| /* { dg-do run { target *-*-linux* *-*-gnu* } } */ |
| /* { dg-options "-fprofile-arcs -fprofile-info-section" } */ |
| |
| #define assert(expr) \ |
| ((expr) \ |
| ? (void)0 \ |
| : (__builtin_printf ("%s:%i: Assertion `%s' failed.\n", \ |
| __FILE__, __LINE__, #expr), \ |
| __builtin_abort ())) |
| |
| struct gcov_info; |
| |
| extern void |
| __gcov_info_to_gcda (const struct gcov_info *__info, |
| void (*__filename_fn) (const char *, void *), |
| void (*__dump_fn) (const void *, unsigned, void *), |
| void *(*__allocate_fn) (unsigned, void *), |
| void *__arg); |
| |
| extern void |
| __gcov_filename_to_gcfn (const char *__filename, |
| void (*__dump_fn) (const void *, unsigned, void *), |
| void *__arg); |
| |
| extern const struct gcov_info *my_info; |
| |
| static unsigned counter; |
| |
| static unsigned counter_after_filename; |
| |
| static int check_zero; |
| |
| static int check_after_filename; |
| |
| static void |
| dump (const void *d, unsigned n, void *arg) |
| { |
| unsigned *m = (unsigned *)arg; |
| assert (arg == &counter); |
| |
| if (*m == 0) |
| { |
| const unsigned *u = d; |
| assert (*u == 0x6763666e); |
| check_zero = 1; |
| } |
| else if (*m == counter_after_filename) |
| { |
| const unsigned *u = d; |
| assert (*u == 0x67636461); |
| check_after_filename = 1; |
| } |
| |
| *m += n; |
| } |
| |
| static void |
| filename (const char *f, void *arg) |
| { |
| assert (arg == &counter); |
| assert (__builtin_strstr (f, "gcov-info-to-gcda.c") == 0); |
| __gcov_filename_to_gcfn (f, dump, arg); |
| counter_after_filename = counter; |
| } |
| |
| static void * |
| allocate (unsigned length, void *arg) |
| { |
| assert (arg == &counter); |
| return __builtin_malloc (length); |
| } |
| |
| int main() |
| { |
| __asm__ volatile (".set my_info, .LPBX2"); |
| __gcov_info_to_gcda (my_info, filename, dump, allocate, &counter); |
| assert (counter > 8); |
| assert (check_zero); |
| assert (check_after_filename); |
| return 0; |
| } |