10ec07f32bbbb209d749b9974408e6f025ad40b31sewardj 20ec07f32bbbb209d749b9974408e6f025ad40b31sewardj#include <stdio.h> 30ec07f32bbbb209d749b9974408e6f025ad40b31sewardj#include "valgrind.h" 40ec07f32bbbb209d749b9974408e6f025ad40b31sewardj 50ec07f32bbbb209d749b9974408e6f025ad40b31sewardj/* Check that function wrapping works for a recursive function. */ 60ec07f32bbbb209d749b9974408e6f025ad40b31sewardj 70ec07f32bbbb209d749b9974408e6f025ad40b31sewardj/* This is needed to stop gcc4 turning 'fact' into a loop */ 80ec07f32bbbb209d749b9974408e6f025ad40b31sewardj__attribute__((noinline)) 90ec07f32bbbb209d749b9974408e6f025ad40b31sewardjint mul ( int x, int y ) { return x * y; } 100ec07f32bbbb209d749b9974408e6f025ad40b31sewardj 110ec07f32bbbb209d749b9974408e6f025ad40b31sewardjint fact ( int n ) 120ec07f32bbbb209d749b9974408e6f025ad40b31sewardj{ 130ec07f32bbbb209d749b9974408e6f025ad40b31sewardj if (n == 0) return 1; else return mul(n, fact(n-1)); 140ec07f32bbbb209d749b9974408e6f025ad40b31sewardj} 150ec07f32bbbb209d749b9974408e6f025ad40b31sewardj 160ec07f32bbbb209d749b9974408e6f025ad40b31sewardjint I_WRAP_SONAME_FNNAME_ZU(NONE,fact) ( int n ) 170ec07f32bbbb209d749b9974408e6f025ad40b31sewardj{ 18d68ac3e974d25f88492774f6baa491999afde9f9sewardj int r; 195a6d7e4866b378affae75405e5d4c9e573677ac7sewardj OrigFn fn; 205a6d7e4866b378affae75405e5d4c9e573677ac7sewardj VALGRIND_GET_ORIG_FN(fn); 210ec07f32bbbb209d749b9974408e6f025ad40b31sewardj printf("in wrapper1-pre: fact(%d)\n", n); 225a6d7e4866b378affae75405e5d4c9e573677ac7sewardj CALL_FN_W_W(r, fn, n); 230ec07f32bbbb209d749b9974408e6f025ad40b31sewardj printf("in wrapper1-post: fact(%d) = %d\n", n, r); 240ec07f32bbbb209d749b9974408e6f025ad40b31sewardj return r; 250ec07f32bbbb209d749b9974408e6f025ad40b31sewardj} 260ec07f32bbbb209d749b9974408e6f025ad40b31sewardj 270ec07f32bbbb209d749b9974408e6f025ad40b31sewardj/* --------------- */ 280ec07f32bbbb209d749b9974408e6f025ad40b31sewardj 290ec07f32bbbb209d749b9974408e6f025ad40b31sewardjint main ( void ) 300ec07f32bbbb209d749b9974408e6f025ad40b31sewardj{ 310ec07f32bbbb209d749b9974408e6f025ad40b31sewardj int r; 320ec07f32bbbb209d749b9974408e6f025ad40b31sewardj printf("computing fact(5)\n"); 330ec07f32bbbb209d749b9974408e6f025ad40b31sewardj r = fact(5); 340ec07f32bbbb209d749b9974408e6f025ad40b31sewardj printf("fact(5) = %d\n", r); 350ec07f32bbbb209d749b9974408e6f025ad40b31sewardj return 0; 360ec07f32bbbb209d749b9974408e6f025ad40b31sewardj} 37