RFR: JDK-8152666: The new Hotspot Build System

Daniel D. Daugherty daniel.daugherty at oracle.com
Tue Apr 5 18:10:04 UTC 2016


On 3/25/16 2:03 AM, Erik Joelsson wrote:
> Hello,
>
> Here is the initial review for the new Hotspot Build System, as 
> described in " JEP 284: New HotSpot Build System". This patch adds the 
> new build system along side the old and makes the new system the 
> default. The old build system will remain for a (hopefully) short 
> while until we feel confident it is no longer needed. This enables us 
> to iron out any details that we might have missed with minimal 
> disruption for the users. The goal is to remove the old system after 
> one week of the new going in. During that time, both build systems 
> will have to be kept in sync. For that to be possible, all changes 
> touching anything in the make directory need to be reviewed by me.
>
> In this patch, the makefiles for the new build system are located in 
> hotspot/makefiles. When we apply the second phase, where we remove the 
> old build system, the new will move into the proper hotspot/make 
> directory.
>
> To activate the old build system after this patch has been applied, 
> use the configure arg "--disable-new-hotspot-build".
>
> For more information about how the new build works and how to interact 
> with it, Magnus wrote a document that is still relevant:
> http://hg.openjdk.java.net/build-infra/jdk9/file/tip/support/new-hotspot-build.md 
>

 > The hotspot build differs from all other libraries in the JDK in that the
 > library is (potentially) built multiple times with different 
conditions (-D
 > flags, for instance). The most common combination is building both 
the 'client'
 > and 'server' variant, but other combinations are possible. While this 
state of
 > affairs is not universally appreciated :-), it still is a use case 
that we need
 > to support, and it affects the entire build system for hotspot.

Thanks for the humor and for retaining this important difference in
the way HotSpot builds versus more sane/simple systems.


 > The new build supports the following variants:
 >
 >  * server (C1+C2)

The above "server" variant is the "tiered server". Does the new
build system support the "C2 server" variant? What about the
32-bit server and 64-bit server build variants? For example,
on Linux you can have:

   * C1/Client, 32-bit
   * C2/Server, 32-bit
   * Tiered (C1 & C2), 32-bit
   * C2/Server, 64-bit
   * Tiered (C1 + C2), 64-bit

The above wide range of variants is also true for Win*.

> The main method of verification for this patch has been running the 
> compare.sh script to verify that the output is equivalent to the old 
> build in as many cases as possible. In most configurations we have 
> reached a high level of confidence that we produce equivalent 
> binaries, but there are some exceptions that should be mentioned:
>
> * Solaris sparcv9 slowdebug produces differences when comparing 
> disassembly output from libjvm.so. I have not been able to find any 
> meaningful differences in compiler or linker flags to explain this.
> * Windows server jvm.dll ends up with some functions in different 
> order in the disassembly output. From what I can tell, the bits are 
> otherwise equivalent.
>
> We have also run the runtime nightlies with no notable failures.
>
> This is a pretty big patch and I expect it to take some time to get 
> properly reviewed. It contains contributions from Magnus Ihse Bursie, 
> Erik Joelsson and Ingemar Åberg.
>
> Bug: https://bugs.openjdk.java.net/browse/JDK-8152666
> Webrev: http://cr.openjdk.java.net/~erikj/8152666/webrev.01/index.html

General
Please make sure all the copyrights are updated.


common/autoconf/basics.m4
     No comments.

common/autoconf/build-performance.m4
     No comments.

common/autoconf/buildjdk-spec.gmk.in
     No comments.

common/autoconf/compare.sh.in
     No comments.

common/autoconf/configure
     No comments.

common/autoconf/configure.ac
     No comments.

common/autoconf/flags.m4
     L274:         SHARED_LIBRARY_FLAGS="-dynamiclib 
-compatibility_version 1.0.0 -current_version 1.0.0 $PICFLAG"
     L275:         JVM_CFLAGS="$JVM_CFLAGS -fPIC"

         L275 is new, but seeing it next to L274 makes me wonder if
         $PICFLAG should be used instead of the literal '-fPIC'?

     L303:         JVM_CFLAGS="$JVM_CFLAGS -fPIC"
         Same question about literal '-fPIC'.

     For most of the changes to flags.m4, I can't see how any of it
     relates to the new HotSpot build.

     Update: Now I'm wondering if this is one of those files that
         we typically don't review because it is auto generated.
         Sorry, don't remember for sure.

common/autoconf/generated-configure.sh
     2642 lines changed... I think this is one of those files
     you're supposed to skip in build-dev review... :-|

common/autoconf/help.m4
     L179:     $PRINTF "Which are valid to use depends on the target 
platform.\n  "
     L180:     $PRINTF "%s " $VALID_JVM_FEATURES
         Why are there blanks after the last '\n' on L179 instead of
         at the beginning of L180?

common/autoconf/hotspot-spec.gmk.in
     No comments.

common/autoconf/hotspot.m4
     L46: # Check if the specified JVM features are explicitely enabled. 
To be used in
         Typo: 'explicitely' -> 'explicitly'

     L59: #   server: normal interpreter, and a tiered C1/C2 compiler
         So no support for a C2-only server config?

     L77:   # Have the user listed more than one variant?
         Typo: 'Have' -> 'Has'

