1436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#include <stdlib.h> 2436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#include <stdio.h> 3436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#include <valgrind.h> 4436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 5436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvoid (*fnptr[256])(char*, char*); 6436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 7436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define BODY(f) \ 8436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{ \ 9436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov fprintf(stderr, f); \ 10436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov calls++; \ 11436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov (*fnptr[(int)*calls])(calls,seq); \ 12436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 13436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 14436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvoid stacktrace(char*last, char* callsequence) 15436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{ 16436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov fprintf(stderr, "\n"); 17436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov VALGRIND_PRINTF_BACKTRACE ("%s", callsequence); 18436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 19436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov__attribute__((noinline)) void f_a(char *calls, char*seq); 20436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov__attribute__((noinline)) void f_b(char *calls, char*seq); 21436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov__attribute__((noinline)) void f_c(char *calls, char*seq); 22436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov__attribute__((noinline)) void f_d(char *calls, char*seq); 23436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 24436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov__attribute__((noinline)) void f_a(char *calls, char*seq) 25436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovBODY("a") 26436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 27436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov__attribute__((noinline)) void f_b(char *calls, char*seq) 28436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovBODY("b") 29436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 30436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov__attribute__((noinline)) void f_c(char *calls, char*seq) 31436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovBODY("c"); 32436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 33436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov__attribute__((noinline)) void f_d(char *calls, char*seq) 34436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovBODY("d"); 35436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 36436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvoid doit (int argc, char**argv) 37436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{ 38436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov int i; 39436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov for (i = 1; i < argc; i++) { 40436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov char* calls = argv[i]; 41436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov char* seq = argv[i]; 42436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov calls--; 43436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov BODY("test ") 44436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 45436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 46436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 47436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovint main(int argc, char**argv) 48436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{ 49436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 50436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov fnptr[0] = stacktrace; 51436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov fnptr['a'] = f_a; 52436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov fnptr['b'] = f_b; 53436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov fnptr['c'] = f_c; 54436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov fnptr['d'] = f_d; 55436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 56436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov doit(argc, argv); // with default value of our argument. 57436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 58436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov (void) VALGRIND_MONITOR_COMMAND("v.set merge-recursive-frames 3"); 59436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov doit(argc, argv); 60436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 61436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov (void) VALGRIND_MONITOR_COMMAND("v.set merge-recursive-frames 2"); 62436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov doit(argc, argv); 63436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 64436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov (void) VALGRIND_MONITOR_COMMAND("v.set merge-recursive-frames 1"); 65436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov doit(argc, argv); 66436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 67436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov (void) VALGRIND_MONITOR_COMMAND("v.set merge-recursive-frames 0"); 68436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov doit(argc, argv); 69436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 70436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return 0; 71436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 72