diff -r 000000000000 -r 6474c204b198 build/autoconf/gcc-pr49911.m4 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/build/autoconf/gcc-pr49911.m4 Wed Dec 31 06:09:35 2014 +0100 @@ -0,0 +1,71 @@ +dnl This Source Code Form is subject to the terms of the Mozilla Public +dnl License, v. 2.0. If a copy of the MPL was not distributed with this +dnl file, You can obtain one at http://mozilla.org/MPL/2.0/. + +dnl Check if the compiler is gcc and has PR49911. If so +dnl disable vrp. + +AC_DEFUN([MOZ_GCC_PR49911], +[ +if test "$GNU_CC"; then + +AC_MSG_CHECKING(for gcc PR49911) +ac_have_gcc_pr49911="no" +AC_LANG_SAVE +AC_LANG_CPLUSPLUS + +_SAVE_CXXFLAGS=$CXXFLAGS +CXXFLAGS="-O2" +AC_TRY_RUN([ +extern "C" void abort(void); +typedef enum { +eax, ecx, edx, ebx, esp, ebp, +esi, edi } +RegisterID; +union StateRemat { + RegisterID reg_; + int offset_; +}; +static StateRemat FromRegister(RegisterID reg) { + StateRemat sr; + sr.reg_ = reg; + return sr; +} +static StateRemat FromAddress3(int address) { + StateRemat sr; + sr.offset_ = address; + if (address < 46 && address >= 0) { + abort(); + } + return sr; +} +struct FrameState { + StateRemat dataRematInfo2(bool y, int z) { + if (y) return FromRegister(RegisterID(1)); + return FromAddress3(z); + } +}; +FrameState frame; +StateRemat x; +__attribute__((noinline)) void jsop_setelem(bool y, int z) { + x = frame.dataRematInfo2(y, z); +} +int main(void) { + jsop_setelem(0, 47); +} +], true, + ac_have_gcc_pr49911="yes", + true) +CXXFLAGS="$_SAVE_CXXFLAGS" + +AC_LANG_RESTORE + +if test "$ac_have_gcc_pr49911" = "yes"; then + AC_MSG_RESULT(yes) + CFLAGS="$CFLAGS -fno-tree-vrp" + CXXFLAGS="$CXXFLAGS -fno-tree-vrp" +else + AC_MSG_RESULT(no) +fi +fi +])