From a1364805fc74b5690f763033c0c9b43f27613572 Mon Sep 17 00:00:00 2001
|
From: Mark Wielaard <mark@klomp.org>
|
Date: Fri, 16 Jul 2021 15:47:08 -0400
|
Subject: [PATCH] Update helgrind and drd suppression libc and libpthread paths
|
in glibc 2.34
|
|
glibc 2.34 moved all pthread functions into the main libc library.
|
And it changed the (in memory) path of the main libc library to
|
libc.so.6 (before it was libc-2.xx.so).
|
|
This breaks various standard suppressions for helgrind and drd.
|
Fix this by doing a configure check for whether we are using glibc
|
2.34 by checking whether pthread_create is in libc instead of in
|
libpthread. If we are using glibc then define GLIBC_LIBC_PATH and
|
GLIBC_LIBPTHREAD_PATH variables that point to the (regexp) path
|
of the library that contains all libc functions and pthread functions
|
(which will be the same path for glibc 2.34+).
|
|
Rename glibc-2.34567-NPTL-helgrind.supp to glibc-2.X-helgrind.supp.in
|
and glibc-2.X-drd.supp to glibc-2.X-drd.supp.in and replace the
|
GLIBC_LIBC_PATH and GLIBC_LIBPTHREAD_PATH at configure time.
|
|
The same could be done for the glibc-2.X.supp.in file, but hasn't
|
yet because it looks like most suppressions in that file are obsolete.
|
|
Upstream-Status: Backport
|
---
|
Makefile.am | 2 +-
|
configure.ac | 37 +++++++++++++++++--
|
glibc-2.X-drd.supp => glibc-2.X-drd.supp.in | 6 ++-
|
...elgrind.supp => glibc-2.X-helgrind.supp.in | 16 ++++----
|
4 files changed, 47 insertions(+), 14 deletions(-)
|
rename glibc-2.X-drd.supp => glibc-2.X-drd.supp.in (97%)
|
rename glibc-2.34567-NPTL-helgrind.supp => glibc-2.X-helgrind.supp.in (95%)
|
|
Index: valgrind-3.17.0/Makefile.am
|
===================================================================
|
--- valgrind-3.17.0.orig/Makefile.am
|
+++ valgrind-3.17.0/Makefile.am
|
@@ -41,7 +41,7 @@ SUPP_FILES = \
|
glibc-2.2.supp glibc-2.3.supp glibc-2.4.supp glibc-2.5.supp \
|
glibc-2.6.supp glibc-2.7.supp glibc-2.X.supp.in \
|
xfree-3.supp xfree-4.supp \
|
- glibc-2.34567-NPTL-helgrind.supp \
|
+ glibc-2.X-helgrind.supp \
|
glibc-2.2-LinuxThreads-helgrind.supp \
|
glibc-2.X-drd.supp \
|
darwin9.supp darwin9-drd.supp \
|
Index: valgrind-3.17.0/configure.ac
|
===================================================================
|
--- valgrind-3.17.0.orig/configure.ac
|
+++ valgrind-3.17.0/configure.ac
|
@@ -1090,6 +1090,31 @@ if test x$GLIBC_VERSION = x; then
|
fi
|
fi
|
|
+# If this is glibc then figure out the generic (in file) libc.so and
|
+# libpthread.so file paths to use in suppressions. Before 2.34 libpthread
|
+# was a separate library, afterwards it was merged into libc.so and
|
+# the library is called libc.so.6 (before it was libc-2.[0-9]+.so).
|
+# Use this fact to set GLIBC_LIBC_PATH and GLIBC_LIBPTHREAD_PATH.
|
+case ${GLIBC_VERSION} in
|
+2*)
|
+ AC_MSG_CHECKING([whether pthread_create needs libpthread])
|
+ AC_LINK_IFELSE([AC_LANG_CALL([], [pthread_create])],
|
+ [
|
+ AC_MSG_RESULT([no])
|
+ GLIBC_LIBC_PATH="*/lib*/libc.so.6"
|
+ GLIBC_LIBPTHREAD_PATH="$GLIBC_LIBC_PATH"
|
+ ], [
|
+ AC_MSG_RESULT([yes])
|
+ GLIBC_LIBC_PATH="*/lib*/libc-2.*so*"
|
+ GLIBC_LIBPTHREAD_PATH="*/lib*/libpthread-2.*so*"
|
+ ])
|
+ ;;
|
+*)
|
+ AC_MSG_CHECKING([not glibc...])
|
+ AC_MSG_RESULT([${GLIBC_VERSION}])
|
+ ;;
|
+esac
|
+
|
AC_MSG_CHECKING([the glibc version])
|
|
case "${GLIBC_VERSION}" in
|
@@ -1102,13 +1127,13 @@ case "${GLIBC_VERSION}" in
|
2.[[3-6]])
|
AC_MSG_RESULT(${GLIBC_VERSION} family)
|
DEFAULT_SUPP="$srcdir/glibc-${GLIBC_VERSION}.supp ${DEFAULT_SUPP}"
|
- DEFAULT_SUPP="$srcdir/glibc-2.34567-NPTL-helgrind.supp ${DEFAULT_SUPP}"
|
+ DEFAULT_SUPP="$srcdir/glibc-2.X-helgrind.supp ${DEFAULT_SUPP}"
|
DEFAULT_SUPP="$srcdir/glibc-2.X-drd.supp ${DEFAULT_SUPP}"
|
;;
|
2.[[7-9]])
|
AC_MSG_RESULT(${GLIBC_VERSION} family)
|
DEFAULT_SUPP="glibc-2.X.supp ${DEFAULT_SUPP}"
|
- DEFAULT_SUPP="$srcdir/glibc-2.34567-NPTL-helgrind.supp ${DEFAULT_SUPP}"
|
+ DEFAULT_SUPP="$srcdir/glibc-2.X-helgrind.supp ${DEFAULT_SUPP}"
|
DEFAULT_SUPP="$srcdir/glibc-2.X-drd.supp ${DEFAULT_SUPP}"
|
;;
|
2.10|2.11)
|
@@ -1116,7 +1141,7 @@ case "${GLIBC_VERSION}" in
|
AC_DEFINE([GLIBC_MANDATORY_STRLEN_REDIRECT], 1,
|
[Define to 1 if strlen() has been optimized heavily (amd64 glibc >= 2.10)])
|
DEFAULT_SUPP="glibc-2.X.supp ${DEFAULT_SUPP}"
|
- DEFAULT_SUPP="$srcdir/glibc-2.34567-NPTL-helgrind.supp ${DEFAULT_SUPP}"
|
+ DEFAULT_SUPP="$srcdir/glibc-2.X-helgrind.supp ${DEFAULT_SUPP}"
|
DEFAULT_SUPP="$srcdir/glibc-2.X-drd.supp ${DEFAULT_SUPP}"
|
;;
|
2.*)
|
@@ -1126,7 +1151,7 @@ case "${GLIBC_VERSION}" in
|
AC_DEFINE([GLIBC_MANDATORY_INDEX_AND_STRLEN_REDIRECT], 1,
|
[Define to 1 if index() and strlen() have been optimized heavily (x86 glibc >= 2.12)])
|
DEFAULT_SUPP="glibc-2.X.supp ${DEFAULT_SUPP}"
|
- DEFAULT_SUPP="$srcdir/glibc-2.34567-NPTL-helgrind.supp ${DEFAULT_SUPP}"
|
+ DEFAULT_SUPP="$srcdir/glibc-2.X-helgrind.supp ${DEFAULT_SUPP}"
|
DEFAULT_SUPP="$srcdir/glibc-2.X-drd.supp ${DEFAULT_SUPP}"
|
;;
|
darwin)
|
@@ -1157,6 +1182,8 @@ case "${GLIBC_VERSION}" in
|
esac
|
|
AC_SUBST(GLIBC_VERSION)
|
+AC_SUBST(GLIBC_LIBC_PATH)
|
+AC_SUBST(GLIBC_LIBPTHREAD_PATH)
|
|
|
if test "$VGCONF_OS" != "solaris"; then
|
@@ -4910,6 +4937,8 @@ AC_CONFIG_FILES([
|
valgrind.spec
|
valgrind.pc
|
glibc-2.X.supp
|
+ glibc-2.X-helgrind.supp
|
+ glibc-2.X-drd.supp
|
docs/Makefile
|
tests/Makefile
|
tests/vg_regtest
|
Index: valgrind-3.17.0/glibc-2.X-drd.supp
|
===================================================================
|
--- valgrind-3.17.0.orig/glibc-2.X-drd.supp
|
+++ /dev/null
|
@@ -1,330 +0,0 @@
|
-#
|
-# Suppression patterns for ld, the dynamic loader.
|
-#
|
-
|
-# Suppress all data races triggered by ld.
|
-{
|
- drd-ld
|
- drd:ConflictingAccess
|
- obj:*/lib*/ld-*.so
|
-}
|
-
|
-#
|
-# Suppression patterns for libc.
|
-#
|
-
|
-# Suppress all data races where the topmost frame is inside libc.so. Although
|
-# this could hide some real data races, unfortunately this is the only way to
|
-# not report any false positives on stdio functions. The glibc functions
|
-# manipulating FILE objects use locking primitives that cannot be intercepted
|
-# easily. See also the definitions of _IO_lock_lock() etc. in the file
|
-# nptl/sysdeps/pthread/bits/stdio-lock.h in the glibc source tree.
|
-{
|
- drd-libc-stdio
|
- drd:ConflictingAccess
|
- obj:*/lib*/libc-*
|
-}
|
-{
|
- drd-libc-thread-cancellation-test
|
- drd:ConflictingAccess
|
- fun:write
|
-}
|
-{
|
- drd-libc-random
|
- drd:ConflictingAccess
|
- fun:random_r
|
- fun:random
|
-}
|
-
|
-#
|
-# Suppression patterns for libstdc++, the implementation of the standard C++
|
-# library included with the gcc compiler.
|
-#
|
-# Note: several versions of the libstdc++ library (4.2.2, 4.3.2, 4.4.0, 4.5.0
|
-# and their predecessors) contain an implementation of the std::string class
|
-# that triggers conflicting memory accesses. See also
|
-# http://gcc.gnu.org/bugzilla/show_bug.cgi?id=40518
|
-#
|
-
|
-# {
|
-# drd-libstdc++-std::string::string()
|
-# drd:ConflictingAccess
|
-# fun:_ZNSsC1ERKSs
|
-# }
|
-
|
-{
|
- drd-libstdc++-cxa_guard_release
|
- drd:CondErr
|
- fun:pthread_cond_broadcast@*
|
- fun:__cxa_guard_release
|
-}
|
-{
|
- drd-libstdc++-std::__ostream_insert()
|
- drd:ConflictingAccess
|
- fun:_ZSt16__ostream_insertIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_PKS3_l
|
- fun:_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc
|
-}
|
-{
|
- drd-libstdc++-std::ostream::_M_insert<long>()
|
- drd:ConflictingAccess
|
- ...
|
- fun:_ZNSo9_M_insertIlEERSoT_
|
-}
|
-
|
-
|
-#
|
-# Suppression patterns for libpthread.
|
-#
|
-
|
-{
|
- drd-libpthread-pthread_create
|
- drd:ConflictingAccess
|
- ...
|
- fun:pthread_create*
|
-}
|
-{
|
- drd-libpthread-pthread_join
|
- drd:ConflictingAccess
|
- fun:pthread_join
|
- fun:pthread_join
|
-}
|
-{
|
- drd-libpthread-__deallocate_stack
|
- drd:ConflictingAccess
|
- ...
|
- fun:__deallocate_stack
|
-}
|
-{
|
- drd-libpthread-__free_stacks
|
- drd:ConflictingAccess
|
- fun:__free_stacks
|
-}
|
-{
|
- drd-libpthread-__free_tcb
|
- drd:ConflictingAccess
|
- ...
|
- fun:__free_tcb
|
-}
|
-{
|
- drd-libpthread-__nptl_deallocate_tsd
|
- drd:ConflictingAccess
|
- fun:__nptl_deallocate_tsd
|
-}
|
-{
|
- drd-libpthread-pthread_detach
|
- drd:ConflictingAccess
|
- fun:pthread_detach
|
- fun:pthread_detach
|
-}
|
-{
|
- drd-libpthread-pthread_once
|
- drd:ConflictingAccess
|
- fun:pthread_once
|
-}
|
-{
|
- drd-libpthread-pthread_cancel_init
|
- drd:ConflictingAccess
|
- fun:pthread_cancel_init
|
-}
|
-{
|
- drd-libpthread-pthread_cancel
|
- drd:ConflictingAccess
|
- fun:pthread_cancel
|
- fun:pthread_cancel_intercept
|
-}
|
-{
|
- drd-libpthread-_Unwind_ForcedUnwind
|
- drd:ConflictingAccess
|
- ...
|
- fun:_Unwind_ForcedUnwind
|
-}
|
-{
|
- drd-libpthread-_Unwind_GetCFA
|
- drd:ConflictingAccess
|
- fun:_Unwind_GetCFA
|
-}
|
-{
|
- drd-libpthread-_Unwind_Resume
|
- drd:ConflictingAccess
|
- ...
|
- fun:_Unwind_Resume
|
-}
|
-{
|
- drd-libpthread-?
|
- drd:ConflictingAccess
|
- obj:*/lib/libgcc_s.so.1
|
-}
|
-{
|
- drd-libpthread-nanosleep
|
- drd:ConflictingAccess
|
- fun:nanosleep
|
-}
|
-
|
-#
|
-# Suppression patterns for libgomp.
|
-#
|
-
|
-# Unfortunately many statements in libgomp trigger conflicting accesses. It is
|
-# not clear to me which of these are safe and which ones not. See also
|
-# http://gcc.gnu.org/bugzilla/show_bug.cgi?id=40362
|
-{
|
- drd-libgomp
|
- drd:ConflictingAccess
|
- obj:/usr/lib*/libgomp.so*
|
-}
|
-
|
-#
|
-# Suppression patterns for libX11.
|
-#
|
-
|
-{
|
- drd-libX11-XCreateFontSet
|
- drd:CondErr
|
- fun:pthread_cond_init*
|
- fun:_XReply
|
- fun:XListFontsWithInfo
|
- obj:/usr/lib*/libX11.so*
|
- fun:XCreateOC
|
- fun:XCreateFontSet
|
-}
|
-
|
-#
|
-# Suppression patterns for libxcb.
|
-#
|
-
|
-{
|
- drd-libxcb-xcb_wait_for_reply
|
- drd:CondErr
|
- ...
|
- fun:pthread_cond_destroy*
|
- fun:xcb_wait_for_reply
|
-}
|
-
|
-#
|
-# Suppression patterns for libglib.
|
-#
|
-
|
-{
|
- drd-libglib-access-g_threads_got_initialized
|
- drd:ConflictingAccess
|
- ...
|
- fun:g_slice_alloc
|
- fun:g_ptr_array_sized_new
|
-}
|
-{
|
- drd-libglib-access-g_threads_got_initialized
|
- drd:ConflictingAccess
|
- ...
|
- fun:_ZN27QEventDispatcherGlibPrivateC1EP13_GMainContext
|
- fun:_ZN20QEventDispatcherGlibC1EP7QObject
|
- obj:/usr/lib*/libQtCore.so.4.*
|
- obj:/usr/lib*/libQtCore.so.4.*
|
-}
|
-{
|
- drd-libglib-access-g_mem_initialized
|
- drd:ConflictingAccess
|
- fun:g_malloc0
|
-}
|
-{
|
- drd-libglib-g_private_get_posix_impl
|
- drd:ConflictingAccess
|
- fun:g_private_get_posix_impl
|
-}
|
-{
|
- drd-libglib-g_private_set_posix_impl
|
- drd:ConflictingAccess
|
- fun:g_private_set_posix_impl
|
-}
|
-{
|
- drd-libglib-g_get_language_names
|
- drd:ConflictingAccess
|
- fun:g_slice_free_chain_with_offset
|
-}
|
-{
|
- drd-libglib-g_main_context_new
|
- drd:ConflictingAccess
|
- fun:fcntl
|
- obj:/usr/lib*/libglib-*.so*
|
- fun:g_main_context_new
|
-}
|
-
|
-#
|
-# Suppression patterns for libQtCore.
|
-#
|
-
|
-{
|
- drd-libQtCore-deref-that-calls-QThreadData-destructor
|
- drd:ConflictingAccess
|
- fun:_ZN11QThreadDataD1Ev
|
- obj:/usr/lib*/libQtCore.so.4.*
|
-}
|
-{
|
- drd-libQtCore-4.0/4.1-Q_GLOBAL_STATIC-connectionList
|
- drd:ConflictingAccess
|
- obj:/usr/lib*/libQtCore.so.4.*
|
- fun:_ZN11QMetaObject8activateEP7QObjectiiPPv
|
- fun:_ZN11QMetaObject8activateEP7QObjectPKS_iPPv
|
-}
|
-{
|
- drd-libQtCore-QObjectPrivate::clearGuards(QObject*)
|
- drd:ConflictingAccess
|
- fun:_ZN14QReadWriteLock12lockForWriteEv
|
- fun:_ZN14QObjectPrivate11clearGuardsEP7QObject
|
- fun:_ZN7QObjectD2Ev
|
-}
|
-{
|
- drd-libQtCore-QObjectPrivate::clearGuards(QObject*)
|
- drd:ConflictingAccess
|
- fun:_ZN14QReadWriteLock12lockForWriteEv
|
- fun:_ZN12QWriteLocker6relockEv
|
- fun:_ZN12QWriteLockerC1EP14QReadWriteLock
|
- fun:_ZN14QObjectPrivate11clearGuardsEP7QObject
|
- fun:_ZN7QObjectD2Ev
|
- fun:_ZN24QAbstractEventDispatcherD2Ev
|
- fun:_ZN20QEventDispatcherGlibD0Ev
|
-}
|
-{
|
- drd-libQtCore-QMutexPool::get(void const*)
|
- drd:ConflictingAccess
|
- fun:_ZN10QMutexPool3getEPKv
|
-}
|
-{
|
- drd-libQtCore-qt_gettime_is_monotonic()
|
- drd:ConflictingAccess
|
- fun:_Z23qt_gettime_is_monotonicv
|
-}
|
-
|
-#
|
-# Suppression patterns for libboost.
|
-#
|
-
|
-# Suppress the races on boost::once_flag::epoch and on
|
-# boost::detail::this_thread_epoch. See also the source file
|
-# boost/thread/pthread/once.hpp in the Boost source tree
|
-# (https://svn.boost.org/trac/boost/browser/trunk/boost/thread/pthread/once.hpp).
|
-{
|
- drd-libboost-boost::call_once<void (*)()>(boost::once_flag&, void (*)())
|
- drd:ConflictingAccess
|
- ...
|
- fun:_ZN5boost9call_onceIPFvvEEEvRNS_9once_flagET_
|
-}
|
-{
|
- drd-libboost-boost::detail::get_once_per_thread_epoch()
|
- drd:ConflictingAccess
|
- fun:_ZN5boost6detail25get_once_per_thread_epochEv
|
-}
|
-# Suppress the race reports on boost::detail::current_thread_tls_key. See also
|
-# https://svn.boost.org/trac/boost/ticket/3526 for more information about why
|
-# the access pattern of current_thread_tls_key is safe.
|
-{
|
- drd-libboost-boost::detail::get_current_thread_data()
|
- drd:ConflictingAccess
|
- ...
|
- fun:_ZN5boost6detail23get_current_thread_dataEv
|
-}
|
-{
|
- drd-libboost-boost::detail::set_current_thread_data(boost::detail::thread_data_base*)
|
- drd:ConflictingAccess
|
- ...
|
- fun:_ZN5boost6detail23set_current_thread_dataEPNS0_16thread_data_baseE
|
-}
|
Index: valgrind-3.17.0/glibc-2.X-drd.supp.in
|
===================================================================
|
--- /dev/null
|
+++ valgrind-3.17.0/glibc-2.X-drd.supp.in
|
@@ -0,0 +1,332 @@
|
+# IMPORTANT: DO NOT EDIT glibc-2.X-drd.supp, as it is as a generated
|
+# file. Instead edit glibc-2.X-drd.supp.in.
|
+#
|
+# Suppression patterns for ld, the dynamic loader.
|
+#
|
+
|
+# Suppress all data races triggered by ld.
|
+{
|
+ drd-ld
|
+ drd:ConflictingAccess
|
+ obj:*/lib*/ld*.so*
|
+}
|
+
|
+#
|
+# Suppression patterns for libc.
|
+#
|
+
|
+# Suppress all data races where the topmost frame is inside libc.so. Although
|
+# this could hide some real data races, unfortunately this is the only way to
|
+# not report any false positives on stdio functions. The glibc functions
|
+# manipulating FILE objects use locking primitives that cannot be intercepted
|
+# easily. See also the definitions of _IO_lock_lock() etc. in the file
|
+# nptl/sysdeps/pthread/bits/stdio-lock.h in the glibc source tree.
|
+{
|
+ drd-libc-stdio
|
+ drd:ConflictingAccess
|
+ obj:@GLIBC_LIBC_PATH@
|
+}
|
+{
|
+ drd-libc-thread-cancellation-test
|
+ drd:ConflictingAccess
|
+ fun:write
|
+}
|
+{
|
+ drd-libc-random
|
+ drd:ConflictingAccess
|
+ fun:random_r
|
+ fun:random
|
+}
|
+
|
+#
|
+# Suppression patterns for libstdc++, the implementation of the standard C++
|
+# library included with the gcc compiler.
|
+#
|
+# Note: several versions of the libstdc++ library (4.2.2, 4.3.2, 4.4.0, 4.5.0
|
+# and their predecessors) contain an implementation of the std::string class
|
+# that triggers conflicting memory accesses. See also
|
+# http://gcc.gnu.org/bugzilla/show_bug.cgi?id=40518
|
+#
|
+
|
+# {
|
+# drd-libstdc++-std::string::string()
|
+# drd:ConflictingAccess
|
+# fun:_ZNSsC1ERKSs
|
+# }
|
+
|
+{
|
+ drd-libstdc++-cxa_guard_release
|
+ drd:CondErr
|
+ fun:pthread_cond_broadcast@*
|
+ fun:__cxa_guard_release
|
+}
|
+{
|
+ drd-libstdc++-std::__ostream_insert()
|
+ drd:ConflictingAccess
|
+ fun:_ZSt16__ostream_insertIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_PKS3_l
|
+ fun:_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc
|
+}
|
+{
|
+ drd-libstdc++-std::ostream::_M_insert<long>()
|
+ drd:ConflictingAccess
|
+ ...
|
+ fun:_ZNSo9_M_insertIlEERSoT_
|
+}
|
+
|
+
|
+#
|
+# Suppression patterns for libpthread.
|
+#
|
+
|
+{
|
+ drd-libpthread-pthread_create
|
+ drd:ConflictingAccess
|
+ ...
|
+ fun:pthread_create*
|
+}
|
+{
|
+ drd-libpthread-pthread_join
|
+ drd:ConflictingAccess
|
+ fun:pthread_join
|
+ fun:pthread_join
|
+}
|
+{
|
+ drd-libpthread-__deallocate_stack
|
+ drd:ConflictingAccess
|
+ ...
|
+ fun:__deallocate_stack
|
+}
|
+{
|
+ drd-libpthread-__free_stacks
|
+ drd:ConflictingAccess
|
+ fun:__free_stacks
|
+}
|
+{
|
+ drd-libpthread-__free_tcb
|
+ drd:ConflictingAccess
|
+ ...
|
+ fun:__free_tcb
|
+}
|
+{
|
+ drd-libpthread-__nptl_deallocate_tsd
|
+ drd:ConflictingAccess
|
+ fun:__nptl_deallocate_tsd
|
+}
|
+{
|
+ drd-libpthread-pthread_detach
|
+ drd:ConflictingAccess
|
+ fun:pthread_detach
|
+ fun:pthread_detach
|
+}
|
+{
|
+ drd-libpthread-pthread_once
|
+ drd:ConflictingAccess
|
+ fun:pthread_once
|
+}
|
+{
|
+ drd-libpthread-pthread_cancel_init
|
+ drd:ConflictingAccess
|
+ fun:pthread_cancel_init
|
+}
|
+{
|
+ drd-libpthread-pthread_cancel
|
+ drd:ConflictingAccess
|
+ fun:pthread_cancel
|
+ fun:pthread_cancel_intercept
|
+}
|
+{
|
+ drd-libpthread-_Unwind_ForcedUnwind
|
+ drd:ConflictingAccess
|
+ ...
|
+ fun:_Unwind_ForcedUnwind
|
+}
|
+{
|
+ drd-libpthread-_Unwind_GetCFA
|
+ drd:ConflictingAccess
|
+ fun:_Unwind_GetCFA
|
+}
|
+{
|
+ drd-libpthread-_Unwind_Resume
|
+ drd:ConflictingAccess
|
+ ...
|
+ fun:_Unwind_Resume
|
+}
|
+{
|
+ drd-libpthread-?
|
+ drd:ConflictingAccess
|
+ obj:*/lib/libgcc_s.so.1
|
+}
|
+{
|
+ drd-libpthread-nanosleep
|
+ drd:ConflictingAccess
|
+ fun:nanosleep
|
+}
|
+
|
+#
|
+# Suppression patterns for libgomp.
|
+#
|
+
|
+# Unfortunately many statements in libgomp trigger conflicting accesses. It is
|
+# not clear to me which of these are safe and which ones not. See also
|
+# http://gcc.gnu.org/bugzilla/show_bug.cgi?id=40362
|
+{
|
+ drd-libgomp
|
+ drd:ConflictingAccess
|
+ obj:/usr/lib*/libgomp.so*
|
+}
|
+
|
+#
|
+# Suppression patterns for libX11.
|
+#
|
+
|
+{
|
+ drd-libX11-XCreateFontSet
|
+ drd:CondErr
|
+ fun:pthread_cond_init*
|
+ fun:_XReply
|
+ fun:XListFontsWithInfo
|
+ obj:/usr/lib*/libX11.so*
|
+ fun:XCreateOC
|
+ fun:XCreateFontSet
|
+}
|
+
|
+#
|
+# Suppression patterns for libxcb.
|
+#
|
+
|
+{
|
+ drd-libxcb-xcb_wait_for_reply
|
+ drd:CondErr
|
+ ...
|
+ fun:pthread_cond_destroy*
|
+ fun:xcb_wait_for_reply
|
+}
|
+
|
+#
|
+# Suppression patterns for libglib.
|
+#
|
+
|
+{
|
+ drd-libglib-access-g_threads_got_initialized
|
+ drd:ConflictingAccess
|
+ ...
|
+ fun:g_slice_alloc
|
+ fun:g_ptr_array_sized_new
|
+}
|
+{
|
+ drd-libglib-access-g_threads_got_initialized
|
+ drd:ConflictingAccess
|
+ ...
|
+ fun:_ZN27QEventDispatcherGlibPrivateC1EP13_GMainContext
|
+ fun:_ZN20QEventDispatcherGlibC1EP7QObject
|
+ obj:/usr/lib*/libQtCore.so.4.*
|
+ obj:/usr/lib*/libQtCore.so.4.*
|
+}
|
+{
|
+ drd-libglib-access-g_mem_initialized
|
+ drd:ConflictingAccess
|
+ fun:g_malloc0
|
+}
|
+{
|
+ drd-libglib-g_private_get_posix_impl
|
+ drd:ConflictingAccess
|
+ fun:g_private_get_posix_impl
|
+}
|
+{
|
+ drd-libglib-g_private_set_posix_impl
|
+ drd:ConflictingAccess
|
+ fun:g_private_set_posix_impl
|
+}
|
+{
|
+ drd-libglib-g_get_language_names
|
+ drd:ConflictingAccess
|
+ fun:g_slice_free_chain_with_offset
|
+}
|
+{
|
+ drd-libglib-g_main_context_new
|
+ drd:ConflictingAccess
|
+ fun:fcntl
|
+ obj:/usr/lib*/libglib-*.so*
|
+ fun:g_main_context_new
|
+}
|
+
|
+#
|
+# Suppression patterns for libQtCore.
|
+#
|
+
|
+{
|
+ drd-libQtCore-deref-that-calls-QThreadData-destructor
|
+ drd:ConflictingAccess
|
+ fun:_ZN11QThreadDataD1Ev
|
+ obj:/usr/lib*/libQtCore.so.4.*
|
+}
|
+{
|
+ drd-libQtCore-4.0/4.1-Q_GLOBAL_STATIC-connectionList
|
+ drd:ConflictingAccess
|
+ obj:/usr/lib*/libQtCore.so.4.*
|
+ fun:_ZN11QMetaObject8activateEP7QObjectiiPPv
|
+ fun:_ZN11QMetaObject8activateEP7QObjectPKS_iPPv
|
+}
|
+{
|
+ drd-libQtCore-QObjectPrivate::clearGuards(QObject*)
|
+ drd:ConflictingAccess
|
+ fun:_ZN14QReadWriteLock12lockForWriteEv
|
+ fun:_ZN14QObjectPrivate11clearGuardsEP7QObject
|
+ fun:_ZN7QObjectD2Ev
|
+}
|
+{
|
+ drd-libQtCore-QObjectPrivate::clearGuards(QObject*)
|
+ drd:ConflictingAccess
|
+ fun:_ZN14QReadWriteLock12lockForWriteEv
|
+ fun:_ZN12QWriteLocker6relockEv
|
+ fun:_ZN12QWriteLockerC1EP14QReadWriteLock
|
+ fun:_ZN14QObjectPrivate11clearGuardsEP7QObject
|
+ fun:_ZN7QObjectD2Ev
|
+ fun:_ZN24QAbstractEventDispatcherD2Ev
|
+ fun:_ZN20QEventDispatcherGlibD0Ev
|
+}
|
+{
|
+ drd-libQtCore-QMutexPool::get(void const*)
|
+ drd:ConflictingAccess
|
+ fun:_ZN10QMutexPool3getEPKv
|
+}
|
+{
|
+ drd-libQtCore-qt_gettime_is_monotonic()
|
+ drd:ConflictingAccess
|
+ fun:_Z23qt_gettime_is_monotonicv
|
+}
|
+
|
+#
|
+# Suppression patterns for libboost.
|
+#
|
+
|
+# Suppress the races on boost::once_flag::epoch and on
|
+# boost::detail::this_thread_epoch. See also the source file
|
+# boost/thread/pthread/once.hpp in the Boost source tree
|
+# (https://svn.boost.org/trac/boost/browser/trunk/boost/thread/pthread/once.hpp).
|
+{
|
+ drd-libboost-boost::call_once<void (*)()>(boost::once_flag&, void (*)())
|
+ drd:ConflictingAccess
|
+ ...
|
+ fun:_ZN5boost9call_onceIPFvvEEEvRNS_9once_flagET_
|
+}
|
+{
|
+ drd-libboost-boost::detail::get_once_per_thread_epoch()
|
+ drd:ConflictingAccess
|
+ fun:_ZN5boost6detail25get_once_per_thread_epochEv
|
+}
|
+# Suppress the race reports on boost::detail::current_thread_tls_key. See also
|
+# https://svn.boost.org/trac/boost/ticket/3526 for more information about why
|
+# the access pattern of current_thread_tls_key is safe.
|
+{
|
+ drd-libboost-boost::detail::get_current_thread_data()
|
+ drd:ConflictingAccess
|
+ ...
|
+ fun:_ZN5boost6detail23get_current_thread_dataEv
|
+}
|
+{
|
+ drd-libboost-boost::detail::set_current_thread_data(boost::detail::thread_data_base*)
|
+ drd:ConflictingAccess
|
+ ...
|
+ fun:_ZN5boost6detail23set_current_thread_dataEPNS0_16thread_data_baseE
|
+}
|
Index: valgrind-3.17.0/glibc-2.34567-NPTL-helgrind.supp
|
===================================================================
|
--- valgrind-3.17.0.orig/glibc-2.34567-NPTL-helgrind.supp
|
+++ /dev/null
|
@@ -1,301 +0,0 @@
|
-
|
-# FIXME 22 Jan 09: helgrind-glibc2X-005 overlaps with a lot of
|
-# other stuff. They should be removed.
|
-
|
-##----------------------------------------------------------------------##
|
-# Suppressions for the Helgrind tool when using
|
-# a glibc-2.{3,4,5,6,7,8,9} system
|
-
|
-####################################################
|
-# glibc-2.X specific
|
-# These are generic cover-alls which catch a lot of stuff
|
-# in various combinations of ld, libc and libpthread
|
-#
|
-# Note this is heavyhanded and not very clever:
|
-#
|
-# - suppress anything that has its top frame in ld.so
|
-# That's fine, since it's mostly dynamic linking stuff,
|
-# which has various deliberate (harmless) races
|
-#
|
-# - suppress anything that has its top frame in libc.so.
|
-# This really isn't clever, since it could hide some
|
-# legitimate races. But the problem is, if we don't do
|
-# this, then loads of errors to do with stdio are reported, because
|
-# H fails to see glibc's internal locking/unlocking of FILE*s
|
-# as required by POSIX. A better solution is needed.
|
-#
|
-# - some of the stdio functions in newer glibc manipulate stdio
|
-# FILE*s state through mempcpy, which we intercept, so we also need
|
-# to suppress such manipulations.
|
-
|
-#{
|
-# helgrind-glibc2X-001
|
-# Helgrind:Race
|
-# obj:*/lib*/ld-2.*so*
|
-#}
|
-
|
-# helgrind-glibc2X-002 was merged into helgrind-glibc2X-001
|
-
|
-# helgrind-glibc2X-003 was merged into helgrind-glibc2X-001
|
-
|
-{
|
- helgrind-glibc2X-004
|
- Helgrind:Race
|
- obj:*/lib*/libc-2.*so*
|
-}
|
-
|
-{
|
- helgrind-glibc-io-xsputn-mempcpy
|
- Helgrind:Race
|
- fun:__GI_mempcpy
|
- fun:_IO_*xsputn*
|
- obj:*/lib*/libc-2.*so*
|
-}
|
-
|
-{
|
- helgrind-glibc2X-005
|
- Helgrind:Race
|
- obj:*/lib*/libpthread-2.*so*
|
-}
|
-
|
-# helgrind-glibc2X-006 was merged into helgrind-glibc2X-005
|
-
|
-# helgrind-glibc2X-007 was merged into helgrind-glibc2X-001
|
-
|
-# helgrind-glibc2X-008 was merged into helgrind-glibc2X-004
|
-
|
-# helgrind-glibc2X-009 was merged into helgrind-glibc2X-004
|
-
|
-# helgrind-glibc2X-010 was merged into helgrind-glibc2X-001
|
-
|
-# helgrind-glibc2X-011 was merged into helgrind-glibc2X-004
|
-
|
-# helgrind-glibc2X-012 was merged into helgrind-glibc2X-001
|
-
|
-# helgrind-glibc2X-013 was merged into helgrind-glibc2X-001
|
-
|
-# helgrind-glibc2X-014 was merged into helgrind-glibc2X-001
|
-
|
-# helgrind-glibc2X-015 was merged into helgrind-glibc2X-004
|
-
|
-# helgrind-glibc2X-016 was merged into helgrind-glibc2X-004
|
-
|
-# These are very ugly. They are needed to suppress errors inside (eg)
|
-# NPTL's pthread_cond_signal. Why only one stack frame -- at least we
|
-# should see the wrapper calling the real functions, right?
|
-# Unfortunately, no: the real functions are handwritten assembly (in
|
-# the glibc-2.5 sources) and does not create a proper stack frame.
|
-# Therefore it's only one level of unwinding before we're back out in
|
-# user code rather than the 2 levels you'd expect.
|
-{
|
- helgrind-glibc2X-101
|
- Helgrind:Race
|
- obj:*/lib*/libpthread-2.*so*
|
- fun:pthread_*
|
-}
|
-{
|
- helgrind-glibc2X-102
|
- Helgrind:Race
|
- fun:mythread_wrapper
|
- obj:*/lib*/libpthread-2.*so*
|
-}
|
-{
|
- helgrind-glibc2X-103
|
- Helgrind:Race
|
- fun:pthread_cond_*@@GLIBC_2.*
|
-}
|
-{
|
- helgrind-glibc2X-104
|
- Helgrind:Race
|
- fun:__lll_mutex_*
|
-}
|
-{
|
- helgrind-glibc2X-105
|
- Helgrind:Race
|
- fun:pthread_rwlock_*lock*
|
-}
|
-{
|
- helgrind-glibc2X-106
|
- Helgrind:Race
|
- fun:__lll_lock_wait
|
-}
|
-{
|
- helgrind-glibc2X-107
|
- Helgrind:Race
|
- obj:*/lib*/libpthread-2.*so*
|
- fun:sem_*
|
-}
|
-{
|
- helgrind-glibc2X-108
|
- Helgrind:Race
|
- fun:clone
|
-}
|
-{
|
- helgrind-glibc2X-109
|
- Helgrind:Race
|
- fun:start_thread
|
-}
|
-{
|
- helgrind-glibc2X-110
|
- Helgrind:Race
|
- obj:*/lib*/libc-2.*so*
|
- fun:pthread_*
|
-}
|
-{
|
- helgrind-glibc2X-111
|
- Helgrind:Race
|
- fun:__lll_*lock_*
|
-}
|
-{
|
- helgrind-glibc2X-113
|
- Helgrind:Race
|
- fun:pthread_barrier_wait*
|
-}
|
-
|
-
|
-####################################################
|
-# qt4 specific (GNU mangling)
|
-#
|
-{
|
- helgrind-qt4---QMutex::lock()-QMutex::lock()
|
- Helgrind:Race
|
- ...
|
- fun:_ZN6QMutex4lockEv
|
- fun:_ZN6QMutex4lockEv
|
-}
|
-
|
-{
|
- helgrind-qt4---QMutex::unlock()-QMutex::unlock()
|
- Helgrind:Race
|
- ...
|
- fun:_ZN6QMutex6unlockEv
|
- fun:_ZN6QMutex6unlockEv
|
-}
|
-
|
-{
|
- helgrind-qt4---pthread_setspecific-QThreadPrivate::start(void*)
|
- Helgrind:Race
|
- fun:pthread_setspecific
|
- fun:_ZN14QThreadPrivate5startEPv
|
-}
|
-
|
-
|
-####################################################
|
-# Other stuff.
|
-#
|
-# pthread_exit apparently calls some kind of unwind
|
-# mechanism - maybe to remove some number of frames
|
-# from the thread's stack, so as to get back to the
|
-# outermost frame for the thread? Anyway..
|
-
|
-{
|
- helgrind---*Unwind*-...-pthread_exit
|
- Helgrind:Race
|
- fun:*Unwind*
|
- ...
|
- fun:pthread_exit
|
-}
|
-
|
-{
|
- helgrind---...-*Unwind*-*pthread_unwind*
|
- Helgrind:Race
|
- ...
|
- fun:*Unwind*
|
- fun:*pthread_unwind*
|
-}
|
-
|
-{
|
- helgrind---...-*Unwind*-*pthread_unwind*
|
- Helgrind:Race
|
- ...
|
- fun:_Unwind*
|
- ...
|
- fun:_Unwind_Backtrace
|
-}
|
-
|
-
|
-
|
-
|
-####################################################
|
-# To do with thread stack allocation and deallocation?
|
-#
|
-{
|
- helgrind---free_stacks-__deallocate_stack
|
- Helgrind:Race
|
- fun:free_stacks
|
- fun:__deallocate_stack
|
-}
|
-
|
-{
|
- helgrind---__deallocate_stack-start_thread-clone
|
- Helgrind:Race
|
- fun:__deallocate_stack
|
- fun:start_thread
|
- fun:clone
|
-}
|
-
|
-
|
-####################################################
|
-# To do with pthread_{set,get}specific
|
-#
|
-{
|
- helgrind---pthread_setspecific
|
- Helgrind:Race
|
- fun:pthread_setspecific
|
-}
|
-
|
-{
|
- helgrind---pthread_getspecific
|
- Helgrind:Race
|
- fun:pthread_getspecific
|
-}
|
-
|
-
|
-####################################################
|
-# To do with dynamic linking
|
-#
|
-# helgrind---ld.so-...-dlsym was merged into helgrind-glibc2X-001
|
-
|
-{
|
- helgrind---_dl_allocate_tls
|
- Helgrind:Race
|
- fun:mempcpy
|
- fun:_dl_allocate_tls_init
|
- ...
|
- fun:pthread_create@@GLIBC_2.2*
|
- fun:pthread_create_WRK
|
- fun:pthread_create@*
|
-}
|
-
|
-{
|
- helgrind---_dl_allocate_tls2
|
- Helgrind:Race
|
- fun:memcpy
|
- fun:__mempcpy_inline
|
- fun:_dl_allocate_tls_init
|
- ...
|
- fun:pthread_create@@GLIBC_2.2*
|
- fun:pthread_create_WRK
|
- fun:pthread_create@*
|
-}
|
-
|
-####################################################
|
-# To do with GNU libgomp
|
-#
|
-{
|
- helgrind---libgomp43-1
|
- Helgrind:Race
|
- fun:gomp_ordered_sync
|
-}
|
-
|
-{
|
- helgrind---libgomp43-1
|
- Helgrind:Race
|
- fun:gomp_ordered_next
|
-}
|
-
|
-{
|
- helgrind---libgomp43-1
|
- Helgrind:Race
|
- fun:gomp_ordered_last
|
-}
|
Index: valgrind-3.17.0/glibc-2.X-helgrind.supp.in
|
===================================================================
|
--- /dev/null
|
+++ valgrind-3.17.0/glibc-2.X-helgrind.supp.in
|
@@ -0,0 +1,303 @@
|
+# IMPORTANT: DO NOT EDIT glibc-2.X-helgrind.supp, as it is as a generated
|
+# file. Instead edit glibc-2.X-helgrind.supp.in.
|
+
|
+# FIXME 22 Jan 09: helgrind-glibc2X-005 overlaps with a lot of
|
+# other stuff. They should be removed.
|
+
|
+##----------------------------------------------------------------------##
|
+# Suppressions for the Helgrind tool when using
|
+# a glibc-2.{3,4,5,6,7,8,9} system
|
+
|
+####################################################
|
+# glibc-2.X specific
|
+# These are generic cover-alls which catch a lot of stuff
|
+# in various combinations of ld, libc and libpthread
|
+#
|
+# Note this is heavyhanded and not very clever:
|
+#
|
+# - suppress anything that has its top frame in ld.so
|
+# That's fine, since it's mostly dynamic linking stuff,
|
+# which has various deliberate (harmless) races
|
+#
|
+# - suppress anything that has its top frame in libc.so.
|
+# This really isn't clever, since it could hide some
|
+# legitimate races. But the problem is, if we don't do
|
+# this, then loads of errors to do with stdio are reported, because
|
+# H fails to see glibc's internal locking/unlocking of FILE*s
|
+# as required by POSIX. A better solution is needed.
|
+#
|
+# - some of the stdio functions in newer glibc manipulate stdio
|
+# FILE*s state through mempcpy, which we intercept, so we also need
|
+# to suppress such manipulations.
|
+
|
+#{
|
+# helgrind-glibc2X-001
|
+# Helgrind:Race
|
+# obj:*/lib*/ld-2.*so*
|
+#}
|
+
|
+# helgrind-glibc2X-002 was merged into helgrind-glibc2X-001
|
+
|
+# helgrind-glibc2X-003 was merged into helgrind-glibc2X-001
|
+
|
+{
|
+ helgrind-glibc2X-004
|
+ Helgrind:Race
|
+ obj:@GLIBC_LIBC_PATH@
|
+}
|
+
|
+{
|
+ helgrind-glibc-io-xsputn-mempcpy
|
+ Helgrind:Race
|
+ fun:__GI_mempcpy
|
+ fun:_IO_*xsputn*
|
+ obj:@GLIBC_LIBC_PATH@
|
+}
|
+
|
+{
|
+ helgrind-glibc2X-005
|
+ Helgrind:Race
|
+ obj:@GLIBC_LIBPTHREAD_PATH@
|
+}
|
+
|
+# helgrind-glibc2X-006 was merged into helgrind-glibc2X-005
|
+
|
+# helgrind-glibc2X-007 was merged into helgrind-glibc2X-001
|
+
|
+# helgrind-glibc2X-008 was merged into helgrind-glibc2X-004
|
+
|
+# helgrind-glibc2X-009 was merged into helgrind-glibc2X-004
|
+
|
+# helgrind-glibc2X-010 was merged into helgrind-glibc2X-001
|
+
|
+# helgrind-glibc2X-011 was merged into helgrind-glibc2X-004
|
+
|
+# helgrind-glibc2X-012 was merged into helgrind-glibc2X-001
|
+
|
+# helgrind-glibc2X-013 was merged into helgrind-glibc2X-001
|
+
|
+# helgrind-glibc2X-014 was merged into helgrind-glibc2X-001
|
+
|
+# helgrind-glibc2X-015 was merged into helgrind-glibc2X-004
|
+
|
+# helgrind-glibc2X-016 was merged into helgrind-glibc2X-004
|
+
|
+# These are very ugly. They are needed to suppress errors inside (eg)
|
+# NPTL's pthread_cond_signal. Why only one stack frame -- at least we
|
+# should see the wrapper calling the real functions, right?
|
+# Unfortunately, no: the real functions are handwritten assembly (in
|
+# the glibc-2.5 sources) and does not create a proper stack frame.
|
+# Therefore it's only one level of unwinding before we're back out in
|
+# user code rather than the 2 levels you'd expect.
|
+{
|
+ helgrind-glibc2X-101
|
+ Helgrind:Race
|
+ obj:@GLIBC_LIBPTHREAD_PATH@
|
+ fun:pthread_*
|
+}
|
+{
|
+ helgrind-glibc2X-102
|
+ Helgrind:Race
|
+ fun:mythread_wrapper
|
+ obj:@GLIBC_LIBPTHREAD_PATH@
|
+}
|
+{
|
+ helgrind-glibc2X-103
|
+ Helgrind:Race
|
+ fun:pthread_cond_*@@GLIBC_2.*
|
+}
|
+{
|
+ helgrind-glibc2X-104
|
+ Helgrind:Race
|
+ fun:__lll_mutex_*
|
+}
|
+{
|
+ helgrind-glibc2X-105
|
+ Helgrind:Race
|
+ fun:pthread_rwlock_*lock*
|
+}
|
+{
|
+ helgrind-glibc2X-106
|
+ Helgrind:Race
|
+ fun:__lll_lock_wait
|
+}
|
+{
|
+ helgrind-glibc2X-107
|
+ Helgrind:Race
|
+ obj:@GLIBC_LIBPTHREAD_PATH@
|
+ fun:sem_*
|
+}
|
+{
|
+ helgrind-glibc2X-108
|
+ Helgrind:Race
|
+ fun:clone
|
+}
|
+{
|
+ helgrind-glibc2X-109
|
+ Helgrind:Race
|
+ fun:start_thread
|
+}
|
+{
|
+ helgrind-glibc2X-110
|
+ Helgrind:Race
|
+ obj:@GLIBC_LIBC_PATH@
|
+ fun:pthread_*
|
+}
|
+{
|
+ helgrind-glibc2X-111
|
+ Helgrind:Race
|
+ fun:__lll_*lock_*
|
+}
|
+{
|
+ helgrind-glibc2X-113
|
+ Helgrind:Race
|
+ fun:pthread_barrier_wait*
|
+}
|
+
|
+
|
+####################################################
|
+# qt4 specific (GNU mangling)
|
+#
|
+{
|
+ helgrind-qt4---QMutex::lock()-QMutex::lock()
|
+ Helgrind:Race
|
+ ...
|
+ fun:_ZN6QMutex4lockEv
|
+ fun:_ZN6QMutex4lockEv
|
+}
|
+
|
+{
|
+ helgrind-qt4---QMutex::unlock()-QMutex::unlock()
|
+ Helgrind:Race
|
+ ...
|
+ fun:_ZN6QMutex6unlockEv
|
+ fun:_ZN6QMutex6unlockEv
|
+}
|
+
|
+{
|
+ helgrind-qt4---pthread_setspecific-QThreadPrivate::start(void*)
|
+ Helgrind:Race
|
+ fun:pthread_setspecific
|
+ fun:_ZN14QThreadPrivate5startEPv
|
+}
|
+
|
+
|
+####################################################
|
+# Other stuff.
|
+#
|
+# pthread_exit apparently calls some kind of unwind
|
+# mechanism - maybe to remove some number of frames
|
+# from the thread's stack, so as to get back to the
|
+# outermost frame for the thread? Anyway..
|
+
|
+{
|
+ helgrind---*Unwind*-...-pthread_exit
|
+ Helgrind:Race
|
+ fun:*Unwind*
|
+ ...
|
+ fun:pthread_exit
|
+}
|
+
|
+{
|
+ helgrind---...-*Unwind*-*pthread_unwind*
|
+ Helgrind:Race
|
+ ...
|
+ fun:*Unwind*
|
+ fun:*pthread_unwind*
|
+}
|
+
|
+{
|
+ helgrind---...-*Unwind*-*pthread_unwind*
|
+ Helgrind:Race
|
+ ...
|
+ fun:_Unwind*
|
+ ...
|
+ fun:_Unwind_Backtrace
|
+}
|
+
|
+
|
+
|
+
|
+####################################################
|
+# To do with thread stack allocation and deallocation?
|
+#
|
+{
|
+ helgrind---free_stacks-__deallocate_stack
|
+ Helgrind:Race
|
+ fun:free_stacks
|
+ fun:__deallocate_stack
|
+}
|
+
|
+{
|
+ helgrind---__deallocate_stack-start_thread-clone
|
+ Helgrind:Race
|
+ fun:__deallocate_stack
|
+ fun:start_thread
|
+ fun:clone
|
+}
|
+
|
+
|
+####################################################
|
+# To do with pthread_{set,get}specific
|
+#
|
+{
|
+ helgrind---pthread_setspecific
|
+ Helgrind:Race
|
+ fun:pthread_setspecific
|
+}
|
+
|
+{
|
+ helgrind---pthread_getspecific
|
+ Helgrind:Race
|
+ fun:pthread_getspecific
|
+}
|
+
|
+
|
+####################################################
|
+# To do with dynamic linking
|
+#
|
+# helgrind---ld.so-...-dlsym was merged into helgrind-glibc2X-001
|
+
|
+{
|
+ helgrind---_dl_allocate_tls
|
+ Helgrind:Race
|
+ fun:mempcpy
|
+ fun:_dl_allocate_tls_init
|
+ ...
|
+ fun:pthread_create@@GLIBC_2.2*
|
+ fun:pthread_create_WRK
|
+ fun:pthread_create@*
|
+}
|
+
|
+{
|
+ helgrind---_dl_allocate_tls2
|
+ Helgrind:Race
|
+ fun:memcpy
|
+ fun:__mempcpy_inline
|
+ fun:_dl_allocate_tls_init
|
+ ...
|
+ fun:pthread_create@@GLIBC_2.2*
|
+ fun:pthread_create_WRK
|
+ fun:pthread_create@*
|
+}
|
+
|
+####################################################
|
+# To do with GNU libgomp
|
+#
|
+{
|
+ helgrind---libgomp43-1
|
+ Helgrind:Race
|
+ fun:gomp_ordered_sync
|
+}
|
+
|
+{
|
+ helgrind---libgomp43-1
|
+ Helgrind:Race
|
+ fun:gomp_ordered_next
|
+}
|
+
|
+{
|
+ helgrind---libgomp43-1
|
+ Helgrind:Race
|
+ fun:gomp_ordered_last
|
+}
|