8224087: Compile C code for at least C99 Standard compliance
authordholmes
Wed, 22 May 2019 21:50:16 -0400
changeset 54999 98ed47cd114a
parent 54998 dc343eb0fcf0
child 55000 f11f2a4210b5
8224087: Compile C code for at least C99 Standard compliance Reviewed-by: simonis, aph, erikj, serb, stuefe
doc/building.html
doc/building.md
make/autoconf/flags-cflags.m4
make/lib/Awt2dLibraries.gmk
--- a/doc/building.html	Thu May 23 02:36:15 2019 +0200
+++ b/doc/building.html	Wed May 22 21:50:16 2019 -0400
@@ -297,6 +297,10 @@
 </tr>
 </tbody>
 </table>
+<p>All compilers are expected to be able to compile to the C99 language standard,
+as some C99 features are used in the source code. Microsoft Visual Studio
+doesn't fully support C99 so in practice shared code is limited to using C99
+features that it does support.</p>
 <h3 id="gcc">gcc</h3>
 <p>The minimum accepted version of gcc is 4.8. Older versions will generate a warning by <code>configure</code> and are unlikely to work.</p>
 <p>The JDK is currently known to be able to compile with at least version 7.4 of gcc.</p>
--- a/doc/building.md	Thu May 23 02:36:15 2019 +0200
+++ b/doc/building.md	Wed May 22 21:50:16 2019 -0400
@@ -328,6 +328,11 @@
  Solaris            Oracle Solaris Studio 12.6 (with compiler version 5.15)
  Windows            Microsoft Visual Studio 2017 update 15.9.6
 
+All compilers are expected to be able to compile to the C99 language standard,
+as some C99 features are used in the source code. Microsoft Visual Studio
+doesn't fully support C99 so in practice shared code is limited to using C99
+features that it does support.
+
 ### gcc
 
 The minimum accepted version of gcc is 4.8. Older versions will generate a warning
--- a/make/autoconf/flags-cflags.m4	Thu May 23 02:36:15 2019 +0200
+++ b/make/autoconf/flags-cflags.m4	Wed May 22 21:50:16 2019 -0400
@@ -564,7 +564,7 @@
     TOOLCHAIN_CFLAGS="-errshort=tags"
 
     TOOLCHAIN_CFLAGS_JDK="-mt $TOOLCHAIN_FLAGS"
-    TOOLCHAIN_CFLAGS_JDK_CONLY="-xCC -Xa -W0,-noglobal $TOOLCHAIN_CFLAGS" # C only
+    TOOLCHAIN_CFLAGS_JDK_CONLY="-W0,-noglobal $TOOLCHAIN_CFLAGS" # C only
     TOOLCHAIN_CFLAGS_JDK_CXXONLY="-features=no%except -norunpath -xnolib" # CXX only
     TOOLCHAIN_CFLAGS_JVM="-template=no%extdef -features=no%split_init \
         -library=stlport4 -mt -features=no%except $TOOLCHAIN_FLAGS"
@@ -585,6 +585,30 @@
     TOOLCHAIN_CFLAGS_JDK="-nologo -MD -Zc:wchar_t-"
   fi
 
+  # CFLAGS C language level for JDK sources (hotspot only uses C++)
+  # Ideally we would have a common level across all toolchains so that all sources
+  # are sure to conform to the same standard. Unfortunately neither our sources nor
+  # our toolchains are in a condition to support that. But what we loosely aim for is
+  # C99 level.
+  if test "x$TOOLCHAIN_TYPE" = xgcc || test "x$TOOLCHAIN_TYPE" = xclang || test "x$TOOLCHAIN_TYPE" = xxlc; then
+    # This raises the language level for older 4.8 gcc, while lowering it for later
+    # versions. clang and xlclang support the same flag.
+    LANGSTD_CFLAGS="-std=c99"
+  elif test "x$TOOLCHAIN_TYPE" = xsolstudio; then
+    # We can't turn on -std=c99 without breaking compilation of the splashscreen/png
+    # utilities. But we can enable c99 as below (previously achieved by using -Xa).
+    # It is the no_lib that makes the difference.
+    LANGSTD_CFLAGS="-xc99=all,no_lib"
+  elif test "x$TOOLCHAIN_TYPE" = xmicrosoft; then
+    # MSVC doesn't support C99/C11 explicitly, unless you compile as C++:
+    # LANGSTD_CFLAGS="/TP"
+    # but that requires numerous changes to the sources files. So we are limited
+    # to C89/C90 plus whatever extensions Visual Studio has decided to implement.
+    # This is the lowest bar for shared code.
+    LANGSTD_CFLAGS=""
+  fi
+  TOOLCHAIN_CFLAGS_JDK_CONLY="$LANGSTD_CFLAGS $TOOLCHAIN_CFLAGS_JDK_CONLY"
+
   # CFLAGS WARNINGS STUFF
   # Set JVM_CFLAGS warning handling
   if test "x$TOOLCHAIN_TYPE" = xgcc; then
--- a/make/lib/Awt2dLibraries.gmk	Thu May 23 02:36:15 2019 +0200
+++ b/make/lib/Awt2dLibraries.gmk	Wed May 22 21:50:16 2019 -0400
@@ -378,7 +378,6 @@
     OPTIMIZATION := HIGHEST, \
     CFLAGS := $(CFLAGS_JDKLIB) \
         $(LCMS_CFLAGS), \
-    CFLAGS_solaris := -xc99=no_lib, \
     CFLAGS_windows := -DCMS_IS_WINDOWS_, \
     EXTRA_HEADER_DIRS := \
         common/awt/debug \