1
2#include <stdio.h>
3#include "valgrind.h"
4
5/* Check that function wrapping works for a mutually recursive
6   pair. */
7
8static int fact1 ( int n );
9static int fact2 ( int n );
10
11/* This is needed to stop gcc4 turning 'fact' into a loop */
12__attribute__((noinline))
13int mul ( int x, int y ) { return x * y; }
14
15int fact1 ( int n )
16{
17   if (n == 0) return 1; else return mul(n, fact2(n-1));
18}
19int fact2 ( int n )
20{
21   if (n == 0) return 1; else return mul(n, fact1(n-1));
22}
23
24
25int 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
36int 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
49int 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