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