diff options
author | Martin Liska <mliska@suse.cz> | 2016-09-27 13:07:11 +0200 |
---|---|---|
committer | Martin Liska <marxin@gcc.gnu.org> | 2016-09-27 11:07:11 +0000 |
commit | 8c9434c2f9358b8b8bad2c1990edf10a21645f9d (patch) | |
tree | 0dfe81cd421cbccec0f0b4ed0c7bdb2943ad2f00 /libgcc | |
parent | 511d092e41fcea25a4367dec16ea4b44d947f699 (diff) | |
download | gcc-8c9434c2f9358b8b8bad2c1990edf10a21645f9d.zip gcc-8c9434c2f9358b8b8bad2c1990edf10a21645f9d.tar.gz gcc-8c9434c2f9358b8b8bad2c1990edf10a21645f9d.tar.bz2 |
gcov: dump in a static dtor instead of in an atexit handler
PR gcov-profile/7970
PR gcov-profile/16855
PR gcov-profile/44779
* g++.dg/gcov/pr16855.C: New test.
* coverage.c (build_gcov_exit_decl): New function.
(coverage_obj_init): Call the function and generate __gcov_exit
destructor.
* doc/gcov.texi: Document when __gcov_exit function is called.
* libgcov-driver.c (__gcov_init): Do not register a atexit
handler.
(__gcov_exit): Rename from gcov_exit.
* libgcov.h (__gcov_exit): Declare.
From-SVN: r240529
Diffstat (limited to 'libgcc')
-rw-r--r-- | libgcc/ChangeLog | 10 | ||||
-rw-r--r-- | libgcc/libgcov-driver.c | 5 | ||||
-rw-r--r-- | libgcc/libgcov.h | 3 |
3 files changed, 15 insertions, 3 deletions
diff --git a/libgcc/ChangeLog b/libgcc/ChangeLog index 1b4fd93..d1b2d21 100644 --- a/libgcc/ChangeLog +++ b/libgcc/ChangeLog @@ -1,5 +1,15 @@ 2016-09-27 Martin Liska <mliska@suse.cz> + PR gcov-profile/7970 + PR gcov-profile/16855 + PR gcov-profile/44779 + * libgcov-driver.c (__gcov_init): Do not register a atexit + handler. + (__gcov_exit): Rename from gcov_exit. + * libgcov.h (__gcov_exit): Declare. + +2016-09-27 Martin Liska <mliska@suse.cz> + PR bootstrap/77749 * Makefile.in: Remove _gcov_merge_delta. * libgcov-merge.c (void __gcov_merge_delta): Remove. diff --git a/libgcc/libgcov-driver.c b/libgcc/libgcov-driver.c index d51397e..84471bd 100644 --- a/libgcc/libgcov-driver.c +++ b/libgcc/libgcov-driver.c @@ -872,8 +872,8 @@ struct gcov_root __gcov_root; struct gcov_master __gcov_master = {GCOV_VERSION, 0}; -static void -gcov_exit (void) +void +__gcov_exit (void) { __gcov_dump_one (&__gcov_root); if (__gcov_root.next) @@ -906,7 +906,6 @@ __gcov_init (struct gcov_info *info) __gcov_master.root->prev = &__gcov_root; __gcov_master.root = &__gcov_root; } - atexit (gcov_exit); } info->next = __gcov_root.list; diff --git a/libgcc/libgcov.h b/libgcc/libgcov.h index 725ef0a..dc74134 100644 --- a/libgcc/libgcov.h +++ b/libgcc/libgcov.h @@ -234,6 +234,9 @@ extern void __gcov_dump_one (struct gcov_root *) ATTRIBUTE_HIDDEN; /* Register a new object file module. */ extern void __gcov_init (struct gcov_info *) ATTRIBUTE_HIDDEN; +/* GCOV exit function registered via a static destructor. */ +extern void __gcov_exit (void) ATTRIBUTE_HIDDEN; + /* Called before fork, to avoid double counting. */ extern void __gcov_flush (void) ATTRIBUTE_HIDDEN; |