diff options
author | Nathan Sidwell <nathan@acm.org> | 2014-09-17 20:13:17 +0000 |
---|---|---|
committer | Nathan Sidwell <nathan@gcc.gnu.org> | 2014-09-17 20:13:17 +0000 |
commit | cadb2b96890ca65acba6837c24e67f074826f7fa (patch) | |
tree | d63e4fa5645e26ab19e311988498d7daa883d937 /libgcc/libgcov-driver.c | |
parent | c83ee180191ab19daabee8edefa3e8cf4d00b67f (diff) | |
download | gcc-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.c | 25 |
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 */ |