1 2 #include <stdio.h> 3 #include "valgrind.h" 4 5 /* Check that function wrapping works for a mutually recursive 6 pair. */ 7 8 static int fact1 ( int n ); 9 static int fact2 ( int n ); 10 11 /* This is needed to stop gcc4 turning 'fact' into a loop */ 12 __attribute__((noinline)) 13 int mul ( int x, int y ) { return x * y; } 14 15 int fact1 ( int n ) 16 { 17 if (n == 0) return 1; else return mul(n, fact2(n-1)); 18 } 19 int fact2 ( int n ) 20 { 21 if (n == 0) return 1; else return mul(n, fact1(n-1)); 22 } 23 24 25 int I_WRAP_SONAME_FNNAME_ZU(NONE,fact1) ( int n ) 26 { 27 int r; 28 OrigFn fn; 29 VALGRIND_GET_ORIG_FN(fn); 30 printf("in wrapper1-pre: fact(%d)\n", n); 31 CALL_FN_W_W(r,fn,n); 32 printf("in wrapper1-post: fact(%d) = %d\n", n, r); 33 return r; 34 } 35 36 int I_WRAP_SONAME_FNNAME_ZU(NONE,fact2) ( int n ) 37 { 38 int r; 39 OrigFn fn; 40 VALGRIND_GET_ORIG_FN(fn); 41 printf("in wrapper2-pre: fact(%d)\n", n); 42 CALL_FN_W_W(r,fn,n); 43 printf("in wrapper2-post: fact(%d) = %d\n", n, r); 44 return r; 45 } 46 47 /* --------------- */ 48 49 int main ( void ) 50 { 51 int r; 52 printf("computing fact1(5)\n"); 53 r = fact1(5); 54 printf("fact1(5) = %d\n", r); 55 return 0; 56 } 57