1ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 2ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <stdio.h> 3ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <stdlib.h> 4ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "valgrind.h" 5ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 6ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* As wrap4.c, but also throw in various calls to another redirected 7ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown function (malloc) to check that that doesn't screw anything up. 8ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown*/ 9ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 10ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef 11ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct _Lard { 12ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct _Lard* next; 13ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown char stuff[999]; 14ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 15ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Lard; 16ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 17ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownLard* lard = NULL; 18ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic int ctr = 0; 19ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 20ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid addMoreLard ( void ) 21ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 22ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Lard* p; 23ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ctr++; 24ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if ((ctr % 3) == 1) { 25ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = malloc(sizeof(Lard)); 26ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p->next = lard; 27ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown lard = p; 28ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 29ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 30ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 31ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 32ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic int fact1 ( int n ); 33ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic int fact2 ( int n ); 34ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 35ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* This is needed to stop gcc4 turning 'fact' into a loop */ 36ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown__attribute__((noinline)) 37ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownint mul ( int x, int y ) { return x * y; } 38ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 39ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownint fact1 ( int n ) 40ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 41ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addMoreLard(); 42ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (n == 0) return 1; else return mul(n, fact2(n-1)); 43ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 44ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownint fact2 ( int n ) 45ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 46ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addMoreLard(); 47ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (n == 0) return 1; else return mul(n, fact1(n-1)); 48ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 49ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 50ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 51ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownint I_WRAP_SONAME_FNNAME_ZU(NONE,fact1) ( int n ) 52ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 53ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown int r; 54ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown OrigFn fn; 55ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown VALGRIND_GET_ORIG_FN(fn); 56ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown printf("in wrapper1-pre: fact(%d)\n", n); 57ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addMoreLard(); 58ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CALL_FN_W_W(r, fn, n); 59ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addMoreLard(); 60ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown printf("in wrapper1-post: fact(%d) = %d\n", n, r); 61ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (n >= 3) r += fact2(2); 62ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return r; 63ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 64ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 65ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownint I_WRAP_SONAME_FNNAME_ZU(NONE,fact2) ( int n ) 66ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 67ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown int r; 68ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown OrigFn fn; 69ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown VALGRIND_GET_ORIG_FN(fn); 70ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown printf("in wrapper2-pre: fact(%d)\n", n); 71ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addMoreLard(); 72ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CALL_FN_W_W(r, fn, n); 73ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addMoreLard(); 74ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown printf("in wrapper2-post: fact(%d) = %d\n", n, r); 75ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return r; 76ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 77ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 78ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* --------------- */ 79ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 80ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownint main ( void ) 81ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 82ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown int r; 83ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Lard *p, *p_next; 84ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown printf("computing fact1(7)\n"); 85ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown r = fact1(7); 86ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown printf("fact1(7) = %d\n", r); 87ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 88ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown printf("allocated %d Lards\n", ctr); 89ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown for (p = lard; p; p = p_next) { 90ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p_next = p->next; 91ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown free(p); 92ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 93ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 94ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return 0; 95ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 96