aboutsummaryrefslogtreecommitdiff
path: root/libgcc/libgcov-driver.c
diff options
context:
space:
mode:
authorNathan Sidwell <nathan@acm.org>2014-09-17 20:13:17 +0000
committerNathan Sidwell <nathan@gcc.gnu.org>2014-09-17 20:13:17 +0000
commitcadb2b96890ca65acba6837c24e67f074826f7fa (patch)
treed63e4fa5645e26ab19e311988498d7daa883d937 /libgcc/libgcov-driver.c
parentc83ee180191ab19daabee8edefa3e8cf4d00b67f (diff)
downloadgcc-cadb2b96890ca65acba6837c24e67f074826f7fa.zip
gcc-cadb2b96890ca65acba6837c24e67f074826f7fa.tar.gz
gcc-cadb2b96890ca65acba6837c24e67f074826f7fa.tar.bz2
Makefile.in (LIBGCOV_INTERFACE): Add _gcov_dump from ...
* Makefile.in (LIBGCOV_INTERFACE): Add _gcov_dump from ... (LIBGCOV_DRIVER): ... here. * libgcov-driver.c (gcov_master): New. (gcov_exit): Remove from master chain. (__gcov_init): Add to master chain if version compatible. Don't clear the version. * libgcov_interface (__gcov_flust): Call gcov_dump_int. (gcov_reset_int): Clear master chain, if compatible. (gcov_dump_int): New internal interface. Dump master chain, if compatible. (gcov_dump): Alias for gcov_dump_int. * libgcov.h (struct gcov_root): Add next and prev fields. (struct gcov_master): New struct. (__gcov_master): New. (gcov_dump_int): Declare. From-SVN: r215337
Diffstat (limited to 'libgcc/libgcov-driver.c')
-rw-r--r--libgcc/libgcov-driver.c25
1 files changed, 22 insertions, 3 deletions
diff --git a/libgcc/libgcov-driver.c b/libgcc/libgcov-driver.c
index 34c58cd..7bde526 100644
--- a/libgcc/libgcov-driver.c
+++ b/libgcc/libgcov-driver.c
@@ -777,13 +777,23 @@ __gcov_dump_one (struct gcov_root *root)
root->run_counted = 1;
}
-/* Per-program/shared-object gcov state. */
+/* Per-dynamic-object gcov state. */
struct gcov_root __gcov_root;
+/* Exactly one of these will be live in the process image. */
+struct gcov_master __gcov_master =
+ {GCOV_VERSION, 0};
+
static void
gcov_exit (void)
{
__gcov_dump_one (&__gcov_root);
+ if (__gcov_root.next)
+ __gcov_root.next->prev = __gcov_root.prev;
+ if (__gcov_root.prev)
+ __gcov_root.prev->next = __gcov_root.next;
+ else
+ __gcov_master.root = __gcov_root.next;
}
/* Add a new object file onto the bb chain. Invoked automatically
@@ -797,12 +807,21 @@ __gcov_init (struct gcov_info *info)
if (gcov_version (info, info->version, 0))
{
if (!__gcov_root.list)
- atexit (gcov_exit);
+ {
+ /* Add to master list and at exit function. */
+ if (gcov_version (NULL, __gcov_master.version, "<master>"))
+ {
+ __gcov_root.next = __gcov_master.root;
+ if (__gcov_master.root)
+ __gcov_master.root->prev = &__gcov_root;
+ __gcov_master.root = &__gcov_root;
+ }
+ atexit (gcov_exit);
+ }
info->next = __gcov_root.list;
__gcov_root.list = info;
}
- info->version = 0;
}
#endif /* !IN_GCOV_TOOL */
#endif /* L_gcov */