8285435: Show file and line in MacroAssembler::verify_oop for AArch64 and RISC-V platforms (Port from x86)

Reviewed-by: ngasson, fyang
This commit is contained in:
Xiaolin Zheng 2022-04-25 23:57:08 +00:00 committed by Fei Yang
parent d435d692b0
commit 4bf2c18d6c
12 changed files with 67 additions and 34 deletions

View file

@ -1,5 +1,5 @@
/*
* Copyright (c) 1999, 2021, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1999, 2022, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2014, 2021, Red Hat Inc. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@ -326,7 +326,7 @@ void C1_MacroAssembler::load_parameter(int offset_in_words, Register reg) {
void C1_MacroAssembler::verify_stack_oop(int stack_offset) {
if (!VerifyOops) return;
verify_oop_addr(Address(sp, stack_offset), "oop");
verify_oop_addr(Address(sp, stack_offset));
}
void C1_MacroAssembler::verify_not_null_oop(Register r) {

View file

@ -252,7 +252,7 @@ void ZBarrierSetAssembler::generate_c1_load_barrier_stub(LIR_Assembler* ce,
__ far_call(stub->runtime_stub());
// Verify result
__ verify_oop(r0, "Bad oop");
__ verify_oop(r0);
// Move result into place
if (ref != r0) {

View file

@ -117,7 +117,7 @@ void InterpreterMacroAssembler::load_earlyret_value(TosState state) {
switch (state) {
case atos: ldr(r0, oop_addr);
str(zr, oop_addr);
verify_oop(r0, state); break;
interp_verify_oop(r0, state); break;
case ltos: ldr(r0, val_addr); break;
case btos: // fall through
case ztos: // fall through
@ -382,11 +382,11 @@ void InterpreterMacroAssembler::pop(TosState state) {
case vtos: /* nothing to do */ break;
default: ShouldNotReachHere();
}
verify_oop(r0, state);
interp_verify_oop(r0, state);
}
void InterpreterMacroAssembler::push(TosState state) {
verify_oop(r0, state);
interp_verify_oop(r0, state);
switch (state) {
case atos: push_ptr(); break;
case btos:
@ -464,7 +464,7 @@ void InterpreterMacroAssembler::dispatch_base(TosState state,
Unimplemented();
}
if (verifyoop) {
verify_oop(r0, state);
interp_verify_oop(r0, state);
}
Label safepoint;
@ -1469,9 +1469,9 @@ void InterpreterMacroAssembler::profile_switch_case(Register index,
}
}
void InterpreterMacroAssembler::verify_oop(Register reg, TosState state) {
void InterpreterMacroAssembler::_interp_verify_oop(Register reg, TosState state, const char* file, int line) {
if (state == atos) {
MacroAssembler::verify_oop(reg);
MacroAssembler::_verify_oop_checked(reg, "broken oop", file, line);
}
}

View file

@ -277,7 +277,8 @@ class InterpreterMacroAssembler: public MacroAssembler {
// Debugging
// only if +VerifyOops && state == atos
void verify_oop(Register reg, TosState state = atos);
#define interp_verify_oop(reg, state) _interp_verify_oop(reg, state, __FILE__, __LINE__);
void _interp_verify_oop(Register reg, TosState state, const char* file, int line);
// only if +VerifyFPU && (state == ftos || state == dtos)
void verify_FPU(int stack_depth, TosState state = ftos);

View file

@ -772,7 +772,7 @@ void MacroAssembler::call_VM(Register oop_result,
void MacroAssembler::get_vm_result(Register oop_result, Register java_thread) {
ldr(oop_result, Address(java_thread, JavaThread::vm_result_offset()));
str(zr, Address(java_thread, JavaThread::vm_result_offset()));
verify_oop(oop_result, "broken oop in call_VM_base");
verify_oop_msg(oop_result, "broken oop in call_VM_base");
}
void MacroAssembler::get_vm_result_2(Register metadata_result, Register java_thread) {
@ -1139,7 +1139,7 @@ void MacroAssembler::clinit_barrier(Register klass, Register scratch, Label* L_f
}
}
void MacroAssembler::verify_oop(Register reg, const char* s) {
void MacroAssembler::_verify_oop(Register reg, const char* s, const char* file, int line) {
if (!VerifyOops) return;
// Pass register number to verify_oop_subroutine
@ -1147,7 +1147,7 @@ void MacroAssembler::verify_oop(Register reg, const char* s) {
{
ResourceMark rm;
stringStream ss;
ss.print("verify_oop: %s: %s", reg->name(), s);
ss.print("verify_oop: %s: %s (%s:%d)", reg->name(), s, file, line);
b = code_string(ss.as_string());
}
BLOCK_COMMENT("verify_oop {");
@ -1172,14 +1172,14 @@ void MacroAssembler::verify_oop(Register reg, const char* s) {
BLOCK_COMMENT("} verify_oop");
}
void MacroAssembler::verify_oop_addr(Address addr, const char* s) {
void MacroAssembler::_verify_oop_addr(Address addr, const char* s, const char* file, int line) {
if (!VerifyOops) return;
const char* b = NULL;
{
ResourceMark rm;
stringStream ss;
ss.print("verify_oop_addr: %s", s);
ss.print("verify_oop_addr: %s (%s:%d)", s, file, line);
b = code_string(ss.as_string());
}
BLOCK_COMMENT("verify_oop_addr {");
@ -3792,7 +3792,7 @@ void MacroAssembler::encode_heap_oop(Register d, Register s) {
#ifdef ASSERT
verify_heapbase("MacroAssembler::encode_heap_oop: heap base corrupted?");
#endif
verify_oop(s, "broken oop in encode_heap_oop");
verify_oop_msg(s, "broken oop in encode_heap_oop");
if (CompressedOops::base() == NULL) {
if (CompressedOops::shift() != 0) {
assert (LogMinObjAlignmentInBytes == CompressedOops::shift(), "decode alg wrong");
@ -3825,7 +3825,7 @@ void MacroAssembler::encode_heap_oop_not_null(Register r) {
bind(ok);
}
#endif
verify_oop(r, "broken oop in encode_heap_oop_not_null");
verify_oop_msg(r, "broken oop in encode_heap_oop_not_null");
if (CompressedOops::base() != NULL) {
sub(r, r, rheapbase);
}
@ -3845,7 +3845,7 @@ void MacroAssembler::encode_heap_oop_not_null(Register dst, Register src) {
bind(ok);
}
#endif
verify_oop(src, "broken oop in encode_heap_oop_not_null2");
verify_oop_msg(src, "broken oop in encode_heap_oop_not_null2");
Register data = src;
if (CompressedOops::base() != NULL) {
@ -3877,7 +3877,7 @@ void MacroAssembler::decode_heap_oop(Register d, Register s) {
add(d, rheapbase, s, Assembler::LSL, LogMinObjAlignmentInBytes);
bind(done);
}
verify_oop(d, "broken oop in decode_heap_oop");
verify_oop_msg(d, "broken oop in decode_heap_oop");
}
void MacroAssembler::decode_heap_oop_not_null(Register r) {

View file

@ -962,13 +962,27 @@ public:
// Debugging
// only if +VerifyOops
void verify_oop(Register reg, const char* s = "broken oop");
void verify_oop_addr(Address addr, const char * s = "broken oop addr");
void _verify_oop(Register reg, const char* s, const char* file, int line);
void _verify_oop_addr(Address addr, const char * s, const char* file, int line);
void _verify_oop_checked(Register reg, const char* s, const char* file, int line) {
if (VerifyOops) {
_verify_oop(reg, s, file, line);
}
}
void _verify_oop_addr_checked(Address reg, const char* s, const char* file, int line) {
if (VerifyOops) {
_verify_oop_addr(reg, s, file, line);
}
}
// TODO: verify method and klass metadata (compare against vptr?)
void _verify_method_ptr(Register reg, const char * msg, const char * file, int line) {}
void _verify_klass_ptr(Register reg, const char * msg, const char * file, int line){}
#define verify_oop(reg) _verify_oop_checked(reg, "broken oop " #reg, __FILE__, __LINE__)
#define verify_oop_msg(reg, msg) _verify_oop_checked(reg, "broken oop " #reg ", " #msg, __FILE__, __LINE__)
#define verify_oop_addr(addr) _verify_oop_addr_checked(addr, "broken oop addr " #addr, __FILE__, __LINE__)
#define verify_method_ptr(reg) _verify_method_ptr(reg, "broken method " #reg, __FILE__, __LINE__)
#define verify_klass_ptr(reg) _verify_klass_ptr(reg, "broken klass " #reg, __FILE__, __LINE__)

View file

@ -7452,7 +7452,9 @@ class StubGenerator: public StubCodeGenerator {
void generate_all() {
// support for verify_oop (must happen after universe_init)
if (VerifyOops) {
StubRoutines::_verify_oop_subroutine_entry = generate_verify_oop();
}
StubRoutines::_throw_AbstractMethodError_entry =
generate_throw_exception("AbstractMethodError throw_exception",
CAST_FROM_FN_PTR(address,

View file

@ -342,7 +342,7 @@ void C1_MacroAssembler::verify_stack_oop(int stack_offset) {
if (!VerifyOops) {
return;
}
verify_oop_addr(Address(sp, stack_offset), "oop");
verify_oop_addr(Address(sp, stack_offset));
}
void C1_MacroAssembler::verify_not_null_oop(Register r) {

View file

@ -397,7 +397,7 @@ void ZBarrierSetAssembler::generate_c1_load_barrier_stub(LIR_Assembler* ce,
__ far_call(stub->runtime_stub());
// Verify result
__ verify_oop(x10, "Bad oop");
__ verify_oop(x10);
// Move result into place

View file

@ -324,7 +324,7 @@ void MacroAssembler::call_VM_base(Register oop_result,
void MacroAssembler::get_vm_result(Register oop_result, Register java_thread) {
ld(oop_result, Address(java_thread, JavaThread::vm_result_offset()));
sd(zr, Address(java_thread, JavaThread::vm_result_offset()));
verify_oop(oop_result, "broken oop in call_VM_base");
verify_oop_msg(oop_result, "broken oop in call_VM_base");
}
void MacroAssembler::get_vm_result_2(Register metadata_result, Register java_thread) {
@ -362,7 +362,7 @@ void MacroAssembler::clinit_barrier(Register klass, Register tmp, Label* L_fast_
}
}
void MacroAssembler::verify_oop(Register reg, const char* s) {
void MacroAssembler::_verify_oop(Register reg, const char* s, const char* file, int line) {
if (!VerifyOops) { return; }
// Pass register number to verify_oop_subroutine
@ -370,7 +370,7 @@ void MacroAssembler::verify_oop(Register reg, const char* s) {
{
ResourceMark rm;
stringStream ss;
ss.print("verify_oop: %s: %s", reg->name(), s);
ss.print("verify_oop: %s: %s (%s:%d)", reg->name(), s, file, line);
b = code_string(ss.as_string());
}
BLOCK_COMMENT("verify_oop {");
@ -394,7 +394,7 @@ void MacroAssembler::verify_oop(Register reg, const char* s) {
BLOCK_COMMENT("} verify_oop");
}
void MacroAssembler::verify_oop_addr(Address addr, const char* s) {
void MacroAssembler::_verify_oop_addr(Address addr, const char* s, const char* file, int line) {
if (!VerifyOops) {
return;
}
@ -403,7 +403,7 @@ void MacroAssembler::verify_oop_addr(Address addr, const char* s) {
{
ResourceMark rm;
stringStream ss;
ss.print("verify_oop_addr: %s", s);
ss.print("verify_oop_addr: %s (%s:%d)", s, file, line);
b = code_string(ss.as_string());
}
BLOCK_COMMENT("verify_oop_addr {");
@ -1823,7 +1823,7 @@ void MacroAssembler::access_store_at(BasicType type, DecoratorSet decorators,
// Algorithm must match CompressedOops::encode.
void MacroAssembler::encode_heap_oop(Register d, Register s) {
verify_oop(s, "broken oop in encode_heap_oop");
verify_oop_msg(s, "broken oop in encode_heap_oop");
if (CompressedOops::base() == NULL) {
if (CompressedOops::shift() != 0) {
assert (LogMinObjAlignmentInBytes == CompressedOops::shift(), "decode alg wrong");
@ -1981,7 +1981,7 @@ void MacroAssembler::decode_heap_oop(Register d, Register s) {
shadd(d, s, xheapbase, d, LogMinObjAlignmentInBytes);
bind(done);
}
verify_oop(d, "broken oop in decode_heap_oop");
verify_oop_msg(d, "broken oop in decode_heap_oop");
}
void MacroAssembler::store_heap_oop(Address dst, Register src, Register tmp1,

View file

@ -314,12 +314,26 @@ class MacroAssembler: public Assembler {
Address argument_address(RegisterOrConstant arg_slot, int extra_slot_offset = 0);
// only if +VerifyOops
void verify_oop(Register reg, const char* s = "broken oop");
void verify_oop_addr(Address addr, const char* s = "broken oop addr");
void _verify_oop(Register reg, const char* s, const char* file, int line);
void _verify_oop_addr(Address addr, const char* s, const char* file, int line);
void _verify_oop_checked(Register reg, const char* s, const char* file, int line) {
if (VerifyOops) {
_verify_oop(reg, s, file, line);
}
}
void _verify_oop_addr_checked(Address reg, const char* s, const char* file, int line) {
if (VerifyOops) {
_verify_oop_addr(reg, s, file, line);
}
}
void _verify_method_ptr(Register reg, const char* msg, const char* file, int line) {}
void _verify_klass_ptr(Register reg, const char* msg, const char* file, int line) {}
#define verify_oop(reg) _verify_oop_checked(reg, "broken oop " #reg, __FILE__, __LINE__)
#define verify_oop_msg(reg, msg) _verify_oop_checked(reg, "broken oop " #reg ", " #msg, __FILE__, __LINE__)
#define verify_oop_addr(addr) _verify_oop_addr_checked(addr, "broken oop addr " #addr, __FILE__, __LINE__)
#define verify_method_ptr(reg) _verify_method_ptr(reg, "broken method " #reg, __FILE__, __LINE__)
#define verify_klass_ptr(reg) _verify_method_ptr(reg, "broken klass " #reg, __FILE__, __LINE__)

View file

@ -3731,7 +3731,9 @@ class StubGenerator: public StubCodeGenerator {
void generate_all() {
// support for verify_oop (must happen after universe_init)
if (VerifyOops) {
StubRoutines::_verify_oop_subroutine_entry = generate_verify_oop();
}
StubRoutines::_throw_AbstractMethodError_entry =
generate_throw_exception("AbstractMethodError throw_exception",
CAST_FROM_FN_PTR(address,