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}"