src/cpu/sparc/vm/methodHandles_sparc.cpp

changeset 4037
da91efe96a93
parent 3969
1d7922586cf6
child 4052
75f33eecc1b3
     1.1 --- a/src/cpu/sparc/vm/methodHandles_sparc.cpp	Fri Aug 31 16:39:35 2012 -0700
     1.2 +++ b/src/cpu/sparc/vm/methodHandles_sparc.cpp	Sat Sep 01 13:25:18 2012 -0400
     1.3 @@ -46,9 +46,9 @@
     1.4  
     1.5  void MethodHandles::load_klass_from_Class(MacroAssembler* _masm, Register klass_reg, Register temp_reg, Register temp2_reg) {
     1.6    if (VerifyMethodHandles)
     1.7 -    verify_klass(_masm, klass_reg, SystemDictionaryHandles::Class_klass(), temp_reg, temp2_reg,
     1.8 +    verify_klass(_masm, klass_reg, SystemDictionary::WK_KLASS_ENUM_NAME(java_lang_Class), temp_reg, temp2_reg,
     1.9                   "MH argument is a Class");
    1.10 -  __ load_heap_oop(Address(klass_reg, java_lang_Class::klass_offset_in_bytes()), klass_reg);
    1.11 +  __ ld_ptr(Address(klass_reg, java_lang_Class::klass_offset_in_bytes()), klass_reg);
    1.12  }
    1.13  
    1.14  #ifdef ASSERT
    1.15 @@ -63,13 +63,11 @@
    1.16  
    1.17  #ifdef ASSERT
    1.18  void MethodHandles::verify_klass(MacroAssembler* _masm,
    1.19 -                                 Register obj_reg, KlassHandle klass,
    1.20 +                                 Register obj_reg, SystemDictionary::WKID klass_id,
    1.21                                   Register temp_reg, Register temp2_reg,
    1.22                                   const char* error_message) {
    1.23 -  oop* klass_addr = klass.raw_value();
    1.24 -  assert(klass_addr >= SystemDictionaryHandles::Object_klass().raw_value() &&
    1.25 -         klass_addr <= SystemDictionaryHandles::Long_klass().raw_value(),
    1.26 -         "must be one of the SystemDictionaryHandles");
    1.27 +  Klass** klass_addr = SystemDictionary::well_known_klass_addr(klass_id);
    1.28 +  KlassHandle klass = SystemDictionary::well_known_klass(klass_id);
    1.29    bool did_save = false;
    1.30    if (temp_reg == noreg || temp2_reg == noreg) {
    1.31      temp_reg = L1;
    1.32 @@ -83,12 +81,12 @@
    1.33    __ verify_oop(obj_reg);
    1.34    __ br_null_short(obj_reg, Assembler::pn, L_bad);
    1.35    __ load_klass(obj_reg, temp_reg);
    1.36 -  __ set(ExternalAddress(klass_addr), temp2_reg);
    1.37 +  __ set(ExternalAddress((Metadata**)klass_addr), temp2_reg);
    1.38    __ ld_ptr(Address(temp2_reg, 0), temp2_reg);
    1.39    __ cmp_and_brx_short(temp_reg, temp2_reg, Assembler::equal, Assembler::pt, L_ok);
    1.40    intptr_t super_check_offset = klass->super_check_offset();
    1.41    __ ld_ptr(Address(temp_reg, super_check_offset), temp_reg);
    1.42 -  __ set(ExternalAddress(klass_addr), temp2_reg);
    1.43 +  __ set(ExternalAddress((Metadata**)klass_addr), temp2_reg);
    1.44    __ ld_ptr(Address(temp2_reg, 0), temp2_reg);
    1.45    __ cmp_and_brx_short(temp_reg, temp2_reg, Assembler::equal, Assembler::pt, L_ok);
    1.46    __ BIND(L_bad);
    1.47 @@ -123,7 +121,6 @@
    1.48  void MethodHandles::jump_from_method_handle(MacroAssembler* _masm, Register method, Register target, Register temp,
    1.49                                              bool for_compiler_entry) {
    1.50    assert(method == G5_method, "interpreter calling convention");
    1.51 -  __ verify_oop(method);
    1.52  
    1.53    if (!for_compiler_entry && JvmtiExport::can_post_interpreter_events()) {
    1.54      Label run_compiled_code;
    1.55 @@ -134,7 +131,7 @@
    1.56      const Address interp_only(G2_thread, JavaThread::interp_only_mode_offset());
    1.57      __ ld(interp_only, temp);
    1.58      __ cmp_and_br_short(temp, 0, Assembler::zero, Assembler::pt, run_compiled_code);
    1.59 -    __ ld_ptr(G5_method, in_bytes(methodOopDesc::interpreter_entry_offset()), target);
    1.60 +    __ ld_ptr(G5_method, in_bytes(Method::interpreter_entry_offset()), target);
    1.61      __ jmp(target, 0);
    1.62      __ delayed()->nop();
    1.63      __ BIND(run_compiled_code);
    1.64 @@ -142,8 +139,8 @@
    1.65      // it doesn't matter, since this is interpreter code.
    1.66    }
    1.67  
    1.68 -  const ByteSize entry_offset = for_compiler_entry ? methodOopDesc::from_compiled_offset() :
    1.69 -                                                     methodOopDesc::from_interpreted_offset();
    1.70 +  const ByteSize entry_offset = for_compiler_entry ? Method::from_compiled_offset() :
    1.71 +                                                     Method::from_interpreted_offset();
    1.72    __ ld_ptr(G5_method, in_bytes(entry_offset), target);
    1.73    __ jmp(target, 0);
    1.74    __ delayed()->nop();
    1.75 @@ -167,16 +164,15 @@
    1.76    __ verify_oop(method_temp);
    1.77    __ load_heap_oop(Address(method_temp, NONZERO(java_lang_invoke_LambdaForm::vmentry_offset_in_bytes())), method_temp);
    1.78    __ verify_oop(method_temp);
    1.79 -  // the following assumes that a methodOop is normally compressed in the vmtarget field:
    1.80 -  __ load_heap_oop(Address(method_temp, NONZERO(java_lang_invoke_MemberName::vmtarget_offset_in_bytes())),     method_temp);
    1.81 -  __ verify_oop(method_temp);
    1.82 +  // the following assumes that a Method* is normally compressed in the vmtarget field:
    1.83 +  __ ld_ptr(Address(method_temp, NONZERO(java_lang_invoke_MemberName::vmtarget_offset_in_bytes())),     method_temp);
    1.84  
    1.85    if (VerifyMethodHandles && !for_compiler_entry) {
    1.86      // make sure recv is already on stack
    1.87 -    __ load_sized_value(Address(method_temp, methodOopDesc::size_of_parameters_offset()),
    1.88 +    __ load_sized_value(Address(method_temp, Method::size_of_parameters_offset()),
    1.89                          temp2,
    1.90                          sizeof(u2), /*is_signed*/ false);
    1.91 -    // assert(sizeof(u2) == sizeof(methodOopDesc::_size_of_parameters), "");
    1.92 +    // assert(sizeof(u2) == sizeof(Method::_size_of_parameters), "");
    1.93      Label L;
    1.94      __ ld_ptr(__ argument_address(temp2, temp2, -1), temp2);
    1.95      __ cmp_and_br_short(temp2, recv, Assembler::equal, Assembler::pt, L);
    1.96 @@ -204,7 +200,7 @@
    1.97    }
    1.98  
    1.99    // I5_savedSP/O5_savedSP: sender SP (must preserve; see prepare_to_jump_from_interpreted)
   1.100 -  // G5_method:  methodOop
   1.101 +  // G5_method:  Method*
   1.102    // G4 (Gargs): incoming argument list (must preserve)
   1.103    // O0: used as temp to hold mh or receiver
   1.104    // O1, O4: garbage temps, blown away
   1.105 @@ -220,14 +216,14 @@
   1.106    if (VerifyMethodHandles) {
   1.107      Label L;
   1.108      BLOCK_COMMENT("verify_intrinsic_id {");
   1.109 -    __ ldub(Address(G5_method, methodOopDesc::intrinsic_id_offset_in_bytes()), O1_scratch);
   1.110 +    __ ldub(Address(G5_method, Method::intrinsic_id_offset_in_bytes()), O1_scratch);
   1.111      __ cmp_and_br_short(O1_scratch, (int) iid, Assembler::equal, Assembler::pt, L);
   1.112      if (iid == vmIntrinsics::_linkToVirtual ||
   1.113          iid == vmIntrinsics::_linkToSpecial) {
   1.114        // could do this for all kinds, but would explode assembly code size
   1.115 -      trace_method_handle(_masm, "bad methodOop::intrinsic_id");
   1.116 +      trace_method_handle(_masm, "bad Method*::intrinsic_id");
   1.117      }
   1.118 -    __ STOP("bad methodOop::intrinsic_id");
   1.119 +    __ STOP("bad Method*::intrinsic_id");
   1.120      __ bind(L);
   1.121      BLOCK_COMMENT("} verify_intrinsic_id");
   1.122    }
   1.123 @@ -237,10 +233,10 @@
   1.124    int ref_kind = signature_polymorphic_intrinsic_ref_kind(iid);
   1.125    assert(ref_kind != 0 || iid == vmIntrinsics::_invokeBasic, "must be _invokeBasic or a linkTo intrinsic");
   1.126    if (ref_kind == 0 || MethodHandles::ref_kind_has_receiver(ref_kind)) {
   1.127 -    __ load_sized_value(Address(G5_method, methodOopDesc::size_of_parameters_offset()),
   1.128 +    __ load_sized_value(Address(G5_method, Method::size_of_parameters_offset()),
   1.129                          O4_param_size,
   1.130                          sizeof(u2), /*is_signed*/ false);
   1.131 -    // assert(sizeof(u2) == sizeof(methodOopDesc::_size_of_parameters), "");
   1.132 +    // assert(sizeof(u2) == sizeof(Method::_size_of_parameters), "");
   1.133      O4_first_arg_addr = __ argument_address(O4_param_size, O4_param_size, -1);
   1.134    } else {
   1.135      DEBUG_ONLY(O4_param_size = noreg);
   1.136 @@ -331,7 +327,7 @@
   1.137      // The method is a member invoker used by direct method handles.
   1.138      if (VerifyMethodHandles) {
   1.139        // make sure the trailing argument really is a MemberName (caller responsibility)
   1.140 -      verify_klass(_masm, member_reg, SystemDictionaryHandles::MemberName_klass(),
   1.141 +      verify_klass(_masm, member_reg, SystemDictionary::WK_KLASS_ENUM_NAME(MemberName_klass),
   1.142                     temp1, temp2,
   1.143                     "MemberName required for invokeVirtual etc.");
   1.144      }
   1.145 @@ -390,7 +386,7 @@
   1.146        if (VerifyMethodHandles) {
   1.147          verify_ref_kind(_masm, JVM_REF_invokeSpecial, member_reg, temp3);
   1.148        }
   1.149 -      __ load_heap_oop(member_vmtarget, G5_method);
   1.150 +      __ ld_ptr(member_vmtarget, G5_method);
   1.151        method_is_live = true;
   1.152        break;
   1.153  
   1.154 @@ -398,7 +394,7 @@
   1.155        if (VerifyMethodHandles) {
   1.156          verify_ref_kind(_masm, JVM_REF_invokeStatic, member_reg, temp3);
   1.157        }
   1.158 -      __ load_heap_oop(member_vmtarget, G5_method);
   1.159 +      __ ld_ptr(member_vmtarget, G5_method);
   1.160        method_is_live = true;
   1.161        break;
   1.162  
   1.163 @@ -425,7 +421,7 @@
   1.164        // Note:  The verifier invariants allow us to ignore MemberName.clazz and vmtarget
   1.165        // at this point.  And VerifyMethodHandles has already checked clazz, if needed.
   1.166  
   1.167 -      // get target methodOop & entry point
   1.168 +      // get target Method* & entry point
   1.169        __ lookup_virtual_method(temp1_recv_klass, temp2_index, G5_method);
   1.170        method_is_live = true;
   1.171        break;

mercurial