comparison src/cpu/x86/vm/methodHandles_x86.cpp @ 4939:45a1bf98f1bb

7141329: Strange values of stack_size in -XX:+TraceMethodHandles output Reviewed-by: kvn, never
author twisti
date Mon, 13 Feb 2012 02:29:22 -0800
parents 392a3f07d567
children 1d7922586cf6
comparison
equal deleted inserted replaced
4938:de34c646c3f7 4939:45a1bf98f1bb
1016 #ifndef PRODUCT 1016 #ifndef PRODUCT
1017 extern "C" void print_method_handle(oop mh); 1017 extern "C" void print_method_handle(oop mh);
1018 void trace_method_handle_stub(const char* adaptername, 1018 void trace_method_handle_stub(const char* adaptername,
1019 oop mh, 1019 oop mh,
1020 intptr_t* saved_regs, 1020 intptr_t* saved_regs,
1021 intptr_t* entry_sp, 1021 intptr_t* entry_sp) {
1022 intptr_t* saved_sp,
1023 intptr_t* saved_bp) {
1024 // called as a leaf from native code: do not block the JVM! 1022 // called as a leaf from native code: do not block the JVM!
1025 bool has_mh = (strstr(adaptername, "return/") == NULL); // return adapters don't have rcx_mh 1023 bool has_mh = (strstr(adaptername, "return/") == NULL); // return adapters don't have rcx_mh
1026 1024 const char* mh_reg_name = has_mh ? "rcx_mh" : "rcx";
1027 intptr_t* last_sp = (intptr_t*) saved_bp[frame::interpreter_frame_last_sp_offset]; 1025 tty->print_cr("MH %s %s="PTR_FORMAT" sp="PTR_FORMAT, adaptername, mh_reg_name, mh, entry_sp);
1028 intptr_t* base_sp = last_sp; 1026
1029 typedef MethodHandles::RicochetFrame RicochetFrame;
1030 RicochetFrame* rfp = (RicochetFrame*)((address)saved_bp - RicochetFrame::sender_link_offset_in_bytes());
1031 if (Universe::heap()->is_in((address) rfp->saved_args_base())) {
1032 // Probably an interpreter frame.
1033 base_sp = (intptr_t*) saved_bp[frame::interpreter_frame_monitor_block_top_offset];
1034 }
1035 intptr_t mh_reg = (intptr_t)mh;
1036 const char* mh_reg_name = "rcx_mh";
1037 if (!has_mh) mh_reg_name = "rcx";
1038 tty->print_cr("MH %s %s="PTR_FORMAT" sp=("PTR_FORMAT"+"INTX_FORMAT") stack_size="INTX_FORMAT" bp="PTR_FORMAT,
1039 adaptername, mh_reg_name, mh_reg,
1040 (intptr_t)entry_sp, (intptr_t)(saved_sp - entry_sp), (intptr_t)(base_sp - last_sp), (intptr_t)saved_bp);
1041 if (Verbose) { 1027 if (Verbose) {
1042 tty->print(" reg dump: "); 1028 tty->print_cr("Registers:");
1043 int saved_regs_count = (entry_sp-1) - saved_regs; 1029 const int saved_regs_count = RegisterImpl::number_of_registers;
1044 // 32 bit: rdi rsi rbp rsp; rbx rdx rcx (*) rax 1030 for (int i = 0; i < saved_regs_count; i++) {
1045 int i; 1031 Register r = as_Register(i);
1046 for (i = 0; i <= saved_regs_count; i++) { 1032 // The registers are stored in reverse order on the stack (by pusha).
1047 if (i > 0 && i % 4 == 0 && i != saved_regs_count) { 1033 tty->print("%3s=" PTR_FORMAT, r->name(), saved_regs[((saved_regs_count - 1) - i)]);
1034 if ((i + 1) % 4 == 0) {
1048 tty->cr(); 1035 tty->cr();
1049 tty->print(" + dump: "); 1036 } else {
1050 } 1037 tty->print(", ");
1051 tty->print(" %d: "PTR_FORMAT, i, saved_regs[i]); 1038 }
1052 } 1039 }
1053 tty->cr(); 1040 tty->cr();
1054 if (last_sp != saved_sp && last_sp != NULL)
1055 tty->print_cr("*** last_sp="PTR_FORMAT, (intptr_t)last_sp);
1056 1041
1057 { 1042 {
1058 // dumping last frame with frame::describe 1043 // dumping last frame with frame::describe
1059 1044
1060 JavaThread* p = JavaThread::active(); 1045 JavaThread* p = JavaThread::active();
1100 // Add descriptions without building a Java frame to avoid issues 1085 // Add descriptions without building a Java frame to avoid issues
1101 values.describe(-1, dump_fp, "fp for #1 <not parsed, cannot trust pc>"); 1086 values.describe(-1, dump_fp, "fp for #1 <not parsed, cannot trust pc>");
1102 values.describe(-1, dump_sp, "sp for #1"); 1087 values.describe(-1, dump_sp, "sp for #1");
1103 } 1088 }
1104 1089
1105 // mark saved_sp if seems valid 1090 tty->print_cr("Stack layout:");
1106 if (has_mh) {
1107 if ((saved_sp >= dump_sp - UNREASONABLE_STACK_MOVE) && (saved_sp < dump_fp)) {
1108 values.describe(-1, saved_sp, "*saved_sp");
1109 }
1110 }
1111
1112 tty->print_cr(" stack layout:");
1113 values.print(p); 1091 values.print(p);
1114 } 1092 }
1115 if (has_mh) 1093 if (has_mh)
1116 print_method_handle(mh); 1094 print_method_handle(mh);
1117 } 1095 }
1123 struct MethodHandleStubArguments { 1101 struct MethodHandleStubArguments {
1124 const char* adaptername; 1102 const char* adaptername;
1125 oopDesc* mh; 1103 oopDesc* mh;
1126 intptr_t* saved_regs; 1104 intptr_t* saved_regs;
1127 intptr_t* entry_sp; 1105 intptr_t* entry_sp;
1128 intptr_t* saved_sp;
1129 intptr_t* saved_bp;
1130 }; 1106 };
1131 void trace_method_handle_stub_wrapper(MethodHandleStubArguments* args) { 1107 void trace_method_handle_stub_wrapper(MethodHandleStubArguments* args) {
1132 trace_method_handle_stub(args->adaptername, 1108 trace_method_handle_stub(args->adaptername,
1133 args->mh, 1109 args->mh,
1134 args->saved_regs, 1110 args->saved_regs,
1135 args->entry_sp, 1111 args->entry_sp);
1136 args->saved_sp,
1137 args->saved_bp);
1138 } 1112 }
1139 1113
1140 void MethodHandles::trace_method_handle(MacroAssembler* _masm, const char* adaptername) { 1114 void MethodHandles::trace_method_handle(MacroAssembler* _masm, const char* adaptername) {
1141 if (!TraceMethodHandles) return; 1115 if (!TraceMethodHandles) return;
1142 BLOCK_COMMENT("trace_method_handle {"); 1116 BLOCK_COMMENT("trace_method_handle {");
1155 __ movflt(Address(rsp, 0), xmm0); 1129 __ movflt(Address(rsp, 0), xmm0);
1156 } else { 1130 } else {
1157 __ fst_d(Address(rsp, 0)); 1131 __ fst_d(Address(rsp, 0));
1158 } 1132 }
1159 1133
1160 // incoming state: 1134 // Incoming state:
1161 // rcx: method handle 1135 // rcx: method handle
1162 // r13 or rsi: saved sp 1136 //
1163 // To avoid calling convention issues, build a record on the stack and pass the pointer to that instead. 1137 // To avoid calling convention issues, build a record on the stack
1164 // Note: fix the increment below if pushing more arguments 1138 // and pass the pointer to that instead.
1165 __ push(rbp); // saved_bp
1166 __ push(saved_last_sp_register()); // saved_sp
1167 __ push(rbp); // entry_sp (with extra align space) 1139 __ push(rbp); // entry_sp (with extra align space)
1168 __ push(rbx); // pusha saved_regs 1140 __ push(rbx); // pusha saved_regs
1169 __ push(rcx); // mh 1141 __ push(rcx); // mh
1170 __ push(rcx); // slot for adaptername 1142 __ push(rcx); // slot for adaptername
1171 __ movptr(Address(rsp, 0), (intptr_t) adaptername); 1143 __ movptr(Address(rsp, 0), (intptr_t) adaptername);
1172 __ super_call_VM_leaf(CAST_FROM_FN_PTR(address, trace_method_handle_stub_wrapper), rsp); 1144 __ super_call_VM_leaf(CAST_FROM_FN_PTR(address, trace_method_handle_stub_wrapper), rsp);
1173 __ increment(rsp, 6 * wordSize); // MethodHandleStubArguments 1145 __ increment(rsp, sizeof(MethodHandleStubArguments));
1174 1146
1175 if (UseSSE >= 2) { 1147 if (UseSSE >= 2) {
1176 __ movdbl(xmm0, Address(rsp, 0)); 1148 __ movdbl(xmm0, Address(rsp, 0));
1177 } else if (UseSSE == 1) { 1149 } else if (UseSSE == 1) {
1178 __ movflt(xmm0, Address(rsp, 0)); 1150 __ movflt(xmm0, Address(rsp, 0));