diff --git a/.hgtags b/.hgtags index f477f997b8d509fe5eb5b53a0edd98494542bd42..1beef64a32a4953e80b17ff0c3592e15cb3cc953 100644 --- a/.hgtags +++ b/.hgtags @@ -497,6 +497,10 @@ e4a6e7f1b90b85270aee1c54edaca3ef737082f1 hs25.20-b21 f7429096a202cab5c36a0f20dea33c554026010f jdk8u20-b22 7c56530b11496459e66cb9ea933035002311672c hs25.20-b22 f09d1f6a401e25a54dad44bb7bea482e47558af5 jdk8u20-b23 +42ddd0bbcb6630fe463ec9bc1893c838d5edff1b jdk8u20-b24 +00cf2b6f51b9560b01030e8f4c28c466f0b21fe3 hs25.20-b23 +19408d5fd31c25ce60c43dd33e92b96e8df4a4ea jdk8u20-b25 +eaa4074a7e3975cd33ec55e6b584586e2ac681bd jdk8u20-b26 4828415ebbf11e205dcc08e97ad5ae7dd03522f9 jdk8u40-b00 d952af8cf67dd1e7ab5fec9a299c6c6dafd1863e hs25.40-b01 f0afba33c928ddaa2d5f003b90d683c143f78ea3 hs25.40-b02 diff --git a/make/bsd/makefiles/vm.make b/make/bsd/makefiles/vm.make index 3e8ea7640660f7cfe05282513fbfe591fe3deff7..93640d8f06826ccde51a1860491964e19328b847 100644 --- a/make/bsd/makefiles/vm.make +++ b/make/bsd/makefiles/vm.make @@ -243,10 +243,10 @@ JVM_OBJ_FILES = $(Obj_Files) vm_version.o: $(filter-out vm_version.o,$(JVM_OBJ_FILES)) -mapfile : $(MAPFILE) vm.def +mapfile : $(MAPFILE) vm.def mapfile_ext rm -f $@ awk '{ if ($$0 ~ "INSERT VTABLE SYMBOLS HERE") \ - { system ("cat vm.def"); } \ + { system ("cat mapfile_ext"); system ("cat vm.def"); } \ else \ { print $$0 } \ }' > $@ < $(MAPFILE) @@ -258,6 +258,13 @@ mapfile_reorder : mapfile $(REORDERFILE) vm.def: $(Res_Files) $(Obj_Files) sh $(GAMMADIR)/make/bsd/makefiles/build_vm_def.sh *.o > $@ +mapfile_ext: + rm -f $@ + touch $@ + if [ -f $(HS_ALT_MAKE)/bsd/makefiles/mapfile-ext ]; then \ + cat $(HS_ALT_MAKE)/bsd/makefiles/mapfile-ext > $@; \ + fi + STATIC_CXX = false ifeq ($(LINK_INTO),AOUT) diff --git a/make/linux/makefiles/vm.make b/make/linux/makefiles/vm.make index 7df141f8895fd615cd5304a2c809a33f2afcccce..eebf68fd55e001847e520fe34acc7249490472e5 100644 --- a/make/linux/makefiles/vm.make +++ b/make/linux/makefiles/vm.make @@ -233,10 +233,10 @@ JVM_OBJ_FILES = $(Obj_Files) vm_version.o: $(filter-out vm_version.o,$(JVM_OBJ_FILES)) -mapfile : $(MAPFILE) vm.def +mapfile : $(MAPFILE) vm.def mapfile_ext rm -f $@ awk '{ if ($$0 ~ "INSERT VTABLE SYMBOLS HERE") \ - { system ("cat vm.def"); } \ + { system ("cat mapfile_ext"); system ("cat vm.def"); } \ else \ { print $$0 } \ }' > $@ < $(MAPFILE) @@ -248,6 +248,13 @@ mapfile_reorder : mapfile $(REORDERFILE) vm.def: $(Res_Files) $(Obj_Files) sh $(GAMMADIR)/make/linux/makefiles/build_vm_def.sh *.o > $@ +mapfile_ext: + rm -f $@ + touch $@ + if [ -f $(HS_ALT_MAKE)/linux/makefiles/mapfile-ext ]; then \ + cat $(HS_ALT_MAKE)/linux/makefiles/mapfile-ext > $@; \ + fi + ifeq ($(JVM_VARIANT_ZEROSHARK), true) STATIC_CXX = false else diff --git a/make/solaris/Makefile b/make/solaris/Makefile index 7ae2be418d3ab9ef01b308aefa540de69ce61214..8d786f74a8bd2b2839fa3634e36e23464711ac2c 100644 --- a/make/solaris/Makefile +++ b/make/solaris/Makefile @@ -159,6 +159,7 @@ BUILDTREE_MAKE = $(GAMMADIR)/make/$(OSNAME)/makefiles/buildtree.make BUILDTREE_VARS = GAMMADIR=$(GAMMADIR) OS_FAMILY=$(OSNAME) ARCH=$(SRCARCH) BUILDARCH=$(BUILDARCH) LIBARCH=$(LIBARCH) BUILDTREE_VARS += HOTSPOT_RELEASE_VERSION=$(HOTSPOT_RELEASE_VERSION) HOTSPOT_BUILD_VERSION=$(HOTSPOT_BUILD_VERSION) JRE_RELEASE_VERSION=$(JRE_RELEASE_VERSION) BUILDTREE_VARS += ENABLE_FULL_DEBUG_SYMBOLS=$(ENABLE_FULL_DEBUG_SYMBOLS) OBJCOPY=$(OBJCOPY) STRIP_POLICY=$(STRIP_POLICY) ZIP_DEBUGINFO_FILES=$(ZIP_DEBUGINFO_FILES) ZIPEXE=$(ZIPEXE) +BUILDTREE_VARS += HS_ALT_MAKE=$(HS_ALT_MAKE) BUILDTREE = $(MAKE) -f $(BUILDTREE_MAKE) $(BUILDTREE_VARS) diff --git a/make/solaris/makefiles/buildtree.make b/make/solaris/makefiles/buildtree.make index ca602a81e3cd8e3723fff1c51578f0eda45bf868..4b68a7c13c2eabd9b63701a645fd7c67ce14ff85 100644 --- a/make/solaris/makefiles/buildtree.make +++ b/make/solaris/makefiles/buildtree.make @@ -258,6 +258,8 @@ flags.make: $(BUILDTREE_MAKE) ../shared_dirs.lst echo && echo "ZIP_DEBUGINFO_FILES = $(ZIP_DEBUGINFO_FILES)"; \ [ -n "$(ZIPEXE)" ] && \ echo && echo "ZIPEXE = $(ZIPEXE)"; \ + [ -n "$(HS_ALT_MAKE)" ] && \ + echo && echo "HS_ALT_MAKE = $(HS_ALT_MAKE)"; \ [ -n "$(HOTSPOT_EXTRA_SYSDEFS)" ] && \ echo && \ echo "HOTSPOT_EXTRA_SYSDEFS\$$(HOTSPOT_EXTRA_SYSDEFS) = $(HOTSPOT_EXTRA_SYSDEFS)" && \ diff --git a/make/solaris/makefiles/vm.make b/make/solaris/makefiles/vm.make index b3939fbe144fb3b0fd17f217d9502abe444a0af9..5ebc7a3a0efb6a6c789ad11c08d2005ef76013ba 100644 --- a/make/solaris/makefiles/vm.make +++ b/make/solaris/makefiles/vm.make @@ -247,11 +247,12 @@ JVM_OBJ_FILES = $(Obj_Files) $(DTRACE_OBJS) vm_version.o: $(filter-out vm_version.o,$(JVM_OBJ_FILES)) -mapfile : $(MAPFILE) $(MAPFILE_DTRACE_OPT) vm.def +mapfile : $(MAPFILE) $(MAPFILE_DTRACE_OPT) vm.def mapfile_ext rm -f $@ cat $(MAPFILE) $(MAPFILE_DTRACE_OPT) \ | $(NAWK) '{ \ if ($$0 ~ "INSERT VTABLE SYMBOLS HERE") { \ + system ("cat mapfile_ext"); \ system ("cat vm.def"); \ } else { \ print $$0; \ @@ -265,6 +266,13 @@ mapfile_extended : mapfile $(MAPFILE_DTRACE_OPT) vm.def: $(Obj_Files) sh $(GAMMADIR)/make/solaris/makefiles/build_vm_def.sh *.o > $@ +mapfile_ext: + rm -f $@ + touch $@ + if [ -f $(HS_ALT_MAKE)/solaris/makefiles/mapfile-ext ]; then \ + cat $(HS_ALT_MAKE)/solaris/makefiles/mapfile-ext > $@; \ + fi + ifeq ($(LINK_INTO),AOUT) LIBJVM.o = LIBJVM_MAPFILE = diff --git a/src/cpu/sparc/vm/c1_LIRGenerator_sparc.cpp b/src/cpu/sparc/vm/c1_LIRGenerator_sparc.cpp index 945b7b09535ce0fc2d662eb095be275129dba2bd..73b61afe7cf417c2355964853caf4caf8a6bfa1f 100644 --- a/src/cpu/sparc/vm/c1_LIRGenerator_sparc.cpp +++ b/src/cpu/sparc/vm/c1_LIRGenerator_sparc.cpp @@ -872,21 +872,19 @@ void LIRGenerator::do_Convert(Convert* x) { void LIRGenerator::do_NewInstance(NewInstance* x) { + print_if_not_loaded(x); + // This instruction can be deoptimized in the slow path : use // O0 as result register. const LIR_Opr reg = result_register_for(x->type()); -#ifndef PRODUCT - if (PrintNotLoaded && !x->klass()->is_loaded()) { - tty->print_cr(" ###class not loaded at new bci %d", x->printable_bci()); - } -#endif + CodeEmitInfo* info = state_for(x, x->state()); LIR_Opr tmp1 = FrameMap::G1_oop_opr; LIR_Opr tmp2 = FrameMap::G3_oop_opr; LIR_Opr tmp3 = FrameMap::G4_oop_opr; LIR_Opr tmp4 = FrameMap::O1_oop_opr; LIR_Opr klass_reg = FrameMap::G5_metadata_opr; - new_instance(reg, x->klass(), tmp1, tmp2, tmp3, tmp4, klass_reg, info); + new_instance(reg, x->klass(), x->is_unresolved(), tmp1, tmp2, tmp3, tmp4, klass_reg, info); LIR_Opr result = rlock_result(x); __ move(reg, result); } diff --git a/src/cpu/x86/vm/c1_LIRGenerator_x86.cpp b/src/cpu/x86/vm/c1_LIRGenerator_x86.cpp index b4e8223e1f541f5bf1d124257dade91e3c4ad6d7..1ee690ea442024bb400996d2455e3d3fb23bacf9 100644 --- a/src/cpu/x86/vm/c1_LIRGenerator_x86.cpp +++ b/src/cpu/x86/vm/c1_LIRGenerator_x86.cpp @@ -1085,14 +1085,11 @@ void LIRGenerator::do_Convert(Convert* x) { void LIRGenerator::do_NewInstance(NewInstance* x) { -#ifndef PRODUCT - if (PrintNotLoaded && !x->klass()->is_loaded()) { - tty->print_cr(" ###class not loaded at new bci %d", x->printable_bci()); - } -#endif + print_if_not_loaded(x); + CodeEmitInfo* info = state_for(x, x->state()); LIR_Opr reg = result_register_for(x->type()); - new_instance(reg, x->klass(), + new_instance(reg, x->klass(), x->is_unresolved(), FrameMap::rcx_oop_opr, FrameMap::rdi_oop_opr, FrameMap::rsi_oop_opr, diff --git a/src/share/vm/c1/c1_GraphBuilder.cpp b/src/share/vm/c1/c1_GraphBuilder.cpp index 6d9daf5a4b3f79873d18fe0a414c8da7cf9d7c03..3198ae87f6e3ca21db9584f463b5121ff0a5ca14 100644 --- a/src/share/vm/c1/c1_GraphBuilder.cpp +++ b/src/share/vm/c1/c1_GraphBuilder.cpp @@ -2061,7 +2061,7 @@ void GraphBuilder::new_instance(int klass_index) { bool will_link; ciKlass* klass = stream()->get_klass(will_link); assert(klass->is_instance_klass(), "must be an instance klass"); - NewInstance* new_instance = new NewInstance(klass->as_instance_klass(), state_before); + NewInstance* new_instance = new NewInstance(klass->as_instance_klass(), state_before, stream()->is_unresolved_klass()); _memory->new_instance(new_instance); apush(append_split(new_instance)); } diff --git a/src/share/vm/c1/c1_Instruction.hpp b/src/share/vm/c1/c1_Instruction.hpp index 19490bbc97b444f89a57fec8d0a1a7b5279bc21b..3121088c9e629c7f32d3ff3a8b713485aedaf145 100644 --- a/src/share/vm/c1/c1_Instruction.hpp +++ b/src/share/vm/c1/c1_Instruction.hpp @@ -1291,16 +1291,18 @@ LEAF(Invoke, StateSplit) LEAF(NewInstance, StateSplit) private: ciInstanceKlass* _klass; + bool _is_unresolved; public: // creation - NewInstance(ciInstanceKlass* klass, ValueStack* state_before) + NewInstance(ciInstanceKlass* klass, ValueStack* state_before, bool is_unresolved) : StateSplit(instanceType, state_before) - , _klass(klass) + , _klass(klass), _is_unresolved(is_unresolved) {} // accessors ciInstanceKlass* klass() const { return _klass; } + bool is_unresolved() const { return _is_unresolved; } virtual bool needs_exception_state() const { return false; } diff --git a/src/share/vm/c1/c1_LIRGenerator.cpp b/src/share/vm/c1/c1_LIRGenerator.cpp index 7bcd4ccb1e48b98f337c15e9454049bf820effab..890ccb7e68a38b2e58cf4c9925a66b88b16fa1cf 100644 --- a/src/share/vm/c1/c1_LIRGenerator.cpp +++ b/src/share/vm/c1/c1_LIRGenerator.cpp @@ -466,8 +466,11 @@ CodeEmitInfo* LIRGenerator::state_for(Instruction* x) { } -void LIRGenerator::klass2reg_with_patching(LIR_Opr r, ciMetadata* obj, CodeEmitInfo* info) { - if (!obj->is_loaded() || PatchALot) { +void LIRGenerator::klass2reg_with_patching(LIR_Opr r, ciMetadata* obj, CodeEmitInfo* info, bool need_resolve) { + /* C2 relies on constant pool entries being resolved (ciTypeFlow), so if TieredCompilation + * is active and the class hasn't yet been resolved we need to emit a patch that resolves + * the class. */ + if ((TieredCompilation && need_resolve) || !obj->is_loaded() || PatchALot) { assert(info != NULL, "info must be set if class is not loaded"); __ klass2reg_patch(NULL, r, info); } else { @@ -660,9 +663,18 @@ void LIRGenerator::monitor_exit(LIR_Opr object, LIR_Opr lock, LIR_Opr new_hdr, L __ unlock_object(hdr, object, lock, scratch, slow_path); } +#ifndef PRODUCT +void LIRGenerator::print_if_not_loaded(const NewInstance* new_instance) { + if (PrintNotLoaded && !new_instance->klass()->is_loaded()) { + tty->print_cr(" ###class not loaded at new bci %d", new_instance->printable_bci()); + } else if (PrintNotLoaded && (TieredCompilation && new_instance->is_unresolved())) { + tty->print_cr(" ###class not resolved at new bci %d", new_instance->printable_bci()); + } +} +#endif -void LIRGenerator::new_instance(LIR_Opr dst, ciInstanceKlass* klass, LIR_Opr scratch1, LIR_Opr scratch2, LIR_Opr scratch3, LIR_Opr scratch4, LIR_Opr klass_reg, CodeEmitInfo* info) { - klass2reg_with_patching(klass_reg, klass, info); +void LIRGenerator::new_instance(LIR_Opr dst, ciInstanceKlass* klass, bool is_unresolved, LIR_Opr scratch1, LIR_Opr scratch2, LIR_Opr scratch3, LIR_Opr scratch4, LIR_Opr klass_reg, CodeEmitInfo* info) { + klass2reg_with_patching(klass_reg, klass, info, is_unresolved); // If klass is not loaded we do not know if the klass has finalizers: if (UseFastNewInstance && klass->is_loaded() && !Klass::layout_helper_needs_slow_path(klass->layout_helper())) { diff --git a/src/share/vm/c1/c1_LIRGenerator.hpp b/src/share/vm/c1/c1_LIRGenerator.hpp index 90b278f4356b16f893a31b70461d8d9f0bbdc379..69d9a0e50e5e4db80dd3f1d1a9dcc4ae347a0f82 100644 --- a/src/share/vm/c1/c1_LIRGenerator.hpp +++ b/src/share/vm/c1/c1_LIRGenerator.hpp @@ -169,6 +169,8 @@ class LIRGenerator: public InstructionVisitor, public BlockClosure { return this; } + void print_if_not_loaded(const NewInstance* new_instance) PRODUCT_RETURN; + #ifdef ASSERT LIR_List* lir(const char * file, int line) const { _lir->set_file_and_line(file, line); @@ -307,7 +309,7 @@ class LIRGenerator: public InstructionVisitor, public BlockClosure { void store_stack_parameter (LIR_Opr opr, ByteSize offset_from_sp_in_bytes); - void klass2reg_with_patching(LIR_Opr r, ciMetadata* obj, CodeEmitInfo* info); + void klass2reg_with_patching(LIR_Opr r, ciMetadata* obj, CodeEmitInfo* info, bool need_resolve = false); // this loads the length and compares against the index void array_range_check (LIR_Opr array, LIR_Opr index, CodeEmitInfo* null_check_info, CodeEmitInfo* range_check_info); @@ -325,7 +327,7 @@ class LIRGenerator: public InstructionVisitor, public BlockClosure { void monitor_enter (LIR_Opr object, LIR_Opr lock, LIR_Opr hdr, LIR_Opr scratch, int monitor_no, CodeEmitInfo* info_for_exception, CodeEmitInfo* info); void monitor_exit (LIR_Opr object, LIR_Opr lock, LIR_Opr hdr, LIR_Opr scratch, int monitor_no); - void new_instance (LIR_Opr dst, ciInstanceKlass* klass, LIR_Opr scratch1, LIR_Opr scratch2, LIR_Opr scratch3, LIR_Opr scratch4, LIR_Opr klass_reg, CodeEmitInfo* info); + void new_instance (LIR_Opr dst, ciInstanceKlass* klass, bool is_unresolved, LIR_Opr scratch1, LIR_Opr scratch2, LIR_Opr scratch3, LIR_Opr scratch4, LIR_Opr klass_reg, CodeEmitInfo* info); // machine dependent void cmp_mem_int(LIR_Condition condition, LIR_Opr base, int disp, int c, CodeEmitInfo* info); diff --git a/src/share/vm/runtime/arguments.cpp b/src/share/vm/runtime/arguments.cpp index 641e8e31627d9571a4b5350fa51ca0851a176e2f..9802b9a471b2d14e59ec37d199f97df08f756ea4 100644 --- a/src/share/vm/runtime/arguments.cpp +++ b/src/share/vm/runtime/arguments.cpp @@ -98,6 +98,8 @@ const char* Arguments::_gc_log_filename = NULL; bool Arguments::_has_profile = false; size_t Arguments::_conservative_max_heap_alignment = 0; uintx Arguments::_min_heap_size = 0; +uintx Arguments::_min_heap_free_ratio = 0; +uintx Arguments::_max_heap_free_ratio = 0; Arguments::Mode Arguments::_mode = _mixed; bool Arguments::_java_compiler = false; bool Arguments::_xdebug_mode = false; @@ -1597,9 +1599,11 @@ void Arguments::set_parallel_gc_flags() { // unless the user actually sets these flags. if (FLAG_IS_DEFAULT(MinHeapFreeRatio)) { FLAG_SET_DEFAULT(MinHeapFreeRatio, 0); + _min_heap_free_ratio = MinHeapFreeRatio; } if (FLAG_IS_DEFAULT(MaxHeapFreeRatio)) { FLAG_SET_DEFAULT(MaxHeapFreeRatio, 100); + _max_heap_free_ratio = MaxHeapFreeRatio; } } @@ -1974,6 +1978,8 @@ bool Arguments::verify_MinHeapFreeRatio(FormatBuffer<80>& err_msg, uintx min_hea MaxHeapFreeRatio); return false; } + // This does not set the flag itself, but stores the value in a safe place for later usage. + _min_heap_free_ratio = min_heap_free_ratio; return true; } @@ -1988,6 +1994,8 @@ bool Arguments::verify_MaxHeapFreeRatio(FormatBuffer<80>& err_msg, uintx max_hea MinHeapFreeRatio); return false; } + // This does not set the flag itself, but stores the value in a safe place for later usage. + _max_heap_free_ratio = max_heap_free_ratio; return true; } diff --git a/src/share/vm/runtime/arguments.hpp b/src/share/vm/runtime/arguments.hpp index 88e8be39c29611d1211268f258179a0173adbdfb..8e3c6062ffd43b60ea61b88cf00dfe25baf21545 100644 --- a/src/share/vm/runtime/arguments.hpp +++ b/src/share/vm/runtime/arguments.hpp @@ -284,7 +284,11 @@ class Arguments : AllStatic { // Value of the conservative maximum heap alignment needed static size_t _conservative_max_heap_alignment; - static uintx _min_heap_size; + static uintx _min_heap_size; + + // Used to store original flag values + static uintx _min_heap_free_ratio; + static uintx _max_heap_free_ratio; // -Xrun arguments static AgentLibraryList _libraryList; @@ -514,6 +518,10 @@ class Arguments : AllStatic { static uintx min_heap_size() { return _min_heap_size; } static void set_min_heap_size(uintx v) { _min_heap_size = v; } + // Returns the original values of -XX:MinHeapFreeRatio and -XX:MaxHeapFreeRatio + static uintx min_heap_free_ratio() { return _min_heap_free_ratio; } + static uintx max_heap_free_ratio() { return _max_heap_free_ratio; } + // -Xrun static AgentLibrary* libraries() { return _libraryList.first(); } static bool init_libraries_at_startup() { return !_libraryList.is_empty(); }