src/cpu/x86/vm/methodHandles_x86.cpp

changeset 3566
45a1bf98f1bb
parent 3501
392a3f07d567
child 3969
1d7922586cf6
     1.1 --- a/src/cpu/x86/vm/methodHandles_x86.cpp	Fri Feb 10 17:20:05 2012 -0800
     1.2 +++ b/src/cpu/x86/vm/methodHandles_x86.cpp	Mon Feb 13 02:29:22 2012 -0800
     1.3 @@ -1018,41 +1018,26 @@
     1.4  void trace_method_handle_stub(const char* adaptername,
     1.5                                oop mh,
     1.6                                intptr_t* saved_regs,
     1.7 -                              intptr_t* entry_sp,
     1.8 -                              intptr_t* saved_sp,
     1.9 -                              intptr_t* saved_bp) {
    1.10 +                              intptr_t* entry_sp) {
    1.11    // called as a leaf from native code: do not block the JVM!
    1.12    bool has_mh = (strstr(adaptername, "return/") == NULL);  // return adapters don't have rcx_mh
    1.13 +  const char* mh_reg_name = has_mh ? "rcx_mh" : "rcx";
    1.14 +  tty->print_cr("MH %s %s="PTR_FORMAT" sp="PTR_FORMAT, adaptername, mh_reg_name, mh, entry_sp);
    1.15  
    1.16 -  intptr_t* last_sp = (intptr_t*) saved_bp[frame::interpreter_frame_last_sp_offset];
    1.17 -  intptr_t* base_sp = last_sp;
    1.18 -  typedef MethodHandles::RicochetFrame RicochetFrame;
    1.19 -  RicochetFrame* rfp = (RicochetFrame*)((address)saved_bp - RicochetFrame::sender_link_offset_in_bytes());
    1.20 -  if (Universe::heap()->is_in((address) rfp->saved_args_base())) {
    1.21 -    // Probably an interpreter frame.
    1.22 -    base_sp = (intptr_t*) saved_bp[frame::interpreter_frame_monitor_block_top_offset];
    1.23 -  }
    1.24 -  intptr_t    mh_reg = (intptr_t)mh;
    1.25 -  const char* mh_reg_name = "rcx_mh";
    1.26 -  if (!has_mh)  mh_reg_name = "rcx";
    1.27 -  tty->print_cr("MH %s %s="PTR_FORMAT" sp=("PTR_FORMAT"+"INTX_FORMAT") stack_size="INTX_FORMAT" bp="PTR_FORMAT,
    1.28 -                adaptername, mh_reg_name, mh_reg,
    1.29 -                (intptr_t)entry_sp, (intptr_t)(saved_sp - entry_sp), (intptr_t)(base_sp - last_sp), (intptr_t)saved_bp);
    1.30    if (Verbose) {
    1.31 -    tty->print(" reg dump: ");
    1.32 -    int saved_regs_count = (entry_sp-1) - saved_regs;
    1.33 -    // 32 bit: rdi rsi rbp rsp; rbx rdx rcx (*) rax
    1.34 -    int i;
    1.35 -    for (i = 0; i <= saved_regs_count; i++) {
    1.36 -      if (i > 0 && i % 4 == 0 && i != saved_regs_count) {
    1.37 +    tty->print_cr("Registers:");
    1.38 +    const int saved_regs_count = RegisterImpl::number_of_registers;
    1.39 +    for (int i = 0; i < saved_regs_count; i++) {
    1.40 +      Register r = as_Register(i);
    1.41 +      // The registers are stored in reverse order on the stack (by pusha).
    1.42 +      tty->print("%3s=" PTR_FORMAT, r->name(), saved_regs[((saved_regs_count - 1) - i)]);
    1.43 +      if ((i + 1) % 4 == 0) {
    1.44          tty->cr();
    1.45 -        tty->print("   + dump: ");
    1.46 +      } else {
    1.47 +        tty->print(", ");
    1.48        }
    1.49 -      tty->print(" %d: "PTR_FORMAT, i, saved_regs[i]);
    1.50      }
    1.51      tty->cr();
    1.52 -    if (last_sp != saved_sp && last_sp != NULL)
    1.53 -      tty->print_cr("*** last_sp="PTR_FORMAT, (intptr_t)last_sp);
    1.54  
    1.55      {
    1.56       // dumping last frame with frame::describe
    1.57 @@ -1102,14 +1087,7 @@
    1.58          values.describe(-1, dump_sp, "sp for #1");
    1.59        }
    1.60  
    1.61 -      // mark saved_sp if seems valid
    1.62 -      if (has_mh) {
    1.63 -        if ((saved_sp >= dump_sp - UNREASONABLE_STACK_MOVE) && (saved_sp < dump_fp)) {
    1.64 -          values.describe(-1, saved_sp, "*saved_sp");
    1.65 -        }
    1.66 -      }
    1.67 -
    1.68 -      tty->print_cr("  stack layout:");
    1.69 +      tty->print_cr("Stack layout:");
    1.70        values.print(p);
    1.71      }
    1.72      if (has_mh)
    1.73 @@ -1125,16 +1103,12 @@
    1.74    oopDesc* mh;
    1.75    intptr_t* saved_regs;
    1.76    intptr_t* entry_sp;
    1.77 -  intptr_t* saved_sp;
    1.78 -  intptr_t* saved_bp;
    1.79  };
    1.80  void trace_method_handle_stub_wrapper(MethodHandleStubArguments* args) {
    1.81    trace_method_handle_stub(args->adaptername,
    1.82                             args->mh,
    1.83                             args->saved_regs,
    1.84 -                           args->entry_sp,
    1.85 -                           args->saved_sp,
    1.86 -                           args->saved_bp);
    1.87 +                           args->entry_sp);
    1.88  }
    1.89  
    1.90  void MethodHandles::trace_method_handle(MacroAssembler* _masm, const char* adaptername) {
    1.91 @@ -1157,20 +1131,18 @@
    1.92      __ fst_d(Address(rsp, 0));
    1.93    }
    1.94  
    1.95 -  // incoming state:
    1.96 +  // Incoming state:
    1.97    // rcx: method handle
    1.98 -  // r13 or rsi: saved sp
    1.99 -  // To avoid calling convention issues, build a record on the stack and pass the pointer to that instead.
   1.100 -  // Note: fix the increment below if pushing more arguments
   1.101 -  __ push(rbp);               // saved_bp
   1.102 -  __ push(saved_last_sp_register()); // saved_sp
   1.103 +  //
   1.104 +  // To avoid calling convention issues, build a record on the stack
   1.105 +  // and pass the pointer to that instead.
   1.106    __ push(rbp);               // entry_sp (with extra align space)
   1.107    __ push(rbx);               // pusha saved_regs
   1.108    __ push(rcx);               // mh
   1.109    __ push(rcx);               // slot for adaptername
   1.110    __ movptr(Address(rsp, 0), (intptr_t) adaptername);
   1.111    __ super_call_VM_leaf(CAST_FROM_FN_PTR(address, trace_method_handle_stub_wrapper), rsp);
   1.112 -  __ increment(rsp, 6 * wordSize); // MethodHandleStubArguments
   1.113 +  __ increment(rsp, sizeof(MethodHandleStubArguments));
   1.114  
   1.115    if  (UseSSE >= 2) {
   1.116      __ movdbl(xmm0, Address(rsp, 0));

mercurial