# HG changeset patch # User zgu # Date 1347413331 25200 # Node ID 3f18d439b40241af56463893dcb2b42004b5545d # Parent 33143ee0780040aeb1f1b7e96839675c9e84e2af# Parent 8a02ca5e55760f0af3a85969a08d39ac00562d35 Merge diff -r 33143ee07800 -r 3f18d439b402 agent/src/share/classes/sun/jvm/hotspot/oops/InstanceClassLoaderKlass.java --- a/agent/src/share/classes/sun/jvm/hotspot/oops/InstanceClassLoaderKlass.java Tue Sep 11 20:53:17 2012 -0400 +++ b/agent/src/share/classes/sun/jvm/hotspot/oops/InstanceClassLoaderKlass.java Tue Sep 11 18:28:51 2012 -0700 @@ -45,7 +45,7 @@ private static synchronized void initialize(TypeDataBase db) throws WrongTypeException { // Just make sure it's there for now - Type type = db.lookupType("instanceClassLoaderKlass"); + Type type = db.lookupType("InstanceClassLoaderKlass"); } public InstanceClassLoaderKlass(Address addr) { diff -r 33143ee07800 -r 3f18d439b402 agent/src/share/classes/sun/jvm/hotspot/oops/InstanceMirrorKlass.java --- a/agent/src/share/classes/sun/jvm/hotspot/oops/InstanceMirrorKlass.java Tue Sep 11 20:53:17 2012 -0400 +++ b/agent/src/share/classes/sun/jvm/hotspot/oops/InstanceMirrorKlass.java Tue Sep 11 18:28:51 2012 -0700 @@ -45,7 +45,7 @@ private static synchronized void initialize(TypeDataBase db) throws WrongTypeException { // Just make sure it's there for now - Type type = db.lookupType("instanceMirrorKlass"); + Type type = db.lookupType("InstanceMirrorKlass"); } public InstanceMirrorKlass(Address addr) { diff -r 33143ee07800 -r 3f18d439b402 agent/src/share/classes/sun/jvm/hotspot/oops/InstanceRefKlass.java --- a/agent/src/share/classes/sun/jvm/hotspot/oops/InstanceRefKlass.java Tue Sep 11 20:53:17 2012 -0400 +++ b/agent/src/share/classes/sun/jvm/hotspot/oops/InstanceRefKlass.java Tue Sep 11 18:28:51 2012 -0700 @@ -45,7 +45,7 @@ private static synchronized void initialize(TypeDataBase db) throws WrongTypeException { // Just make sure it's there for now - Type type = db.lookupType("instanceRefKlass"); + Type type = db.lookupType("InstanceRefKlass"); } public InstanceRefKlass(Address addr) { diff -r 33143ee07800 -r 3f18d439b402 agent/src/share/classes/sun/jvm/hotspot/oops/Metadata.java --- a/agent/src/share/classes/sun/jvm/hotspot/oops/Metadata.java Tue Sep 11 20:53:17 2012 -0400 +++ b/agent/src/share/classes/sun/jvm/hotspot/oops/Metadata.java Tue Sep 11 18:28:51 2012 -0700 @@ -52,9 +52,9 @@ metadataConstructor.addMapping("Metadata", Metadata.class); metadataConstructor.addMapping("Klass", Klass.class); metadataConstructor.addMapping("InstanceKlass", InstanceKlass.class); - metadataConstructor.addMapping("instanceMirrorKlass", InstanceMirrorKlass.class); - metadataConstructor.addMapping("instanceRefKlass", InstanceRefKlass.class); - metadataConstructor.addMapping("instanceClassLoaderKlass", InstanceClassLoaderKlass.class); + metadataConstructor.addMapping("InstanceMirrorKlass", InstanceMirrorKlass.class); + metadataConstructor.addMapping("InstanceRefKlass", InstanceRefKlass.class); + metadataConstructor.addMapping("InstanceClassLoaderKlass", InstanceClassLoaderKlass.class); metadataConstructor.addMapping("typeArrayKlass", TypeArrayKlass.class); metadataConstructor.addMapping("objArrayKlass", ObjArrayKlass.class); metadataConstructor.addMapping("Method", Method.class); diff -r 33143ee07800 -r 3f18d439b402 make/solaris/makefiles/fastdebug.make --- a/make/solaris/makefiles/fastdebug.make Tue Sep 11 20:53:17 2012 -0400 +++ b/make/solaris/makefiles/fastdebug.make Tue Sep 11 18:28:51 2012 -0700 @@ -41,9 +41,6 @@ OPT_CFLAGS/simpleThresholdPolicy.o = $(OPT_CFLAGS/DEFAULT) $(OPT_CCFLAGS/NO_TAIL_CALL_OPT) # CC 5.10 has bug XXXXX with -xO4 OPT_CFLAGS/jvmtiClassFileReconstituter.o = $(OPT_CFLAGS/SLOWER) -# jvm98 crashes on solaris-i586-fastdebug and solaris-sparc-fastdebug with stack overflow -OPT_CFLAGS/escape.o = $(OPT_CFLAGS) -xspace -OPT_CFLAGS/matcher.o = $(OPT_CFLAGS) -xspace endif # COMPILER_REV_NUMERIC == 510 ifeq ($(COMPILER_REV_NUMERIC), 509) diff -r 33143ee07800 -r 3f18d439b402 src/cpu/sparc/vm/c1_FrameMap_sparc.cpp --- a/src/cpu/sparc/vm/c1_FrameMap_sparc.cpp Tue Sep 11 20:53:17 2012 -0400 +++ b/src/cpu/sparc/vm/c1_FrameMap_sparc.cpp Tue Sep 11 18:28:51 2012 -0700 @@ -147,6 +147,39 @@ LIR_Opr FrameMap::I6_oop_opr; LIR_Opr FrameMap::I7_oop_opr; +LIR_Opr FrameMap::G0_metadata_opr; +LIR_Opr FrameMap::G1_metadata_opr; +LIR_Opr FrameMap::G2_metadata_opr; +LIR_Opr FrameMap::G3_metadata_opr; +LIR_Opr FrameMap::G4_metadata_opr; +LIR_Opr FrameMap::G5_metadata_opr; +LIR_Opr FrameMap::G6_metadata_opr; +LIR_Opr FrameMap::G7_metadata_opr; +LIR_Opr FrameMap::O0_metadata_opr; +LIR_Opr FrameMap::O1_metadata_opr; +LIR_Opr FrameMap::O2_metadata_opr; +LIR_Opr FrameMap::O3_metadata_opr; +LIR_Opr FrameMap::O4_metadata_opr; +LIR_Opr FrameMap::O5_metadata_opr; +LIR_Opr FrameMap::O6_metadata_opr; +LIR_Opr FrameMap::O7_metadata_opr; +LIR_Opr FrameMap::L0_metadata_opr; +LIR_Opr FrameMap::L1_metadata_opr; +LIR_Opr FrameMap::L2_metadata_opr; +LIR_Opr FrameMap::L3_metadata_opr; +LIR_Opr FrameMap::L4_metadata_opr; +LIR_Opr FrameMap::L5_metadata_opr; +LIR_Opr FrameMap::L6_metadata_opr; +LIR_Opr FrameMap::L7_metadata_opr; +LIR_Opr FrameMap::I0_metadata_opr; +LIR_Opr FrameMap::I1_metadata_opr; +LIR_Opr FrameMap::I2_metadata_opr; +LIR_Opr FrameMap::I3_metadata_opr; +LIR_Opr FrameMap::I4_metadata_opr; +LIR_Opr FrameMap::I5_metadata_opr; +LIR_Opr FrameMap::I6_metadata_opr; +LIR_Opr FrameMap::I7_metadata_opr; + LIR_Opr FrameMap::SP_opr; LIR_Opr FrameMap::FP_opr; @@ -310,6 +343,39 @@ I6_oop_opr = as_oop_opr(I6); I7_oop_opr = as_oop_opr(I7); + G0_metadata_opr = as_metadata_opr(G0); + G1_metadata_opr = as_metadata_opr(G1); + G2_metadata_opr = as_metadata_opr(G2); + G3_metadata_opr = as_metadata_opr(G3); + G4_metadata_opr = as_metadata_opr(G4); + G5_metadata_opr = as_metadata_opr(G5); + G6_metadata_opr = as_metadata_opr(G6); + G7_metadata_opr = as_metadata_opr(G7); + O0_metadata_opr = as_metadata_opr(O0); + O1_metadata_opr = as_metadata_opr(O1); + O2_metadata_opr = as_metadata_opr(O2); + O3_metadata_opr = as_metadata_opr(O3); + O4_metadata_opr = as_metadata_opr(O4); + O5_metadata_opr = as_metadata_opr(O5); + O6_metadata_opr = as_metadata_opr(O6); + O7_metadata_opr = as_metadata_opr(O7); + L0_metadata_opr = as_metadata_opr(L0); + L1_metadata_opr = as_metadata_opr(L1); + L2_metadata_opr = as_metadata_opr(L2); + L3_metadata_opr = as_metadata_opr(L3); + L4_metadata_opr = as_metadata_opr(L4); + L5_metadata_opr = as_metadata_opr(L5); + L6_metadata_opr = as_metadata_opr(L6); + L7_metadata_opr = as_metadata_opr(L7); + I0_metadata_opr = as_metadata_opr(I0); + I1_metadata_opr = as_metadata_opr(I1); + I2_metadata_opr = as_metadata_opr(I2); + I3_metadata_opr = as_metadata_opr(I3); + I4_metadata_opr = as_metadata_opr(I4); + I5_metadata_opr = as_metadata_opr(I5); + I6_metadata_opr = as_metadata_opr(I6); + I7_metadata_opr = as_metadata_opr(I7); + FP_opr = as_pointer_opr(FP); SP_opr = as_pointer_opr(SP); diff -r 33143ee07800 -r 3f18d439b402 src/cpu/sparc/vm/c1_FrameMap_sparc.hpp --- a/src/cpu/sparc/vm/c1_FrameMap_sparc.hpp Tue Sep 11 20:53:17 2012 -0400 +++ b/src/cpu/sparc/vm/c1_FrameMap_sparc.hpp Tue Sep 11 18:28:51 2012 -0700 @@ -104,6 +104,39 @@ static LIR_Opr I6_oop_opr; static LIR_Opr I7_oop_opr; + static LIR_Opr G0_metadata_opr; + static LIR_Opr G1_metadata_opr; + static LIR_Opr G2_metadata_opr; + static LIR_Opr G3_metadata_opr; + static LIR_Opr G4_metadata_opr; + static LIR_Opr G5_metadata_opr; + static LIR_Opr G6_metadata_opr; + static LIR_Opr G7_metadata_opr; + static LIR_Opr O0_metadata_opr; + static LIR_Opr O1_metadata_opr; + static LIR_Opr O2_metadata_opr; + static LIR_Opr O3_metadata_opr; + static LIR_Opr O4_metadata_opr; + static LIR_Opr O5_metadata_opr; + static LIR_Opr O6_metadata_opr; + static LIR_Opr O7_metadata_opr; + static LIR_Opr L0_metadata_opr; + static LIR_Opr L1_metadata_opr; + static LIR_Opr L2_metadata_opr; + static LIR_Opr L3_metadata_opr; + static LIR_Opr L4_metadata_opr; + static LIR_Opr L5_metadata_opr; + static LIR_Opr L6_metadata_opr; + static LIR_Opr L7_metadata_opr; + static LIR_Opr I0_metadata_opr; + static LIR_Opr I1_metadata_opr; + static LIR_Opr I2_metadata_opr; + static LIR_Opr I3_metadata_opr; + static LIR_Opr I4_metadata_opr; + static LIR_Opr I5_metadata_opr; + static LIR_Opr I6_metadata_opr; + static LIR_Opr I7_metadata_opr; + static LIR_Opr in_long_opr; static LIR_Opr out_long_opr; static LIR_Opr g1_long_single_opr; diff -r 33143ee07800 -r 3f18d439b402 src/cpu/sparc/vm/c1_LIRAssembler_sparc.cpp --- a/src/cpu/sparc/vm/c1_LIRAssembler_sparc.cpp Tue Sep 11 20:53:17 2012 -0400 +++ b/src/cpu/sparc/vm/c1_LIRAssembler_sparc.cpp Tue Sep 11 18:28:51 2012 -0700 @@ -447,9 +447,12 @@ if (compilation()->env()->dtrace_method_probes()) { __ mov(G2_thread, O0); + __ save_thread(I1); // need to preserve thread in G2 across + // runtime call metadata2reg(method()->constant_encoding(), O1); __ call(CAST_FROM_FN_PTR(address, SharedRuntime::dtrace_method_exit), relocInfo::runtime_call_type); __ delayed()->nop(); + __ restore_thread(I1); } if (method()->is_synchronized() || compilation()->env()->dtrace_method_probes()) { @@ -843,6 +846,7 @@ #endif break; case T_ADDRESS: + case T_METADATA: __ st_ptr(from_reg->as_register(), base, offset); break; case T_ARRAY : // fall through @@ -965,6 +969,7 @@ #endif } break; + case T_METADATA: case T_ADDRESS: __ ld_ptr(base, offset, to_reg->as_register()); break; case T_ARRAY : // fall through case T_OBJECT: @@ -1366,6 +1371,7 @@ void LIR_Assembler::mem2reg(LIR_Opr src_opr, LIR_Opr dest, BasicType type, LIR_PatchCode patch_code, CodeEmitInfo* info, bool wide, bool unaligned) { + assert(type != T_METADATA, "load of metadata ptr not supported"); LIR_Address* addr = src_opr->as_address_ptr(); LIR_Opr to_reg = dest; @@ -1513,6 +1519,7 @@ void LIR_Assembler::reg2mem(LIR_Opr from_reg, LIR_Opr dest, BasicType type, LIR_PatchCode patch_code, CodeEmitInfo* info, bool pop_fpu_stack, bool wide, bool unaligned) { + assert(type != T_METADATA, "store of metadata ptr not supported"); LIR_Address* addr = dest->as_address_ptr(); Register src = addr->base()->as_pointer_register(); diff -r 33143ee07800 -r 3f18d439b402 src/cpu/sparc/vm/c1_LIRGenerator_sparc.cpp --- a/src/cpu/sparc/vm/c1_LIRGenerator_sparc.cpp Tue Sep 11 20:53:17 2012 -0400 +++ b/src/cpu/sparc/vm/c1_LIRGenerator_sparc.cpp Tue Sep 11 18:28:51 2012 -0700 @@ -884,7 +884,7 @@ 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_oop_opr; + LIR_Opr klass_reg = FrameMap::G5_metadata_opr; new_instance(reg, x->klass(), tmp1, tmp2, tmp3, tmp4, klass_reg, info); LIR_Opr result = rlock_result(x); __ move(reg, result); @@ -903,11 +903,11 @@ 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_oop_opr; + LIR_Opr klass_reg = FrameMap::G5_metadata_opr; LIR_Opr len = length.result(); BasicType elem_type = x->elt_type(); - __ oop2reg(ciTypeArrayKlass::make(elem_type)->constant_encoding(), klass_reg); + __ metadata2reg(ciTypeArrayKlass::make(elem_type)->constant_encoding(), klass_reg); CodeStub* slow_path = new NewTypeArrayStub(klass_reg, len, reg, info); __ allocate_array(reg, len, tmp1, tmp2, tmp3, tmp4, elem_type, klass_reg, slow_path); @@ -935,7 +935,7 @@ 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_oop_opr; + LIR_Opr klass_reg = FrameMap::G5_metadata_opr; LIR_Opr len = length.result(); CodeStub* slow_path = new NewObjectArrayStub(klass_reg, len, reg, info); @@ -985,8 +985,8 @@ // This instruction can be deoptimized in the slow path : use // O0 as result register. - const LIR_Opr reg = result_register_for(x->type()); - klass2reg_with_patching(reg, x->klass(), patching_info); + const LIR_Opr klass_reg = FrameMap::O0_metadata_opr; + klass2reg_with_patching(klass_reg, x->klass(), patching_info); LIR_Opr rank = FrameMap::O1_opr; __ move(LIR_OprFact::intConst(x->rank()), rank); LIR_Opr varargs = FrameMap::as_pointer_opr(O2); @@ -995,9 +995,10 @@ LIR_OprFact::intptrConst(offset_from_sp), varargs); LIR_OprList* args = new LIR_OprList(3); - args->append(reg); + args->append(klass_reg); args->append(rank); args->append(varargs); + const LIR_Opr reg = result_register_for(x->type()); __ call_runtime(Runtime1::entry_for(Runtime1::new_multi_array_id), LIR_OprFact::illegalOpr, reg, args, info); diff -r 33143ee07800 -r 3f18d439b402 src/cpu/sparc/vm/sharedRuntime_sparc.cpp --- a/src/cpu/sparc/vm/sharedRuntime_sparc.cpp Tue Sep 11 20:53:17 2012 -0400 +++ b/src/cpu/sparc/vm/sharedRuntime_sparc.cpp Tue Sep 11 18:28:51 2012 -0700 @@ -1340,6 +1340,7 @@ case T_ADDRESS: // raw pointers, like current thread, for VM calls case T_ARRAY: case T_OBJECT: + case T_METADATA: regs[i].set2( int_stk_helper( j ) ); break; case T_FLOAT: @@ -1388,6 +1389,7 @@ case T_FLOAT: case T_INT: case T_OBJECT: + case T_METADATA: case T_SHORT: regs[i].set1( int_stk_helper( i ) ); break; diff -r 33143ee07800 -r 3f18d439b402 src/cpu/x86/vm/c1_FrameMap_x86.cpp --- a/src/cpu/x86/vm/c1_FrameMap_x86.cpp Tue Sep 11 20:53:17 2012 -0400 +++ b/src/cpu/x86/vm/c1_FrameMap_x86.cpp Tue Sep 11 18:28:51 2012 -0700 @@ -96,6 +96,13 @@ LIR_Opr FrameMap::rdx_oop_opr; LIR_Opr FrameMap::rcx_oop_opr; +LIR_Opr FrameMap::rsi_metadata_opr; +LIR_Opr FrameMap::rdi_metadata_opr; +LIR_Opr FrameMap::rbx_metadata_opr; +LIR_Opr FrameMap::rax_metadata_opr; +LIR_Opr FrameMap::rdx_metadata_opr; +LIR_Opr FrameMap::rcx_metadata_opr; + LIR_Opr FrameMap::long0_opr; LIR_Opr FrameMap::long1_opr; LIR_Opr FrameMap::fpu0_float_opr; @@ -122,6 +129,13 @@ LIR_Opr FrameMap::r12_oop_opr; LIR_Opr FrameMap::r13_oop_opr; LIR_Opr FrameMap::r14_oop_opr; + +LIR_Opr FrameMap::r8_metadata_opr; +LIR_Opr FrameMap::r9_metadata_opr; +LIR_Opr FrameMap::r11_metadata_opr; +LIR_Opr FrameMap::r12_metadata_opr; +LIR_Opr FrameMap::r13_metadata_opr; +LIR_Opr FrameMap::r14_metadata_opr; #endif // _LP64 LIR_Opr FrameMap::_caller_save_cpu_regs[] = { 0, }; @@ -236,6 +250,13 @@ rdx_oop_opr = as_oop_opr(rdx); rcx_oop_opr = as_oop_opr(rcx); + rsi_metadata_opr = as_metadata_opr(rsi); + rdi_metadata_opr = as_metadata_opr(rdi); + rbx_metadata_opr = as_metadata_opr(rbx); + rax_metadata_opr = as_metadata_opr(rax); + rdx_metadata_opr = as_metadata_opr(rdx); + rcx_metadata_opr = as_metadata_opr(rcx); + rsp_opr = as_pointer_opr(rsp); rbp_opr = as_pointer_opr(rbp); @@ -246,6 +267,13 @@ r12_oop_opr = as_oop_opr(r12); r13_oop_opr = as_oop_opr(r13); r14_oop_opr = as_oop_opr(r14); + + r8_metadata_opr = as_metadata_opr(r8); + r9_metadata_opr = as_metadata_opr(r9); + r11_metadata_opr = as_metadata_opr(r11); + r12_metadata_opr = as_metadata_opr(r12); + r13_metadata_opr = as_metadata_opr(r13); + r14_metadata_opr = as_metadata_opr(r14); #endif // _LP64 VMRegPair regs; diff -r 33143ee07800 -r 3f18d439b402 src/cpu/x86/vm/c1_FrameMap_x86.hpp --- a/src/cpu/x86/vm/c1_FrameMap_x86.hpp Tue Sep 11 20:53:17 2012 -0400 +++ b/src/cpu/x86/vm/c1_FrameMap_x86.hpp Tue Sep 11 18:28:51 2012 -0700 @@ -73,6 +73,14 @@ static LIR_Opr rax_oop_opr; static LIR_Opr rdx_oop_opr; static LIR_Opr rcx_oop_opr; + + static LIR_Opr rsi_metadata_opr; + static LIR_Opr rdi_metadata_opr; + static LIR_Opr rbx_metadata_opr; + static LIR_Opr rax_metadata_opr; + static LIR_Opr rdx_metadata_opr; + static LIR_Opr rcx_metadata_opr; + #ifdef _LP64 static LIR_Opr r8_opr; @@ -92,6 +100,14 @@ static LIR_Opr r13_oop_opr; static LIR_Opr r14_oop_opr; + static LIR_Opr r8_metadata_opr; + static LIR_Opr r9_metadata_opr; + + static LIR_Opr r11_metadata_opr; + static LIR_Opr r12_metadata_opr; + static LIR_Opr r13_metadata_opr; + static LIR_Opr r14_metadata_opr; + #endif // _LP64 static LIR_Opr long0_opr; diff -r 33143ee07800 -r 3f18d439b402 src/cpu/x86/vm/c1_LIRAssembler_x86.cpp --- a/src/cpu/x86/vm/c1_LIRAssembler_x86.cpp Tue Sep 11 20:53:17 2012 -0400 +++ b/src/cpu/x86/vm/c1_LIRAssembler_x86.cpp Tue Sep 11 18:28:51 2012 -0700 @@ -950,6 +950,8 @@ if (type == T_OBJECT || type == T_ARRAY) { __ verify_oop(src->as_register()); __ movptr (dst, src->as_register()); + } else if (type == T_METADATA) { + __ movptr (dst, src->as_register()); } else { __ movl (dst, src->as_register()); } @@ -1041,6 +1043,14 @@ __ movptr(as_Address(to_addr), src->as_register()); } break; + case T_METADATA: + // We get here to store a method pointer to the stack to pass to + // a dtrace runtime call. This can't work on 64 bit with + // compressed klass ptrs: T_METADATA can be a compressed klass + // ptr or a 64 bit method pointer. + LP64_ONLY(ShouldNotReachHere()); + __ movptr(as_Address(to_addr), src->as_register()); + break; case T_ADDRESS: __ movptr(as_Address(to_addr), src->as_register()); break; @@ -1118,6 +1128,8 @@ if (type == T_ARRAY || type == T_OBJECT) { __ movptr(dest->as_register(), frame_map()->address_for_slot(src->single_stack_ix())); __ verify_oop(dest->as_register()); + } else if (type == T_METADATA) { + __ movptr(dest->as_register(), frame_map()->address_for_slot(src->single_stack_ix())); } else { __ movl(dest->as_register(), frame_map()->address_for_slot(src->single_stack_ix())); } diff -r 33143ee07800 -r 3f18d439b402 src/cpu/x86/vm/c1_LIRGenerator_x86.cpp --- a/src/cpu/x86/vm/c1_LIRGenerator_x86.cpp Tue Sep 11 20:53:17 2012 -0400 +++ b/src/cpu/x86/vm/c1_LIRGenerator_x86.cpp Tue Sep 11 18:28:51 2012 -0700 @@ -1002,13 +1002,12 @@ #endif CodeEmitInfo* info = state_for(x, x->state()); LIR_Opr reg = result_register_for(x->type()); - LIR_Opr klass_reg = new_register(objectType); new_instance(reg, x->klass(), FrameMap::rcx_oop_opr, FrameMap::rdi_oop_opr, FrameMap::rsi_oop_opr, LIR_OprFact::illegalOpr, - FrameMap::rdx_oop_opr, info); + FrameMap::rdx_metadata_opr, info); LIR_Opr result = rlock_result(x); __ move(reg, result); } @@ -1025,11 +1024,11 @@ LIR_Opr tmp2 = FrameMap::rsi_oop_opr; LIR_Opr tmp3 = FrameMap::rdi_oop_opr; LIR_Opr tmp4 = reg; - LIR_Opr klass_reg = FrameMap::rdx_oop_opr; + LIR_Opr klass_reg = FrameMap::rdx_metadata_opr; LIR_Opr len = length.result(); BasicType elem_type = x->elt_type(); - __ oop2reg(ciTypeArrayKlass::make(elem_type)->constant_encoding(), klass_reg); + __ metadata2reg(ciTypeArrayKlass::make(elem_type)->constant_encoding(), klass_reg); CodeStub* slow_path = new NewTypeArrayStub(klass_reg, len, reg, info); __ allocate_array(reg, len, tmp1, tmp2, tmp3, tmp4, elem_type, klass_reg, slow_path); @@ -1055,7 +1054,7 @@ LIR_Opr tmp2 = FrameMap::rsi_oop_opr; LIR_Opr tmp3 = FrameMap::rdi_oop_opr; LIR_Opr tmp4 = reg; - LIR_Opr klass_reg = FrameMap::rdx_oop_opr; + LIR_Opr klass_reg = FrameMap::rdx_metadata_opr; length.load_item_force(FrameMap::rbx_opr); LIR_Opr len = length.result(); @@ -1103,17 +1102,18 @@ store_stack_parameter(size->result(), in_ByteSize(i*4)); } - LIR_Opr reg = result_register_for(x->type()); - klass2reg_with_patching(reg, x->klass(), patching_info); + LIR_Opr klass_reg = FrameMap::rax_metadata_opr; + klass2reg_with_patching(klass_reg, x->klass(), patching_info); LIR_Opr rank = FrameMap::rbx_opr; __ move(LIR_OprFact::intConst(x->rank()), rank); LIR_Opr varargs = FrameMap::rcx_opr; __ move(FrameMap::rsp_opr, varargs); LIR_OprList* args = new LIR_OprList(3); - args->append(reg); + args->append(klass_reg); args->append(rank); args->append(varargs); + LIR_Opr reg = result_register_for(x->type()); __ call_runtime(Runtime1::entry_for(Runtime1::new_multi_array_id), LIR_OprFact::illegalOpr, reg, args, info); diff -r 33143ee07800 -r 3f18d439b402 src/cpu/x86/vm/sharedRuntime_x86_32.cpp --- a/src/cpu/x86/vm/sharedRuntime_x86_32.cpp Tue Sep 11 20:53:17 2012 -0400 +++ b/src/cpu/x86/vm/sharedRuntime_x86_32.cpp Tue Sep 11 18:28:51 2012 -0700 @@ -938,6 +938,7 @@ case T_OBJECT: case T_ARRAY: case T_ADDRESS: + case T_METADATA: regs[i].set1(VMRegImpl::stack2reg(stack++)); break; case T_LONG: diff -r 33143ee07800 -r 3f18d439b402 src/cpu/x86/vm/sharedRuntime_x86_64.cpp --- a/src/cpu/x86/vm/sharedRuntime_x86_64.cpp Tue Sep 11 20:53:17 2012 -0400 +++ b/src/cpu/x86/vm/sharedRuntime_x86_64.cpp Tue Sep 11 18:28:51 2012 -0700 @@ -903,6 +903,7 @@ case T_OBJECT: case T_ARRAY: case T_ADDRESS: + case T_METADATA: if (int_args < Argument::n_int_register_parameters_c) { regs[i].set2(INT_ArgReg[int_args++]->as_VMReg()); #ifdef _WIN64 diff -r 33143ee07800 -r 3f18d439b402 src/share/vm/c1/c1_FrameMap.hpp --- a/src/share/vm/c1/c1_FrameMap.hpp Tue Sep 11 20:53:17 2012 -0400 +++ b/src/share/vm/c1/c1_FrameMap.hpp Tue Sep 11 18:28:51 2012 -0700 @@ -194,6 +194,10 @@ return LIR_OprFact::single_cpu_oop(cpu_reg2rnr(r)); } + static LIR_Opr as_metadata_opr(Register r) { + return LIR_OprFact::single_cpu_metadata(cpu_reg2rnr(r)); + } + FrameMap(ciMethod* method, int monitors, int reserved_argument_area_size); bool finalize_frame(int nof_slots); diff -r 33143ee07800 -r 3f18d439b402 src/share/vm/c1/c1_LIR.cpp --- a/src/share/vm/c1/c1_LIR.cpp Tue Sep 11 20:53:17 2012 -0400 +++ b/src/share/vm/c1/c1_LIR.cpp Tue Sep 11 18:28:51 2012 -0700 @@ -89,8 +89,12 @@ ClassConstant* c = type->as_ClassConstant(); if (c != NULL && !c->value()->is_loaded()) { return LIR_OprFact::metadataConst(NULL); + } else if (c != NULL) { + return LIR_OprFact::metadataConst(c->value()->constant_encoding()); } else { - return LIR_OprFact::metadataConst(c->value()->constant_encoding()); + MethodConstant* m = type->as_MethodConstant(); + assert (m != NULL, "not a class or a method?"); + return LIR_OprFact::metadataConst(m->value()->constant_encoding()); } } case objectTag : { @@ -1166,10 +1170,12 @@ void LIR_List::oop2reg_patch(jobject o, LIR_Opr reg, CodeEmitInfo* info) { + assert(reg->type() == T_OBJECT, "bad reg"); append(new LIR_Op1(lir_move, LIR_OprFact::oopConst(o), reg, T_OBJECT, lir_patch_normal, info)); } void LIR_List::klass2reg_patch(Metadata* o, LIR_Opr reg, CodeEmitInfo* info) { + assert(reg->type() == T_METADATA, "bad reg"); append(new LIR_Op1(lir_move, LIR_OprFact::metadataConst(o), reg, T_METADATA, lir_patch_normal, info)); } diff -r 33143ee07800 -r 3f18d439b402 src/share/vm/c1/c1_LIR.hpp --- a/src/share/vm/c1/c1_LIR.hpp Tue Sep 11 20:53:17 2012 -0400 +++ b/src/share/vm/c1/c1_LIR.hpp Tue Sep 11 18:28:51 2012 -0700 @@ -299,6 +299,7 @@ , address_type = 4 << type_shift , float_type = 5 << type_shift , double_type = 6 << type_shift + , metadata_type = 7 << type_shift }; friend OprType as_OprType(BasicType t); friend BasicType as_BasicType(OprType t); @@ -322,6 +323,7 @@ case T_ADDRESS: case T_OBJECT: case T_ARRAY: + case T_METADATA: return single_size; break; @@ -474,6 +476,7 @@ case T_OBJECT: case T_ARRAY: return LIR_OprDesc::object_type; case T_ADDRESS: return LIR_OprDesc::address_type; + case T_METADATA: return LIR_OprDesc::metadata_type; case T_ILLEGAL: // fall through default: ShouldNotReachHere(); return LIR_OprDesc::unknown_type; } @@ -487,6 +490,7 @@ case LIR_OprDesc::double_type: return T_DOUBLE; case LIR_OprDesc::object_type: return T_OBJECT; case LIR_OprDesc::address_type: return T_ADDRESS; + case LIR_OprDesc::metadata_type:return T_METADATA; case LIR_OprDesc::unknown_type: // fall through default: ShouldNotReachHere(); return T_ILLEGAL; } @@ -587,6 +591,12 @@ LIR_OprDesc::cpu_register | LIR_OprDesc::single_size); } + static LIR_Opr single_cpu_metadata(int reg) { + return (LIR_Opr)(intptr_t)((reg << LIR_OprDesc::reg1_shift) | + LIR_OprDesc::metadata_type | + LIR_OprDesc::cpu_register | + LIR_OprDesc::single_size); + } static LIR_Opr double_cpu(int reg1, int reg2) { LP64_ONLY(assert(reg1 == reg2, "must be identical")); return (LIR_Opr)(intptr_t)((reg1 << LIR_OprDesc::reg1_shift) | @@ -660,6 +670,14 @@ LIR_OprDesc::virtual_mask); break; + case T_METADATA: + res = (LIR_Opr)(intptr_t)((index << LIR_OprDesc::data_shift) | + LIR_OprDesc::metadata_type| + LIR_OprDesc::cpu_register | + LIR_OprDesc::single_size | + LIR_OprDesc::virtual_mask); + break; + case T_INT: res = (LIR_Opr)(intptr_t)((index << LIR_OprDesc::data_shift) | LIR_OprDesc::int_type | @@ -757,6 +775,12 @@ LIR_OprDesc::single_size); break; + case T_METADATA: + res = (LIR_Opr)(intptr_t)((index << LIR_OprDesc::data_shift) | + LIR_OprDesc::metadata_type | + LIR_OprDesc::stack_value | + LIR_OprDesc::single_size); + break; case T_INT: res = (LIR_Opr)(intptr_t)((index << LIR_OprDesc::data_shift) | LIR_OprDesc::int_type | @@ -2006,10 +2030,10 @@ } void volatile_move(LIR_Opr src, LIR_Opr dst, BasicType type, CodeEmitInfo* info = NULL, LIR_PatchCode patch_code = lir_patch_none) { append(new LIR_Op1(lir_move, src, dst, type, patch_code, info, lir_move_volatile)); } - void oop2reg (jobject o, LIR_Opr reg) { append(new LIR_Op1(lir_move, LIR_OprFact::oopConst(o), reg)); } + void oop2reg (jobject o, LIR_Opr reg) { assert(reg->type() == T_OBJECT, "bad reg"); append(new LIR_Op1(lir_move, LIR_OprFact::oopConst(o), reg)); } void oop2reg_patch(jobject o, LIR_Opr reg, CodeEmitInfo* info); - void oop2reg (Metadata* o, LIR_Opr reg) { append(new LIR_Op1(lir_move, LIR_OprFact::metadataConst(o), reg)); } + void metadata2reg (Metadata* o, LIR_Opr reg) { assert(reg->type() == T_METADATA, "bad reg"); append(new LIR_Op1(lir_move, LIR_OprFact::metadataConst(o), reg)); } void klass2reg_patch(Metadata* o, LIR_Opr reg, CodeEmitInfo* info); void return_op(LIR_Opr result) { append(new LIR_Op1(lir_return, result)); } diff -r 33143ee07800 -r 3f18d439b402 src/share/vm/c1/c1_LIRGenerator.cpp --- a/src/share/vm/c1/c1_LIRGenerator.cpp Tue Sep 11 20:53:17 2012 -0400 +++ b/src/share/vm/c1/c1_LIRGenerator.cpp Tue Sep 11 18:28:51 2012 -0700 @@ -467,7 +467,7 @@ __ klass2reg_patch(NULL, r, info); } else { // no patching needed - __ oop2reg(obj->constant_encoding(), r); + __ metadata2reg(obj->constant_encoding(), r); } } @@ -955,8 +955,8 @@ not_taken_count_offset = t; } - LIR_Opr md_reg = new_register(T_OBJECT); - __ oop2reg(md->constant_encoding(), md_reg); + LIR_Opr md_reg = new_register(T_METADATA); + __ metadata2reg(md->constant_encoding(), md_reg); LIR_Opr data_offset_reg = new_pointer_register(); __ cmove(lir_cond(cond), @@ -1192,8 +1192,8 @@ signature.append(T_OBJECT); // Method* LIR_OprList* args = new LIR_OprList(); args->append(getThreadPointer()); - LIR_Opr meth = new_register(T_OBJECT); - __ oop2reg(method()->constant_encoding(), meth); + LIR_Opr meth = new_register(T_METADATA); + __ metadata2reg(method()->constant_encoding(), meth); args->append(meth); call_runtime(&signature, args, CAST_FROM_FN_PTR(address, SharedRuntime::dtrace_method_exit), voidType, NULL); } @@ -2292,7 +2292,7 @@ if (gen_type_check) { // We have determined that offset == referent_offset && src != null. // if (src->_klass->_reference_type == REF_NONE) -> continue - __ move(new LIR_Address(src.result(), oopDesc::klass_offset_in_bytes(), T_OBJECT), src_klass); + __ move(new LIR_Address(src.result(), oopDesc::klass_offset_in_bytes(), UseCompressedKlassPointers ? T_OBJECT : T_ADDRESS), src_klass); LIR_Address* reference_type_addr = new LIR_Address(src_klass, in_bytes(InstanceKlass::reference_type_offset()), T_BYTE); LIR_Opr reference_type = new_register(T_INT); __ move(reference_type_addr, reference_type); @@ -2553,8 +2553,8 @@ assert(data->is_JumpData(), "need JumpData for branches"); offset = md->byte_offset_of_slot(data, JumpData::taken_offset()); } - LIR_Opr md_reg = new_register(T_OBJECT); - __ oop2reg(md->constant_encoding(), md_reg); + LIR_Opr md_reg = new_register(T_METADATA); + __ metadata2reg(md->constant_encoding(), md_reg); increment_counter(new LIR_Address(md_reg, offset, NOT_LP64(T_INT) LP64_ONLY(T_LONG)), DataLayout::counter_increment); @@ -2611,8 +2611,8 @@ signature.append(T_OBJECT); // Method* LIR_OprList* args = new LIR_OprList(); args->append(getThreadPointer()); - LIR_Opr meth = new_register(T_OBJECT); - __ oop2reg(method()->constant_encoding(), meth); + LIR_Opr meth = new_register(T_METADATA); + __ metadata2reg(method()->constant_encoding(), meth); args->append(meth); call_runtime(&signature, args, CAST_FROM_FN_PTR(address, SharedRuntime::dtrace_method_entry), voidType, NULL); } @@ -3032,21 +3032,21 @@ assert(level > CompLevel_simple, "Shouldn't be here"); int offset = -1; - LIR_Opr counter_holder = new_register(T_OBJECT); + LIR_Opr counter_holder = new_register(T_METADATA); LIR_Opr meth; if (level == CompLevel_limited_profile) { offset = in_bytes(backedge ? Method::backedge_counter_offset() : Method::invocation_counter_offset()); - __ oop2reg(method->constant_encoding(), counter_holder); + __ metadata2reg(method->constant_encoding(), counter_holder); meth = counter_holder; } else if (level == CompLevel_full_profile) { offset = in_bytes(backedge ? MethodData::backedge_counter_offset() : MethodData::invocation_counter_offset()); ciMethodData* md = method->method_data_or_null(); assert(md != NULL, "Sanity"); - __ oop2reg(md->constant_encoding(), counter_holder); - meth = new_register(T_OBJECT); - __ oop2reg(method->constant_encoding(), meth); + __ metadata2reg(md->constant_encoding(), counter_holder); + meth = new_register(T_METADATA); + __ metadata2reg(method->constant_encoding(), meth); } else { ShouldNotReachHere(); } diff -r 33143ee07800 -r 3f18d439b402 src/share/vm/c1/c1_LinearScan.cpp --- a/src/share/vm/c1/c1_LinearScan.cpp Tue Sep 11 20:53:17 2012 -0400 +++ b/src/share/vm/c1/c1_LinearScan.cpp Tue Sep 11 18:28:51 2012 -0700 @@ -2067,6 +2067,12 @@ return LIR_OprFact::single_cpu_address(assigned_reg); } + case T_METADATA: { + assert(assigned_reg >= pd_first_cpu_reg && assigned_reg <= pd_last_cpu_reg, "no cpu register"); + assert(interval->assigned_regHi() == any_reg, "must not have hi register"); + return LIR_OprFact::single_cpu_metadata(assigned_reg); + } + #ifdef __SOFTFP__ case T_FLOAT: // fall through #endif // __SOFTFP__ diff -r 33143ee07800 -r 3f18d439b402 src/share/vm/c1/c1_ValueType.cpp --- a/src/share/vm/c1/c1_ValueType.cpp Tue Sep 11 20:53:17 2012 -0400 +++ b/src/share/vm/c1/c1_ValueType.cpp Tue Sep 11 18:28:51 2012 -0700 @@ -168,6 +168,7 @@ case floatTag: return T_FLOAT; case doubleTag: return T_DOUBLE; case objectTag: return T_OBJECT; + case metaDataTag:return T_METADATA; case addressTag: return T_ADDRESS; case illegalTag: return T_ILLEGAL; } diff -r 33143ee07800 -r 3f18d439b402 src/share/vm/classfile/classFileParser.cpp --- a/src/share/vm/classfile/classFileParser.cpp Tue Sep 11 20:53:17 2012 -0400 +++ b/src/share/vm/classfile/classFileParser.cpp Tue Sep 11 18:28:51 2012 -0700 @@ -3271,7 +3271,7 @@ int next_nonstatic_field_offset; // Calculate the starting byte offsets - next_static_oop_offset = instanceMirrorKlass::offset_of_static_fields(); + next_static_oop_offset = InstanceMirrorKlass::offset_of_static_fields(); next_static_double_offset = next_static_oop_offset + (fac.count[STATIC_OOP] * heapOopSize); if ( fac.count[STATIC_DOUBLE] && diff -r 33143ee07800 -r 3f18d439b402 src/share/vm/classfile/javaClasses.cpp --- a/src/share/vm/classfile/javaClasses.cpp Tue Sep 11 20:53:17 2012 -0400 +++ b/src/share/vm/classfile/javaClasses.cpp Tue Sep 11 18:28:51 2012 -0700 @@ -500,7 +500,7 @@ void java_lang_Class::fixup_mirror(KlassHandle k, TRAPS) { - assert(instanceMirrorKlass::offset_of_static_fields() != 0, "must have been computed already"); + assert(InstanceMirrorKlass::offset_of_static_fields() != 0, "must have been computed already"); // If the offset was read from the shared archive, it was fixed up already if (!k->is_shared()) { @@ -510,7 +510,7 @@ // update all the static field offsets to included the size. for (JavaFieldStream fs(InstanceKlass::cast(k())); !fs.done(); fs.next()) { if (fs.access_flags().is_static()) { - int real_offset = fs.offset() + instanceMirrorKlass::offset_of_static_fields(); + int real_offset = fs.offset() + InstanceMirrorKlass::offset_of_static_fields(); fs.set_offset(real_offset); } } @@ -531,9 +531,9 @@ // the mirror. if (SystemDictionary::Class_klass_loaded()) { // Allocate mirror (java.lang.Class instance) - Handle mirror = instanceMirrorKlass::cast(SystemDictionary::Class_klass())->allocate_instance(k, CHECK_0); - - instanceMirrorKlass* mk = instanceMirrorKlass::cast(mirror->klass()); + Handle mirror = InstanceMirrorKlass::cast(SystemDictionary::Class_klass())->allocate_instance(k, CHECK_0); + + InstanceMirrorKlass* mk = InstanceMirrorKlass::cast(mirror->klass()); java_lang_Class::set_static_oop_field_count(mirror(), mk->compute_static_oop_field_count(mirror())); // It might also have a component mirror. This mirror must already exist. @@ -592,14 +592,14 @@ oop java_lang_Class::create_basic_type_mirror(const char* basic_type_name, BasicType type, TRAPS) { // This should be improved by adding a field at the Java level or by // introducing a new VM klass (see comment in ClassFileParser) - oop java_class = instanceMirrorKlass::cast(SystemDictionary::Class_klass())->allocate_instance(NULL, CHECK_0); + oop java_class = InstanceMirrorKlass::cast(SystemDictionary::Class_klass())->allocate_instance(NULL, CHECK_0); if (type != T_VOID) { Klass* aklass = Universe::typeArrayKlassObj(type); assert(aklass != NULL, "correct bootstrap"); set_array_klass(java_class, aklass); } #ifdef ASSERT - instanceMirrorKlass* mk = instanceMirrorKlass::cast(SystemDictionary::Class_klass()); + InstanceMirrorKlass* mk = InstanceMirrorKlass::cast(SystemDictionary::Class_klass()); assert(java_lang_Class::static_oop_field_count(java_class) == 0, "should have been zeroed by allocation"); #endif return java_class; @@ -2835,17 +2835,17 @@ // Support for java_lang_System int java_lang_System::in_offset_in_bytes() { - return (instanceMirrorKlass::offset_of_static_fields() + static_in_offset); + return (InstanceMirrorKlass::offset_of_static_fields() + static_in_offset); } int java_lang_System::out_offset_in_bytes() { - return (instanceMirrorKlass::offset_of_static_fields() + static_out_offset); + return (InstanceMirrorKlass::offset_of_static_fields() + static_out_offset); } int java_lang_System::err_offset_in_bytes() { - return (instanceMirrorKlass::offset_of_static_fields() + static_err_offset); + return (InstanceMirrorKlass::offset_of_static_fields() + static_err_offset); } @@ -3124,10 +3124,10 @@ tty->print_cr("Static field %s.%s appears to be nonstatic", klass_name, field_name); return false; } - if (fd.offset() == hardcoded_offset + instanceMirrorKlass::offset_of_static_fields()) { + if (fd.offset() == hardcoded_offset + InstanceMirrorKlass::offset_of_static_fields()) { return true; } else { - tty->print_cr("Offset of static field %s.%s is hardcoded as %d but should really be %d.", klass_name, field_name, hardcoded_offset, fd.offset() - instanceMirrorKlass::offset_of_static_fields()); + tty->print_cr("Offset of static field %s.%s is hardcoded as %d but should really be %d.", klass_name, field_name, hardcoded_offset, fd.offset() - InstanceMirrorKlass::offset_of_static_fields()); return false; } } diff -r 33143ee07800 -r 3f18d439b402 src/share/vm/classfile/systemDictionary.cpp --- a/src/share/vm/classfile/systemDictionary.cpp Tue Sep 11 20:53:17 2012 -0400 +++ b/src/share/vm/classfile/systemDictionary.cpp Tue Sep 11 18:28:51 2012 -0700 @@ -1953,7 +1953,7 @@ // Initialize the constant pool for the Object_class InstanceKlass* ik = InstanceKlass::cast(Object_klass()); ik->constants()->restore_unshareable_info(CHECK); - initialize_wk_klasses_through(WK_KLASS_ENUM_NAME(Class_klass), scan, CHECK); + initialize_wk_klasses_through(WK_KLASS_ENUM_NAME(Class_klass), scan, CHECK); } else { initialize_wk_klasses_through(WK_KLASS_ENUM_NAME(Class_klass), scan, CHECK); } @@ -1976,7 +1976,7 @@ // Preload ref klasses and set reference types InstanceKlass::cast(WK_KLASS(Reference_klass))->set_reference_type(REF_OTHER); - instanceRefKlass::update_nonstatic_oop_maps(WK_KLASS(Reference_klass)); + InstanceRefKlass::update_nonstatic_oop_maps(WK_KLASS(Reference_klass)); initialize_wk_klasses_through(WK_KLASS_ENUM_NAME(PhantomReference_klass), scan, CHECK); InstanceKlass::cast(WK_KLASS(SoftReference_klass))->set_reference_type(REF_SOFT); diff -r 33143ee07800 -r 3f18d439b402 src/share/vm/compiler/compileBroker.cpp --- a/src/share/vm/compiler/compileBroker.cpp Tue Sep 11 20:53:17 2012 -0400 +++ b/src/share/vm/compiler/compileBroker.cpp Tue Sep 11 18:28:51 2012 -0700 @@ -1108,7 +1108,7 @@ // the pending list lock or a 3-way deadlock may occur // between the reference handler thread, a GC (instigated // by a compiler thread), and compiled method registration. - if (instanceRefKlass::owns_pending_list_lock(JavaThread::current())) { + if (InstanceRefKlass::owns_pending_list_lock(JavaThread::current())) { return; } @@ -1440,7 +1440,7 @@ // Should the current thread be blocked until this compilation request // has been fulfilled? bool CompileBroker::is_compile_blocking(methodHandle method, int osr_bci) { - assert(!instanceRefKlass::owns_pending_list_lock(JavaThread::current()), "possible deadlock"); + assert(!InstanceRefKlass::owns_pending_list_lock(JavaThread::current()), "possible deadlock"); return !BackgroundCompilation; } diff -r 33143ee07800 -r 3f18d439b402 src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.hpp --- a/src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.hpp Tue Sep 11 20:53:17 2012 -0400 +++ b/src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.hpp Tue Sep 11 18:28:51 2012 -0700 @@ -839,7 +839,7 @@ friend class AdjustKlassClosure; friend class FollowKlassClosure; friend class FollowRootClosure; - friend class instanceClassLoaderKlass; + friend class InstanceClassLoaderKlass; friend class RefProcTaskProxy; private: diff -r 33143ee07800 -r 3f18d439b402 src/share/vm/gc_implementation/shared/concurrentGCThread.cpp --- a/src/share/vm/gc_implementation/shared/concurrentGCThread.cpp Tue Sep 11 20:53:17 2012 -0400 +++ b/src/share/vm/gc_implementation/shared/concurrentGCThread.cpp Tue Sep 11 18:28:51 2012 -0700 @@ -255,13 +255,13 @@ } switch(msg) { case acquirePLL: { - instanceRefKlass::acquire_pending_list_lock(&pll_basic_lock); + InstanceRefKlass::acquire_pending_list_lock(&pll_basic_lock); debug_only(owned++;) break; } case releaseAndNotifyPLL: { assert(owned > 0, "Don't have PLL"); - instanceRefKlass::release_and_notify_pending_list_lock(&pll_basic_lock); + InstanceRefKlass::release_and_notify_pending_list_lock(&pll_basic_lock); debug_only(owned--;) break; } diff -r 33143ee07800 -r 3f18d439b402 src/share/vm/gc_implementation/shared/vmGCOperations.cpp --- a/src/share/vm/gc_implementation/shared/vmGCOperations.cpp Tue Sep 11 20:53:17 2012 -0400 +++ b/src/share/vm/gc_implementation/shared/vmGCOperations.cpp Tue Sep 11 18:28:51 2012 -0700 @@ -70,13 +70,13 @@ void VM_GC_Operation::acquire_pending_list_lock() { // we may enter this with pending exception set - instanceRefKlass::acquire_pending_list_lock(&_pending_list_basic_lock); + InstanceRefKlass::acquire_pending_list_lock(&_pending_list_basic_lock); } void VM_GC_Operation::release_and_notify_pending_list_lock() { - instanceRefKlass::release_and_notify_pending_list_lock(&_pending_list_basic_lock); + InstanceRefKlass::release_and_notify_pending_list_lock(&_pending_list_basic_lock); } // Allocations may fail in several threads at about the same time, diff -r 33143ee07800 -r 3f18d439b402 src/share/vm/gc_interface/collectedHeap.cpp --- a/src/share/vm/gc_interface/collectedHeap.cpp Tue Sep 11 20:53:17 2012 -0400 +++ b/src/share/vm/gc_interface/collectedHeap.cpp Tue Sep 11 18:28:51 2012 -0700 @@ -516,7 +516,7 @@ real_klass->set_java_mirror(mirror); } - instanceMirrorKlass* mk = instanceMirrorKlass::cast(mirror->klass()); + InstanceMirrorKlass* mk = InstanceMirrorKlass::cast(mirror->klass()); assert(size == mk->instance_size(real_klass), "should have been set"); // notify jvmti and dtrace diff -r 33143ee07800 -r 3f18d439b402 src/share/vm/interpreter/interpreterRuntime.cpp --- a/src/share/vm/interpreter/interpreterRuntime.cpp Tue Sep 11 20:53:17 2012 -0400 +++ b/src/share/vm/interpreter/interpreterRuntime.cpp Tue Sep 11 18:28:51 2012 -0700 @@ -734,6 +734,7 @@ } // end JvmtiHideSingleStepping cache_entry(thread)->set_method_handle( + pool, info.resolved_method(), info.resolved_appendix(), pool->resolved_references()); @@ -761,6 +762,7 @@ ConstantPoolCacheEntry* cp_cache_entry = pool->invokedynamic_cp_cache_entry_at(index); cp_cache_entry->set_dynamic_call( + pool, info.resolved_method(), info.resolved_appendix(), pool->resolved_references()); diff -r 33143ee07800 -r 3f18d439b402 src/share/vm/memory/iterator.cpp --- a/src/share/vm/memory/iterator.cpp Tue Sep 11 20:53:17 2012 -0400 +++ b/src/share/vm/memory/iterator.cpp Tue Sep 11 18:28:51 2012 -0700 @@ -26,6 +26,10 @@ #include "memory/iterator.hpp" #include "oops/oop.inline.hpp" +void KlassToOopClosure::do_klass(Klass* k) { + k->oops_do(_oop_closure); +} + void ObjectToOopClosure::do_object(oop obj) { obj->oop_iterate(_cl); } diff -r 33143ee07800 -r 3f18d439b402 src/share/vm/memory/iterator.hpp --- a/src/share/vm/memory/iterator.hpp Tue Sep 11 20:53:17 2012 -0400 +++ b/src/share/vm/memory/iterator.hpp Tue Sep 11 18:28:51 2012 -0700 @@ -128,6 +128,13 @@ virtual void do_klass(Klass* k) = 0; }; +class KlassToOopClosure : public KlassClosure { + OopClosure* _oop_closure; + public: + KlassToOopClosure(OopClosure* oop_closure) : _oop_closure(oop_closure) {} + virtual void do_klass(Klass* k); +}; + // ObjectClosure is used for iterating through an object space class ObjectClosure : public Closure { diff -r 33143ee07800 -r 3f18d439b402 src/share/vm/memory/metaspace.cpp --- a/src/share/vm/memory/metaspace.cpp Tue Sep 11 20:53:17 2012 -0400 +++ b/src/share/vm/memory/metaspace.cpp Tue Sep 11 18:28:51 2012 -0700 @@ -2541,7 +2541,7 @@ // MetaspaceAux -size_t MetaspaceAux::used_in_bytes_unsafe(Metaspace::MetadataType mdtype) { +size_t MetaspaceAux::used_in_bytes(Metaspace::MetadataType mdtype) { size_t used = 0; ClassLoaderDataGraphMetaspaceIterator iter; while (iter.repeat()) { @@ -2554,33 +2554,6 @@ return used * BytesPerWord; } -size_t MetaspaceAux::used_in_bytes(Metaspace::MetadataType mdtype) { - assert(SafepointSynchronize::is_at_safepoint(), - "Consistency checks require being at a safepoint"); - size_t used = 0; -#ifdef ASSERT - size_t free = 0; - size_t capacity = 0; -#endif - ClassLoaderDataGraphMetaspaceIterator iter; - while (iter.repeat()) { - Metaspace* msp = iter.get_next(); - // Sum allocation_total for each metaspace - if (msp != NULL) { - used += msp->used_words(mdtype); -#ifdef ASSERT - free += msp->free_words(mdtype); - capacity += msp->capacity_words(mdtype); - assert(used + free == capacity, - err_msg("Accounting is wrong used " SIZE_FORMAT - " free " SIZE_FORMAT " capacity " SIZE_FORMAT, - used, free, capacity)); -#endif - } - } - return used * BytesPerWord; -} - size_t MetaspaceAux::free_in_bytes(Metaspace::MetadataType mdtype) { size_t free = 0; ClassLoaderDataGraphMetaspaceIterator iter; @@ -2661,15 +2634,15 @@ out->print_cr(" Metaspace total " SIZE_FORMAT "K, used " SIZE_FORMAT "K," " reserved " SIZE_FORMAT "K", - capacity_in_bytes()/K, used_in_bytes_unsafe()/K, reserved_in_bytes()/K); + capacity_in_bytes()/K, used_in_bytes()/K, reserved_in_bytes()/K); out->print_cr(" data space " SIZE_FORMAT "K, used " SIZE_FORMAT "K," " reserved " SIZE_FORMAT "K", - capacity_in_bytes(nct)/K, used_in_bytes_unsafe(nct)/K, reserved_in_bytes(nct)/K); + capacity_in_bytes(nct)/K, used_in_bytes(nct)/K, reserved_in_bytes(nct)/K); out->print_cr(" class space " SIZE_FORMAT "K, used " SIZE_FORMAT "K," " reserved " SIZE_FORMAT "K", - capacity_in_bytes(ct)/K, used_in_bytes_unsafe(ct)/K, reserved_in_bytes(ct)/K); + capacity_in_bytes(ct)/K, used_in_bytes(ct)/K, reserved_in_bytes(ct)/K); } // Print information for class space and data space separately. @@ -2806,19 +2779,22 @@ _class_space_list = new VirtualSpaceList(rs); } -// Class space probably needs a lot less than data space -const int class_space_divisor = 4; void Metaspace::initialize(Mutex* lock, size_t initial_size) { - // Use SmallChunk size if not specified, adjust class to smaller size if so. + // Use SmallChunk size if not specified. If specified, use this size for + // the data metaspace. size_t word_size; size_t class_word_size; if (initial_size == 0) { word_size = (size_t) SpaceManager::SmallChunk; - class_word_size = word_size; + class_word_size = (size_t) SpaceManager::SmallChunk; } else { word_size = initial_size; - class_word_size = initial_size/class_space_divisor; + // Make the first class chunk bigger than a medium chunk so it's not put + // on the medium chunk list. The next chunk will be small and progress + // from there. This size calculated by -version. + class_word_size = MIN2((size_t)SpaceManager::MediumChunk*5, + (ClassMetaspaceSize/BytesPerWord)*2); } assert(space_list() != NULL, diff -r 33143ee07800 -r 3f18d439b402 src/share/vm/memory/metaspace.hpp --- a/src/share/vm/memory/metaspace.hpp Tue Sep 11 20:53:17 2012 -0400 +++ b/src/share/vm/memory/metaspace.hpp Tue Sep 11 18:28:51 2012 -0700 @@ -149,10 +149,6 @@ // Statistics for class space and data space in metaspace. static size_t used_in_bytes(Metaspace::MetadataType mdtype); - // Same as used_in_bytes() without the consistency checking. - // Use this version if not at a safepoint (so consistency is - // not necessarily expected). - static size_t used_in_bytes_unsafe(Metaspace::MetadataType mdtype); static size_t free_in_bytes(Metaspace::MetadataType mdtype); static size_t capacity_in_bytes(Metaspace::MetadataType mdtype); static size_t reserved_in_bytes(Metaspace::MetadataType mdtype); @@ -167,11 +163,6 @@ used_in_bytes(Metaspace::NonClassType); } - static size_t used_in_bytes_unsafe() { - return used_in_bytes_unsafe(Metaspace::ClassType) + - used_in_bytes_unsafe(Metaspace::NonClassType); - } - // Total of available space in all Metaspaces // Total of capacity allocated to all Metaspaces. This includes // space in Metachunks not yet allocated and in the Metachunk diff -r 33143ee07800 -r 3f18d439b402 src/share/vm/memory/metaspaceCounters.cpp --- a/src/share/vm/memory/metaspaceCounters.cpp Tue Sep 11 20:53:17 2012 -0400 +++ b/src/share/vm/memory/metaspaceCounters.cpp Tue Sep 11 18:28:51 2012 -0700 @@ -35,7 +35,7 @@ size_t min_capacity = MetaspaceAux::min_chunk_size(); size_t max_capacity = MetaspaceAux::reserved_in_bytes(); size_t curr_capacity = MetaspaceAux::capacity_in_bytes(); - size_t used = MetaspaceAux::used_in_bytes_unsafe(); + size_t used = MetaspaceAux::used_in_bytes(); initialize(min_capacity, max_capacity, curr_capacity, used); } @@ -131,7 +131,7 @@ void MetaspaceCounters::update_used() { assert(UsePerfData, "Should not be called unless being used"); - size_t used_in_bytes = MetaspaceAux::used_in_bytes_unsafe(); + size_t used_in_bytes = MetaspaceAux::used_in_bytes(); _used->set_value(used_in_bytes); } diff -r 33143ee07800 -r 3f18d439b402 src/share/vm/memory/metaspaceShared.cpp --- a/src/share/vm/memory/metaspaceShared.cpp Tue Sep 11 20:53:17 2012 -0400 +++ b/src/share/vm/memory/metaspaceShared.cpp Tue Sep 11 18:28:51 2012 -0700 @@ -153,9 +153,9 @@ // // Execution time: // First virtual method call for any object of these metadata types: -// 1. object->klass->klass_part -// 2. vtable entry for that klass_part points to the jump table entries -// 3. branches to common_code with %O0/klass_part, %L0: Klass index <<8 + method index +// 1. object->klass +// 2. vtable entry for that klass points to the jump table entries +// 3. branches to common_code with %O0/klass, %L0: Klass index <<8 + method index // 4. common_code: // Get address of new vtbl pointer for this Klass from updated table // Update new vtbl pointer in the Klass: future virtual calls go direct diff -r 33143ee07800 -r 3f18d439b402 src/share/vm/memory/referenceProcessor.cpp --- a/src/share/vm/memory/referenceProcessor.cpp Tue Sep 11 20:53:17 2012 -0400 +++ b/src/share/vm/memory/referenceProcessor.cpp Tue Sep 11 18:28:51 2012 -0700 @@ -1036,7 +1036,7 @@ list = &_discoveredPhantomRefs[id]; break; case REF_NONE: - // we should not reach here if we are an instanceRefKlass + // we should not reach here if we are an InstanceRefKlass default: ShouldNotReachHere(); } diff -r 33143ee07800 -r 3f18d439b402 src/share/vm/memory/specialized_oop_closures.hpp --- a/src/share/vm/memory/specialized_oop_closures.hpp Tue Sep 11 20:53:17 2012 -0400 +++ b/src/share/vm/memory/specialized_oop_closures.hpp Tue Sep 11 18:28:51 2012 -0700 @@ -199,7 +199,7 @@ public: enum Kind { ik, // InstanceKlass - irk, // instanceRefKlass + irk, // InstanceRefKlass oa, // objArrayKlass NUM_Kinds }; diff -r 33143ee07800 -r 3f18d439b402 src/share/vm/memory/universe.cpp --- a/src/share/vm/memory/universe.cpp Tue Sep 11 20:53:17 2012 -0400 +++ b/src/share/vm/memory/universe.cpp Tue Sep 11 18:28:51 2012 -0700 @@ -435,9 +435,9 @@ void Universe::init_self_patching_vtbl_list(void** list, int count) { int n = 0; { InstanceKlass o; add_vtable(list, &n, &o, count); } - { instanceClassLoaderKlass o; add_vtable(list, &n, &o, count); } - { instanceMirrorKlass o; add_vtable(list, &n, &o, count); } - { instanceRefKlass o; add_vtable(list, &n, &o, count); } + { InstanceClassLoaderKlass o; add_vtable(list, &n, &o, count); } + { InstanceMirrorKlass o; add_vtable(list, &n, &o, count); } + { InstanceRefKlass o; add_vtable(list, &n, &o, count); } { typeArrayKlass o; add_vtable(list, &n, &o, count); } { objArrayKlass o; add_vtable(list, &n, &o, count); } { Method o; add_vtable(list, &n, &o, count); } @@ -486,7 +486,7 @@ assert(SystemDictionary::Class_klass_loaded(), "java.lang.Class should be loaded"); HandleMark hm(THREAD); // Cache the start of the static fields - instanceMirrorKlass::init_offset_of_static_fields(); + InstanceMirrorKlass::init_offset_of_static_fields(); GrowableArray * list = java_lang_Class::fixup_mirror_list(); int list_length = list->length(); @@ -858,7 +858,7 @@ ReservedSpace Universe::reserve_heap(size_t heap_size, size_t alignment) { // Add in the class metaspace area so the classes in the headers can // be compressed the same as instances. - size_t total_reserved = heap_size + ClassMetaspaceSize; + size_t total_reserved = align_size_up(heap_size + ClassMetaspaceSize, alignment); char* addr = Universe::preferred_heap_base(total_reserved, Universe::UnscaledNarrowOop); ReservedHeapSpace total_rs(total_reserved, alignment, UseLargePages, addr); diff -r 33143ee07800 -r 3f18d439b402 src/share/vm/oops/constantPool.cpp --- a/src/share/vm/oops/constantPool.cpp Tue Sep 11 20:53:17 2012 -0400 +++ b/src/share/vm/oops/constantPool.cpp Tue Sep 11 18:28:51 2012 -0700 @@ -152,6 +152,10 @@ // CDS support. Create a new resolved_references array. void ConstantPool::restore_unshareable_info(TRAPS) { + + // restore the C++ vtable from the shared archive + restore_vtable(); + if (SystemDictionary::Object_klass_loaded()) { // Recreate the object array and add to ClassLoaderData. int map_length = resolved_reference_length(); diff -r 33143ee07800 -r 3f18d439b402 src/share/vm/oops/constantPool.hpp --- a/src/share/vm/oops/constantPool.hpp Tue Sep 11 20:53:17 2012 -0400 +++ b/src/share/vm/oops/constantPool.hpp Tue Sep 11 18:28:51 2012 -0700 @@ -643,6 +643,11 @@ void remove_unshareable_info(); void restore_unshareable_info(TRAPS); bool resolve_class_constants(TRAPS); + // The ConstantPool vtable is restored by this call when the ConstantPool is + // in the shared archive. See patch_klass_vtables() in metaspaceShared.cpp for + // all the gory details. SA, dtrace and pstack helpers distinguish metadata + // by their vtable. + void restore_vtable() { guarantee(is_constantPool(), "vtable restored by this call"); } private: enum { _no_index_sentinel = -1, _possible_index_sentinel = -2 }; diff -r 33143ee07800 -r 3f18d439b402 src/share/vm/oops/cpCache.cpp --- a/src/share/vm/oops/cpCache.cpp Tue Sep 11 20:53:17 2012 -0400 +++ b/src/share/vm/oops/cpCache.cpp Tue Sep 11 18:28:51 2012 -0700 @@ -243,17 +243,20 @@ } -void ConstantPoolCacheEntry::set_method_handle(methodHandle adapter, Handle appendix, +void ConstantPoolCacheEntry::set_method_handle(constantPoolHandle cpool, + methodHandle adapter, Handle appendix, objArrayHandle resolved_references) { - set_method_handle_common(Bytecodes::_invokehandle, adapter, appendix, resolved_references); + set_method_handle_common(cpool, Bytecodes::_invokehandle, adapter, appendix, resolved_references); } -void ConstantPoolCacheEntry::set_dynamic_call(methodHandle adapter, Handle appendix, +void ConstantPoolCacheEntry::set_dynamic_call(constantPoolHandle cpool, + methodHandle adapter, Handle appendix, objArrayHandle resolved_references) { - set_method_handle_common(Bytecodes::_invokedynamic, adapter, appendix, resolved_references); + set_method_handle_common(cpool, Bytecodes::_invokedynamic, adapter, appendix, resolved_references); } -void ConstantPoolCacheEntry::set_method_handle_common(Bytecodes::Code invoke_code, +void ConstantPoolCacheEntry::set_method_handle_common(constantPoolHandle cpool, + Bytecodes::Code invoke_code, methodHandle adapter, Handle appendix, objArrayHandle resolved_references) { @@ -261,28 +264,23 @@ // There are three words to update: flags, refs[f2], f1 (in that order). // Writers must store all other values before f1. // Readers must test f1 first for non-null before reading other fields. - // Competing writers must acquire exclusive access on the first - // write, to flags, using a compare/exchange. - // A losing writer to flags must spin until the winner writes f1, - // so that when he returns, he can use the linked cache entry. + // Competing writers must acquire exclusive access via a lock. + // A losing writer waits on the lock until the winner writes f1 and leaves + // the lock, so that when the losing writer returns, he can use the linked + // cache entry. + + MonitorLockerEx ml(cpool->lock()); + if (!is_f1_null()) { + return; + } bool has_appendix = appendix.not_null(); // Write the flags. - bool owner = - init_method_flags_atomic(as_TosState(adapter->result_type()), + set_method_flags(as_TosState(adapter->result_type()), ((has_appendix ? 1 : 0) << has_appendix_shift) | ( 1 << is_final_shift), adapter->size_of_parameters()); - if (!owner) { - // Somebody else is working on the same CPCE. Let them proceed. - while (is_f1_null()) { - // Pause momentarily on a low-level lock, to allow racing thread to win. - MutexLockerEx mu(Patching_lock, Mutex::_no_safepoint_check_flag); - os::yield(); - } - return; - } if (TraceInvokeDynamic) { tty->print_cr("set_method_handle bc=%d appendix="PTR_FORMAT"%s method="PTR_FORMAT" ", diff -r 33143ee07800 -r 3f18d439b402 src/share/vm/oops/cpCache.hpp --- a/src/share/vm/oops/cpCache.hpp Tue Sep 11 20:53:17 2012 -0400 +++ b/src/share/vm/oops/cpCache.hpp Tue Sep 11 18:28:51 2012 -0700 @@ -221,12 +221,14 @@ ); void set_method_handle( + constantPoolHandle cpool, // holding constant pool (required for locking) methodHandle method, // adapter for invokeExact, etc. Handle appendix, // stored in refs[f2]; could be a java.lang.invoke.MethodType objArrayHandle resolved_references ); void set_dynamic_call( + constantPoolHandle cpool, // holding constant pool (required for locking) methodHandle method, // adapter for this call site Handle appendix, // stored in refs[f2]; could be a java.lang.invoke.CallSite objArrayHandle resolved_references @@ -248,6 +250,7 @@ // resolution logic needs to make slightly different assessments about the // number and types of arguments. void set_method_handle_common( + constantPoolHandle cpool, // holding constant pool (required for locking) Bytecodes::Code invoke_code, // _invokehandle or _invokedynamic methodHandle adapter, // invoker method (f1) Handle appendix, // appendix such as CallSite, MethodType, etc. (refs[f2]) diff -r 33143ee07800 -r 3f18d439b402 src/share/vm/oops/instanceClassLoaderKlass.cpp --- a/src/share/vm/oops/instanceClassLoaderKlass.cpp Tue Sep 11 20:53:17 2012 -0400 +++ b/src/share/vm/oops/instanceClassLoaderKlass.cpp Tue Sep 11 18:28:51 2012 -0700 @@ -49,14 +49,14 @@ "Inconsistency in do_metadata"); \ if (closure->do_metadata##nv_suffix()) -// Macro to define instanceClassLoaderKlass::oop_oop_iterate for virtual/nonvirtual for +// Macro to define InstanceClassLoaderKlass::oop_oop_iterate for virtual/nonvirtual for // all closures. Macros calling macros above for each oop size. // Since ClassLoader objects have only a pointer to the loader_data, they are not // compressed nor does the pointer move. #define InstanceClassLoaderKlass_OOP_OOP_ITERATE_DEFN(OopClosureType, nv_suffix)\ \ -int instanceClassLoaderKlass:: \ +int InstanceClassLoaderKlass:: \ oop_oop_iterate##nv_suffix(oop obj, OopClosureType* closure) { \ /* Get size before changing pointers */ \ SpecializationStats::record_iterate_call##nv_suffix(SpecializationStats::irk);\ @@ -76,7 +76,7 @@ #ifndef SERIALGC #define InstanceClassLoaderKlass_OOP_OOP_ITERATE_BACKWARDS_DEFN(OopClosureType, nv_suffix) \ \ -int instanceClassLoaderKlass:: \ +int InstanceClassLoaderKlass:: \ oop_oop_iterate_backwards##nv_suffix(oop obj, OopClosureType* closure) { \ /* Get size before changing pointers */ \ SpecializationStats::record_iterate_call##nv_suffix(SpecializationStats::irk);\ @@ -88,7 +88,7 @@ #define InstanceClassLoaderKlass_OOP_OOP_ITERATE_DEFN_m(OopClosureType, nv_suffix) \ \ -int instanceClassLoaderKlass:: \ +int InstanceClassLoaderKlass:: \ oop_oop_iterate##nv_suffix##_m(oop obj, \ OopClosureType* closure, \ MemRegion mr) { \ @@ -118,7 +118,7 @@ ALL_OOP_OOP_ITERATE_CLOSURES_1(InstanceClassLoaderKlass_OOP_OOP_ITERATE_DEFN_m) ALL_OOP_OOP_ITERATE_CLOSURES_2(InstanceClassLoaderKlass_OOP_OOP_ITERATE_DEFN_m) -void instanceClassLoaderKlass::oop_follow_contents(oop obj) { +void InstanceClassLoaderKlass::oop_follow_contents(oop obj) { InstanceKlass::oop_follow_contents(obj); ClassLoaderData * const loader_data = java_lang_ClassLoader::loader_data(obj); @@ -130,7 +130,7 @@ } #ifndef SERIALGC -void instanceClassLoaderKlass::oop_follow_contents(ParCompactionManager* cm, +void InstanceClassLoaderKlass::oop_follow_contents(ParCompactionManager* cm, oop obj) { InstanceKlass::oop_follow_contents(cm, obj); ClassLoaderData * const loader_data = java_lang_ClassLoader::loader_data(obj); @@ -139,7 +139,7 @@ } } -void instanceClassLoaderKlass::oop_push_contents(PSPromotionManager* pm, oop obj) { +void InstanceClassLoaderKlass::oop_push_contents(PSPromotionManager* pm, oop obj) { InstanceKlass::oop_push_contents(pm, obj); // This is called by the young collector. It will already have taken care of @@ -147,7 +147,7 @@ // class loader data link. } -int instanceClassLoaderKlass::oop_update_pointers(ParCompactionManager* cm, oop obj) { +int InstanceClassLoaderKlass::oop_update_pointers(ParCompactionManager* cm, oop obj) { InstanceKlass::oop_update_pointers(cm, obj); ClassLoaderData * const loader_data = java_lang_ClassLoader::loader_data(obj); if (loader_data != NULL) { diff -r 33143ee07800 -r 3f18d439b402 src/share/vm/oops/instanceClassLoaderKlass.hpp --- a/src/share/vm/oops/instanceClassLoaderKlass.hpp Tue Sep 11 20:53:17 2012 -0400 +++ b/src/share/vm/oops/instanceClassLoaderKlass.hpp Tue Sep 11 18:28:51 2012 -0700 @@ -27,24 +27,24 @@ #include "oops/instanceKlass.hpp" -// An instanceClassLoaderKlass is a specialization of the InstanceKlass. It does +// An InstanceClassLoaderKlass is a specialization of the InstanceKlass. It does // not add any field. It is added to walk the dependencies for the class loader // key that this class loader points to. This is how the loader_data graph is // walked and dependant class loaders are kept alive. I thought we walked // the list later? -class instanceClassLoaderKlass: public InstanceKlass { +class InstanceClassLoaderKlass: public InstanceKlass { friend class VMStructs; friend class InstanceKlass; // Constructor - instanceClassLoaderKlass(int vtable_len, int itable_len, int static_field_size, int nonstatic_oop_map_size, ReferenceType rt, AccessFlags access_flags, bool is_anonymous) + InstanceClassLoaderKlass(int vtable_len, int itable_len, int static_field_size, int nonstatic_oop_map_size, ReferenceType rt, AccessFlags access_flags, bool is_anonymous) : InstanceKlass(vtable_len, itable_len, static_field_size, nonstatic_oop_map_size, rt, access_flags, is_anonymous) {} public: virtual bool oop_is_instanceClassLoader() const { return true; } - instanceClassLoaderKlass() { assert(DumpSharedSpaces || UseSharedSpaces, "only for CDS"); } + InstanceClassLoaderKlass() { assert(DumpSharedSpaces || UseSharedSpaces, "only for CDS"); } // Iterators int oop_oop_iterate(oop obj, ExtendedOopClosure* blk) { diff -r 33143ee07800 -r 3f18d439b402 src/share/vm/oops/instanceKlass.cpp --- a/src/share/vm/oops/instanceKlass.cpp Tue Sep 11 20:53:17 2012 -0400 +++ b/src/share/vm/oops/instanceKlass.cpp Tue Sep 11 18:28:51 2012 -0700 @@ -191,14 +191,14 @@ InstanceKlass* ik; if (rt == REF_NONE) { if (name == vmSymbols::java_lang_Class()) { - ik = new (loader_data, size, THREAD) instanceMirrorKlass( + ik = new (loader_data, size, THREAD) InstanceMirrorKlass( vtable_len, itable_len, static_field_size, nonstatic_oop_map_size, rt, access_flags, !host_klass.is_null()); } else if (name == vmSymbols::java_lang_ClassLoader() || (SystemDictionary::ClassLoader_klass_loaded() && super_klass != NULL && super_klass->is_subtype_of(SystemDictionary::ClassLoader_klass()))) { - ik = new (loader_data, size, THREAD) instanceClassLoaderKlass( + ik = new (loader_data, size, THREAD) InstanceClassLoaderKlass( vtable_len, itable_len, static_field_size, nonstatic_oop_map_size, rt, access_flags, !host_klass.is_null()); } else { @@ -209,7 +209,7 @@ } } else { // reference klass - ik = new (loader_data, size, THREAD) instanceRefKlass( + ik = new (loader_data, size, THREAD) InstanceRefKlass( vtable_len, itable_len, static_field_size, nonstatic_oop_map_size, rt, access_flags, !host_klass.is_null()); } @@ -2165,6 +2165,8 @@ for (int index2 = 0; index2 < num_methods; ++index2) { methodHandle m(THREAD, methods->at(index2)); m()->link_method(m, CHECK); + // restore method's vtable by calling a virtual function + m->restore_vtable(); } if (JvmtiExport::has_redefined_a_class()) { // Reinitialize vtable because RedefineClasses may have changed some @@ -2282,7 +2284,7 @@ } address InstanceKlass::static_field_addr(int offset) { - return (address)(offset + instanceMirrorKlass::offset_of_static_fields() + (intptr_t)java_mirror()); + return (address)(offset + InstanceMirrorKlass::offset_of_static_fields() + (intptr_t)java_mirror()); } @@ -3071,7 +3073,7 @@ void JNIid::verify(Klass* holder) { - int first_field_offset = instanceMirrorKlass::offset_of_static_fields(); + int first_field_offset = InstanceMirrorKlass::offset_of_static_fields(); int end_field_offset; end_field_offset = first_field_offset + (InstanceKlass::cast(holder)->static_field_size() * wordSize); diff -r 33143ee07800 -r 3f18d439b402 src/share/vm/oops/instanceMirrorKlass.cpp --- a/src/share/vm/oops/instanceMirrorKlass.cpp Tue Sep 11 20:53:17 2012 -0400 +++ b/src/share/vm/oops/instanceMirrorKlass.cpp Tue Sep 11 18:28:51 2012 -0700 @@ -47,7 +47,7 @@ #include "oops/oop.pcgc.inline.hpp" #endif -int instanceMirrorKlass::_offset_of_static_fields = 0; +int InstanceMirrorKlass::_offset_of_static_fields = 0; #ifdef ASSERT template void assert_is_in(T *p) { @@ -148,7 +148,7 @@ } -void instanceMirrorKlass::oop_follow_contents(oop obj) { +void InstanceMirrorKlass::oop_follow_contents(oop obj) { InstanceKlass::oop_follow_contents(obj); // Follow the klass field in the mirror. @@ -169,7 +169,7 @@ } #ifndef SERIALGC -void instanceMirrorKlass::oop_follow_contents(ParCompactionManager* cm, +void InstanceMirrorKlass::oop_follow_contents(ParCompactionManager* cm, oop obj) { InstanceKlass::oop_follow_contents(cm, obj); @@ -191,7 +191,7 @@ } #endif // SERIALGC -int instanceMirrorKlass::oop_adjust_pointers(oop obj) { +int InstanceMirrorKlass::oop_adjust_pointers(oop obj) { int size = oop_size(obj); InstanceKlass::oop_adjust_pointers(obj); @@ -235,12 +235,12 @@ "Inconsistency in do_metadata"); \ if (closure->do_metadata##nv_suffix()) -// Macro to define instanceMirrorKlass::oop_oop_iterate for virtual/nonvirtual for +// Macro to define InstanceMirrorKlass::oop_oop_iterate for virtual/nonvirtual for // all closures. Macros calling macros above for each oop size. #define InstanceMirrorKlass_OOP_OOP_ITERATE_DEFN(OopClosureType, nv_suffix) \ \ -int instanceMirrorKlass:: \ +int InstanceMirrorKlass:: \ oop_oop_iterate##nv_suffix(oop obj, OopClosureType* closure) { \ /* Get size before changing pointers */ \ SpecializationStats::record_iterate_call##nv_suffix(SpecializationStats::irk); \ @@ -265,7 +265,7 @@ #ifndef SERIALGC #define InstanceMirrorKlass_OOP_OOP_ITERATE_BACKWARDS_DEFN(OopClosureType, nv_suffix) \ \ -int instanceMirrorKlass:: \ +int InstanceMirrorKlass:: \ oop_oop_iterate_backwards##nv_suffix(oop obj, OopClosureType* closure) { \ /* Get size before changing pointers */ \ SpecializationStats::record_iterate_call##nv_suffix(SpecializationStats::irk); \ @@ -283,7 +283,7 @@ #define InstanceMirrorKlass_OOP_OOP_ITERATE_DEFN_m(OopClosureType, nv_suffix) \ \ -int instanceMirrorKlass:: \ +int InstanceMirrorKlass:: \ oop_oop_iterate##nv_suffix##_m(oop obj, \ OopClosureType* closure, \ MemRegion mr) { \ @@ -318,7 +318,7 @@ ALL_OOP_OOP_ITERATE_CLOSURES_2(InstanceMirrorKlass_OOP_OOP_ITERATE_DEFN_m) #ifndef SERIALGC -void instanceMirrorKlass::oop_push_contents(PSPromotionManager* pm, oop obj) { +void InstanceMirrorKlass::oop_push_contents(PSPromotionManager* pm, oop obj) { // Note that we don't have to follow the mirror -> klass pointer, since all // klasses that are dirty will be scavenged when we iterate over the // ClassLoaderData objects. @@ -332,7 +332,7 @@ assert_nothing ) } -int instanceMirrorKlass::oop_update_pointers(ParCompactionManager* cm, oop obj) { +int InstanceMirrorKlass::oop_update_pointers(ParCompactionManager* cm, oop obj) { int size = oop_size(obj); InstanceKlass::oop_update_pointers(cm, obj); @@ -355,14 +355,14 @@ } #endif // SERIALGC -int instanceMirrorKlass::instance_size(KlassHandle k) { +int InstanceMirrorKlass::instance_size(KlassHandle k) { if (k() != NULL && k->oop_is_instance()) { return align_object_size(size_helper() + InstanceKlass::cast(k())->static_field_size()); } return size_helper(); } -instanceOop instanceMirrorKlass::allocate_instance(KlassHandle k, TRAPS) { +instanceOop InstanceMirrorKlass::allocate_instance(KlassHandle k, TRAPS) { // Query before forming handle. int size = instance_size(k); KlassHandle h_k(THREAD, this); @@ -370,11 +370,11 @@ return i; } -int instanceMirrorKlass::oop_size(oop obj) const { +int InstanceMirrorKlass::oop_size(oop obj) const { return java_lang_Class::oop_size(obj); } -int instanceMirrorKlass::compute_static_oop_field_count(oop obj) { +int InstanceMirrorKlass::compute_static_oop_field_count(oop obj) { Klass* k = java_lang_Class::as_Klass(obj); if (k != NULL && k->oop_is_instance()) { return InstanceKlass::cast(k)->static_oop_field_count(); diff -r 33143ee07800 -r 3f18d439b402 src/share/vm/oops/instanceMirrorKlass.hpp --- a/src/share/vm/oops/instanceMirrorKlass.hpp Tue Sep 11 20:53:17 2012 -0400 +++ b/src/share/vm/oops/instanceMirrorKlass.hpp Tue Sep 11 18:28:51 2012 -0700 @@ -29,7 +29,7 @@ #include "oops/instanceKlass.hpp" #include "runtime/handles.hpp" -// An instanceMirrorKlass is a specialized InstanceKlass for +// An InstanceMirrorKlass is a specialized InstanceKlass for // java.lang.Class instances. These instances are special because // they contain the static fields of the class in addition to the // normal fields of Class. This means they are variable sized @@ -37,7 +37,7 @@ // iteration of their oops. -class instanceMirrorKlass: public InstanceKlass { +class InstanceMirrorKlass: public InstanceKlass { friend class VMStructs; friend class InstanceKlass; @@ -45,18 +45,18 @@ static int _offset_of_static_fields; // Constructor - instanceMirrorKlass(int vtable_len, int itable_len, int static_field_size, int nonstatic_oop_map_size, ReferenceType rt, AccessFlags access_flags, bool is_anonymous) + InstanceMirrorKlass(int vtable_len, int itable_len, int static_field_size, int nonstatic_oop_map_size, ReferenceType rt, AccessFlags access_flags, bool is_anonymous) : InstanceKlass(vtable_len, itable_len, static_field_size, nonstatic_oop_map_size, rt, access_flags, is_anonymous) {} public: - instanceMirrorKlass() { assert(DumpSharedSpaces || UseSharedSpaces, "only for CDS"); } + InstanceMirrorKlass() { assert(DumpSharedSpaces || UseSharedSpaces, "only for CDS"); } // Type testing bool oop_is_instanceMirror() const { return true; } // Casting from Klass* - static instanceMirrorKlass* cast(Klass* k) { - assert(k->oop_is_instanceMirror(), "cast to instanceMirrorKlass"); - return (instanceMirrorKlass*) k; + static InstanceMirrorKlass* cast(Klass* k) { + assert(k->oop_is_instanceMirror(), "cast to InstanceMirrorKlass"); + return (InstanceMirrorKlass*) k; } // Returns the size of the instance including the extra static fields. @@ -71,7 +71,7 @@ static void init_offset_of_static_fields() { // Cache the offset of the static fields in the Class instance assert(_offset_of_static_fields == 0, "once"); - _offset_of_static_fields = instanceMirrorKlass::cast(SystemDictionary::Class_klass())->size_helper() << LogHeapWordSize; + _offset_of_static_fields = InstanceMirrorKlass::cast(SystemDictionary::Class_klass())->size_helper() << LogHeapWordSize; } static int offset_of_static_fields() { diff -r 33143ee07800 -r 3f18d439b402 src/share/vm/oops/instanceRefKlass.cpp --- a/src/share/vm/oops/instanceRefKlass.cpp Tue Sep 11 20:53:17 2012 -0400 +++ b/src/share/vm/oops/instanceRefKlass.cpp Tue Sep 11 18:28:51 2012 -0700 @@ -45,12 +45,12 @@ #endif template -void specialized_oop_follow_contents(instanceRefKlass* ref, oop obj) { +void specialized_oop_follow_contents(InstanceRefKlass* ref, oop obj) { T* referent_addr = (T*)java_lang_ref_Reference::referent_addr(obj); T heap_oop = oopDesc::load_heap_oop(referent_addr); debug_only( if(TraceReferenceGC && PrintGCDetails) { - gclog_or_tty->print_cr("instanceRefKlass::oop_follow_contents " INTPTR_FORMAT, obj); + gclog_or_tty->print_cr("InstanceRefKlass::oop_follow_contents " INTPTR_FORMAT, obj); } ) if (!oopDesc::is_null(heap_oop)) { @@ -112,7 +112,7 @@ ref->InstanceKlass::oop_follow_contents(obj); } -void instanceRefKlass::oop_follow_contents(oop obj) { +void InstanceRefKlass::oop_follow_contents(oop obj) { if (UseCompressedOops) { specialized_oop_follow_contents(this, obj); } else { @@ -122,14 +122,14 @@ #ifndef SERIALGC template -void specialized_oop_follow_contents(instanceRefKlass* ref, +void specialized_oop_follow_contents(InstanceRefKlass* ref, ParCompactionManager* cm, oop obj) { T* referent_addr = (T*)java_lang_ref_Reference::referent_addr(obj); T heap_oop = oopDesc::load_heap_oop(referent_addr); debug_only( if(TraceReferenceGC && PrintGCDetails) { - gclog_or_tty->print_cr("instanceRefKlass::oop_follow_contents " INTPTR_FORMAT, obj); + gclog_or_tty->print_cr("InstanceRefKlass::oop_follow_contents " INTPTR_FORMAT, obj); } ) if (!oopDesc::is_null(heap_oop)) { @@ -186,7 +186,7 @@ ref->InstanceKlass::oop_follow_contents(cm, obj); } -void instanceRefKlass::oop_follow_contents(ParCompactionManager* cm, +void InstanceRefKlass::oop_follow_contents(ParCompactionManager* cm, oop obj) { if (UseCompressedOops) { specialized_oop_follow_contents(this, cm, obj); @@ -218,18 +218,18 @@ } #endif -template void specialized_oop_adjust_pointers(instanceRefKlass *ref, oop obj) { +template void specialized_oop_adjust_pointers(InstanceRefKlass *ref, oop obj) { T* referent_addr = (T*)java_lang_ref_Reference::referent_addr(obj); MarkSweep::adjust_pointer(referent_addr); T* next_addr = (T*)java_lang_ref_Reference::next_addr(obj); MarkSweep::adjust_pointer(next_addr); T* discovered_addr = (T*)java_lang_ref_Reference::discovered_addr(obj); MarkSweep::adjust_pointer(discovered_addr); - debug_only(trace_reference_gc("instanceRefKlass::oop_adjust_pointers", obj, + debug_only(trace_reference_gc("InstanceRefKlass::oop_adjust_pointers", obj, referent_addr, next_addr, discovered_addr);) } -int instanceRefKlass::oop_adjust_pointers(oop obj) { +int InstanceRefKlass::oop_adjust_pointers(oop obj) { int size = size_helper(); InstanceKlass::oop_adjust_pointers(obj); @@ -298,12 +298,12 @@ template bool contains(T *t) { return true; } -// Macro to define instanceRefKlass::oop_oop_iterate for virtual/nonvirtual for +// Macro to define InstanceRefKlass::oop_oop_iterate for virtual/nonvirtual for // all closures. Macros calling macros above for each oop size. #define InstanceRefKlass_OOP_OOP_ITERATE_DEFN(OopClosureType, nv_suffix) \ \ -int instanceRefKlass:: \ +int InstanceRefKlass:: \ oop_oop_iterate##nv_suffix(oop obj, OopClosureType* closure) { \ /* Get size before changing pointers */ \ SpecializationStats::record_iterate_call##nv_suffix(SpecializationStats::irk);\ @@ -320,7 +320,7 @@ #ifndef SERIALGC #define InstanceRefKlass_OOP_OOP_ITERATE_BACKWARDS_DEFN(OopClosureType, nv_suffix) \ \ -int instanceRefKlass:: \ +int InstanceRefKlass:: \ oop_oop_iterate_backwards##nv_suffix(oop obj, OopClosureType* closure) { \ /* Get size before changing pointers */ \ SpecializationStats::record_iterate_call##nv_suffix(SpecializationStats::irk);\ @@ -338,7 +338,7 @@ #define InstanceRefKlass_OOP_OOP_ITERATE_DEFN_m(OopClosureType, nv_suffix) \ \ -int instanceRefKlass:: \ +int InstanceRefKlass:: \ oop_oop_iterate##nv_suffix##_m(oop obj, \ OopClosureType* closure, \ MemRegion mr) { \ @@ -363,7 +363,7 @@ #ifndef SERIALGC template -void specialized_oop_push_contents(instanceRefKlass *ref, +void specialized_oop_push_contents(InstanceRefKlass *ref, PSPromotionManager* pm, oop obj) { T* referent_addr = (T*)java_lang_ref_Reference::referent_addr(obj); if (PSScavenge::should_scavenge(referent_addr)) { @@ -414,7 +414,7 @@ ref->InstanceKlass::oop_push_contents(pm, obj); } -void instanceRefKlass::oop_push_contents(PSPromotionManager* pm, oop obj) { +void InstanceRefKlass::oop_push_contents(PSPromotionManager* pm, oop obj) { if (UseCompressedOops) { specialized_oop_push_contents(this, pm, obj); } else { @@ -423,7 +423,7 @@ } template -void specialized_oop_update_pointers(instanceRefKlass *ref, +void specialized_oop_update_pointers(InstanceRefKlass *ref, ParCompactionManager* cm, oop obj) { T* referent_addr = (T*)java_lang_ref_Reference::referent_addr(obj); PSParallelCompact::adjust_pointer(referent_addr); @@ -431,11 +431,11 @@ PSParallelCompact::adjust_pointer(next_addr); T* discovered_addr = (T*)java_lang_ref_Reference::discovered_addr(obj); PSParallelCompact::adjust_pointer(discovered_addr); - debug_only(trace_reference_gc("instanceRefKlass::oop_update_ptrs", obj, + debug_only(trace_reference_gc("InstanceRefKlass::oop_update_ptrs", obj, referent_addr, next_addr, discovered_addr);) } -int instanceRefKlass::oop_update_pointers(ParCompactionManager* cm, oop obj) { +int InstanceRefKlass::oop_update_pointers(ParCompactionManager* cm, oop obj) { InstanceKlass::oop_update_pointers(cm, obj); if (UseCompressedOops) { specialized_oop_update_pointers(this, cm, obj); @@ -446,7 +446,7 @@ } #endif // SERIALGC -void instanceRefKlass::update_nonstatic_oop_maps(Klass* k) { +void InstanceRefKlass::update_nonstatic_oop_maps(Klass* k) { // Clear the nonstatic oop-map entries corresponding to referent // and nextPending field. They are treated specially by the // garbage collector. @@ -485,7 +485,7 @@ // Verification -void instanceRefKlass::oop_verify_on(oop obj, outputStream* st) { +void InstanceRefKlass::oop_verify_on(oop obj, outputStream* st) { InstanceKlass::oop_verify_on(obj, st); // Verify referent field oop referent = java_lang_ref_Reference::referent(obj); @@ -506,13 +506,13 @@ } } -bool instanceRefKlass::owns_pending_list_lock(JavaThread* thread) { +bool InstanceRefKlass::owns_pending_list_lock(JavaThread* thread) { if (java_lang_ref_Reference::pending_list_lock() == NULL) return false; Handle h_lock(thread, java_lang_ref_Reference::pending_list_lock()); return ObjectSynchronizer::current_thread_holds_lock(thread, h_lock); } -void instanceRefKlass::acquire_pending_list_lock(BasicLock *pending_list_basic_lock) { +void InstanceRefKlass::acquire_pending_list_lock(BasicLock *pending_list_basic_lock) { // we may enter this with pending exception set PRESERVE_EXCEPTION_MARK; // exceptions are never thrown, needed for TRAPS argument @@ -529,7 +529,7 @@ if (HAS_PENDING_EXCEPTION) CLEAR_PENDING_EXCEPTION; } -void instanceRefKlass::release_and_notify_pending_list_lock( +void InstanceRefKlass::release_and_notify_pending_list_lock( BasicLock *pending_list_basic_lock) { // we may enter this with pending exception set PRESERVE_EXCEPTION_MARK; // exceptions are never thrown, needed for TRAPS argument diff -r 33143ee07800 -r 3f18d439b402 src/share/vm/oops/instanceRefKlass.hpp --- a/src/share/vm/oops/instanceRefKlass.hpp Tue Sep 11 20:53:17 2012 -0400 +++ b/src/share/vm/oops/instanceRefKlass.hpp Tue Sep 11 18:28:51 2012 -0700 @@ -27,7 +27,7 @@ #include "oops/instanceKlass.hpp" -// An instanceRefKlass is a specialized InstanceKlass for Java +// An InstanceRefKlass is a specialized InstanceKlass for Java // classes that are subclasses of java/lang/ref/Reference. // // These classes are used to implement soft/weak/final/phantom @@ -44,22 +44,22 @@ // and the pending list lock object in the same class is notified. -class instanceRefKlass: public InstanceKlass { +class InstanceRefKlass: public InstanceKlass { friend class InstanceKlass; // Constructor - instanceRefKlass(int vtable_len, int itable_len, int static_field_size, int nonstatic_oop_map_size, ReferenceType rt, AccessFlags access_flags, bool is_anonymous) + InstanceRefKlass(int vtable_len, int itable_len, int static_field_size, int nonstatic_oop_map_size, ReferenceType rt, AccessFlags access_flags, bool is_anonymous) : InstanceKlass(vtable_len, itable_len, static_field_size, nonstatic_oop_map_size, rt, access_flags, is_anonymous) {} public: - instanceRefKlass() { assert(DumpSharedSpaces || UseSharedSpaces, "only for CDS"); } + InstanceRefKlass() { assert(DumpSharedSpaces || UseSharedSpaces, "only for CDS"); } // Type testing bool oop_is_instanceRef() const { return true; } // Casting from Klass* - static instanceRefKlass* cast(Klass* k) { - assert(k->oop_is_instanceRef(), "cast to instanceRefKlass"); - return (instanceRefKlass*) k; + static InstanceRefKlass* cast(Klass* k) { + assert(k->oop_is_instanceRef(), "cast to InstanceRefKlass"); + return (InstanceRefKlass*) k; } // Garbage collection diff -r 33143ee07800 -r 3f18d439b402 src/share/vm/oops/method.cpp --- a/src/share/vm/oops/method.cpp Tue Sep 11 20:53:17 2012 -0400 +++ b/src/share/vm/oops/method.cpp Tue Sep 11 18:28:51 2012 -0700 @@ -376,7 +376,7 @@ void Method::build_interpreter_method_data(methodHandle method, TRAPS) { // Do not profile method if current thread holds the pending list lock, // which avoids deadlock for acquiring the MethodData_lock. - if (instanceRefKlass::owns_pending_list_lock((JavaThread*)THREAD)) { + if (InstanceRefKlass::owns_pending_list_lock((JavaThread*)THREAD)) { return; } diff -r 33143ee07800 -r 3f18d439b402 src/share/vm/oops/method.hpp --- a/src/share/vm/oops/method.hpp Tue Sep 11 20:53:17 2012 -0400 +++ b/src/share/vm/oops/method.hpp Tue Sep 11 18:28:51 2012 -0700 @@ -168,9 +168,16 @@ TRAPS); Method() { assert(DumpSharedSpaces || UseSharedSpaces, "only for CDS"); } + + // The Method vtable is restored by this call when the Method is in the + // shared archive. See patch_klass_vtables() in metaspaceShared.cpp for + // all the gory details. SA, dtrace and pstack helpers distinguish metadata + // by their vtable. + void restore_vtable() { guarantee(is_method(), "vtable restored by this call"); } bool is_method() const volatile { return true; } // accessors for instance variables + ConstMethod* constMethod() const { return _constMethod; } void set_constMethod(ConstMethod* xconst) { _constMethod = xconst; } diff -r 33143ee07800 -r 3f18d439b402 src/share/vm/oops/oopsHierarchy.hpp --- a/src/share/vm/oops/oopsHierarchy.hpp Tue Sep 11 20:53:17 2012 -0400 +++ b/src/share/vm/oops/oopsHierarchy.hpp Tue Sep 11 18:28:51 2012 -0700 @@ -169,9 +169,9 @@ class Klass; class InstanceKlass; -class instanceMirrorKlass; -class instanceClassLoaderKlass; -class instanceRefKlass; +class InstanceMirrorKlass; +class InstanceClassLoaderKlass; +class InstanceRefKlass; class arrayKlass; class objArrayKlass; class typeArrayKlass; diff -r 33143ee07800 -r 3f18d439b402 src/share/vm/opto/runtime.cpp --- a/src/share/vm/opto/runtime.cpp Tue Sep 11 20:53:17 2012 -0400 +++ b/src/share/vm/opto/runtime.cpp Tue Sep 11 18:28:51 2012 -0700 @@ -1148,7 +1148,7 @@ // create input type (domain) const Type **fields = TypeTuple::fields(2); fields[TypeFunc::Parms+0] = TypeRawPtr::BOTTOM; // Thread-local storage - fields[TypeFunc::Parms+1] = TypeInstPtr::NOTNULL; // Method*; Method we are entering + fields[TypeFunc::Parms+1] = TypeMetadataPtr::BOTTOM; // Method*; Method we are entering const TypeTuple *domain = TypeTuple::make(TypeFunc::Parms+2,fields); // create result type (range) diff -r 33143ee07800 -r 3f18d439b402 src/share/vm/opto/type.cpp --- a/src/share/vm/opto/type.cpp Tue Sep 11 20:53:17 2012 -0400 +++ b/src/share/vm/opto/type.cpp Tue Sep 11 18:28:51 2012 -0700 @@ -2380,7 +2380,7 @@ assert(this->isa_instptr(), "must be an instance ptr."); _is_ptr_to_narrowoop = false; } else if (klass() == ciEnv::current()->Class_klass() && - _offset >= instanceMirrorKlass::offset_of_static_fields()) { + _offset >= InstanceMirrorKlass::offset_of_static_fields()) { // Static fields assert(o != NULL, "must be constant"); ciInstanceKlass* k = o->as_instance()->java_lang_Class_klass()->as_instance_klass(); diff -r 33143ee07800 -r 3f18d439b402 src/share/vm/prims/jvmtiTagMap.cpp --- a/src/share/vm/prims/jvmtiTagMap.cpp Tue Sep 11 20:53:17 2012 -0400 +++ b/src/share/vm/prims/jvmtiTagMap.cpp Tue Sep 11 18:28:51 2012 -0700 @@ -2552,15 +2552,17 @@ return; } + assert(Universe::heap()->is_in_reserved(o), "should be impossible"); + jvmtiHeapReferenceKind kind = root_kind(); - - assert(Universe::heap()->is_in_reserved(o), "should be impossible"); + if (kind == JVMTI_HEAP_REFERENCE_SYSTEM_CLASS) { // SystemDictionary::always_strong_oops_do reports the application // class loader as a root. We want this root to be reported as // a root kind of "OTHER" rather than "SYSTEM_CLASS". - if (o->is_instance() && root_kind() == JVMTI_HEAP_REFERENCE_SYSTEM_CLASS) { + if (!o->is_instanceMirror()) { kind = JVMTI_HEAP_REFERENCE_OTHER; } + } // some objects are ignored - in the case of simple // roots it's mostly Symbol*s that we are skipping @@ -2790,7 +2792,7 @@ static inline bool verify_static_oop(InstanceKlass* ik, oop mirror, int offset) { address obj_p = (address)mirror + offset; - address start = (address)instanceMirrorKlass::start_of_static_fields(mirror); + address start = (address)InstanceMirrorKlass::start_of_static_fields(mirror); address end = start + (java_lang_Class::static_oop_field_count(mirror) * heapOopSize); assert(end >= start, "sanity check"); @@ -2991,7 +2993,8 @@ // Preloaded classes and loader from the system dictionary blk.set_kind(JVMTI_HEAP_REFERENCE_SYSTEM_CLASS); SystemDictionary::always_strong_oops_do(&blk); - ClassLoaderDataGraph::always_strong_oops_do(&blk, NULL, false); + KlassToOopClosure klass_blk(&blk); + ClassLoaderDataGraph::always_strong_oops_do(&blk, &klass_blk, false); if (blk.stopped()) { return false; } diff -r 33143ee07800 -r 3f18d439b402 src/share/vm/runtime/arguments.cpp --- a/src/share/vm/runtime/arguments.cpp Tue Sep 11 20:53:17 2012 -0400 +++ b/src/share/vm/runtime/arguments.cpp Tue Sep 11 18:28:51 2012 -0700 @@ -1427,6 +1427,16 @@ // if (FLAG_IS_DEFAULT(UseCompressedKlassPointers)) { // FLAG_SET_ERGO(bool, UseCompressedKlassPointers, true); // } + // Set the ClassMetaspaceSize to something that will not need to be + // expanded, since it cannot be expanded. + if (UseCompressedKlassPointers && FLAG_IS_DEFAULT(ClassMetaspaceSize)) { + // 100,000 classes seems like a good size, so 100M assumes around 1K + // per klass. The vtable and oopMap is embedded so we don't have a fixed + // size per klass. Eventually, this will be parameterized because it + // would also be useful to determine the optimal size of the + // systemDictionary. + FLAG_SET_ERGO(uintx, ClassMetaspaceSize, 100*M); + } } // Also checks that certain machines are slower with compressed oops // in vm_version initialization code. @@ -1965,6 +1975,9 @@ status = status && verify_object_alignment(); + status = status && verify_min_value(ClassMetaspaceSize, 1*M, + "ClassMetaspaceSize"); + return status; } @@ -2916,7 +2929,7 @@ (UseLargePages && FLAG_IS_CMDLINE(UseLargePages)); if (cannot_share) { if (must_share) { - warning("disabling large pages%s" + warning("disabling large pages %s" "because of %s", "" LP64_ONLY("and compressed oops "), DumpSharedSpaces ? "-Xshare:dump" : "-Xshare:on"); FLAG_SET_CMDLINE(bool, UseLargePages, false); diff -r 33143ee07800 -r 3f18d439b402 src/share/vm/runtime/globals.hpp --- a/src/share/vm/runtime/globals.hpp Tue Sep 11 20:53:17 2012 -0400 +++ b/src/share/vm/runtime/globals.hpp Tue Sep 11 18:28:51 2012 -0700 @@ -2993,7 +2993,7 @@ product(uintx, MaxMetaspaceSize, max_uintx, \ "Maximum size of Metaspaces (in bytes)") \ \ - product(uintx, ClassMetaspaceSize, NOT_LP64(1*M) LP64_ONLY(512*M), \ + product(uintx, ClassMetaspaceSize, 2*M, \ "Maximum size of InstanceKlass area in Metaspace used for " \ "UseCompressedKlassPointers") \ \ diff -r 33143ee07800 -r 3f18d439b402 src/share/vm/runtime/vmStructs.cpp --- a/src/share/vm/runtime/vmStructs.cpp Tue Sep 11 20:53:17 2012 -0400 +++ b/src/share/vm/runtime/vmStructs.cpp Tue Sep 11 18:28:51 2012 -0700 @@ -1374,9 +1374,9 @@ declare_type(objArrayKlass, arrayKlass) \ declare_type(typeArrayKlass, arrayKlass) \ declare_type(InstanceKlass, Klass) \ - declare_type(instanceClassLoaderKlass, InstanceKlass) \ - declare_type(instanceMirrorKlass, InstanceKlass) \ - declare_type(instanceRefKlass, InstanceKlass) \ + declare_type(InstanceClassLoaderKlass, InstanceKlass) \ + declare_type(InstanceMirrorKlass, InstanceKlass) \ + declare_type(InstanceRefKlass, InstanceKlass) \ declare_type(ConstantPool, Metadata) \ declare_type(ConstantPoolCache, MetaspaceObj) \ declare_type(MethodData, Metadata) \ diff -r 33143ee07800 -r 3f18d439b402 src/share/vm/utilities/globalDefinitions.cpp --- a/src/share/vm/utilities/globalDefinitions.cpp Tue Sep 11 20:53:17 2012 -0400 +++ b/src/share/vm/utilities/globalDefinitions.cpp Tue Sep 11 18:28:51 2012 -0700 @@ -213,7 +213,7 @@ // Map BasicType to size in words -int type2size[T_CONFLICT+1]={ -1, 0, 0, 0, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 0, 1, 1, -1}; +int type2size[T_CONFLICT+1]={ -1, 0, 0, 0, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 0, 1, 1, 1, -1}; BasicType type2field[T_CONFLICT+1] = { (BasicType)0, // 0,