8026495: JVM Crashes when started with -XX:+DTraceMethodProbes on Solaris x86_64
Fix wrong calling convention in LIR_Assembler::emit_unwind_handler(), T_METADATA support in calling convention generator, C1 register allocator Reviewed-by: twisti, jrose
This commit is contained in:
parent
1b5bd82335
commit
1c047b640d
@ -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) {
|
|||||||
#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() {
|
|||||||
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() {
|
|||||||
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) {
|
|||||||
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) {
|
|||||||
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) {
|
|||||||
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) {
|
|||||||
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 @@
|
|||||||
|
|
||||||
// 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
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user