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