# HG changeset patch # User amurillo # Date 1409683321 25200 # Node ID a178c2e6f85f36991460bc2fbcde7bf02daaedb9 # Parent 3012cc0c8e2465c8a41221e28dcc2f55511880cc# Parent 77878c021b8d98992be6c38d39a83855183d0bb4 Merge diff -r 3012cc0c8e24 -r a178c2e6f85f .hgtags --- a/.hgtags Thu Aug 28 14:00:21 2014 -0700 +++ b/.hgtags Tue Sep 02 11:42:01 2014 -0700 @@ -497,6 +497,10 @@ 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 -r 3012cc0c8e24 -r a178c2e6f85f make/bsd/makefiles/vm.make --- a/make/bsd/makefiles/vm.make Thu Aug 28 14:00:21 2014 -0700 +++ b/make/bsd/makefiles/vm.make Tue Sep 02 11:42:01 2014 -0700 @@ -243,10 +243,10 @@ 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 @@ 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 -r 3012cc0c8e24 -r a178c2e6f85f make/hotspot_version diff -r 3012cc0c8e24 -r a178c2e6f85f make/linux/makefiles/vm.make --- a/make/linux/makefiles/vm.make Thu Aug 28 14:00:21 2014 -0700 +++ b/make/linux/makefiles/vm.make Tue Sep 02 11:42:01 2014 -0700 @@ -233,10 +233,10 @@ 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 @@ 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 -r 3012cc0c8e24 -r a178c2e6f85f make/solaris/Makefile --- a/make/solaris/Makefile Thu Aug 28 14:00:21 2014 -0700 +++ b/make/solaris/Makefile Tue Sep 02 11:42:01 2014 -0700 @@ -159,6 +159,7 @@ 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 -r 3012cc0c8e24 -r a178c2e6f85f make/solaris/makefiles/buildtree.make --- a/make/solaris/makefiles/buildtree.make Thu Aug 28 14:00:21 2014 -0700 +++ b/make/solaris/makefiles/buildtree.make Tue Sep 02 11:42:01 2014 -0700 @@ -258,6 +258,8 @@ 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 -r 3012cc0c8e24 -r a178c2e6f85f make/solaris/makefiles/vm.make --- a/make/solaris/makefiles/vm.make Thu Aug 28 14:00:21 2014 -0700 +++ b/make/solaris/makefiles/vm.make Tue Sep 02 11:42:01 2014 -0700 @@ -247,11 +247,12 @@ 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 @@ 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 -r 3012cc0c8e24 -r a178c2e6f85f src/cpu/sparc/vm/c1_LIRGenerator_sparc.cpp --- a/src/cpu/sparc/vm/c1_LIRGenerator_sparc.cpp Thu Aug 28 14:00:21 2014 -0700 +++ b/src/cpu/sparc/vm/c1_LIRGenerator_sparc.cpp Tue Sep 02 11:42:01 2014 -0700 @@ -872,21 +872,19 @@ 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 -r 3012cc0c8e24 -r a178c2e6f85f src/cpu/x86/vm/c1_LIRGenerator_x86.cpp --- a/src/cpu/x86/vm/c1_LIRGenerator_x86.cpp Thu Aug 28 14:00:21 2014 -0700 +++ b/src/cpu/x86/vm/c1_LIRGenerator_x86.cpp Tue Sep 02 11:42:01 2014 -0700 @@ -1085,14 +1085,11 @@ 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 -r 3012cc0c8e24 -r a178c2e6f85f src/os/aix/vm/os_aix.cpp diff -r 3012cc0c8e24 -r a178c2e6f85f src/share/vm/c1/c1_GraphBuilder.cpp --- a/src/share/vm/c1/c1_GraphBuilder.cpp Thu Aug 28 14:00:21 2014 -0700 +++ b/src/share/vm/c1/c1_GraphBuilder.cpp Tue Sep 02 11:42:01 2014 -0700 @@ -2061,7 +2061,7 @@ 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 -r 3012cc0c8e24 -r a178c2e6f85f src/share/vm/c1/c1_Instruction.hpp --- a/src/share/vm/c1/c1_Instruction.hpp Thu Aug 28 14:00:21 2014 -0700 +++ b/src/share/vm/c1/c1_Instruction.hpp Tue Sep 02 11:42:01 2014 -0700 @@ -1291,16 +1291,18 @@ 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 -r 3012cc0c8e24 -r a178c2e6f85f src/share/vm/c1/c1_LIRGenerator.cpp --- a/src/share/vm/c1/c1_LIRGenerator.cpp Thu Aug 28 14:00:21 2014 -0700 +++ b/src/share/vm/c1/c1_LIRGenerator.cpp Tue Sep 02 11:42:01 2014 -0700 @@ -466,8 +466,11 @@ } -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 @@ __ unlock_object(hdr, object, lock, scratch, slow_path); } - -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); +#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, 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 -r 3012cc0c8e24 -r a178c2e6f85f src/share/vm/c1/c1_LIRGenerator.hpp --- a/src/share/vm/c1/c1_LIRGenerator.hpp Thu Aug 28 14:00:21 2014 -0700 +++ b/src/share/vm/c1/c1_LIRGenerator.hpp Tue Sep 02 11:42:01 2014 -0700 @@ -169,6 +169,8 @@ 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 @@ 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 @@ 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 -r 3012cc0c8e24 -r a178c2e6f85f src/share/vm/runtime/arguments.cpp --- a/src/share/vm/runtime/arguments.cpp Thu Aug 28 14:00:21 2014 -0700 +++ b/src/share/vm/runtime/arguments.cpp Tue Sep 02 11:42:01 2014 -0700 @@ -98,6 +98,8 @@ 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 @@ // 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 @@ 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 @@ 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 -r 3012cc0c8e24 -r a178c2e6f85f src/share/vm/runtime/arguments.hpp --- a/src/share/vm/runtime/arguments.hpp Thu Aug 28 14:00:21 2014 -0700 +++ b/src/share/vm/runtime/arguments.hpp Tue Sep 02 11:42:01 2014 -0700 @@ -284,7 +284,11 @@ // 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 @@ 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(); }