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));