aboutsummaryrefslogtreecommitdiff
path: root/libgcc/gcov.h
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2020-11-14 13:51:09 +0100
committerSebastian Huber <sebastian.huber@embedded-brains.de>2021-08-06 07:28:26 +0200
commit9124bbe1857f0d3a3015d6461d5f8d04f07cab85 (patch)
tree7da449bf5bade4e861d82257bf12350cfa7a9dba /libgcc/gcov.h
parenta3d3e8c362c2d850543eb2e2631128e1efc368f0 (diff)
downloadgcc-9124bbe1857f0d3a3015d6461d5f8d04f07cab85.zip
gcc-9124bbe1857f0d3a3015d6461d5f8d04f07cab85.tar.gz
gcc-9124bbe1857f0d3a3015d6461d5f8d04f07cab85.tar.bz2
gcov: Add __gcov_info_to_gdca()
Add __gcov_info_to_gcda() to libgcov to get the gcda data for a gcda info in a freestanding environment. It is intended to be used with the -fprofile-info-section option. A crude test program which doesn't use a linker script is (use "gcc -coverage -fprofile-info-section -lgcov test.c" to compile it): #include <gcov.h> #include <stdio.h> #include <stdlib.h> extern const struct gcov_info *my_info; static void filename (const char *f, void *arg) { printf("filename: %s\n", f); } static void dump (const void *d, unsigned n, void *arg) { const unsigned char *c = d; for (unsigned i = 0; i < n; ++i) printf ("%02x", c[i]); } static void * allocate (unsigned length, void *arg) { return malloc (length); } int main() { __asm__ volatile (".set my_info, .LPBX2"); __gcov_info_to_gcda (my_info, filename, dump, allocate, NULL); return 0; } With this patch, <stdint.h> is included in libgcov-driver.c even if inhibit_libc is defined. This header file should be also available for freestanding environments. If this is not the case, then we have to define intptr_t somehow. The patch removes one use of memset() which makes the <string.h> include superfluous. gcc/ * gcov-io.h (gcov_write): Declare. * gcov-io.c (gcov_write): New. (gcov_write_counter): Remove. (gcov_write_tag_length): Likewise. (gcov_write_summary): Replace gcov_write_tag_length() with calls to gcov_write_unsigned(). * doc/invoke.texi (fprofile-info-section): Mention __gcov_info_to_gdca(). gcc/testsuite/ * gcc.dg/gcov-info-to-gcda.c: New test. libgcc/ * Makefile.in (LIBGCOV_DRIVER): Add _gcov_info_to_gcda. * gcov.h (gcov_info): Declare. (__gcov_info_to_gdca): Likewise. * libgcov.h (gcov_write_counter): Remove. (gcov_write_tag_length): Likewise. * libgcov-driver.c (#include <stdint.h>): New. (#include <string.h>): Remove. (NEED_L_GCOV): Conditionally define. (NEED_L_GCOV_INFO_TO_GCDA): Likewise. (are_all_counters_zero): New. (gcov_dump_handler): Likewise. (gcov_allocate_handler): Likewise. (dump_unsigned): Likewise. (dump_counter): Likewise. (write_topn_counters): Add dump_fn, allocate_fn, and arg parameters. Use dump_unsigned() and dump_counter(). (write_one_data): Add dump_fn, allocate_fn, and arg parameters. Use dump_unsigned(), dump_counter(), and are_all_counters_zero(). (__gcov_info_to_gcda): New.
Diffstat (limited to 'libgcc/gcov.h')
-rw-r--r--libgcc/gcov.h19
1 files changed, 19 insertions, 0 deletions
diff --git a/libgcc/gcov.h b/libgcc/gcov.h
index e6492cd..66d03bf 100644
--- a/libgcc/gcov.h
+++ b/libgcc/gcov.h
@@ -25,6 +25,8 @@
#ifndef GCC_GCOV_H
#define GCC_GCOV_H
+struct gcov_info;
+
/* Set all counters to zero. */
extern void __gcov_reset (void);
@@ -33,4 +35,21 @@ extern void __gcov_reset (void);
extern void __gcov_dump (void);
+/* Convert the gcov information referenced by INFO to a gcda data stream.
+ The FILENAME_FN callback is called exactly once with the filename associated
+ with the gcov information. The filename may be NULL. Afterwards, the
+ DUMP_FN callback is subsequently called with chunks (the begin and length of
+ the chunk are passed as the first two callback parameters) of the gcda data
+ stream. The ALLOCATE_FN callback shall allocate memory with a size in
+ characters specified by the first callback parameter. The ARG parameter is
+ a user-provided argument passed as the last argument to the callback
+ functions. */
+
+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);
+
#endif /* GCC_GCOV_H */