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