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