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