GCC 5.1 is too smart. Disable Identical Code Folding for preload libs.

We want to disabled Identical Code Folding for the tools preload shared
objects to get better backraces. For GCC 5.1 -fipa-icf is enabled by
default at -O2.

    The optimization reduces code size and may disturb
    unwind stacks by replacing a function by equivalent
    one with a different name.

Add a configure check to see if GCC supports -fno-ipa-icf.
If it does then add the flag to AM_CFLAGS_PSO_BASE.

Without this GCC will notice some of the preload replacement functions
in vg_replace_strmem are identical and fold them all into one picking
a random (existing) function name. This causes backtraces showing
completely unexpected function names.

git-svn-id: svn://svn.valgrind.org/valgrind/trunk@15305
This commit is contained in:
Mark Wielaard 2015-06-02 20:23:06 +00:00
parent 9c0019f28a
commit d2b96ae95b
2 changed files with 29 additions and 2 deletions

View File

@ -133,10 +133,10 @@ endif
if VGCONF_OS_IS_DARWIN
AM_CFLAGS_PSO_BASE = -dynamic \
-O -g -fno-omit-frame-pointer -fno-strict-aliasing \
-fpic -fPIC -fno-builtin
-fpic -fPIC -fno-builtin @FLAG_FNO_IPA_ICF@
else
AM_CFLAGS_PSO_BASE = -O -g -fno-omit-frame-pointer -fno-strict-aliasing \
-fpic -fno-builtin
-fpic -fno-builtin @FLAG_FNO_IPA_ICF@
endif

View File

@ -1811,6 +1811,33 @@ CFLAGS=$safe_CFLAGS
AC_SUBST(FLAG_FNO_STACK_PROTECTOR)
# Does GCC support disabling Identical Code Folding?
# We want to disabled Identical Code Folding for the
# tools preload shared objects to get better backraces.
# For GCC 5.1+ -fipa-icf is enabled by default at -O2.
# "The optimization reduces code size and may disturb
# unwind stacks by replacing a function by equivalent
# one with a different name."
AC_MSG_CHECKING([if gcc accepts -fno-ipa-icf])
safe_CFLAGS=$CFLAGS
CFLAGS="-fno-ipa-icf"
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[
return 0;
]])], [
no_ipa_icf=yes
FLAG_FNO_IPA_ICF="-fno-ipa-icf"
AC_MSG_RESULT([yes])
], [
no_ipa_icf=no
FLAG_FNO_IPA_ICF=""
AC_MSG_RESULT([no])
])
CFLAGS=$safe_CFLAGS
AC_SUBST(FLAG_FNO_IPA_ICF)
# Does this compiler support -fsanitize=undefined?
# Only checked for if --enable-ubsan was given.