aboutsummaryrefslogtreecommitdiff
path: root/libgcc
diff options
context:
space:
mode:
authorMartin Liska <mliska@suse.cz>2016-09-27 13:07:11 +0200
committerMartin Liska <marxin@gcc.gnu.org>2016-09-27 11:07:11 +0000
commit8c9434c2f9358b8b8bad2c1990edf10a21645f9d (patch)
tree0dfe81cd421cbccec0f0b4ed0c7bdb2943ad2f00 /libgcc
parent511d092e41fcea25a4367dec16ea4b44d947f699 (diff)
downloadgcc-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/ChangeLog10
-rw-r--r--libgcc/libgcov-driver.c5
-rw-r--r--libgcc/libgcov.h3
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;