Do locking for __gcov_dump and __gcov_reset as well.

PR gcov-profile/93623
	* Makefile.in: Add _gcov_lock_unlock to LIBGCOV_INTERFACE.
	* libgcov-interface.c (ALIAS_void_fn): Remove.
	(__gcov_lock): New.
	(__gcov_unlock): New.
	(__gcov_flush): Use __gcov_lock and __gcov_unlock.
	(__gcov_reset): Likewise.
	(__gcov_dump): Likewise.
	* libgcov.h (__gcov_lock): New declaration.
	(__gcov_unlock): Likewise.
This commit is contained in:
Martin Liska 2020-05-05 16:15:45 +02:00
parent 2d8a60a63c
commit d39f7dc8d5
No known key found for this signature in database
GPG Key ID: 4DC182DC0FA73785
4 changed files with 65 additions and 16 deletions

View File

@ -1,3 +1,16 @@
2020-05-05 Martin Liska <mliska@suse.cz>
PR gcov-profile/93623
* Makefile.in: Add _gcov_lock_unlock to LIBGCOV_INTERFACE.
* libgcov-interface.c (ALIAS_void_fn): Remove.
(__gcov_lock): New.
(__gcov_unlock): New.
(__gcov_flush): Use __gcov_lock and __gcov_unlock.
(__gcov_reset): Likewise.
(__gcov_dump): Likewise.
* libgcov.h (__gcov_lock): New declaration.
(__gcov_unlock): Likewise.
2020-05-01 Uroš Bizjak <ubizjak@gmail.com> 2020-05-01 Uroš Bizjak <ubizjak@gmail.com>
* config/i386/sfp-exceptions.c (__math_force_eval): New define. * config/i386/sfp-exceptions.c (__math_force_eval): New define.

View File

@ -906,7 +906,8 @@ LIBGCOV_PROFILER = _gcov_interval_profiler \
_gcov_time_profiler _gcov_time_profiler
LIBGCOV_INTERFACE = _gcov_dump _gcov_flush _gcov_fork \ LIBGCOV_INTERFACE = _gcov_dump _gcov_flush _gcov_fork \
_gcov_execl _gcov_execlp \ _gcov_execl _gcov_execlp \
_gcov_execle _gcov_execv _gcov_execvp _gcov_execve _gcov_reset _gcov_execle _gcov_execv _gcov_execvp _gcov_execve _gcov_reset \
_gcov_lock_unlock
LIBGCOV_DRIVER = _gcov LIBGCOV_DRIVER = _gcov
libgcov-merge-objects = $(patsubst %,%$(objext),$(LIBGCOV_MERGE)) libgcov-merge-objects = $(patsubst %,%$(objext),$(LIBGCOV_MERGE))

View File

@ -42,18 +42,9 @@ void __gcov_dump (void) {}
#else #else
/* Some functions we want to bind in this dynamic object, but have an
overridable global alias. Unfortunately not all targets support
aliases, so we just have a forwarding function. That'll be tail
called, so the cost is a single jump instruction.*/
#define ALIAS_void_fn(src,dst) \
void dst (void) \
{ src (); }
extern __gthread_mutex_t __gcov_flush_mx ATTRIBUTE_HIDDEN; extern __gthread_mutex_t __gcov_flush_mx ATTRIBUTE_HIDDEN;
#ifdef L_gcov_flush #ifdef L_gcov_lock_unlock
#ifdef __GTHREAD_MUTEX_INIT #ifdef __GTHREAD_MUTEX_INIT
__gthread_mutex_t __gcov_flush_mx = __GTHREAD_MUTEX_INIT; __gthread_mutex_t __gcov_flush_mx = __GTHREAD_MUTEX_INIT;
#define init_mx_once() #define init_mx_once()
@ -74,6 +65,25 @@ init_mx_once (void)
} }
#endif #endif
/* Lock critical section for __gcov_dump and __gcov_reset functions. */
void
__gcov_lock (void)
{
init_mx_once ();
__gthread_mutex_lock (&__gcov_flush_mx);
}
/* Unlock critical section for __gcov_dump and __gcov_reset functions. */
void
__gcov_unlock (void)
{
__gthread_mutex_unlock (&__gcov_flush_mx);
}
#endif
#ifdef L_gcov_flush
/* Called before fork or exec - write out profile information gathered so /* Called before fork or exec - write out profile information gathered so
far and reset it to zero. This avoids duplication or loss of the far and reset it to zero. This avoids duplication or loss of the
profile information gathered so far. */ profile information gathered so far. */
@ -81,13 +91,12 @@ init_mx_once (void)
void void
__gcov_flush (void) __gcov_flush (void)
{ {
init_mx_once (); __gcov_lock ();
__gthread_mutex_lock (&__gcov_flush_mx);
__gcov_dump_int (); __gcov_dump_int ();
__gcov_reset_int (); __gcov_reset_int ();
__gthread_mutex_unlock (&__gcov_flush_mx); __gcov_unlock ();
} }
#endif /* L_gcov_flush */ #endif /* L_gcov_flush */
@ -143,7 +152,17 @@ __gcov_reset_int (void)
} }
} }
ALIAS_void_fn (__gcov_reset_int, __gcov_reset); /* Exported function __gcov_reset. */
void
__gcov_reset (void)
{
__gcov_lock ();
__gcov_reset_int ();
__gcov_unlock ();
}
#endif /* L_gcov_reset */ #endif /* L_gcov_reset */
@ -163,7 +182,17 @@ __gcov_dump_int (void)
__gcov_dump_one (root); __gcov_dump_one (root);
} }
ALIAS_void_fn (__gcov_dump_int, __gcov_dump); /* Exported function __gcov_dump. */
void
__gcov_dump (void)
{
__gcov_lock ();
__gcov_dump_int ();
__gcov_unlock ();
}
#endif /* L_gcov_dump */ #endif /* L_gcov_dump */

View File

@ -253,6 +253,12 @@ extern void __gcov_reset_int (void) ATTRIBUTE_HIDDEN;
/* User function to enable early write of profile information so far. */ /* User function to enable early write of profile information so far. */
extern void __gcov_dump_int (void) ATTRIBUTE_HIDDEN; extern void __gcov_dump_int (void) ATTRIBUTE_HIDDEN;
/* Lock critical section for __gcov_dump and __gcov_reset functions. */
extern void __gcov_lock (void) ATTRIBUTE_HIDDEN;
/* Unlock critical section for __gcov_dump and __gcov_reset functions. */
extern void __gcov_unlock (void) ATTRIBUTE_HIDDEN;
/* The merge function that just sums the counters. */ /* The merge function that just sums the counters. */
extern void __gcov_merge_add (gcov_type *, unsigned) ATTRIBUTE_HIDDEN; extern void __gcov_merge_add (gcov_type *, unsigned) ATTRIBUTE_HIDDEN;