--- old/src/hotspot/share/aot/aotLoader.cpp 2018-04-18 21:25:33.000000000 -0700 +++ new/src/hotspot/share/aot/aotLoader.cpp 2018-04-18 21:25:33.000000000 -0700 @@ -183,28 +183,21 @@ // Shifts are static values which initialized by 0 until java heap initialization. // AOT libs are loaded before heap initialized so shift values are not set. // It is okay since ObjectAlignmentInBytes flag which defines shifts value is set before AOT libs are loaded. - // Set shifts value based on first AOT library config. + // AOT sets shift values during heap and metaspace initialization. + // Check shifts value to make sure thay did not change. if (UseCompressedOops && AOTLib::narrow_oop_shift_initialized()) { int oop_shift = Universe::narrow_oop_shift(); - if (oop_shift == 0) { - Universe::set_narrow_oop_shift(AOTLib::narrow_oop_shift()); - } else { - FOR_ALL_AOT_LIBRARIES(lib) { - (*lib)->verify_flag(AOTLib::narrow_oop_shift(), oop_shift, "Universe::narrow_oop_shift"); - } + FOR_ALL_AOT_LIBRARIES(lib) { + (*lib)->verify_flag(AOTLib::narrow_oop_shift(), oop_shift, "Universe::narrow_oop_shift"); } if (UseCompressedClassPointers) { // It is set only if UseCompressedOops is set int klass_shift = Universe::narrow_klass_shift(); - if (klass_shift == 0) { - Universe::set_narrow_klass_shift(AOTLib::narrow_klass_shift()); - } else { - FOR_ALL_AOT_LIBRARIES(lib) { - (*lib)->verify_flag(AOTLib::narrow_klass_shift(), klass_shift, "Universe::narrow_klass_shift"); - } + FOR_ALL_AOT_LIBRARIES(lib) { + (*lib)->verify_flag(AOTLib::narrow_klass_shift(), klass_shift, "Universe::narrow_klass_shift"); } } } - // Create heaps for all the libraries + // Create heaps for all valid libraries FOR_ALL_AOT_LIBRARIES(lib) { if ((*lib)->is_valid()) { AOTCodeHeap* heap = new AOTCodeHeap(*lib); @@ -213,6 +206,9 @@ add_heap(heap); CodeCache::add_heap(heap); } + } else { + // Unload invalid libraries + os::dll_unload((*lib)->dl_handle()); } } } @@ -223,10 +219,30 @@ } } +// Set shift value for compressed oops and classes based on first AOT library config. +// AOTLoader::universe_init(), which is called later, will check the shift value again to make sure nobody change it. +// This code is not executed during CDS dump because it runs in Interpreter mode and AOT is disabled in this mode. + +void AOTLoader::set_narrow_oop_shift() { + // This method could be called from Universe::initialize_heap(). + if (UseAOT && libraries_count() > 0 && + UseCompressedOops && AOTLib::narrow_oop_shift_initialized()) { + int oop_shift = Universe::narrow_oop_shift(); + if (oop_shift == 0) { + // 0 is valid shift value for small heap but we can safely increase it + // at this point when nobody used it yet. + Universe::set_narrow_oop_shift(AOTLib::narrow_oop_shift()); + } else { + // Non 0 value can't be changed because we can't decrease it. + FOR_ALL_AOT_LIBRARIES(lib) { + (*lib)->verify_flag(AOTLib::narrow_oop_shift(), oop_shift, "Universe::narrow_oop_shift"); + } + } + } +} + void AOTLoader::set_narrow_klass_shift() { - // This method could be called from Metaspace::set_narrow_klass_base_and_shift(). - // In case it is not called (during dump CDS, for example) the corresponding code in - // AOTLoader::universe_init(), which is called later, will set the shift value. + // This method is called from Metaspace::set_narrow_klass_base_and_shift(). if (UseAOT && libraries_count() > 0 && UseCompressedOops && AOTLib::narrow_oop_shift_initialized() && UseCompressedClassPointers) { --- old/src/hotspot/share/aot/aotLoader.hpp 2018-04-18 21:25:34.000000000 -0700 +++ new/src/hotspot/share/aot/aotLoader.hpp 2018-04-18 21:25:34.000000000 -0700 @@ -57,6 +57,7 @@ static void initialize() NOT_AOT({ FLAG_SET_ERGO(bool, UseAOT, false); }); static void universe_init() NOT_AOT_RETURN; + static void set_narrow_oop_shift() NOT_AOT_RETURN; static void set_narrow_klass_shift() NOT_AOT_RETURN; static bool contains(address p) NOT_AOT({ return false; }); static void load_for_klass(InstanceKlass* ik, Thread* thread) NOT_AOT_RETURN; --- old/src/hotspot/share/memory/universe.cpp 2018-04-18 21:25:35.000000000 -0700 +++ new/src/hotspot/share/memory/universe.cpp 2018-04-18 21:25:35.000000000 -0700 @@ -786,6 +786,7 @@ // Did reserve heap below 32Gb. Can use base == 0; Universe::set_narrow_oop_base(0); } + AOTLoader::set_narrow_oop_shift(); Universe::set_narrow_ptrs_base(Universe::narrow_oop_base()); --- old/test/hotspot/jtreg/compiler/aot/fingerprint/CDSDumper.java 2018-04-18 21:25:36.000000000 -0700 +++ new/test/hotspot/jtreg/compiler/aot/fingerprint/CDSDumper.java 2018-04-18 21:25:36.000000000 -0700 @@ -58,9 +58,12 @@ "-XX:ExtraSharedClassListFile=" + classlist, "-XX:SharedArchiveFile=" + archive, "-Xshare:dump", + "-Xlog:gc+heap+coops", "-Xlog:cds"); OutputAnalyzer output = new OutputAnalyzer(pb.start()); + System.out.println("[stdout = " + output.getStdout() + "]"); + System.out.println("[stderr = " + output.getStderr() + "]"); output.shouldContain("Loading classes to share"); output.shouldHaveExitValue(0); } --- old/test/hotspot/jtreg/compiler/aot/fingerprint/SelfChangedCDS.java 2018-04-18 21:25:37.000000000 -0700 +++ new/test/hotspot/jtreg/compiler/aot/fingerprint/SelfChangedCDS.java 2018-04-18 21:25:37.000000000 -0700 @@ -46,6 +46,7 @@ * -XX:+UnlockDiagnosticVMOptions -XX:SharedArchiveFile=SelfChangedCDS.jsa * -XX:+IgnoreUnrecognizedVMOptions * -Xshare:auto -XX:+UnlockCommercialFeatures -XX:+UseAppCDS -showversion + * -Xlog:cds -Xlog:gc+heap+coops * -Xlog:aot+class+fingerprint=trace -Xlog:aot+class+load=trace * compiler.aot.fingerprint.Blah TEST-UNMODIFIED * @@ -61,6 +62,7 @@ * -XX:+UnlockDiagnosticVMOptions -XX:SharedArchiveFile=SelfChangedCDS.jsa * -XX:+IgnoreUnrecognizedVMOptions * -Xshare:auto -XX:+UnlockCommercialFeatures -XX:+UseAppCDS -showversion + * -Xlog:cds -Xlog:gc+heap+coops * -Xlog:aot+class+fingerprint=trace -Xlog:aot+class+load=trace * compiler.aot.fingerprint.Blah TEST-MODIFIED */