xref: /openbsd-src/gnu/usr.bin/gcc/gcc/testsuite/gcc.c-torture/execute/eeprof-1.c (revision f2da64fbbbf1b03f09f390ab01267c93dfd77c4c)
1 #define ASSERT(X)	if (!(X)) abort ();
2 #define NOCHK __attribute__ ((no_instrument_function))
3 
4 int entry_calls, exit_calls;
5 void (*last_fn_entered)();
6 void (*last_fn_exited)();
7 
8 int main () NOCHK;
9 
10 void foo ()
11 {
12   ASSERT (last_fn_entered == foo);
13 }
14 
15 static void foo2 ()
16 {
17   ASSERT (entry_calls == 1 && exit_calls == 0);
18   ASSERT (last_fn_entered == foo2);
19   foo ();
20   ASSERT (entry_calls == 2 && exit_calls == 1);
21   ASSERT (last_fn_entered == foo);
22   ASSERT (last_fn_exited == foo);
23 }
24 
25 void nfoo (void) NOCHK;
26 void nfoo ()
27 {
28   ASSERT (entry_calls == 2 && exit_calls == 2);
29   ASSERT (last_fn_entered == foo);
30   ASSERT (last_fn_exited == foo2);
31   foo ();
32   ASSERT (entry_calls == 3 && exit_calls == 3);
33   ASSERT (last_fn_entered == foo);
34   ASSERT (last_fn_exited == foo);
35 }
36 
37 int main ()
38 {
39   ASSERT (entry_calls == 0 && exit_calls == 0);
40 
41   foo2 ();
42 
43   ASSERT (entry_calls == 2 && exit_calls == 2);
44   ASSERT (last_fn_entered == foo);
45   ASSERT (last_fn_exited == foo2);
46 
47   nfoo ();
48 
49   ASSERT (entry_calls == 3 && exit_calls == 3);
50   ASSERT (last_fn_entered == foo);
51 
52   return 0;
53 }
54 
55 void __cyg_profile_func_enter (void (*fn)(), void (*parent)()) NOCHK;
56 void __cyg_profile_func_exit (void (*fn)(), void (*parent)()) NOCHK;
57 
58 void __cyg_profile_func_enter (void (*fn)(), void (*parent)())
59 {
60   entry_calls++;
61   last_fn_entered = fn;
62 }
63 void __cyg_profile_func_exit (void (*fn)(), void (*parent)())
64 {
65   exit_calls++;
66   last_fn_exited = fn;
67 }
68