common/autoconf/toolchain.m4
Print this page
rev 971 : 8032045: Enable compiler and linker safety switches for debug builds
Reviewed-by: duke
@@ -700,30 +700,48 @@
case $COMPILER_TYPE in
CC )
case $COMPILER_NAME in
gcc )
+ C_O_FLAG_NONE="-O0"
case $OPENJDK_TARGET_OS in
macosx )
# On MacOSX we optimize for size, something
# we should do for all platforms?
C_O_FLAG_HI="-Os"
C_O_FLAG_NORM="-Os"
- C_O_FLAG_NONE=""
;;
*)
C_O_FLAG_HI="-O3"
C_O_FLAG_NORM="-O2"
- C_O_FLAG_NONE="-O0"
;;
esac
+ # "-Og" suppported for GCC 4.8 and later
+ AC_MSG_CHECKING([if compiler supports -Og])
+ SAVED_CFLAGS="$CFLAGS"
+ CFLAGS="$CFLAGS -Og"
+ AC_LANG_PUSH([C])
+ AC_LINK_IFELSE([AC_LANG_SOURCE([[int main() { return 0; }]])],
+ [
+ AC_MSG_RESULT([yes])
+ C_O_FLAG_DEBUG="-Og"
+ ],
+ [
+ AC_MSG_RESULT([no])
+ C_O_FLAG_DEBUG="-O0"
+ ]
+ )
+ AC_LANG_POP([C])
+ CFLAGS="$SAVED_CFLAGS"
CXX_O_FLAG_HI="$C_O_FLAG_HI"
CXX_O_FLAG_NORM="$C_O_FLAG_NORM"
CXX_O_FLAG_NONE="$C_O_FLAG_NONE"
+ CXX_O_FLAG_DEBUG="$C_O_FLAG_DEBUG"
CFLAGS_DEBUG_SYMBOLS="-g"
CXXFLAGS_DEBUG_SYMBOLS="-g"
if test "x$OPENJDK_TARGET_CPU_BITS" = "x64" && test "x$DEBUG_LEVEL" = "xfastdebug"; then
+ # reduce from default "-g2" option to save space
CFLAGS_DEBUG_SYMBOLS="-g1"
CXXFLAGS_DEBUG_SYMBOLS="-g1"
fi
;;
ossc )
@@ -775,10 +793,11 @@
x86)
C_O_FLAG_HIGHEST="-xO4 -Wu,-O4~yz $CC_HIGHEST -xregs=no%frameptr"
C_O_FLAG_HI="-xO4 -Wu,-O4~yz -xregs=no%frameptr"
C_O_FLAG_NORM="-xO2 -Wu,-O2~yz -xregs=no%frameptr"
C_O_FLAG_NONE="-xregs=no%frameptr"
+ C_O_FLAG_DEBUG="-xregs=no%frameptr"
CXX_O_FLAG_HIGHEST="-xO4 -Qoption ube -O4~yz $CC_HIGHEST -xregs=no%frameptr"
CXX_O_FLAG_HI="-xO4 -Qoption ube -O4~yz -xregs=no%frameptr"
CXX_O_FLAG_NORM="-xO2 -Qoption ube -O2~yz -xregs=no%frameptr"
CXX_O_FLAG_NONE="-xregs=no%frameptr"
if test "x$OPENJDK_TARGET_CPU" = xx86; then
@@ -791,14 +810,16 @@
CXXFLAGS_JDKLIB_EXTRA="${CXXFLAGS_JDKLIB_EXTRA} -xregs=no%appl"
C_O_FLAG_HIGHEST="-xO4 -Wc,-Qrm-s -Wc,-Qiselect-T0 $CC_HIGHEST -xprefetch=auto,explicit -xchip=ultra"
C_O_FLAG_HI="-xO4 -Wc,-Qrm-s -Wc,-Qiselect-T0"
C_O_FLAG_NORM="-xO2 -Wc,-Qrm-s -Wc,-Qiselect-T0"
C_O_FLAG_NONE=""
+ C_O_FLAG_DEBUG=""
CXX_O_FLAG_HIGHEST="-xO4 -Qoption cg -Qrm-s -Qoption cg -Qiselect-T0 $CC_HIGHEST -xprefetch=auto,explicit -xchip=ultra"
CXX_O_FLAG_HI="-xO4 -Qoption cg -Qrm-s -Qoption cg -Qiselect-T0"
CXX_O_FLAG_NORM="-xO2 -Qoption cg -Qrm-s -Qoption cg -Qiselect-T0"
CXX_O_FLAG_NONE=""
+ CXX_O_FLAG_DEBUG=""
;;
esac
CFLAGS_DEBUG_SYMBOLS="-g -xs"
CXXFLAGS_DEBUG_SYMBOLS="-g0 -xs"
@@ -807,15 +828,17 @@
C_FLAG_DEPS="-qmakedep=gcc -MF"
CXX_FLAG_DEPS="-qmakedep=gcc -MF"
C_O_FLAG_HIGHEST="-O3"
C_O_FLAG_HI="-O3 -qstrict"
C_O_FLAG_NORM="-O2"
- C_O_FLAG_NONE=""
+ C_O_FLAG_NONE="-qnoopt"
+ C_O_FLAG_DEBUG="-qnoopt"
CXX_O_FLAG_HIGHEST="-O3"
CXX_O_FLAG_HI="-O3 -qstrict"
CXX_O_FLAG_NORM="-O2"
- CXX_O_FLAG_NONE=""
+ CXX_O_FLAG_NONE="-qnoopt"
+ CXX_O_FLAG_DEBUG="-qnoopt"
CFLAGS_DEBUG_SYMBOLS="-g"
CXXFLAGS_DEBUG_SYMBOLS="-g"
LDFLAGS_JDK="${LDFLAGS_JDK} -q64 -brtl -bnolibpath -liconv -bexpall"
CFLAGS_JDK="${CFLAGS_JDK} -qchars=signed -q64 -qfullpath -qsaveopt"
CXXFLAGS_JDK="${CXXFLAGS_JDK} -qchars=signed -q64 -qfullpath -qsaveopt"
@@ -824,15 +847,17 @@
;;
CL )
C_O_FLAG_HIGHEST="-O2"
C_O_FLAG_HI="-O1"
C_O_FLAG_NORM="-O1"
- C_O_FLAG_NONE="-Od"
+ C_O_FLAG_NONE="-O0"
+ C_O_FLAG_DEBUG="-Od"
CXX_O_FLAG_HIGHEST="$C_O_FLAG_HIGHEST"
CXX_O_FLAG_HI="$C_O_FLAG_HI"
CXX_O_FLAG_NORM="$C_O_FLAG_NORM"
CXX_O_FLAG_NONE="$C_O_FLAG_NONE"
+ CXX_O_FLAG_DEBUG="$C_O_FLAG_DEBUG"
;;
esac
if test -z "$C_O_FLAG_HIGHEST"; then
C_O_FLAG_HIGHEST="$C_O_FLAG_HI"
@@ -840,17 +865,42 @@
if test -z "$CXX_O_FLAG_HIGHEST"; then
CXX_O_FLAG_HIGHEST="$CXX_O_FLAG_HI"
fi
+ # Adjust optimization flags according to debug level.
+ case $DEBUG_LEVEL in
+ release )
+ # no adjustment
+ ;;
+ fastdebug )
+ # Not quite so much optimization
+ C_O_FLAG_HIGHEST="$C_O_FLAG_NORM"
+ C_O_FLAG_HI="$C_O_FLAG_NORM"
+ CXX_O_FLAG_HIGHEST="$CXX_O_FLAG_NORM"
+ CXX_O_FLAG_HI="$CXX_O_FLAG_NORM"
+ ;;
+ slowdebug )
+ # Disable optimization
+ C_O_FLAG_HIGHEST="$C_O_FLAG_NORM"
+ C_O_FLAG_HI="$C_O_FLAG_DEBUG"
+ C_O_FLAG_NORM="$C_O_FLAG_DEBUG"
+ CXX_O_FLAG_HIGHEST="$CXX_O_FLAG_DEBUG"
+ CXX_O_FLAG_HI="$CXX_O_FLAG_DEBUG"
+ CXX_O_FLAG_NORM="$CXX_O_FLAG_DEBUG"
+ ;;
+ esac
+
AC_SUBST(C_O_FLAG_HIGHEST)
AC_SUBST(C_O_FLAG_HI)
AC_SUBST(C_O_FLAG_NORM)
+ AC_SUBST(C_O_FLAG_DEBUG)
AC_SUBST(C_O_FLAG_NONE)
AC_SUBST(CXX_O_FLAG_HIGHEST)
AC_SUBST(CXX_O_FLAG_HI)
AC_SUBST(CXX_O_FLAG_NORM)
+ AC_SUBST(CXX_O_FLAG_DEBUG)
AC_SUBST(CXX_O_FLAG_NONE)
AC_SUBST(C_FLAG_DEPS)
AC_SUBST(CXX_FLAG_DEPS)
])
@@ -956,26 +1006,22 @@
###############################################################################
# Adjust flags according to debug level.
case $DEBUG_LEVEL in
+ release )
+ ;;
fastdebug )
- CFLAGS_JDK="$CFLAGS_JDK $CFLAGS_DEBUG_SYMBOLS"
- CXXFLAGS_JDK="$CXXFLAGS_JDK $CXXFLAGS_DEBUG_SYMBOLS"
- C_O_FLAG_HI="$C_O_FLAG_NORM"
- C_O_FLAG_NORM="$C_O_FLAG_NORM"
- CXX_O_FLAG_HI="$CXX_O_FLAG_NORM"
- CXX_O_FLAG_NORM="$CXX_O_FLAG_NORM"
+ # Add compile time bounds checks and symbol info.
+ CFLAGS_JDK="$CFLAGS_JDK -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=1 $CFLAGS_DEBUG_SYMBOLS"
+ CXXFLAGS_JDK="$CXXFLAGS_JDK -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=1 $CXXFLAGS_DEBUG_SYMBOLS"
JAVAC_FLAGS="$JAVAC_FLAGS -g"
;;
slowdebug )
- CFLAGS_JDK="$CFLAGS_JDK $CFLAGS_DEBUG_SYMBOLS"
- CXXFLAGS_JDK="$CXXFLAGS_JDK $CXXFLAGS_DEBUG_SYMBOLS"
- C_O_FLAG_HI="$C_O_FLAG_NONE"
- C_O_FLAG_NORM="$C_O_FLAG_NONE"
- CXX_O_FLAG_HI="$CXX_O_FLAG_NONE"
- CXX_O_FLAG_NORM="$CXX_O_FLAG_NONE"
+ # Add runtime bounds checks and symbol info.
+ CFLAGS_JDK="$CFLAGS_JDK -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 -fstack-protector-all --param ssp-buffer-size=1 $CFLAGS_DEBUG_SYMBOLS"
+ CXXFLAGS_JDK="$CXXFLAGS_JDK -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 -fstack-protector-all --param ssp-buffer-size=1 $CXXFLAGS_DEBUG_SYMBOLS"
JAVAC_FLAGS="$JAVAC_FLAGS -g"
;;
esac
CCXXFLAGS_JDK="$CCXXFLAGS_JDK $ADD_LP64"
@@ -1087,15 +1133,27 @@
fi
if test "x$OPENJDK_TARGET_OS" = xlinux; then
# And since we now know that the linker is gnu, then add -z defs, to forbid
# undefined symbols in object files.
LDFLAGS_JDK="${LDFLAGS_JDK} -Xlinker -z -Xlinker defs"
- if test "x$DEBUG_LEVEL" = "xrelease"; then
- # When building release libraries, tell the linker optimize them.
+ case $DEBUG_LEVEL in
+ release )
+ # tell linker to optimize libraries.
# Should this be supplied to the OSS linker as well?
LDFLAGS_JDK="${LDFLAGS_JDK} -Xlinker -O1"
- fi
+ ;;
+ fastdebug )
+ # if possible mark relocations read only
+ LDFLAGS_JDK="$LDFLAGS_JDK -z relro"
+ LDFLAGS_CXX_JDK="$LDFLAGS_CXX_JDK -z relro"
+ ;;
+ slowdebug )
+ # do relocations at load and mark read only.
+ LDFLAGS_JDK="$LDFLAGS_JDK -z relro -z now"
+ LDFLAGS_CXX_JDK="$LDFLAGS_CXX_JDK -z relro -z now"
+ ;;
+ esac
fi
fi
LDFLAGS_JDKLIB="${LDFLAGS_JDK} $SHARED_LIBRARY_FLAGS \
-L${JDK_OUTPUTDIR}/lib${OPENJDK_TARGET_CPU_LIBDIR}"