common/autoconf/jdk-options.m4
     No comments other than to say thanks for keeping support
     for 'optimized' builds.

common/autoconf/jdk-version.m4
     No comments.

common/autoconf/lib-std.m4
     No comments.

common/autoconf/libraries.m4
     No comments.

common/autoconf/platform.m4
     No comments, but mind numbing amount of diffs.

common/autoconf/spec.gmk.in
     No comments.

common/autoconf/toolchain.m4
     No comments.

common/autoconf/version-numbers
     No comments.

common/bin/compare.sh
     No comments.

common/bin/compare_exceptions.sh.incl
     No comments.

make/Jprt.gmk
     No comments.

make/Main.gmk
     No comments other than the 'hotspot-ide-project' target
     looks interesting...

make/common/MakeBase.gmk
     No comments.

make/common/NativeCompilation.gmk
     L649:   else ifeq (LOW, $$($1_OPTIMIZATION))
     L650:     $1_OPT_CFLAGS := $(C_O_FLAG_NORM)
     L651:     $1_OPT_CXXFLAGS := $(CXX_O_FLAG_NORM)
         Instead of "_NORM", I was expecting "_LOW".

     L652:   else ifeq (HIGH, $$($1_OPTIMIZATION))
     L653:     $1_OPT_CFLAGS := $(C_O_FLAG_HI)
     L654:     $1_OPT_CXXFLAGS := $(CXX_O_FLAG_HI)
         Instead of "_HI" I was expecting "_HIGH".

make/jprt.properties
     L136: # Don't disable precompiled headers on windows. It's simply 
too slow.
         This is a surprise. Not the slowness part, but not being
         able to do a non-PCH JPRT build on Win*. IMHO, it's a
         little  too much motherhood...

jdk/make/Import.gmk
     No comments.

jdk/make/copy/Copy-java.base.gmk
     No comments.

jdk/make/lib/CoreLibraries.gmk
     No comments.

hotspot/makefiles/BuildHotspot.gmk
     No comments.

hotspot/makefiles/Dist.gmk
     L52: define macosx_universalize
         I thought MacOS X universal support was going away?

         Update: OK, I see the mention of 8069540 ahead...

     L120: # these files are identical, and just pick one arbitrarily to 
use as souce.
         Typo: 'souce' -> 'source'

     L139: # This might have been defined in a custom extenstion
         Typo: 'extenstion' -> 'extension'

     L168: # NOTE: In the old build, this file was not copied on Windows.
     L169: ifneq ($(OPENJDK_TARGET_OS), windows)
     L170:   $(eval $(call SetupCopyFiles, COPY_JVMTI_HTML, \
         I'm not quite sure why the jvmti.html work is done for
         more than a single platform.

         Update: Thinking about this more... I vaguely remember that
         JVM/TI tracing used to be disabled in Client VMs. Don't know
         if that's still the case.

hotspot/makefiles/HotspotCommon.gmk
     No comments.

hotspot/makefiles/gensrc/GenerateSources.gmk
     No comments.

hotspot/makefiles/gensrc/GensrcAdlc.gmk
     L98:     # NOTE: Windows adlc flags was different in the old build. 
Is this really
     L99:     # correct?
         John Rose may know the answer to this historical question.

hotspot/makefiles/gensrc/GensrcDtrace.gmk
     No comments.

hotspot/makefiles/gensrc/GensrcJvmti.gmk
     No comments.

hotspot/makefiles/ide/CreateVSProject.gmk
     No comments.

hotspot/makefiles/lib/CompileDtracePostJvm.gmk
     No comments.

hotspot/makefiles/lib/CompileDtracePreJvm.gmk
     No comments.

hotspot/makefiles/lib/CompileJvm.gmk
     No comments.

hotspot/makefiles/lib/CompileLibjsig.gmk
     No comments.

hotspot/makefiles/lib/CompileLibraries.gmk
     No comments.

hotspot/makefiles/lib/JvmFeatures.gmk
     No comments.

hotspot/makefiles/lib/JvmMapfile.gmk
     No comments.

hotspot/makefiles/lib/JvmOverrideFiles.gmk
     No comments.

hotspot/makefiles/mapfiles/libjsig/mapfile-vers-solaris
hotspot/makefiles/mapfiles/libjvm_db/mapfile-vers
hotspot/makefiles/mapfiles/libjvm_dtrace/mapfile-vers
     No comments on the mapfiles.

hotspot/makefiles/symbols/symbols-aix
hotspot/makefiles/symbols/symbols-aix-debug
hotspot/makefiles/symbols/symbols-linux
hotspot/makefiles/symbols/symbols-macosx
hotspot/makefiles/symbols/symbols-shared
hotspot/makefiles/symbols/symbols-solaris
hotspot/makefiles/symbols/symbols-solaris-dtrace-compiler1
hotspot/makefiles/symbols/symbols-solaris-dtrace-compiler2
hotspot/makefiles/symbols/symbols-unix
     No comments on the symbol files.


Thumbs up on this fix; I don't think that anything I noted
above is a show stopper for this changeset.

Dan


>
> /Erik




More information about the build-dev mailing list