From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 129726 invoked by alias); 29 Jul 2015 14:20:30 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Received: (qmail 129710 invoked by uid 89); 29 Jul 2015 14:20:29 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.6 required=5.0 tests=AWL,BAYES_00,FREEMAIL_FROM,KAM_ASCII_DIVIDERS,RCVD_IN_DNSWL_LOW,SPF_PASS autolearn=no version=3.3.2 X-HELO: mail-io0-f178.google.com Received: from mail-io0-f178.google.com (HELO mail-io0-f178.google.com) (209.85.223.178) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES128-GCM-SHA256 encrypted) ESMTPS; Wed, 29 Jul 2015 14:20:27 +0000 Received: by iodd187 with SMTP id d187so22770455iod.2 for ; Wed, 29 Jul 2015 07:20:25 -0700 (PDT) MIME-Version: 1.0 X-Received: by 10.107.137.87 with SMTP id l84mr2172109iod.119.1438179625545; Wed, 29 Jul 2015 07:20:25 -0700 (PDT) Received: by 10.107.32.140 with HTTP; Wed, 29 Jul 2015 07:20:25 -0700 (PDT) In-Reply-To: <20150729135730.568AAB045@oc7340732750.ibm.com> References: <20150729135730.568AAB045@oc7340732750.ibm.com> Date: Wed, 29 Jul 2015 14:35:00 -0000 Message-ID: Subject: Re: [PATCH] Work around host compiler placement new aliasing bug From: Richard Biener To: Ulrich Weigand Cc: GCC Patches , mliska@suse.cz Content-Type: text/plain; charset=UTF-8 X-IsSubscribed: yes X-SW-Source: 2015-07/txt/msg02472.txt.bz2 On Wed, Jul 29, 2015 at 3:57 PM, Ulrich Weigand wrote: > Hello, > > this patch is a workaround for the problem discussed here: > https://gcc.gnu.org/ml/gcc-patches/2015-07/msg01597.html > > The problem is that the new pool allocator code relies on C++ aliasing > rules related to placement new (basically, that placement new changes > the dynamic type of the referenced memory). GCC compilers prior to > version 4.3 did not implement this rule correctly (PR 29286). > > When building current GCC with a host compiler that is affected by this > bug, and we build with optimization enabled (this typically only happens > when building a cross-compiler), the resulting compiler binary may be > miscompiled. > > The patch below attempts to detect this situation by checking whether > the host compiler is a version of GCC prior to 4.3 (but stil accepts > the -fno-strict-aliasing flag). If so, -fno-strict-aliasing is added > to the flags when building the compiler binary. > > Tested on i686-linux, and when building an SPU cross-compiler using > a gcc 4.1 powerpc64-linux host compiler. > > OK for mainline? Ok if nobody objects. Thanks, Richard. > Bye, > Ulrich > > gcc/ChangeLog: > > * configure.ac: Set aliasing_flags to -fno-strict-aliasing if > the host compiler is affected by placement new aliasing bug. > * configure: Regenerate. > * Makefile.in (ALIASING_FLAGS): New variable. > (ALL_CXXFLAGS): Add $(ALIASING_FLAGS). > > Index: gcc/configure > =================================================================== > --- gcc/configure (revision 226312) > +++ gcc/configure (working copy) > @@ -789,6 +789,7 @@ c_strict_warn > strict_warn > c_loose_warn > loose_warn > +aliasing_flags > CPP > EGREP > GREP > @@ -6526,6 +6527,42 @@ fi > rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext > fi > > +# Check whether compiler is affected by placement new aliasing bug (PR 29286). > +# If the host compiler is affected by the bug, and we build with optimization > +# enabled (which happens e.g. when cross-compiling), the pool allocator may > +# get miscompiled. Use -fno-strict-aliasing to work around this problem. > +# Since there is no reliable feature check for the presence of this bug, > +# we simply use a GCC version number check. (This should never trigger for > +# stages 2 or 3 of a native bootstrap.) > +aliasing_flags= > +if test "$GCC" = yes; then > + saved_CXXFLAGS="$CXXFLAGS" > + > + # The following test compilation will succeed if and only if $CXX accepts > + # -fno-strict-aliasing *and* is older than GCC 4.3. > + CXXFLAGS="$CXXFLAGS -fno-strict-aliasing" > + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX is affected by placement new aliasing bug" >&5 > +$as_echo_n "checking whether $CXX is affected by placement new aliasing bug... " >&6; } > + cat confdefs.h - <<_ACEOF >conftest.$ac_ext > +/* end confdefs.h. */ > + > +#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3) > +#error compiler not affected by placement new aliasing bug > +#endif > + > +_ACEOF > +if ac_fn_cxx_try_compile "$LINENO"; then : > + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 > +$as_echo "yes" >&6; }; aliasing_flags='-fno-strict-aliasing' > +else > + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 > +$as_echo "no" >&6; } > +fi > +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext > + > + CXXFLAGS="$saved_CXXFLAGS" > +fi > + > > > > @@ -18301,7 +18338,7 @@ else > lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 > lt_status=$lt_dlunknown > cat > conftest.$ac_ext <<_LT_EOF > -#line 18304 "configure" > +#line 18341 "configure" > #include "confdefs.h" > > #if HAVE_DLFCN_H > @@ -18407,7 +18444,7 @@ else > lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 > lt_status=$lt_dlunknown > cat > conftest.$ac_ext <<_LT_EOF > -#line 18410 "configure" > +#line 18447 "configure" > #include "confdefs.h" > > #if HAVE_DLFCN_H > Index: gcc/configure.ac > =================================================================== > --- gcc/configure.ac (revision 226312) > +++ gcc/configure.ac (working copy) > @@ -416,6 +416,32 @@ struct X { typedef long long > ]], [[X::t x;]])],[],[AC_MSG_ERROR([error verifying int64_t uses long long])]) > fi > > +# Check whether compiler is affected by placement new aliasing bug (PR 29286). > +# If the host compiler is affected by the bug, and we build with optimization > +# enabled (which happens e.g. when cross-compiling), the pool allocator may > +# get miscompiled. Use -fno-strict-aliasing to work around this problem. > +# Since there is no reliable feature check for the presence of this bug, > +# we simply use a GCC version number check. (This should never trigger for > +# stages 2 or 3 of a native bootstrap.) > +aliasing_flags= > +if test "$GCC" = yes; then > + saved_CXXFLAGS="$CXXFLAGS" > + > + # The following test compilation will succeed if and only if $CXX accepts > + # -fno-strict-aliasing *and* is older than GCC 4.3. > + CXXFLAGS="$CXXFLAGS -fno-strict-aliasing" > + AC_MSG_CHECKING([whether $CXX is affected by placement new aliasing bug]) > + AC_COMPILE_IFELSE([ > +#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3) > +#error compiler not affected by placement new aliasing bug > +#endif > +], > + [AC_MSG_RESULT([yes]); aliasing_flags='-fno-strict-aliasing'], > + [AC_MSG_RESULT([no])]) > + > + CXXFLAGS="$saved_CXXFLAGS" > +fi > +AC_SUBST(aliasing_flags) > > > > Index: gcc/Makefile.in > =================================================================== > --- gcc/Makefile.in (revision 226312) > +++ gcc/Makefile.in (working copy) > @@ -180,6 +180,8 @@ NOCOMMON_FLAG = @nocommon_flag@ > > NOEXCEPTION_FLAGS = @noexception_flags@ > > +ALIASING_FLAGS = @aliasing_flags@ > + > # This is set by --disable-maintainer-mode (default) to "#" > # FIXME: 'MAINT' will always be set to an empty string, no matter if > # --disable-maintainer-mode is used or not. This is because the > @@ -986,7 +988,8 @@ ALL_CFLAGS = $(T_CFLAGS) $(CFLAGS-$@) \ > > # The C++ version. > ALL_CXXFLAGS = $(T_CFLAGS) $(CFLAGS-$@) $(CXXFLAGS) $(INTERNAL_CFLAGS) \ > - $(COVERAGE_FLAGS) $(NOEXCEPTION_FLAGS) $(WARN_CXXFLAGS) @DEFS@ > + $(COVERAGE_FLAGS) $(ALIASING_FLAGS) $(NOEXCEPTION_FLAGS) \ > + $(WARN_CXXFLAGS) @DEFS@ > > # Likewise. Put INCLUDES at the beginning: this way, if some autoconf macro > # puts -I options in CPPFLAGS, our include files in the srcdir will always > -- > Dr. Ulrich Weigand > GNU/Linux compilers and toolchain > Ulrich.Weigand@de.ibm.com >