146207652a0c99a2c8b0f05eafce3ca3ec533c121philippe#include <stdlib.h> 246207652a0c99a2c8b0f05eafce3ca3ec533c121philippe#include <stdio.h> 346207652a0c99a2c8b0f05eafce3ca3ec533c121philippe#include <valgrind.h> 446207652a0c99a2c8b0f05eafce3ca3ec533c121philippe 546207652a0c99a2c8b0f05eafce3ca3ec533c121philippevoid (*fnptr[256])(char*, char*); 646207652a0c99a2c8b0f05eafce3ca3ec533c121philippe 746207652a0c99a2c8b0f05eafce3ca3ec533c121philippe#define BODY(f) \ 846207652a0c99a2c8b0f05eafce3ca3ec533c121philippe{ \ 946207652a0c99a2c8b0f05eafce3ca3ec533c121philippe fprintf(stderr, f); \ 1046207652a0c99a2c8b0f05eafce3ca3ec533c121philippe calls++; \ 1146207652a0c99a2c8b0f05eafce3ca3ec533c121philippe (*fnptr[(int)*calls])(calls,seq); \ 1246207652a0c99a2c8b0f05eafce3ca3ec533c121philippe} 1346207652a0c99a2c8b0f05eafce3ca3ec533c121philippe 1446207652a0c99a2c8b0f05eafce3ca3ec533c121philippevoid stacktrace(char*last, char* callsequence) 1546207652a0c99a2c8b0f05eafce3ca3ec533c121philippe{ 1646207652a0c99a2c8b0f05eafce3ca3ec533c121philippe fprintf(stderr, "\n"); 174ecae76e1836352287f615c002c3963d9974afa7philippe VALGRIND_PRINTF_BACKTRACE ("%s", callsequence); 1846207652a0c99a2c8b0f05eafce3ca3ec533c121philippe} 1946207652a0c99a2c8b0f05eafce3ca3ec533c121philippe__attribute__((noinline)) void f_a(char *calls, char*seq); 2046207652a0c99a2c8b0f05eafce3ca3ec533c121philippe__attribute__((noinline)) void f_b(char *calls, char*seq); 2146207652a0c99a2c8b0f05eafce3ca3ec533c121philippe__attribute__((noinline)) void f_c(char *calls, char*seq); 2246207652a0c99a2c8b0f05eafce3ca3ec533c121philippe__attribute__((noinline)) void f_d(char *calls, char*seq); 2346207652a0c99a2c8b0f05eafce3ca3ec533c121philippe 2446207652a0c99a2c8b0f05eafce3ca3ec533c121philippe__attribute__((noinline)) void f_a(char *calls, char*seq) 2546207652a0c99a2c8b0f05eafce3ca3ec533c121philippeBODY("a") 2646207652a0c99a2c8b0f05eafce3ca3ec533c121philippe 2746207652a0c99a2c8b0f05eafce3ca3ec533c121philippe__attribute__((noinline)) void f_b(char *calls, char*seq) 2846207652a0c99a2c8b0f05eafce3ca3ec533c121philippeBODY("b") 2946207652a0c99a2c8b0f05eafce3ca3ec533c121philippe 3046207652a0c99a2c8b0f05eafce3ca3ec533c121philippe__attribute__((noinline)) void f_c(char *calls, char*seq) 3146207652a0c99a2c8b0f05eafce3ca3ec533c121philippeBODY("c"); 3246207652a0c99a2c8b0f05eafce3ca3ec533c121philippe 3346207652a0c99a2c8b0f05eafce3ca3ec533c121philippe__attribute__((noinline)) void f_d(char *calls, char*seq) 3446207652a0c99a2c8b0f05eafce3ca3ec533c121philippeBODY("d"); 3546207652a0c99a2c8b0f05eafce3ca3ec533c121philippe 3646207652a0c99a2c8b0f05eafce3ca3ec533c121philippevoid doit (int argc, char**argv) 3746207652a0c99a2c8b0f05eafce3ca3ec533c121philippe{ 3846207652a0c99a2c8b0f05eafce3ca3ec533c121philippe int i; 3946207652a0c99a2c8b0f05eafce3ca3ec533c121philippe for (i = 1; i < argc; i++) { 4046207652a0c99a2c8b0f05eafce3ca3ec533c121philippe char* calls = argv[i]; 4146207652a0c99a2c8b0f05eafce3ca3ec533c121philippe char* seq = argv[i]; 4246207652a0c99a2c8b0f05eafce3ca3ec533c121philippe calls--; 4346207652a0c99a2c8b0f05eafce3ca3ec533c121philippe BODY("test ") 4446207652a0c99a2c8b0f05eafce3ca3ec533c121philippe } 4546207652a0c99a2c8b0f05eafce3ca3ec533c121philippe} 4646207652a0c99a2c8b0f05eafce3ca3ec533c121philippe 4746207652a0c99a2c8b0f05eafce3ca3ec533c121philippeint main(int argc, char**argv) 4846207652a0c99a2c8b0f05eafce3ca3ec533c121philippe{ 4946207652a0c99a2c8b0f05eafce3ca3ec533c121philippe 5046207652a0c99a2c8b0f05eafce3ca3ec533c121philippe fnptr[0] = stacktrace; 5146207652a0c99a2c8b0f05eafce3ca3ec533c121philippe fnptr['a'] = f_a; 5246207652a0c99a2c8b0f05eafce3ca3ec533c121philippe fnptr['b'] = f_b; 5346207652a0c99a2c8b0f05eafce3ca3ec533c121philippe fnptr['c'] = f_c; 5446207652a0c99a2c8b0f05eafce3ca3ec533c121philippe fnptr['d'] = f_d; 5546207652a0c99a2c8b0f05eafce3ca3ec533c121philippe 5646207652a0c99a2c8b0f05eafce3ca3ec533c121philippe doit(argc, argv); // with default value of our argument. 5746207652a0c99a2c8b0f05eafce3ca3ec533c121philippe 5806bc722457ffe12e056d2f40d0d2f5c8711b541fflorian (void) VALGRIND_MONITOR_COMMAND("v.set merge-recursive-frames 3"); 5946207652a0c99a2c8b0f05eafce3ca3ec533c121philippe doit(argc, argv); 6046207652a0c99a2c8b0f05eafce3ca3ec533c121philippe 6106bc722457ffe12e056d2f40d0d2f5c8711b541fflorian (void) VALGRIND_MONITOR_COMMAND("v.set merge-recursive-frames 2"); 6246207652a0c99a2c8b0f05eafce3ca3ec533c121philippe doit(argc, argv); 6346207652a0c99a2c8b0f05eafce3ca3ec533c121philippe 6406bc722457ffe12e056d2f40d0d2f5c8711b541fflorian (void) VALGRIND_MONITOR_COMMAND("v.set merge-recursive-frames 1"); 6546207652a0c99a2c8b0f05eafce3ca3ec533c121philippe doit(argc, argv); 6646207652a0c99a2c8b0f05eafce3ca3ec533c121philippe 6706bc722457ffe12e056d2f40d0d2f5c8711b541fflorian (void) VALGRIND_MONITOR_COMMAND("v.set merge-recursive-frames 0"); 6846207652a0c99a2c8b0f05eafce3ca3ec533c121philippe doit(argc, argv); 6946207652a0c99a2c8b0f05eafce3ca3ec533c121philippe 7046207652a0c99a2c8b0f05eafce3ca3ec533c121philippe return 0; 7146207652a0c99a2c8b0f05eafce3ca3ec533c121philippe} 72