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