Fix 64-bit uncleanness in VG_(get_bbs_translated)/VG_(get_bbs_discarded_or_dumped) ..
[valgrind.git] / memcheck / tests / wrap3.c
blobc6c552d5dfdba4af99a2273d6032a7b6c9ee1bd7
2 #include <stdio.h>
3 #include "valgrind.h"
5 /* Check that function wrapping works for a mutually recursive
6 pair. */
8 int fact1 ( int n );
9 int fact2 ( int n );
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; }
15 __attribute((noinline))
16 int fact1 ( int n )
18 if (n == 0) return 1; else return mul(n, fact2(n-1));
20 __attribute((noinline))
21 int fact2 ( int n )
23 if (n == 0) return 1; else return mul(n, fact1(n-1));
27 int I_WRAP_SONAME_FNNAME_ZU(NONE,fact1) ( int n )
29 int r;
30 OrigFn fn;
31 VALGRIND_GET_ORIG_FN(fn);
32 printf("in wrapper1-pre: fact(%d)\n", n);
33 CALL_FN_W_W(r,fn,n);
34 printf("in wrapper1-post: fact(%d) = %d\n", n, r);
35 return r;
38 int I_WRAP_SONAME_FNNAME_ZU(NONE,fact2) ( int n )
40 int r;
41 OrigFn fn;
42 VALGRIND_GET_ORIG_FN(fn);
43 printf("in wrapper2-pre: fact(%d)\n", n);
44 CALL_FN_W_W(r,fn,n);
45 printf("in wrapper2-post: fact(%d) = %d\n", n, r);
46 return r;
49 /* --------------- */
51 int main ( void )
53 int r;
54 printf("computing fact1(5)\n");
55 r = fact1(5);
56 printf("fact1(5) = %d\n", r);
57 return 0;