7195816: NPG: Crash in c1_ValueType - ShouldNotReachHere

Tue, 11 Sep 2012 16:20:57 +0200

author
roland
date
Tue, 11 Sep 2012 16:20:57 +0200
changeset 4051
8a02ca5e5576
parent 4050
ec98e58952b2
child 4052
75f33eecc1b3
child 4054
3f18d439b402

7195816: NPG: Crash in c1_ValueType - ShouldNotReachHere
Summary: C1 needs knowledge of T_METADATA at the LIR level.
Reviewed-by: kvn, coleenp

src/cpu/sparc/vm/c1_FrameMap_sparc.cpp file | annotate | diff | comparison | revisions
src/cpu/sparc/vm/c1_FrameMap_sparc.hpp file | annotate | diff | comparison | revisions
src/cpu/sparc/vm/c1_LIRAssembler_sparc.cpp file | annotate | diff | comparison | revisions
src/cpu/sparc/vm/c1_LIRGenerator_sparc.cpp file | annotate | diff | comparison | revisions
src/cpu/sparc/vm/sharedRuntime_sparc.cpp file | annotate | diff | comparison | revisions
src/cpu/x86/vm/c1_FrameMap_x86.cpp file | annotate | diff | comparison | revisions
src/cpu/x86/vm/c1_FrameMap_x86.hpp file | annotate | diff | comparison | revisions
src/cpu/x86/vm/c1_LIRAssembler_x86.cpp file | annotate | diff | comparison | revisions
src/cpu/x86/vm/c1_LIRGenerator_x86.cpp file | annotate | diff | comparison | revisions
src/cpu/x86/vm/sharedRuntime_x86_32.cpp file | annotate | diff | comparison | revisions
src/cpu/x86/vm/sharedRuntime_x86_64.cpp file | annotate | diff | comparison | revisions
src/share/vm/c1/c1_FrameMap.hpp file | annotate | diff | comparison | revisions
src/share/vm/c1/c1_LIR.cpp file | annotate | diff | comparison | revisions
src/share/vm/c1/c1_LIR.hpp file | annotate | diff | comparison | revisions
src/share/vm/c1/c1_LIRGenerator.cpp file | annotate | diff | comparison | revisions
src/share/vm/c1/c1_LinearScan.cpp file | annotate | diff | comparison | revisions
src/share/vm/c1/c1_ValueType.cpp file | annotate | diff | comparison | revisions
src/share/vm/opto/runtime.cpp file | annotate | diff | comparison | revisions
src/share/vm/utilities/globalDefinitions.cpp file | annotate | diff | comparison | revisions
     1.1 --- a/src/cpu/sparc/vm/c1_FrameMap_sparc.cpp	Tue Sep 11 14:59:23 2012 +0200
     1.2 +++ b/src/cpu/sparc/vm/c1_FrameMap_sparc.cpp	Tue Sep 11 16:20:57 2012 +0200
     1.3 @@ -147,6 +147,39 @@
     1.4  LIR_Opr FrameMap::I6_oop_opr;
     1.5  LIR_Opr FrameMap::I7_oop_opr;
     1.6  
     1.7 +LIR_Opr FrameMap::G0_metadata_opr;
     1.8 +LIR_Opr FrameMap::G1_metadata_opr;
     1.9 +LIR_Opr FrameMap::G2_metadata_opr;
    1.10 +LIR_Opr FrameMap::G3_metadata_opr;
    1.11 +LIR_Opr FrameMap::G4_metadata_opr;
    1.12 +LIR_Opr FrameMap::G5_metadata_opr;
    1.13 +LIR_Opr FrameMap::G6_metadata_opr;
    1.14 +LIR_Opr FrameMap::G7_metadata_opr;
    1.15 +LIR_Opr FrameMap::O0_metadata_opr;
    1.16 +LIR_Opr FrameMap::O1_metadata_opr;
    1.17 +LIR_Opr FrameMap::O2_metadata_opr;
    1.18 +LIR_Opr FrameMap::O3_metadata_opr;
    1.19 +LIR_Opr FrameMap::O4_metadata_opr;
    1.20 +LIR_Opr FrameMap::O5_metadata_opr;
    1.21 +LIR_Opr FrameMap::O6_metadata_opr;
    1.22 +LIR_Opr FrameMap::O7_metadata_opr;
    1.23 +LIR_Opr FrameMap::L0_metadata_opr;
    1.24 +LIR_Opr FrameMap::L1_metadata_opr;
    1.25 +LIR_Opr FrameMap::L2_metadata_opr;
    1.26 +LIR_Opr FrameMap::L3_metadata_opr;
    1.27 +LIR_Opr FrameMap::L4_metadata_opr;
    1.28 +LIR_Opr FrameMap::L5_metadata_opr;
    1.29 +LIR_Opr FrameMap::L6_metadata_opr;
    1.30 +LIR_Opr FrameMap::L7_metadata_opr;
    1.31 +LIR_Opr FrameMap::I0_metadata_opr;
    1.32 +LIR_Opr FrameMap::I1_metadata_opr;
    1.33 +LIR_Opr FrameMap::I2_metadata_opr;
    1.34 +LIR_Opr FrameMap::I3_metadata_opr;
    1.35 +LIR_Opr FrameMap::I4_metadata_opr;
    1.36 +LIR_Opr FrameMap::I5_metadata_opr;
    1.37 +LIR_Opr FrameMap::I6_metadata_opr;
    1.38 +LIR_Opr FrameMap::I7_metadata_opr;
    1.39 +
    1.40  LIR_Opr FrameMap::SP_opr;
    1.41  LIR_Opr FrameMap::FP_opr;
    1.42  
    1.43 @@ -310,6 +343,39 @@
    1.44    I6_oop_opr = as_oop_opr(I6);
    1.45    I7_oop_opr = as_oop_opr(I7);
    1.46  
    1.47 +  G0_metadata_opr = as_metadata_opr(G0);
    1.48 +  G1_metadata_opr = as_metadata_opr(G1);
    1.49 +  G2_metadata_opr = as_metadata_opr(G2);
    1.50 +  G3_metadata_opr = as_metadata_opr(G3);
    1.51 +  G4_metadata_opr = as_metadata_opr(G4);
    1.52 +  G5_metadata_opr = as_metadata_opr(G5);
    1.53 +  G6_metadata_opr = as_metadata_opr(G6);
    1.54 +  G7_metadata_opr = as_metadata_opr(G7);
    1.55 +  O0_metadata_opr = as_metadata_opr(O0);
    1.56 +  O1_metadata_opr = as_metadata_opr(O1);
    1.57 +  O2_metadata_opr = as_metadata_opr(O2);
    1.58 +  O3_metadata_opr = as_metadata_opr(O3);
    1.59 +  O4_metadata_opr = as_metadata_opr(O4);
    1.60 +  O5_metadata_opr = as_metadata_opr(O5);
    1.61 +  O6_metadata_opr = as_metadata_opr(O6);
    1.62 +  O7_metadata_opr = as_metadata_opr(O7);
    1.63 +  L0_metadata_opr = as_metadata_opr(L0);
    1.64 +  L1_metadata_opr = as_metadata_opr(L1);
    1.65 +  L2_metadata_opr = as_metadata_opr(L2);
    1.66 +  L3_metadata_opr = as_metadata_opr(L3);
    1.67 +  L4_metadata_opr = as_metadata_opr(L4);
    1.68 +  L5_metadata_opr = as_metadata_opr(L5);
    1.69 +  L6_metadata_opr = as_metadata_opr(L6);
    1.70 +  L7_metadata_opr = as_metadata_opr(L7);
    1.71 +  I0_metadata_opr = as_metadata_opr(I0);
    1.72 +  I1_metadata_opr = as_metadata_opr(I1);
    1.73 +  I2_metadata_opr = as_metadata_opr(I2);
    1.74 +  I3_metadata_opr = as_metadata_opr(I3);
    1.75 +  I4_metadata_opr = as_metadata_opr(I4);
    1.76 +  I5_metadata_opr = as_metadata_opr(I5);
    1.77 +  I6_metadata_opr = as_metadata_opr(I6);
    1.78 +  I7_metadata_opr = as_metadata_opr(I7);
    1.79 +
    1.80    FP_opr = as_pointer_opr(FP);
    1.81    SP_opr = as_pointer_opr(SP);
    1.82  
     2.1 --- a/src/cpu/sparc/vm/c1_FrameMap_sparc.hpp	Tue Sep 11 14:59:23 2012 +0200
     2.2 +++ b/src/cpu/sparc/vm/c1_FrameMap_sparc.hpp	Tue Sep 11 16:20:57 2012 +0200
     2.3 @@ -104,6 +104,39 @@
     2.4    static LIR_Opr I6_oop_opr;
     2.5    static LIR_Opr I7_oop_opr;
     2.6  
     2.7 +  static LIR_Opr G0_metadata_opr;
     2.8 +  static LIR_Opr G1_metadata_opr;
     2.9 +  static LIR_Opr G2_metadata_opr;
    2.10 +  static LIR_Opr G3_metadata_opr;
    2.11 +  static LIR_Opr G4_metadata_opr;
    2.12 +  static LIR_Opr G5_metadata_opr;
    2.13 +  static LIR_Opr G6_metadata_opr;
    2.14 +  static LIR_Opr G7_metadata_opr;
    2.15 +  static LIR_Opr O0_metadata_opr;
    2.16 +  static LIR_Opr O1_metadata_opr;
    2.17 +  static LIR_Opr O2_metadata_opr;
    2.18 +  static LIR_Opr O3_metadata_opr;
    2.19 +  static LIR_Opr O4_metadata_opr;
    2.20 +  static LIR_Opr O5_metadata_opr;
    2.21 +  static LIR_Opr O6_metadata_opr;
    2.22 +  static LIR_Opr O7_metadata_opr;
    2.23 +  static LIR_Opr L0_metadata_opr;
    2.24 +  static LIR_Opr L1_metadata_opr;
    2.25 +  static LIR_Opr L2_metadata_opr;
    2.26 +  static LIR_Opr L3_metadata_opr;
    2.27 +  static LIR_Opr L4_metadata_opr;
    2.28 +  static LIR_Opr L5_metadata_opr;
    2.29 +  static LIR_Opr L6_metadata_opr;
    2.30 +  static LIR_Opr L7_metadata_opr;
    2.31 +  static LIR_Opr I0_metadata_opr;
    2.32 +  static LIR_Opr I1_metadata_opr;
    2.33 +  static LIR_Opr I2_metadata_opr;
    2.34 +  static LIR_Opr I3_metadata_opr;
    2.35 +  static LIR_Opr I4_metadata_opr;
    2.36 +  static LIR_Opr I5_metadata_opr;
    2.37 +  static LIR_Opr I6_metadata_opr;
    2.38 +  static LIR_Opr I7_metadata_opr;
    2.39 +
    2.40    static LIR_Opr in_long_opr;
    2.41    static LIR_Opr out_long_opr;
    2.42    static LIR_Opr g1_long_single_opr;
     3.1 --- a/src/cpu/sparc/vm/c1_LIRAssembler_sparc.cpp	Tue Sep 11 14:59:23 2012 +0200
     3.2 +++ b/src/cpu/sparc/vm/c1_LIRAssembler_sparc.cpp	Tue Sep 11 16:20:57 2012 +0200
     3.3 @@ -447,9 +447,12 @@
     3.4  
     3.5    if (compilation()->env()->dtrace_method_probes()) {
     3.6      __ mov(G2_thread, O0);
     3.7 +    __ save_thread(I1); // need to preserve thread in G2 across
     3.8 +                        // runtime call
     3.9      metadata2reg(method()->constant_encoding(), O1);
    3.10      __ call(CAST_FROM_FN_PTR(address, SharedRuntime::dtrace_method_exit), relocInfo::runtime_call_type);
    3.11      __ delayed()->nop();
    3.12 +    __ restore_thread(I1);
    3.13    }
    3.14  
    3.15    if (method()->is_synchronized() || compilation()->env()->dtrace_method_probes()) {
    3.16 @@ -843,6 +846,7 @@
    3.17  #endif
    3.18          break;
    3.19        case T_ADDRESS:
    3.20 +      case T_METADATA:
    3.21          __ st_ptr(from_reg->as_register(), base, offset);
    3.22          break;
    3.23        case T_ARRAY : // fall through
    3.24 @@ -965,6 +969,7 @@
    3.25  #endif
    3.26          }
    3.27          break;
    3.28 +      case T_METADATA:
    3.29        case T_ADDRESS:  __ ld_ptr(base, offset, to_reg->as_register()); break;
    3.30        case T_ARRAY : // fall through
    3.31        case T_OBJECT:
    3.32 @@ -1366,6 +1371,7 @@
    3.33  void LIR_Assembler::mem2reg(LIR_Opr src_opr, LIR_Opr dest, BasicType type,
    3.34                              LIR_PatchCode patch_code, CodeEmitInfo* info, bool wide, bool unaligned) {
    3.35  
    3.36 +  assert(type != T_METADATA, "load of metadata ptr not supported");
    3.37    LIR_Address* addr = src_opr->as_address_ptr();
    3.38    LIR_Opr to_reg = dest;
    3.39  
    3.40 @@ -1513,6 +1519,7 @@
    3.41  void LIR_Assembler::reg2mem(LIR_Opr from_reg, LIR_Opr dest, BasicType type,
    3.42                              LIR_PatchCode patch_code, CodeEmitInfo* info, bool pop_fpu_stack,
    3.43                              bool wide, bool unaligned) {
    3.44 +  assert(type != T_METADATA, "store of metadata ptr not supported");
    3.45    LIR_Address* addr = dest->as_address_ptr();
    3.46  
    3.47    Register src = addr->base()->as_pointer_register();
     4.1 --- a/src/cpu/sparc/vm/c1_LIRGenerator_sparc.cpp	Tue Sep 11 14:59:23 2012 +0200
     4.2 +++ b/src/cpu/sparc/vm/c1_LIRGenerator_sparc.cpp	Tue Sep 11 16:20:57 2012 +0200
     4.3 @@ -884,7 +884,7 @@
     4.4    LIR_Opr tmp2 = FrameMap::G3_oop_opr;
     4.5    LIR_Opr tmp3 = FrameMap::G4_oop_opr;
     4.6    LIR_Opr tmp4 = FrameMap::O1_oop_opr;
     4.7 -  LIR_Opr klass_reg = FrameMap::G5_oop_opr;
     4.8 +  LIR_Opr klass_reg = FrameMap::G5_metadata_opr;
     4.9    new_instance(reg, x->klass(), tmp1, tmp2, tmp3, tmp4, klass_reg, info);
    4.10    LIR_Opr result = rlock_result(x);
    4.11    __ move(reg, result);
    4.12 @@ -903,11 +903,11 @@
    4.13    LIR_Opr tmp2 = FrameMap::G3_oop_opr;
    4.14    LIR_Opr tmp3 = FrameMap::G4_oop_opr;
    4.15    LIR_Opr tmp4 = FrameMap::O1_oop_opr;
    4.16 -  LIR_Opr klass_reg = FrameMap::G5_oop_opr;
    4.17 +  LIR_Opr klass_reg = FrameMap::G5_metadata_opr;
    4.18    LIR_Opr len = length.result();
    4.19    BasicType elem_type = x->elt_type();
    4.20  
    4.21 -  __ oop2reg(ciTypeArrayKlass::make(elem_type)->constant_encoding(), klass_reg);
    4.22 +  __ metadata2reg(ciTypeArrayKlass::make(elem_type)->constant_encoding(), klass_reg);
    4.23  
    4.24    CodeStub* slow_path = new NewTypeArrayStub(klass_reg, len, reg, info);
    4.25    __ allocate_array(reg, len, tmp1, tmp2, tmp3, tmp4, elem_type, klass_reg, slow_path);
    4.26 @@ -935,7 +935,7 @@
    4.27    LIR_Opr tmp2 = FrameMap::G3_oop_opr;
    4.28    LIR_Opr tmp3 = FrameMap::G4_oop_opr;
    4.29    LIR_Opr tmp4 = FrameMap::O1_oop_opr;
    4.30 -  LIR_Opr klass_reg = FrameMap::G5_oop_opr;
    4.31 +  LIR_Opr klass_reg = FrameMap::G5_metadata_opr;
    4.32    LIR_Opr len = length.result();
    4.33  
    4.34    CodeStub* slow_path = new NewObjectArrayStub(klass_reg, len, reg, info);
    4.35 @@ -985,8 +985,8 @@
    4.36  
    4.37    // This instruction can be deoptimized in the slow path : use
    4.38    // O0 as result register.
    4.39 -  const LIR_Opr reg = result_register_for(x->type());
    4.40 -  klass2reg_with_patching(reg, x->klass(), patching_info);
    4.41 +  const LIR_Opr klass_reg = FrameMap::O0_metadata_opr;
    4.42 +  klass2reg_with_patching(klass_reg, x->klass(), patching_info);
    4.43    LIR_Opr rank = FrameMap::O1_opr;
    4.44    __ move(LIR_OprFact::intConst(x->rank()), rank);
    4.45    LIR_Opr varargs = FrameMap::as_pointer_opr(O2);
    4.46 @@ -995,9 +995,10 @@
    4.47           LIR_OprFact::intptrConst(offset_from_sp),
    4.48           varargs);
    4.49    LIR_OprList* args = new LIR_OprList(3);
    4.50 -  args->append(reg);
    4.51 +  args->append(klass_reg);
    4.52    args->append(rank);
    4.53    args->append(varargs);
    4.54 +  const LIR_Opr reg = result_register_for(x->type());
    4.55    __ call_runtime(Runtime1::entry_for(Runtime1::new_multi_array_id),
    4.56                    LIR_OprFact::illegalOpr,
    4.57                    reg, args, info);
     5.1 --- a/src/cpu/sparc/vm/sharedRuntime_sparc.cpp	Tue Sep 11 14:59:23 2012 +0200
     5.2 +++ b/src/cpu/sparc/vm/sharedRuntime_sparc.cpp	Tue Sep 11 16:20:57 2012 +0200
     5.3 @@ -1340,6 +1340,7 @@
     5.4        case T_ADDRESS: // raw pointers, like current thread, for VM calls
     5.5        case T_ARRAY:
     5.6        case T_OBJECT:
     5.7 +      case T_METADATA:
     5.8          regs[i].set2( int_stk_helper( j ) );
     5.9          break;
    5.10        case T_FLOAT:
    5.11 @@ -1388,6 +1389,7 @@
    5.12        case T_FLOAT:
    5.13        case T_INT:
    5.14        case T_OBJECT:
    5.15 +      case T_METADATA:
    5.16        case T_SHORT:
    5.17          regs[i].set1( int_stk_helper( i ) );
    5.18          break;
     6.1 --- a/src/cpu/x86/vm/c1_FrameMap_x86.cpp	Tue Sep 11 14:59:23 2012 +0200
     6.2 +++ b/src/cpu/x86/vm/c1_FrameMap_x86.cpp	Tue Sep 11 16:20:57 2012 +0200
     6.3 @@ -96,6 +96,13 @@
     6.4  LIR_Opr FrameMap::rdx_oop_opr;
     6.5  LIR_Opr FrameMap::rcx_oop_opr;
     6.6  
     6.7 +LIR_Opr FrameMap::rsi_metadata_opr;
     6.8 +LIR_Opr FrameMap::rdi_metadata_opr;
     6.9 +LIR_Opr FrameMap::rbx_metadata_opr;
    6.10 +LIR_Opr FrameMap::rax_metadata_opr;
    6.11 +LIR_Opr FrameMap::rdx_metadata_opr;
    6.12 +LIR_Opr FrameMap::rcx_metadata_opr;
    6.13 +
    6.14  LIR_Opr FrameMap::long0_opr;
    6.15  LIR_Opr FrameMap::long1_opr;
    6.16  LIR_Opr FrameMap::fpu0_float_opr;
    6.17 @@ -122,6 +129,13 @@
    6.18  LIR_Opr FrameMap::r12_oop_opr;
    6.19  LIR_Opr FrameMap::r13_oop_opr;
    6.20  LIR_Opr FrameMap::r14_oop_opr;
    6.21 +
    6.22 +LIR_Opr  FrameMap::r8_metadata_opr;
    6.23 +LIR_Opr  FrameMap::r9_metadata_opr;
    6.24 +LIR_Opr FrameMap::r11_metadata_opr;
    6.25 +LIR_Opr FrameMap::r12_metadata_opr;
    6.26 +LIR_Opr FrameMap::r13_metadata_opr;
    6.27 +LIR_Opr FrameMap::r14_metadata_opr;
    6.28  #endif // _LP64
    6.29  
    6.30  LIR_Opr FrameMap::_caller_save_cpu_regs[] = { 0, };
    6.31 @@ -236,6 +250,13 @@
    6.32    rdx_oop_opr = as_oop_opr(rdx);
    6.33    rcx_oop_opr = as_oop_opr(rcx);
    6.34  
    6.35 +  rsi_metadata_opr = as_metadata_opr(rsi);
    6.36 +  rdi_metadata_opr = as_metadata_opr(rdi);
    6.37 +  rbx_metadata_opr = as_metadata_opr(rbx);
    6.38 +  rax_metadata_opr = as_metadata_opr(rax);
    6.39 +  rdx_metadata_opr = as_metadata_opr(rdx);
    6.40 +  rcx_metadata_opr = as_metadata_opr(rcx);
    6.41 +
    6.42    rsp_opr = as_pointer_opr(rsp);
    6.43    rbp_opr = as_pointer_opr(rbp);
    6.44  
    6.45 @@ -246,6 +267,13 @@
    6.46    r12_oop_opr = as_oop_opr(r12);
    6.47    r13_oop_opr = as_oop_opr(r13);
    6.48    r14_oop_opr = as_oop_opr(r14);
    6.49 +
    6.50 +  r8_metadata_opr = as_metadata_opr(r8);
    6.51 +  r9_metadata_opr = as_metadata_opr(r9);
    6.52 +  r11_metadata_opr = as_metadata_opr(r11);
    6.53 +  r12_metadata_opr = as_metadata_opr(r12);
    6.54 +  r13_metadata_opr = as_metadata_opr(r13);
    6.55 +  r14_metadata_opr = as_metadata_opr(r14);
    6.56  #endif // _LP64
    6.57  
    6.58    VMRegPair regs;
     7.1 --- a/src/cpu/x86/vm/c1_FrameMap_x86.hpp	Tue Sep 11 14:59:23 2012 +0200
     7.2 +++ b/src/cpu/x86/vm/c1_FrameMap_x86.hpp	Tue Sep 11 16:20:57 2012 +0200
     7.3 @@ -73,6 +73,14 @@
     7.4    static LIR_Opr rax_oop_opr;
     7.5    static LIR_Opr rdx_oop_opr;
     7.6    static LIR_Opr rcx_oop_opr;
     7.7 +
     7.8 +  static LIR_Opr rsi_metadata_opr;
     7.9 +  static LIR_Opr rdi_metadata_opr;
    7.10 +  static LIR_Opr rbx_metadata_opr;
    7.11 +  static LIR_Opr rax_metadata_opr;
    7.12 +  static LIR_Opr rdx_metadata_opr;
    7.13 +  static LIR_Opr rcx_metadata_opr;
    7.14 +
    7.15  #ifdef _LP64
    7.16  
    7.17    static LIR_Opr  r8_opr;
    7.18 @@ -92,6 +100,14 @@
    7.19    static LIR_Opr r13_oop_opr;
    7.20    static LIR_Opr r14_oop_opr;
    7.21  
    7.22 +  static LIR_Opr  r8_metadata_opr;
    7.23 +  static LIR_Opr  r9_metadata_opr;
    7.24 +
    7.25 +  static LIR_Opr r11_metadata_opr;
    7.26 +  static LIR_Opr r12_metadata_opr;
    7.27 +  static LIR_Opr r13_metadata_opr;
    7.28 +  static LIR_Opr r14_metadata_opr;
    7.29 +
    7.30  #endif // _LP64
    7.31  
    7.32    static LIR_Opr long0_opr;
     8.1 --- a/src/cpu/x86/vm/c1_LIRAssembler_x86.cpp	Tue Sep 11 14:59:23 2012 +0200
     8.2 +++ b/src/cpu/x86/vm/c1_LIRAssembler_x86.cpp	Tue Sep 11 16:20:57 2012 +0200
     8.3 @@ -950,6 +950,8 @@
     8.4      if (type == T_OBJECT || type == T_ARRAY) {
     8.5        __ verify_oop(src->as_register());
     8.6        __ movptr (dst, src->as_register());
     8.7 +    } else if (type == T_METADATA) {
     8.8 +      __ movptr (dst, src->as_register());
     8.9      } else {
    8.10        __ movl (dst, src->as_register());
    8.11      }
    8.12 @@ -1041,6 +1043,14 @@
    8.13          __ movptr(as_Address(to_addr), src->as_register());
    8.14        }
    8.15        break;
    8.16 +    case T_METADATA:
    8.17 +      // We get here to store a method pointer to the stack to pass to
    8.18 +      // a dtrace runtime call. This can't work on 64 bit with
    8.19 +      // compressed klass ptrs: T_METADATA can be a compressed klass
    8.20 +      // ptr or a 64 bit method pointer.
    8.21 +      LP64_ONLY(ShouldNotReachHere());
    8.22 +      __ movptr(as_Address(to_addr), src->as_register());
    8.23 +      break;
    8.24      case T_ADDRESS:
    8.25        __ movptr(as_Address(to_addr), src->as_register());
    8.26        break;
    8.27 @@ -1118,6 +1128,8 @@
    8.28      if (type == T_ARRAY || type == T_OBJECT) {
    8.29        __ movptr(dest->as_register(), frame_map()->address_for_slot(src->single_stack_ix()));
    8.30        __ verify_oop(dest->as_register());
    8.31 +    } else if (type == T_METADATA) {
    8.32 +      __ movptr(dest->as_register(), frame_map()->address_for_slot(src->single_stack_ix()));
    8.33      } else {
    8.34        __ movl(dest->as_register(), frame_map()->address_for_slot(src->single_stack_ix()));
    8.35      }
     9.1 --- a/src/cpu/x86/vm/c1_LIRGenerator_x86.cpp	Tue Sep 11 14:59:23 2012 +0200
     9.2 +++ b/src/cpu/x86/vm/c1_LIRGenerator_x86.cpp	Tue Sep 11 16:20:57 2012 +0200
     9.3 @@ -1002,13 +1002,12 @@
     9.4  #endif
     9.5    CodeEmitInfo* info = state_for(x, x->state());
     9.6    LIR_Opr reg = result_register_for(x->type());
     9.7 -  LIR_Opr klass_reg = new_register(objectType);
     9.8    new_instance(reg, x->klass(),
     9.9                         FrameMap::rcx_oop_opr,
    9.10                         FrameMap::rdi_oop_opr,
    9.11                         FrameMap::rsi_oop_opr,
    9.12                         LIR_OprFact::illegalOpr,
    9.13 -                       FrameMap::rdx_oop_opr, info);
    9.14 +                       FrameMap::rdx_metadata_opr, info);
    9.15    LIR_Opr result = rlock_result(x);
    9.16    __ move(reg, result);
    9.17  }
    9.18 @@ -1025,11 +1024,11 @@
    9.19    LIR_Opr tmp2 = FrameMap::rsi_oop_opr;
    9.20    LIR_Opr tmp3 = FrameMap::rdi_oop_opr;
    9.21    LIR_Opr tmp4 = reg;
    9.22 -  LIR_Opr klass_reg = FrameMap::rdx_oop_opr;
    9.23 +  LIR_Opr klass_reg = FrameMap::rdx_metadata_opr;
    9.24    LIR_Opr len = length.result();
    9.25    BasicType elem_type = x->elt_type();
    9.26  
    9.27 -  __ oop2reg(ciTypeArrayKlass::make(elem_type)->constant_encoding(), klass_reg);
    9.28 +  __ metadata2reg(ciTypeArrayKlass::make(elem_type)->constant_encoding(), klass_reg);
    9.29  
    9.30    CodeStub* slow_path = new NewTypeArrayStub(klass_reg, len, reg, info);
    9.31    __ allocate_array(reg, len, tmp1, tmp2, tmp3, tmp4, elem_type, klass_reg, slow_path);
    9.32 @@ -1055,7 +1054,7 @@
    9.33    LIR_Opr tmp2 = FrameMap::rsi_oop_opr;
    9.34    LIR_Opr tmp3 = FrameMap::rdi_oop_opr;
    9.35    LIR_Opr tmp4 = reg;
    9.36 -  LIR_Opr klass_reg = FrameMap::rdx_oop_opr;
    9.37 +  LIR_Opr klass_reg = FrameMap::rdx_metadata_opr;
    9.38  
    9.39    length.load_item_force(FrameMap::rbx_opr);
    9.40    LIR_Opr len = length.result();
    9.41 @@ -1103,17 +1102,18 @@
    9.42      store_stack_parameter(size->result(), in_ByteSize(i*4));
    9.43    }
    9.44  
    9.45 -  LIR_Opr reg = result_register_for(x->type());
    9.46 -  klass2reg_with_patching(reg, x->klass(), patching_info);
    9.47 +  LIR_Opr klass_reg = FrameMap::rax_metadata_opr;
    9.48 +  klass2reg_with_patching(klass_reg, x->klass(), patching_info);
    9.49  
    9.50    LIR_Opr rank = FrameMap::rbx_opr;
    9.51    __ move(LIR_OprFact::intConst(x->rank()), rank);
    9.52    LIR_Opr varargs = FrameMap::rcx_opr;
    9.53    __ move(FrameMap::rsp_opr, varargs);
    9.54    LIR_OprList* args = new LIR_OprList(3);
    9.55 -  args->append(reg);
    9.56 +  args->append(klass_reg);
    9.57    args->append(rank);
    9.58    args->append(varargs);
    9.59 +  LIR_Opr reg = result_register_for(x->type());
    9.60    __ call_runtime(Runtime1::entry_for(Runtime1::new_multi_array_id),
    9.61                    LIR_OprFact::illegalOpr,
    9.62                    reg, args, info);
    10.1 --- a/src/cpu/x86/vm/sharedRuntime_x86_32.cpp	Tue Sep 11 14:59:23 2012 +0200
    10.2 +++ b/src/cpu/x86/vm/sharedRuntime_x86_32.cpp	Tue Sep 11 16:20:57 2012 +0200
    10.3 @@ -938,6 +938,7 @@
    10.4      case T_OBJECT:
    10.5      case T_ARRAY:
    10.6      case T_ADDRESS:
    10.7 +    case T_METADATA:
    10.8        regs[i].set1(VMRegImpl::stack2reg(stack++));
    10.9        break;
   10.10      case T_LONG:
    11.1 --- a/src/cpu/x86/vm/sharedRuntime_x86_64.cpp	Tue Sep 11 14:59:23 2012 +0200
    11.2 +++ b/src/cpu/x86/vm/sharedRuntime_x86_64.cpp	Tue Sep 11 16:20:57 2012 +0200
    11.3 @@ -903,6 +903,7 @@
    11.4        case T_OBJECT:
    11.5        case T_ARRAY:
    11.6        case T_ADDRESS:
    11.7 +      case T_METADATA:
    11.8          if (int_args < Argument::n_int_register_parameters_c) {
    11.9            regs[i].set2(INT_ArgReg[int_args++]->as_VMReg());
   11.10  #ifdef _WIN64
    12.1 --- a/src/share/vm/c1/c1_FrameMap.hpp	Tue Sep 11 14:59:23 2012 +0200
    12.2 +++ b/src/share/vm/c1/c1_FrameMap.hpp	Tue Sep 11 16:20:57 2012 +0200
    12.3 @@ -194,6 +194,10 @@
    12.4      return LIR_OprFact::single_cpu_oop(cpu_reg2rnr(r));
    12.5    }
    12.6  
    12.7 +  static LIR_Opr as_metadata_opr(Register r) {
    12.8 +    return LIR_OprFact::single_cpu_metadata(cpu_reg2rnr(r));
    12.9 +  }
   12.10 +
   12.11    FrameMap(ciMethod* method, int monitors, int reserved_argument_area_size);
   12.12    bool finalize_frame(int nof_slots);
   12.13  
    13.1 --- a/src/share/vm/c1/c1_LIR.cpp	Tue Sep 11 14:59:23 2012 +0200
    13.2 +++ b/src/share/vm/c1/c1_LIR.cpp	Tue Sep 11 16:20:57 2012 +0200
    13.3 @@ -89,8 +89,12 @@
    13.4      ClassConstant* c = type->as_ClassConstant();
    13.5      if (c != NULL && !c->value()->is_loaded()) {
    13.6        return LIR_OprFact::metadataConst(NULL);
    13.7 +    } else if (c != NULL) {
    13.8 +      return LIR_OprFact::metadataConst(c->value()->constant_encoding());
    13.9      } else {
   13.10 -      return LIR_OprFact::metadataConst(c->value()->constant_encoding());
   13.11 +      MethodConstant* m = type->as_MethodConstant();
   13.12 +      assert (m != NULL, "not a class or a method?");
   13.13 +      return LIR_OprFact::metadataConst(m->value()->constant_encoding());
   13.14      }
   13.15    }
   13.16    case objectTag : {
   13.17 @@ -1166,10 +1170,12 @@
   13.18  
   13.19  
   13.20  void LIR_List::oop2reg_patch(jobject o, LIR_Opr reg, CodeEmitInfo* info) {
   13.21 +  assert(reg->type() == T_OBJECT, "bad reg");
   13.22    append(new LIR_Op1(lir_move, LIR_OprFact::oopConst(o),  reg, T_OBJECT, lir_patch_normal, info));
   13.23  }
   13.24  
   13.25  void LIR_List::klass2reg_patch(Metadata* o, LIR_Opr reg, CodeEmitInfo* info) {
   13.26 +  assert(reg->type() == T_METADATA, "bad reg");
   13.27    append(new LIR_Op1(lir_move, LIR_OprFact::metadataConst(o), reg, T_METADATA, lir_patch_normal, info));
   13.28  }
   13.29  
    14.1 --- a/src/share/vm/c1/c1_LIR.hpp	Tue Sep 11 14:59:23 2012 +0200
    14.2 +++ b/src/share/vm/c1/c1_LIR.hpp	Tue Sep 11 16:20:57 2012 +0200
    14.3 @@ -299,6 +299,7 @@
    14.4      , address_type  = 4 << type_shift
    14.5      , float_type    = 5 << type_shift
    14.6      , double_type   = 6 << type_shift
    14.7 +    , metadata_type = 7 << type_shift
    14.8    };
    14.9    friend OprType as_OprType(BasicType t);
   14.10    friend BasicType as_BasicType(OprType t);
   14.11 @@ -322,6 +323,7 @@
   14.12        case T_ADDRESS:
   14.13        case T_OBJECT:
   14.14        case T_ARRAY:
   14.15 +      case T_METADATA:
   14.16          return single_size;
   14.17          break;
   14.18  
   14.19 @@ -474,6 +476,7 @@
   14.20    case T_OBJECT:
   14.21    case T_ARRAY:    return LIR_OprDesc::object_type;
   14.22    case T_ADDRESS:  return LIR_OprDesc::address_type;
   14.23 +  case T_METADATA: return LIR_OprDesc::metadata_type;
   14.24    case T_ILLEGAL:  // fall through
   14.25    default: ShouldNotReachHere(); return LIR_OprDesc::unknown_type;
   14.26    }
   14.27 @@ -487,6 +490,7 @@
   14.28    case LIR_OprDesc::double_type:  return T_DOUBLE;
   14.29    case LIR_OprDesc::object_type:  return T_OBJECT;
   14.30    case LIR_OprDesc::address_type: return T_ADDRESS;
   14.31 +  case LIR_OprDesc::metadata_type:return T_METADATA;
   14.32    case LIR_OprDesc::unknown_type: // fall through
   14.33    default: ShouldNotReachHere();  return T_ILLEGAL;
   14.34    }
   14.35 @@ -587,6 +591,12 @@
   14.36                                 LIR_OprDesc::cpu_register         |
   14.37                                 LIR_OprDesc::single_size);
   14.38    }
   14.39 +  static LIR_Opr single_cpu_metadata(int reg) {
   14.40 +    return (LIR_Opr)(intptr_t)((reg  << LIR_OprDesc::reg1_shift) |
   14.41 +                               LIR_OprDesc::metadata_type        |
   14.42 +                               LIR_OprDesc::cpu_register         |
   14.43 +                               LIR_OprDesc::single_size);
   14.44 +  }
   14.45    static LIR_Opr double_cpu(int reg1, int reg2) {
   14.46      LP64_ONLY(assert(reg1 == reg2, "must be identical"));
   14.47      return (LIR_Opr)(intptr_t)((reg1 << LIR_OprDesc::reg1_shift) |
   14.48 @@ -660,6 +670,14 @@
   14.49                                              LIR_OprDesc::virtual_mask);
   14.50          break;
   14.51  
   14.52 +      case T_METADATA:
   14.53 +        res = (LIR_Opr)(intptr_t)((index << LIR_OprDesc::data_shift)  |
   14.54 +                                            LIR_OprDesc::metadata_type|
   14.55 +                                            LIR_OprDesc::cpu_register |
   14.56 +                                            LIR_OprDesc::single_size  |
   14.57 +                                            LIR_OprDesc::virtual_mask);
   14.58 +        break;
   14.59 +
   14.60        case T_INT:
   14.61          res = (LIR_Opr)(intptr_t)((index << LIR_OprDesc::data_shift) |
   14.62                                    LIR_OprDesc::int_type              |
   14.63 @@ -757,6 +775,12 @@
   14.64                                    LIR_OprDesc::single_size);
   14.65          break;
   14.66  
   14.67 +      case T_METADATA:
   14.68 +        res = (LIR_Opr)(intptr_t)((index << LIR_OprDesc::data_shift) |
   14.69 +                                  LIR_OprDesc::metadata_type         |
   14.70 +                                  LIR_OprDesc::stack_value           |
   14.71 +                                  LIR_OprDesc::single_size);
   14.72 +        break;
   14.73        case T_INT:
   14.74          res = (LIR_Opr)(intptr_t)((index << LIR_OprDesc::data_shift) |
   14.75                                    LIR_OprDesc::int_type              |
   14.76 @@ -2006,10 +2030,10 @@
   14.77    }
   14.78    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)); }
   14.79  
   14.80 -  void oop2reg  (jobject o, LIR_Opr reg)         { append(new LIR_Op1(lir_move, LIR_OprFact::oopConst(o),    reg));   }
   14.81 +  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));   }
   14.82    void oop2reg_patch(jobject o, LIR_Opr reg, CodeEmitInfo* info);
   14.83  
   14.84 -  void oop2reg  (Metadata* o, LIR_Opr reg)       { append(new LIR_Op1(lir_move, LIR_OprFact::metadataConst(o), reg));   }
   14.85 +  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));   }
   14.86    void klass2reg_patch(Metadata* o, LIR_Opr reg, CodeEmitInfo* info);
   14.87  
   14.88    void return_op(LIR_Opr result)                 { append(new LIR_Op1(lir_return, result)); }
    15.1 --- a/src/share/vm/c1/c1_LIRGenerator.cpp	Tue Sep 11 14:59:23 2012 +0200
    15.2 +++ b/src/share/vm/c1/c1_LIRGenerator.cpp	Tue Sep 11 16:20:57 2012 +0200
    15.3 @@ -467,7 +467,7 @@
    15.4      __ klass2reg_patch(NULL, r, info);
    15.5    } else {
    15.6      // no patching needed
    15.7 -    __ oop2reg(obj->constant_encoding(), r);
    15.8 +    __ metadata2reg(obj->constant_encoding(), r);
    15.9    }
   15.10  }
   15.11  
   15.12 @@ -955,8 +955,8 @@
   15.13        not_taken_count_offset = t;
   15.14      }
   15.15  
   15.16 -    LIR_Opr md_reg = new_register(T_OBJECT);
   15.17 -    __ oop2reg(md->constant_encoding(), md_reg);
   15.18 +    LIR_Opr md_reg = new_register(T_METADATA);
   15.19 +    __ metadata2reg(md->constant_encoding(), md_reg);
   15.20  
   15.21      LIR_Opr data_offset_reg = new_pointer_register();
   15.22      __ cmove(lir_cond(cond),
   15.23 @@ -1192,8 +1192,8 @@
   15.24      signature.append(T_OBJECT); // Method*
   15.25      LIR_OprList* args = new LIR_OprList();
   15.26      args->append(getThreadPointer());
   15.27 -    LIR_Opr meth = new_register(T_OBJECT);
   15.28 -    __ oop2reg(method()->constant_encoding(), meth);
   15.29 +    LIR_Opr meth = new_register(T_METADATA);
   15.30 +    __ metadata2reg(method()->constant_encoding(), meth);
   15.31      args->append(meth);
   15.32      call_runtime(&signature, args, CAST_FROM_FN_PTR(address, SharedRuntime::dtrace_method_exit), voidType, NULL);
   15.33    }
   15.34 @@ -2553,8 +2553,8 @@
   15.35        assert(data->is_JumpData(), "need JumpData for branches");
   15.36        offset = md->byte_offset_of_slot(data, JumpData::taken_offset());
   15.37      }
   15.38 -    LIR_Opr md_reg = new_register(T_OBJECT);
   15.39 -    __ oop2reg(md->constant_encoding(), md_reg);
   15.40 +    LIR_Opr md_reg = new_register(T_METADATA);
   15.41 +    __ metadata2reg(md->constant_encoding(), md_reg);
   15.42  
   15.43      increment_counter(new LIR_Address(md_reg, offset,
   15.44                                        NOT_LP64(T_INT) LP64_ONLY(T_LONG)), DataLayout::counter_increment);
   15.45 @@ -2611,8 +2611,8 @@
   15.46      signature.append(T_OBJECT); // Method*
   15.47      LIR_OprList* args = new LIR_OprList();
   15.48      args->append(getThreadPointer());
   15.49 -    LIR_Opr meth = new_register(T_OBJECT);
   15.50 -    __ oop2reg(method()->constant_encoding(), meth);
   15.51 +    LIR_Opr meth = new_register(T_METADATA);
   15.52 +    __ metadata2reg(method()->constant_encoding(), meth);
   15.53      args->append(meth);
   15.54      call_runtime(&signature, args, CAST_FROM_FN_PTR(address, SharedRuntime::dtrace_method_entry), voidType, NULL);
   15.55    }
   15.56 @@ -3032,21 +3032,21 @@
   15.57    assert(level > CompLevel_simple, "Shouldn't be here");
   15.58  
   15.59    int offset = -1;
   15.60 -  LIR_Opr counter_holder = new_register(T_OBJECT);
   15.61 +  LIR_Opr counter_holder = new_register(T_METADATA);
   15.62    LIR_Opr meth;
   15.63    if (level == CompLevel_limited_profile) {
   15.64      offset = in_bytes(backedge ? Method::backedge_counter_offset() :
   15.65                                   Method::invocation_counter_offset());
   15.66 -    __ oop2reg(method->constant_encoding(), counter_holder);
   15.67 +    __ metadata2reg(method->constant_encoding(), counter_holder);
   15.68      meth = counter_holder;
   15.69    } else if (level == CompLevel_full_profile) {
   15.70      offset = in_bytes(backedge ? MethodData::backedge_counter_offset() :
   15.71                                   MethodData::invocation_counter_offset());
   15.72      ciMethodData* md = method->method_data_or_null();
   15.73      assert(md != NULL, "Sanity");
   15.74 -    __ oop2reg(md->constant_encoding(), counter_holder);
   15.75 -    meth = new_register(T_OBJECT);
   15.76 -    __ oop2reg(method->constant_encoding(), meth);
   15.77 +    __ metadata2reg(md->constant_encoding(), counter_holder);
   15.78 +    meth = new_register(T_METADATA);
   15.79 +    __ metadata2reg(method->constant_encoding(), meth);
   15.80    } else {
   15.81      ShouldNotReachHere();
   15.82    }
    16.1 --- a/src/share/vm/c1/c1_LinearScan.cpp	Tue Sep 11 14:59:23 2012 +0200
    16.2 +++ b/src/share/vm/c1/c1_LinearScan.cpp	Tue Sep 11 16:20:57 2012 +0200
    16.3 @@ -2067,6 +2067,12 @@
    16.4          return LIR_OprFact::single_cpu_address(assigned_reg);
    16.5        }
    16.6  
    16.7 +      case T_METADATA: {
    16.8 +        assert(assigned_reg >= pd_first_cpu_reg && assigned_reg <= pd_last_cpu_reg, "no cpu register");
    16.9 +        assert(interval->assigned_regHi() == any_reg, "must not have hi register");
   16.10 +        return LIR_OprFact::single_cpu_metadata(assigned_reg);
   16.11 +      }
   16.12 +
   16.13  #ifdef __SOFTFP__
   16.14        case T_FLOAT:  // fall through
   16.15  #endif // __SOFTFP__
    17.1 --- a/src/share/vm/c1/c1_ValueType.cpp	Tue Sep 11 14:59:23 2012 +0200
    17.2 +++ b/src/share/vm/c1/c1_ValueType.cpp	Tue Sep 11 16:20:57 2012 +0200
    17.3 @@ -168,6 +168,7 @@
    17.4      case floatTag:   return T_FLOAT;
    17.5      case doubleTag:  return T_DOUBLE;
    17.6      case objectTag:  return T_OBJECT;
    17.7 +    case metaDataTag:return T_METADATA;
    17.8      case addressTag: return T_ADDRESS;
    17.9      case illegalTag: return T_ILLEGAL;
   17.10    }
    18.1 --- a/src/share/vm/opto/runtime.cpp	Tue Sep 11 14:59:23 2012 +0200
    18.2 +++ b/src/share/vm/opto/runtime.cpp	Tue Sep 11 16:20:57 2012 +0200
    18.3 @@ -1148,7 +1148,7 @@
    18.4    // create input type (domain)
    18.5    const Type **fields = TypeTuple::fields(2);
    18.6    fields[TypeFunc::Parms+0] = TypeRawPtr::BOTTOM; // Thread-local storage
    18.7 -  fields[TypeFunc::Parms+1] = TypeInstPtr::NOTNULL;  // Method*;    Method we are entering
    18.8 +  fields[TypeFunc::Parms+1] = TypeMetadataPtr::BOTTOM;  // Method*;    Method we are entering
    18.9    const TypeTuple *domain = TypeTuple::make(TypeFunc::Parms+2,fields);
   18.10  
   18.11    // create result type (range)
    19.1 --- a/src/share/vm/utilities/globalDefinitions.cpp	Tue Sep 11 14:59:23 2012 +0200
    19.2 +++ b/src/share/vm/utilities/globalDefinitions.cpp	Tue Sep 11 16:20:57 2012 +0200
    19.3 @@ -213,7 +213,7 @@
    19.4  
    19.5  
    19.6  // Map BasicType to size in words
    19.7 -int type2size[T_CONFLICT+1]={ -1, 0, 0, 0, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 0, 1, 1, -1};
    19.8 +int type2size[T_CONFLICT+1]={ -1, 0, 0, 0, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 0, 1, 1, 1, -1};
    19.9  
   19.10  BasicType type2field[T_CONFLICT+1] = {
   19.11    (BasicType)0,            // 0,

mercurial