diff options
Diffstat (limited to 'meta/recipes-devtools/valgrind/valgrind/a1364805fc74b5690f763033c0c9b43f27613572.patch')
-rw-r--r-- | meta/recipes-devtools/valgrind/valgrind/a1364805fc74b5690f763033c0c9b43f27613572.patch | 1422 |
1 files changed, 1422 insertions, 0 deletions
diff --git a/meta/recipes-devtools/valgrind/valgrind/a1364805fc74b5690f763033c0c9b43f27613572.patch b/meta/recipes-devtools/valgrind/valgrind/a1364805fc74b5690f763033c0c9b43f27613572.patch new file mode 100644 index 0000000000..ece88406c6 --- /dev/null +++ b/meta/recipes-devtools/valgrind/valgrind/a1364805fc74b5690f763033c0c9b43f27613572.patch @@ -0,0 +1,1422 @@ +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 ++} |