Bug 695711 - Always add -ffunction-sections and -fdata-sections when building with GCC, and port
bug 670659 and
bug 675867 to js/src. r=khuey
rename from build/unix/check_debug_ranges.py
rename to build/autoconf/check_debug_ranges.py
--- a/build/autoconf/compiler-opts.m4
+++ b/build/autoconf/compiler-opts.m4
@@ -4,10 +4,75 @@ AC_DEFUN([MOZ_COMPILER_OPTS],
[
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 "$GNU_CC"; then
+ CFLAGS="$CFLAGS -ffunction-sections -fdata-sections"
+ CXXFLAGS="$CXXFLAGS -ffunction-sections -fdata-sections"
+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"; 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
+ LDFLAGS="$LDFLAGS -Wl,--icf=safe"
+ fi
+fi
+
+dnl ========================================================
+dnl = Automatically remove dead symbols
+dnl ========================================================
+
+if test "$GNU_CC" -a "$GCC_USE_GNU_LD" -a -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 "$_topsrcdir"/build/autoconf/check_debug_ranges.py conftest.${ac_objext} conftest.${ac_ext}`" = \
+ "`$PYTHON "$_topsrcdir"/build/autoconf/check_debug_ranges.py 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
+fi
+
])
-
--- a/configure.in
+++ b/configure.in
@@ -7175,88 +7175,16 @@ MOZ_ARG_ENABLE_STRING(debug-symbols,
MOZ_DEBUG_SYMBOLS=1)
if test -n "$MOZ_DEBUG" -o -n "$MOZ_DEBUG_SYMBOLS"; then
AC_DEFINE(MOZ_DEBUG_SYMBOLS)
export MOZ_DEBUG_SYMBOLS
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"; 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 '{a[[$6]] = $1} END {if (a[["foo"]] && (a[["foo"]] != a[["bar"]])) { exit 1 }}'; then
- LD_SUPPORTS_ICF=yes
- else
- LD_SUPPORTS_ICF=no
- fi
- rm -rf conftest*])
- if test "$LD_SUPPORTS_ICF" = yes; then
- LDFLAGS="$LDFLAGS -Wl,--icf=safe"
- CFLAGS="$CFLAGS -ffunction-sections"
- CXXFLAGS="$CXXFLAGS -ffunction-sections"
- fi
-fi
-
-dnl ========================================================
-dnl = Automatically remove dead symbols
-dnl ========================================================
-
-if test "$GNU_CC" -a "$GCC_USE_GNU_LD" -a -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 -ffunction-sections -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 "$_topsrcdir"/build/unix/check_debug_ranges.py conftest.${ac_objext} conftest.${ac_ext}`" = \
- "`$PYTHON "$_topsrcdir"/build/unix/check_debug_ranges.py 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"
- case "$CFLAGS" in
- *-ffunction-sections*)
- CFLAGS="$CFLAGS -fdata-sections"
- CXXFLAGS="$CXXFLAGS -fdata-sections"
- ;;
- *)
- CFLAGS="$CFLAGS -ffunction-sections -fdata-sections"
- CXXFLAGS="$CXXFLAGS -ffunction-sections -fdata-sections"
- ;;
- esac
- fi
-fi
-
-dnl ========================================================
dnl = Enable any treating of compile warnings as errors
dnl ========================================================
MOZ_ARG_ENABLE_BOOL(warnings-as-errors,
[ --enable-warnings-as-errors
Enable treating of warnings as errors],
MOZ_ENABLE_WARNINGS_AS_ERRORS=1,
MOZ_ENABLE_WARNINGS_AS_ERRORS=)
if test -z "$MOZ_ENABLE_WARNINGS_AS_ERRORS"; then
copy from build/unix/check_debug_ranges.py
copy to js/src/build/autoconf/check_debug_ranges.py
--- a/js/src/build/autoconf/compiler-opts.m4
+++ b/js/src/build/autoconf/compiler-opts.m4
@@ -4,10 +4,75 @@ AC_DEFUN([MOZ_COMPILER_OPTS],
[
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 "$GNU_CC"; then
+ CFLAGS="$CFLAGS -ffunction-sections -fdata-sections"
+ CXXFLAGS="$CXXFLAGS -ffunction-sections -fdata-sections"
+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"; 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
+ LDFLAGS="$LDFLAGS -Wl,--icf=safe"
+ fi
+fi
+
+dnl ========================================================
+dnl = Automatically remove dead symbols
+dnl ========================================================
+
+if test "$GNU_CC" -a "$GCC_USE_GNU_LD" -a -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 "$_topsrcdir"/build/autoconf/check_debug_ranges.py conftest.${ac_objext} conftest.${ac_ext}`" = \
+ "`$PYTHON "$_topsrcdir"/build/autoconf/check_debug_ranges.py 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
+fi
+
])
-