Mercurial > hg > truffle
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)); |