summaryrefslogtreecommitdiff
path: root/build/autoconf/compiler-opts.m4
diff options
context:
space:
mode:
Diffstat (limited to 'build/autoconf/compiler-opts.m4')
-rw-r--r--build/autoconf/compiler-opts.m4316
1 files changed, 316 insertions, 0 deletions
diff --git a/build/autoconf/compiler-opts.m4 b/build/autoconf/compiler-opts.m4
new file mode 100644
index 000000000..5e495e107
--- /dev/null
+++ b/build/autoconf/compiler-opts.m4
@@ -0,0 +1,316 @@
+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 Add compiler specific options
+
+AC_DEFUN([MOZ_DEFAULT_COMPILER],
+[
+dnl set DEVELOPER_OPTIONS early; MOZ_DEFAULT_COMPILER is usually the first non-setup directive
+ if test -z "$MOZILLA_OFFICIAL"; then
+ DEVELOPER_OPTIONS=1
+ fi
+ MOZ_ARG_ENABLE_BOOL(release,
+ [ --enable-release Build with more conservative, release engineering-oriented options.
+ This may slow down builds.],
+ DEVELOPER_OPTIONS=,
+ DEVELOPER_OPTIONS=1)
+
+dnl Default to MSVC for win32 and gcc-4.2 for darwin
+dnl ==============================================================
+if test -z "$CROSS_COMPILE"; then
+case "$target" in
+*-mingw*)
+ if test -z "$CPP"; then CPP="$CC -E -nologo"; fi
+ if test -z "$CXXCPP"; then CXXCPP="$CXX -TP -E -nologo"; ac_cv_prog_CXXCPP="$CXXCPP"; fi
+ if test -z "$AS"; then
+ case "${target_cpu}" in
+ i*86)
+ AS=ml;
+ ;;
+ x86_64)
+ AS=ml64;
+ ;;
+ esac
+ fi
+ if test -z "$MIDL"; then MIDL=midl; fi
+
+ # need override this flag since we don't use $(LDFLAGS) for this.
+ if test -z "$HOST_LDFLAGS" ; then
+ HOST_LDFLAGS=" "
+ fi
+ ;;
+esac
+fi
+])
+
+dnl ============================================================================
+dnl C++ rtti
+dnl We don't use it in the code, but it can be usefull for debugging, so give
+dnl the user the option of enabling it.
+dnl ============================================================================
+AC_DEFUN([MOZ_RTTI],
+[
+MOZ_ARG_ENABLE_BOOL(cpp-rtti,
+[ --enable-cpp-rtti Enable C++ RTTI ],
+[ _MOZ_USE_RTTI=1 ],
+[ _MOZ_USE_RTTI= ])
+
+if test -z "$_MOZ_USE_RTTI"; then
+ if test "$GNU_CC"; then
+ CXXFLAGS="$CXXFLAGS -fno-rtti"
+ else
+ case "$target" in
+ *-mingw*)
+ CXXFLAGS="$CXXFLAGS -GR-"
+ esac
+ fi
+fi
+])
+
+dnl ========================================================
+dnl =
+dnl = Debugging Options
+dnl =
+dnl ========================================================
+AC_DEFUN([MOZ_DEBUGGING_OPTS],
+[
+
+if test -z "$MOZ_DEBUG" -o -n "$MOZ_ASAN"; then
+ MOZ_NO_DEBUG_RTL=1
+fi
+
+AC_SUBST(MOZ_NO_DEBUG_RTL)
+
+MOZ_DEBUG_ENABLE_DEFS="DEBUG TRACING"
+MOZ_ARG_WITH_STRING(debug-label,
+[ --with-debug-label=LABELS
+ Define DEBUG_<value> for each comma-separated
+ value given.],
+[ for option in `echo $withval | sed 's/,/ /g'`; do
+ MOZ_DEBUG_ENABLE_DEFS="$MOZ_DEBUG_ENABLE_DEFS DEBUG_${option}"
+done])
+
+if test -n "$MOZ_DEBUG"; then
+ if test -n "$COMPILE_ENVIRONMENT"; then
+ AC_MSG_CHECKING([for valid debug flags])
+ _SAVE_CFLAGS=$CFLAGS
+ CFLAGS="$CFLAGS $MOZ_DEBUG_FLAGS"
+ AC_TRY_COMPILE([#include <stdio.h>],
+ [printf("Hello World\n");],
+ _results=yes,
+ _results=no)
+ AC_MSG_RESULT([$_results])
+ if test "$_results" = "no"; then
+ AC_MSG_ERROR([These compiler flags are invalid: $MOZ_DEBUG_FLAGS])
+ fi
+ CFLAGS=$_SAVE_CFLAGS
+ fi
+
+ MOZ_DEBUG_DEFINES="$MOZ_DEBUG_ENABLE_DEFS"
+else
+ MOZ_DEBUG_DEFINES="NDEBUG TRIMMED"
+fi
+
+AC_SUBST_LIST(MOZ_DEBUG_DEFINES)
+
+])
+
+dnl A high level macro for selecting compiler options.
+AC_DEFUN([MOZ_COMPILER_OPTS],
+[
+ MOZ_DEBUGGING_OPTS
+ MOZ_RTTI
+if test "$CLANG_CXX"; then
+ ## We disable return-type-c-linkage because jsval is defined as a C++ type but is
+ ## returned by C functions. This is possible because we use knowledge about the ABI
+ ## to typedef it to a C type with the same layout when the headers are included
+ ## from C.
+ _WARNINGS_CXXFLAGS="${_WARNINGS_CXXFLAGS} -Wno-unknown-warning-option -Wno-return-type-c-linkage"
+fi
+
+if test -n "$DEVELOPER_OPTIONS"; then
+ MOZ_FORCE_GOLD=1
+fi
+
+MOZ_ARG_ENABLE_BOOL(gold,
+[ --enable-gold Enable GNU Gold Linker when it is not already the default],
+ MOZ_FORCE_GOLD=1,
+ MOZ_FORCE_GOLD=
+ )
+
+if test "$GNU_CC" -a -n "$MOZ_FORCE_GOLD"; then
+ dnl if the default linker is BFD ld, check if gold is available and try to use it
+ dnl for local builds only.
+ if $CC -Wl,--version 2>&1 | grep -q "GNU ld"; then
+ GOLD=$($CC -print-prog-name=ld.gold)
+ case "$GOLD" in
+ /*)
+ ;;
+ *)
+ GOLD=$(which $GOLD)
+ ;;
+ esac
+ if test -n "$GOLD"; then
+ mkdir -p $_objdir/build/unix/gold
+ rm -f $_objdir/build/unix/gold/ld
+ ln -s "$GOLD" $_objdir/build/unix/gold/ld
+ if $CC -B $_objdir/build/unix/gold -Wl,--version 2>&1 | grep -q "GNU gold"; then
+ LDFLAGS="$LDFLAGS -B $_objdir/build/unix/gold"
+ else
+ rm -rf $_objdir/build/unix/gold
+ fi
+ fi
+ fi
+fi
+if test "$GNU_CC"; then
+ if $CC $LDFLAGS -Wl,--version 2>&1 | grep -q "GNU ld"; then
+ LD_IS_BFD=1
+ fi
+fi
+
+AC_SUBST([LD_IS_BFD])
+
+if test "$GNU_CC"; then
+ if test -z "$DEVELOPER_OPTIONS"; then
+ CFLAGS="$CFLAGS -ffunction-sections -fdata-sections"
+ CXXFLAGS="$CXXFLAGS -ffunction-sections -fdata-sections"
+ fi
+ CFLAGS="$CFLAGS -fno-math-errno"
+ CXXFLAGS="$CXXFLAGS -fno-exceptions -fno-math-errno"
+
+ if test -z "$CLANG_CC"; then
+ case "$CC_VERSION" in
+ 4.*)
+ ;;
+ *)
+ # Lifetime Dead Store Elimination level 2 (default in GCC6+) breaks Gecko.
+ # Ideally, we'd use -flifetime-dse=1, but that means we'd forcefully
+ # enable it on optimization levels where it would otherwise not be enabled.
+ # So we disable it entirely. But since that would mean inconsistency with
+ # GCC5, which has level 1 depending on optimization level, disable it on
+ # GCC5 as well, because better safe than sorry.
+ # Add it first so that a mozconfig can override by setting CFLAGS/CXXFLAGS.
+ CFLAGS="-fno-lifetime-dse $CFLAGS"
+ CXXFLAGS="-fno-lifetime-dse $CXXFLAGS"
+ ;;
+ esac
+ fi
+fi
+
+dnl ========================================================
+dnl = Identical Code Folding
+dnl ========================================================
+
+MOZ_ARG_DISABLE_BOOL(icf,
+[ --disable-icf Disable Identical Code Folding],
+ MOZ_DISABLE_ICF=1,
+ MOZ_DISABLE_ICF= )
+
+if test "$GNU_CC" -a "$GCC_USE_GNU_LD" -a -z "$MOZ_DISABLE_ICF" -a -z "$DEVELOPER_OPTIONS"; then
+ AC_CACHE_CHECK([whether the linker supports Identical Code Folding],
+ LD_SUPPORTS_ICF,
+ [echo 'int foo() {return 42;}' \
+ 'int bar() {return 42;}' \
+ 'int main() {return foo() - bar();}' > conftest.${ac_ext}
+ # If the linker supports ICF, foo and bar symbols will have
+ # the same address
+ if AC_TRY_COMMAND([${CC-cc} -o conftest${ac_exeext} $LDFLAGS -Wl,--icf=safe -ffunction-sections conftest.${ac_ext} $LIBS 1>&2]) &&
+ test -s conftest${ac_exeext} &&
+ objdump -t conftest${ac_exeext} | awk changequote(<<, >>)'{a[<<$>>6] = <<$>>1} END {if (a["foo"] && (a["foo"] != a["bar"])) { exit 1 }}'changequote([, ]); then
+ LD_SUPPORTS_ICF=yes
+ else
+ LD_SUPPORTS_ICF=no
+ fi
+ rm -rf conftest*])
+ if test "$LD_SUPPORTS_ICF" = yes; then
+ _SAVE_LDFLAGS="$LDFLAGS -Wl,--icf=safe"
+ LDFLAGS="$LDFLAGS -Wl,--icf=safe -Wl,--print-icf-sections"
+ AC_TRY_LINK([], [],
+ [LD_PRINT_ICF_SECTIONS=-Wl,--print-icf-sections],
+ [LD_PRINT_ICF_SECTIONS=])
+ AC_SUBST([LD_PRINT_ICF_SECTIONS])
+ LDFLAGS="$_SAVE_LDFLAGS"
+ fi
+fi
+
+dnl ========================================================
+dnl = Automatically remove dead symbols
+dnl ========================================================
+
+if test "$GNU_CC" -a "$GCC_USE_GNU_LD" -a -z "$DEVELOPER_OPTIONS"; then
+ if test -n "$MOZ_DEBUG_FLAGS"; then
+ dnl See bug 670659
+ AC_CACHE_CHECK([whether removing dead symbols breaks debugging],
+ GC_SECTIONS_BREAKS_DEBUG_RANGES,
+ [echo 'int foo() {return 42;}' \
+ 'int bar() {return 1;}' \
+ 'int main() {return foo();}' > conftest.${ac_ext}
+ if AC_TRY_COMMAND([${CC-cc} -o conftest.${ac_objext} $CFLAGS $MOZ_DEBUG_FLAGS -c conftest.${ac_ext} 1>&2]) &&
+ AC_TRY_COMMAND([${CC-cc} -o conftest${ac_exeext} $LDFLAGS $MOZ_DEBUG_FLAGS -Wl,--gc-sections conftest.${ac_objext} $LIBS 1>&2]) &&
+ test -s conftest${ac_exeext} -a -s conftest.${ac_objext}; then
+ if test "`$PYTHON -m mozbuild.configure.check_debug_ranges conftest.${ac_objext} conftest.${ac_ext}`" = \
+ "`$PYTHON -m mozbuild.configure.check_debug_ranges conftest${ac_exeext} conftest.${ac_ext}`"; then
+ GC_SECTIONS_BREAKS_DEBUG_RANGES=no
+ else
+ GC_SECTIONS_BREAKS_DEBUG_RANGES=yes
+ fi
+ else
+ dnl We really don't expect to get here, but just in case
+ GC_SECTIONS_BREAKS_DEBUG_RANGES="no, but it's broken in some other way"
+ fi
+ rm -rf conftest*])
+ if test "$GC_SECTIONS_BREAKS_DEBUG_RANGES" = no; then
+ DSO_LDOPTS="$DSO_LDOPTS -Wl,--gc-sections"
+ fi
+ else
+ DSO_LDOPTS="$DSO_LDOPTS -Wl,--gc-sections"
+ fi
+fi
+
+# bionic in Android < 4.1 doesn't support PIE
+# On OSX, the linker defaults to building PIE programs when targetting OSX 10.7+,
+# but not when targetting OSX < 10.7. OSX < 10.7 doesn't support running PIE
+# programs, so as long as support for OSX 10.6 is kept, we can't build PIE.
+# Even after dropping 10.6 support, MOZ_PIE would not be useful since it's the
+# default (and clang says the -pie option is not used).
+# On other Unix systems, some file managers (Nautilus) can't start PIE programs
+if test -n "$gonkdir" && test "$ANDROID_VERSION" -ge 16; then
+ MOZ_PIE=1
+else
+ MOZ_PIE=
+fi
+
+MOZ_ARG_ENABLE_BOOL(pie,
+[ --enable-pie Enable Position Independent Executables],
+ MOZ_PIE=1,
+ MOZ_PIE= )
+
+if test "$GNU_CC" -a -n "$MOZ_PIE"; then
+ AC_MSG_CHECKING([for PIE support])
+ _SAVE_LDFLAGS=$LDFLAGS
+ LDFLAGS="$LDFLAGS $DSO_PIC_CFLAGS -pie"
+ AC_TRY_LINK(,,AC_MSG_RESULT([yes])
+ [MOZ_PROGRAM_LDFLAGS="$MOZ_PROGRAM_LDFLAGS -pie"],
+ AC_MSG_RESULT([no])
+ AC_MSG_ERROR([--enable-pie requires PIE support from the linker.]))
+ LDFLAGS=$_SAVE_LDFLAGS
+fi
+
+AC_SUBST(MOZ_PROGRAM_LDFLAGS)
+
+dnl ASan assumes no symbols are being interposed, and when that happens,
+dnl it's not happy with it. Unconveniently, since Firefox is exporting
+dnl libffi symbols and Gtk+3 pulls system libffi via libwayland-client,
+dnl system libffi interposes libffi symbols that ASan assumes are in
+dnl libxul, so it barfs about buffer overflows.
+dnl Using -Wl,-Bsymbolic ensures no exported symbol can be interposed.
+if test -n "$GCC_USE_GNU_LD"; then
+ case "$LDFLAGS" in
+ *-fsanitize=address*)
+ LDFLAGS="$LDFLAGS -Wl,-Bsymbolic"
+ ;;
+ esac
+fi
+
+])