This is another patch (well, I've polished it a bit) that was sitting in my local tree for some time. I've not enabled the ggc-common.c code (I merely want to get rid of the false possitives).
Queued for 4.10 unless I'm told otherwise. Richard. 2014-03-18 Richard Biener <rguent...@suse.de> * configure.ac: Do valgrind header checks unconditionally. Add --enable-valgrind-annotations. * system.h: Guard valgrind header inclusion with ENABLE_VALGRIND_ANNOTATIONS instead of ENABLE_VALGRIND_CHECKING. * alloc-pool.c (pool_alloc, pool_free): Use ENABLE_VALGRIND_ANNOTATIONS instead of ENABLE_VALGRIND_CHECKING to guard possibly dead code. * config.in: Regenerated. * configure: Likewise. Index: gcc/configure.ac =================================================================== *** gcc/configure.ac (revision 208642) --- gcc/configure.ac (working copy) *************** dnl # an if statement. This was the sou *** 512,538 **** dnl # in converting to autoconf 2.5x! AC_CHECK_HEADER(valgrind.h, have_valgrind_h=yes, have_valgrind_h=no) ! if test x$ac_valgrind_checking != x ; then ! # It is certainly possible that there's valgrind but no valgrind.h. ! # GCC relies on making annotations so we must have both. ! AC_MSG_CHECKING(for VALGRIND_DISCARD in <valgrind/memcheck.h>) ! AC_PREPROC_IFELSE([AC_LANG_SOURCE( ! [[#include <valgrind/memcheck.h> #ifndef VALGRIND_DISCARD #error VALGRIND_DISCARD not defined #endif]])], [gcc_cv_header_valgrind_memcheck_h=yes], [gcc_cv_header_valgrind_memcheck_h=no]) ! AC_MSG_RESULT($gcc_cv_header_valgrind_memcheck_h) ! AC_MSG_CHECKING(for VALGRIND_DISCARD in <memcheck.h>) ! AC_PREPROC_IFELSE([AC_LANG_SOURCE( ! [[#include <memcheck.h> #ifndef VALGRIND_DISCARD #error VALGRIND_DISCARD not defined #endif]])], [gcc_cv_header_memcheck_h=yes], [gcc_cv_header_memcheck_h=no]) ! AC_MSG_RESULT($gcc_cv_header_memcheck_h) AM_PATH_PROG_WITH_TEST(valgrind_path, valgrind, [$ac_dir/$ac_word --version | grep valgrind- >/dev/null 2>&1]) if test "x$valgrind_path" = "x" \ --- 512,547 ---- dnl # in converting to autoconf 2.5x! AC_CHECK_HEADER(valgrind.h, have_valgrind_h=yes, have_valgrind_h=no) ! # It is certainly possible that there's valgrind but no valgrind.h. ! # GCC relies on making annotations so we must have both. ! AC_MSG_CHECKING(for VALGRIND_DISCARD in <valgrind/memcheck.h>) ! AC_PREPROC_IFELSE([AC_LANG_SOURCE( ! [[#include <valgrind/memcheck.h> #ifndef VALGRIND_DISCARD #error VALGRIND_DISCARD not defined #endif]])], [gcc_cv_header_valgrind_memcheck_h=yes], [gcc_cv_header_valgrind_memcheck_h=no]) ! AC_MSG_RESULT($gcc_cv_header_valgrind_memcheck_h) ! AC_MSG_CHECKING(for VALGRIND_DISCARD in <memcheck.h>) ! AC_PREPROC_IFELSE([AC_LANG_SOURCE( ! [[#include <memcheck.h> #ifndef VALGRIND_DISCARD #error VALGRIND_DISCARD not defined #endif]])], [gcc_cv_header_memcheck_h=yes], [gcc_cv_header_memcheck_h=no]) ! AC_MSG_RESULT($gcc_cv_header_memcheck_h) ! if test $gcc_cv_header_valgrind_memcheck_h = yes; then ! AC_DEFINE(HAVE_VALGRIND_MEMCHECK_H, 1, ! [Define if valgrind's valgrind/memcheck.h header is installed.]) ! fi ! if test $gcc_cv_header_memcheck_h = yes; then ! AC_DEFINE(HAVE_MEMCHECK_H, 1, ! [Define if valgrind's memcheck.h header is installed.]) ! fi ! ! if test x$ac_valgrind_checking != x ; then AM_PATH_PROG_WITH_TEST(valgrind_path, valgrind, [$ac_dir/$ac_word --version | grep valgrind- >/dev/null 2>&1]) if test "x$valgrind_path" = "x" \ *************** if test x$ac_valgrind_checking != x ; th *** 546,559 **** AC_DEFINE(ENABLE_VALGRIND_CHECKING, 1, [Define if you want to run subprograms and generated programs through valgrind (a memory checker). This is extremely expensive.]) - if test $gcc_cv_header_valgrind_memcheck_h = yes; then - AC_DEFINE(HAVE_VALGRIND_MEMCHECK_H, 1, - [Define if valgrind's valgrind/memcheck.h header is installed.]) - fi - if test $gcc_cv_header_memcheck_h = yes; then - AC_DEFINE(HAVE_MEMCHECK_H, 1, - [Define if valgrind's memcheck.h header is installed.]) - fi fi AC_SUBST(valgrind_path_defines) AC_SUBST(valgrind_command) --- 555,560 ---- *************** gather_stats=`if test $enable_gather_det *** 592,597 **** --- 593,613 ---- AC_DEFINE_UNQUOTED(GATHER_STATISTICS, $gather_stats, [Define to enable detailed memory allocation stats gathering.]) + AC_ARG_ENABLE(valgrind-annotations, + [AS_HELP_STRING([--enable-valgrind-annotations], + [enable valgrind runtime interaction])], [], + [enable_valgrind_annotations=no]) + if test x$enable_valgrind_annotations != xno \ + || test x$ac_valgrind_checking != x; then + if (test $have_valgrind_h = no \ + && test $gcc_cv_header_memcheck_h = no \ + && test $gcc_cv_header_valgrind_memcheck_h = no); then + AC_MSG_ERROR([*** Can't find valgrind/memcheck.h, memcheck.h or valgrind.h]) + fi + AC_DEFINE(ENABLE_VALGRIND_ANNOTATIONS, 1, + [Define to get calls to the valgrind runtime enabled.]) + fi + # ------------------------------- # Miscenalleous configure options # ------------------------------- Index: gcc/system.h =================================================================== *** gcc/system.h (revision 208642) --- gcc/system.h (working copy) *************** helper_const_non_const_cast (const char *** 1025,1031 **** #endif #endif ! #ifdef ENABLE_VALGRIND_CHECKING # ifdef HAVE_VALGRIND_MEMCHECK_H # include <valgrind/memcheck.h> # elif defined HAVE_MEMCHECK_H --- 1025,1031 ---- #endif #endif ! #ifdef ENABLE_VALGRIND_ANNOTATIONS # ifdef HAVE_VALGRIND_MEMCHECK_H # include <valgrind/memcheck.h> # elif defined HAVE_MEMCHECK_H Index: gcc/alloc-pool.c =================================================================== *** gcc/alloc-pool.c (revision 208642) --- gcc/alloc-pool.c (working copy) *************** void * *** 250,256 **** pool_alloc (alloc_pool pool) { alloc_pool_list header; ! #ifdef ENABLE_VALGRIND_CHECKING int size; #endif --- 250,256 ---- pool_alloc (alloc_pool pool) { alloc_pool_list header; ! #ifdef ENABLE_VALGRIND_ANNOTATIONS int size; #endif *************** pool_alloc (alloc_pool pool) *** 265,271 **** } gcc_checking_assert (pool); ! #ifdef ENABLE_VALGRIND_CHECKING size = pool->elt_size - offsetof (allocation_object, u.data); #endif --- 265,271 ---- } gcc_checking_assert (pool); ! #ifdef ENABLE_VALGRIND_ANNOTATIONS size = pool->elt_size - offsetof (allocation_object, u.data); #endif *************** void *** 334,340 **** pool_free (alloc_pool pool, void *ptr) { alloc_pool_list header; ! #if defined(ENABLE_VALGRIND_CHECKING) || defined(ENABLE_CHECKING) int size; size = pool->elt_size - offsetof (allocation_object, u.data); #endif --- 334,340 ---- pool_free (alloc_pool pool, void *ptr) { alloc_pool_list header; ! #if defined(ENABLE_VALGRIND_ANNOTATIONS) || defined(ENABLE_CHECKING) int size; size = pool->elt_size - offsetof (allocation_object, u.data); #endif