提交 0939b0f7 编写于 作者: I iveresov

8026495: JVM Crashes when started with -XX:+DTraceMethodProbes on Solaris x86_64

Summary: Fix wrong calling convention in LIR_Assembler::emit_unwind_handler(), T_METADATA support in calling convention generator, C1 register allocator
Reviewed-by: twisti, jrose
上级 0cc413b6
...@@ -53,6 +53,8 @@ LIR_Opr FrameMap::map_to_opr(BasicType type, VMRegPair* reg, bool outgoing) { ...@@ -53,6 +53,8 @@ LIR_Opr FrameMap::map_to_opr(BasicType type, VMRegPair* reg, bool outgoing) {
opr = as_long_opr(reg); opr = as_long_opr(reg);
} else if (type == T_OBJECT || type == T_ARRAY) { } else if (type == T_OBJECT || type == T_ARRAY) {
opr = as_oop_opr(reg); opr = as_oop_opr(reg);
} else if (type == T_METADATA) {
opr = as_metadata_opr(reg);
} else { } else {
opr = as_opr(reg); opr = as_opr(reg);
} }
......
...@@ -52,6 +52,8 @@ LIR_Opr FrameMap::map_to_opr(BasicType type, VMRegPair* reg, bool) { ...@@ -52,6 +52,8 @@ LIR_Opr FrameMap::map_to_opr(BasicType type, VMRegPair* reg, bool) {
#endif // _LP64 #endif // _LP64
} else if (type == T_OBJECT || type == T_ARRAY) { } else if (type == T_OBJECT || type == T_ARRAY) {
opr = as_oop_opr(reg); opr = as_oop_opr(reg);
} else if (type == T_METADATA) {
opr = as_metadata_opr(reg);
} else { } else {
opr = as_opr(reg); opr = as_opr(reg);
} }
......
...@@ -432,15 +432,16 @@ int LIR_Assembler::emit_unwind_handler() { ...@@ -432,15 +432,16 @@ int LIR_Assembler::emit_unwind_handler() {
int offset = code_offset(); int offset = code_offset();
// Fetch the exception from TLS and clear out exception related thread state // Fetch the exception from TLS and clear out exception related thread state
__ get_thread(rsi); Register thread = NOT_LP64(rsi) LP64_ONLY(r15_thread);
__ movptr(rax, Address(rsi, JavaThread::exception_oop_offset())); NOT_LP64(__ get_thread(rsi));
__ movptr(Address(rsi, JavaThread::exception_oop_offset()), (intptr_t)NULL_WORD); __ movptr(rax, Address(thread, JavaThread::exception_oop_offset()));
__ movptr(Address(rsi, JavaThread::exception_pc_offset()), (intptr_t)NULL_WORD); __ movptr(Address(thread, JavaThread::exception_oop_offset()), (intptr_t)NULL_WORD);
__ movptr(Address(thread, JavaThread::exception_pc_offset()), (intptr_t)NULL_WORD);
__ bind(_unwind_handler_entry); __ bind(_unwind_handler_entry);
__ verify_not_null_oop(rax); __ verify_not_null_oop(rax);
if (method()->is_synchronized() || compilation()->env()->dtrace_method_probes()) { if (method()->is_synchronized() || compilation()->env()->dtrace_method_probes()) {
__ mov(rsi, rax); // Preserve the exception __ mov(rbx, rax); // Preserve the exception (rbx is always callee-saved)
} }
// Preform needed unlocking // Preform needed unlocking
...@@ -448,19 +449,24 @@ int LIR_Assembler::emit_unwind_handler() { ...@@ -448,19 +449,24 @@ int LIR_Assembler::emit_unwind_handler() {
if (method()->is_synchronized()) { if (method()->is_synchronized()) {
monitor_address(0, FrameMap::rax_opr); monitor_address(0, FrameMap::rax_opr);
stub = new MonitorExitStub(FrameMap::rax_opr, true, 0); stub = new MonitorExitStub(FrameMap::rax_opr, true, 0);
__ unlock_object(rdi, rbx, rax, *stub->entry()); __ unlock_object(rdi, rsi, rax, *stub->entry());
__ bind(*stub->continuation()); __ bind(*stub->continuation());
} }
if (compilation()->env()->dtrace_method_probes()) { if (compilation()->env()->dtrace_method_probes()) {
#ifdef _LP64
__ mov(rdi, r15_thread);
__ mov_metadata(rsi, method()->constant_encoding());
#else
__ get_thread(rax); __ get_thread(rax);
__ movptr(Address(rsp, 0), rax); __ movptr(Address(rsp, 0), rax);
__ mov_metadata(Address(rsp, sizeof(void*)), method()->constant_encoding()); __ mov_metadata(Address(rsp, sizeof(void*)), method()->constant_encoding());
#endif
__ call(RuntimeAddress(CAST_FROM_FN_PTR(address, SharedRuntime::dtrace_method_exit))); __ call(RuntimeAddress(CAST_FROM_FN_PTR(address, SharedRuntime::dtrace_method_exit)));
} }
if (method()->is_synchronized() || compilation()->env()->dtrace_method_probes()) { if (method()->is_synchronized() || compilation()->env()->dtrace_method_probes()) {
__ mov(rax, rsi); // Restore the exception __ mov(rax, rbx); // Restore the exception
} }
// remove the activation and dispatch to the unwind handler // remove the activation and dispatch to the unwind handler
......
...@@ -183,10 +183,10 @@ char LIR_OprDesc::type_char(BasicType t) { ...@@ -183,10 +183,10 @@ char LIR_OprDesc::type_char(BasicType t) {
case T_LONG: case T_LONG:
case T_OBJECT: case T_OBJECT:
case T_ADDRESS: case T_ADDRESS:
case T_METADATA:
case T_VOID: case T_VOID:
return ::type2char(t); return ::type2char(t);
case T_METADATA:
return 'M';
case T_ILLEGAL: case T_ILLEGAL:
return '?'; return '?';
......
...@@ -1175,7 +1175,7 @@ void LIRGenerator::do_Return(Return* x) { ...@@ -1175,7 +1175,7 @@ void LIRGenerator::do_Return(Return* x) {
if (compilation()->env()->dtrace_method_probes()) { if (compilation()->env()->dtrace_method_probes()) {
BasicTypeList signature; BasicTypeList signature;
signature.append(LP64_ONLY(T_LONG) NOT_LP64(T_INT)); // thread signature.append(LP64_ONLY(T_LONG) NOT_LP64(T_INT)); // thread
signature.append(T_OBJECT); // Method* signature.append(T_METADATA); // Method*
LIR_OprList* args = new LIR_OprList(); LIR_OprList* args = new LIR_OprList();
args->append(getThreadPointer()); args->append(getThreadPointer());
LIR_Opr meth = new_register(T_METADATA); LIR_Opr meth = new_register(T_METADATA);
...@@ -2720,7 +2720,7 @@ void LIRGenerator::do_Base(Base* x) { ...@@ -2720,7 +2720,7 @@ void LIRGenerator::do_Base(Base* x) {
if (compilation()->env()->dtrace_method_probes()) { if (compilation()->env()->dtrace_method_probes()) {
BasicTypeList signature; BasicTypeList signature;
signature.append(LP64_ONLY(T_LONG) NOT_LP64(T_INT)); // thread signature.append(LP64_ONLY(T_LONG) NOT_LP64(T_INT)); // thread
signature.append(T_OBJECT); // Method* signature.append(T_METADATA); // Method*
LIR_OprList* args = new LIR_OprList(); LIR_OprList* args = new LIR_OprList();
args->append(getThreadPointer()); args->append(getThreadPointer());
LIR_Opr meth = new_register(T_METADATA); LIR_Opr meth = new_register(T_METADATA);
...@@ -3331,7 +3331,7 @@ void LIRGenerator::do_RuntimeCall(RuntimeCall* x) { ...@@ -3331,7 +3331,7 @@ void LIRGenerator::do_RuntimeCall(RuntimeCall* x) {
BasicTypeList* signature = new BasicTypeList(x->number_of_arguments()); BasicTypeList* signature = new BasicTypeList(x->number_of_arguments());
if (x->pass_thread()) { if (x->pass_thread()) {
signature->append(T_ADDRESS); signature->append(LP64_ONLY(T_LONG) NOT_LP64(T_INT)); // thread
args->append(getThreadPointer()); args->append(getThreadPointer());
} }
......
...@@ -75,9 +75,9 @@ ...@@ -75,9 +75,9 @@
// Map BasicType to spill size in 32-bit words, matching VMReg's notion of words // Map BasicType to spill size in 32-bit words, matching VMReg's notion of words
#ifdef _LP64 #ifdef _LP64
static int type2spill_size[T_CONFLICT+1]={ -1, 0, 0, 0, 1, 1, 1, 2, 1, 1, 1, 2, 2, 2, 0, 1, -1}; static int type2spill_size[T_CONFLICT+1]={ -1, 0, 0, 0, 1, 1, 1, 2, 1, 1, 1, 2, 2, 2, 0, 2, 1, 2, 1, -1};
#else #else
static int type2spill_size[T_CONFLICT+1]={ -1, 0, 0, 0, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 0, 1, -1}; static int type2spill_size[T_CONFLICT+1]={ -1, 0, 0, 0, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 0, 1, -1, 1, 1, -1};
#endif #endif
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册