fix gfcov regression

Nathan Sidwell nathan@acm.org
Sat Aug 23 14:33:00 GMT 2014


Hi,
this patch fixes a defect Jan found with firefox and its shared objects.  We 
were inadvertently calling an externally visible and overridable symbol, rather 
than the local shared object's instance.  This led to strangely sparse gcov results.

I've taken the STRONG_ALIAS #define from glibc.  I'm not 100% sure it's valid 
for all supported targets.

Tested in x86_64-linux

I've not committed this patch because of that, and (b) I'm  about to emmigrate, 
so likely to be unable to respond to any potential fallout in a timely manner.

Jan, if you think this patch is sufficiently safe, please apply.

nathan
-------------- next part --------------
2014-08-22  Nathan sidwell  <nathan@acm.org>

	* libgcov-interface.c (STRONG_ALIAS): New.
	(__gcov_flush): Call __gcov_reset_int.
	(__gcov_reset): Strong alias for ...
	(__gcov_reset_ing): ... this renamed hidden version.
	* libgcov.h (__gcov_reset_int): New declaration.

Index: libgcc/libgcov-interface.c
===================================================================
--- libgcc/libgcov-interface.c	(revision 214320)
+++ libgcc/libgcov-interface.c	(working copy)
@@ -42,6 +42,12 @@ void __gcov_dump (void) {}
 
 #else
 
+
+/* Some functions we want to bind in this dynamic object, but have an
+   overridable global alias.  */
+#define STRONG_ALIAS(src,dst) \
+  extern __typeof (src) dst __attribute__((alias (#src)))
+
 extern __gthread_mutex_t __gcov_flush_mx ATTRIBUTE_HIDDEN;
 extern __gthread_mutex_t __gcov_flush_mx ATTRIBUTE_HIDDEN;
 
@@ -77,7 +83,7 @@ __gcov_flush (void)
   __gthread_mutex_lock (&__gcov_flush_mx);
 
   __gcov_dump_one (&__gcov_root);
-  __gcov_reset ();
+  __gcov_reset_int ();
 
   __gthread_mutex_unlock (&__gcov_flush_mx);
 }
@@ -121,12 +127,14 @@ gcov_clear (const struct gcov_info *list
    in order to collect profile in region of interest.  */
 
 void
-__gcov_reset (void)
+__gcov_reset_int (void)
 {
   gcov_clear (__gcov_root.list);
   __gcov_root.dumped = 0;
 }
 
+STRONG_ALIAS (__gcov_reset_int, __gcov_reset);
+
 #endif /* L_gcov_reset */
 
 #ifdef L_gcov_dump
Index: libgcc/libgcov.h
===================================================================
--- libgcc/libgcov.h	(revision 214320)
+++ libgcc/libgcov.h	(working copy)
@@ -225,8 +225,10 @@ extern void __gcov_init (struct gcov_inf
 /* Called before fork, to avoid double counting.  */
 extern void __gcov_flush (void) ATTRIBUTE_HIDDEN;
 
-/* Function to reset all counters to 0.  */
+/* Function to reset all counters to 0.  Both externally visible (and
+   overridable) and internal version.  */
 extern void __gcov_reset (void);
+extern void __gcov_reset_int (void) ATTRIBUTE_HIDDEN;
 
 /* Function to enable early write of profile information so far.  */
 extern void __gcov_dump (void);


More information about the Gcc-patches mailing list