mirror of
https://github.com/openjdk/jdk.git
synced 2025-09-22 03:54:33 +02:00
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:
parent
d435d692b0
commit
4bf2c18d6c
12 changed files with 67 additions and 34 deletions
|
@ -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.
|
* Copyright (c) 2014, 2021, Red Hat Inc. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* 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) {
|
void C1_MacroAssembler::verify_stack_oop(int stack_offset) {
|
||||||
if (!VerifyOops) return;
|
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) {
|
void C1_MacroAssembler::verify_not_null_oop(Register r) {
|
||||||
|
|
|
@ -252,7 +252,7 @@ void ZBarrierSetAssembler::generate_c1_load_barrier_stub(LIR_Assembler* ce,
|
||||||
__ far_call(stub->runtime_stub());
|
__ far_call(stub->runtime_stub());
|
||||||
|
|
||||||
// Verify result
|
// Verify result
|
||||||
__ verify_oop(r0, "Bad oop");
|
__ verify_oop(r0);
|
||||||
|
|
||||||
// Move result into place
|
// Move result into place
|
||||||
if (ref != r0) {
|
if (ref != r0) {
|
||||||
|
|
|
@ -117,7 +117,7 @@ void InterpreterMacroAssembler::load_earlyret_value(TosState state) {
|
||||||
switch (state) {
|
switch (state) {
|
||||||
case atos: ldr(r0, oop_addr);
|
case atos: ldr(r0, oop_addr);
|
||||||
str(zr, 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 ltos: ldr(r0, val_addr); break;
|
||||||
case btos: // fall through
|
case btos: // fall through
|
||||||
case ztos: // fall through
|
case ztos: // fall through
|
||||||
|
@ -382,11 +382,11 @@ void InterpreterMacroAssembler::pop(TosState state) {
|
||||||
case vtos: /* nothing to do */ break;
|
case vtos: /* nothing to do */ break;
|
||||||
default: ShouldNotReachHere();
|
default: ShouldNotReachHere();
|
||||||
}
|
}
|
||||||
verify_oop(r0, state);
|
interp_verify_oop(r0, state);
|
||||||
}
|
}
|
||||||
|
|
||||||
void InterpreterMacroAssembler::push(TosState state) {
|
void InterpreterMacroAssembler::push(TosState state) {
|
||||||
verify_oop(r0, state);
|
interp_verify_oop(r0, state);
|
||||||
switch (state) {
|
switch (state) {
|
||||||
case atos: push_ptr(); break;
|
case atos: push_ptr(); break;
|
||||||
case btos:
|
case btos:
|
||||||
|
@ -464,7 +464,7 @@ void InterpreterMacroAssembler::dispatch_base(TosState state,
|
||||||
Unimplemented();
|
Unimplemented();
|
||||||
}
|
}
|
||||||
if (verifyoop) {
|
if (verifyoop) {
|
||||||
verify_oop(r0, state);
|
interp_verify_oop(r0, state);
|
||||||
}
|
}
|
||||||
|
|
||||||
Label safepoint;
|
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) {
|
if (state == atos) {
|
||||||
MacroAssembler::verify_oop(reg);
|
MacroAssembler::_verify_oop_checked(reg, "broken oop", file, line);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -277,7 +277,8 @@ class InterpreterMacroAssembler: public MacroAssembler {
|
||||||
|
|
||||||
// Debugging
|
// Debugging
|
||||||
// only if +VerifyOops && state == atos
|
// 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)
|
// only if +VerifyFPU && (state == ftos || state == dtos)
|
||||||
void verify_FPU(int stack_depth, TosState state = ftos);
|
void verify_FPU(int stack_depth, TosState state = ftos);
|
||||||
|
|
||||||
|
|
|
@ -772,7 +772,7 @@ void MacroAssembler::call_VM(Register oop_result,
|
||||||
void MacroAssembler::get_vm_result(Register oop_result, Register java_thread) {
|
void MacroAssembler::get_vm_result(Register oop_result, Register java_thread) {
|
||||||
ldr(oop_result, Address(java_thread, JavaThread::vm_result_offset()));
|
ldr(oop_result, Address(java_thread, JavaThread::vm_result_offset()));
|
||||||
str(zr, 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) {
|
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;
|
if (!VerifyOops) return;
|
||||||
|
|
||||||
// Pass register number to verify_oop_subroutine
|
// Pass register number to verify_oop_subroutine
|
||||||
|
@ -1147,7 +1147,7 @@ void MacroAssembler::verify_oop(Register reg, const char* s) {
|
||||||
{
|
{
|
||||||
ResourceMark rm;
|
ResourceMark rm;
|
||||||
stringStream ss;
|
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());
|
b = code_string(ss.as_string());
|
||||||
}
|
}
|
||||||
BLOCK_COMMENT("verify_oop {");
|
BLOCK_COMMENT("verify_oop {");
|
||||||
|
@ -1172,14 +1172,14 @@ void MacroAssembler::verify_oop(Register reg, const char* s) {
|
||||||
BLOCK_COMMENT("} verify_oop");
|
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;
|
if (!VerifyOops) return;
|
||||||
|
|
||||||
const char* b = NULL;
|
const char* b = NULL;
|
||||||
{
|
{
|
||||||
ResourceMark rm;
|
ResourceMark rm;
|
||||||
stringStream ss;
|
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());
|
b = code_string(ss.as_string());
|
||||||
}
|
}
|
||||||
BLOCK_COMMENT("verify_oop_addr {");
|
BLOCK_COMMENT("verify_oop_addr {");
|
||||||
|
@ -3792,7 +3792,7 @@ void MacroAssembler::encode_heap_oop(Register d, Register s) {
|
||||||
#ifdef ASSERT
|
#ifdef ASSERT
|
||||||
verify_heapbase("MacroAssembler::encode_heap_oop: heap base corrupted?");
|
verify_heapbase("MacroAssembler::encode_heap_oop: heap base corrupted?");
|
||||||
#endif
|
#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::base() == NULL) {
|
||||||
if (CompressedOops::shift() != 0) {
|
if (CompressedOops::shift() != 0) {
|
||||||
assert (LogMinObjAlignmentInBytes == CompressedOops::shift(), "decode alg wrong");
|
assert (LogMinObjAlignmentInBytes == CompressedOops::shift(), "decode alg wrong");
|
||||||
|
@ -3825,7 +3825,7 @@ void MacroAssembler::encode_heap_oop_not_null(Register r) {
|
||||||
bind(ok);
|
bind(ok);
|
||||||
}
|
}
|
||||||
#endif
|
#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) {
|
if (CompressedOops::base() != NULL) {
|
||||||
sub(r, r, rheapbase);
|
sub(r, r, rheapbase);
|
||||||
}
|
}
|
||||||
|
@ -3845,7 +3845,7 @@ void MacroAssembler::encode_heap_oop_not_null(Register dst, Register src) {
|
||||||
bind(ok);
|
bind(ok);
|
||||||
}
|
}
|
||||||
#endif
|
#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;
|
Register data = src;
|
||||||
if (CompressedOops::base() != NULL) {
|
if (CompressedOops::base() != NULL) {
|
||||||
|
@ -3877,7 +3877,7 @@ void MacroAssembler::decode_heap_oop(Register d, Register s) {
|
||||||
add(d, rheapbase, s, Assembler::LSL, LogMinObjAlignmentInBytes);
|
add(d, rheapbase, s, Assembler::LSL, LogMinObjAlignmentInBytes);
|
||||||
bind(done);
|
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) {
|
void MacroAssembler::decode_heap_oop_not_null(Register r) {
|
||||||
|
|
|
@ -962,13 +962,27 @@ public:
|
||||||
// Debugging
|
// Debugging
|
||||||
|
|
||||||
// only if +VerifyOops
|
// only if +VerifyOops
|
||||||
void verify_oop(Register reg, const char* s = "broken oop");
|
void _verify_oop(Register reg, const char* s, const char* file, int line);
|
||||||
void verify_oop_addr(Address addr, const char * s = "broken oop addr");
|
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?)
|
// 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_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){}
|
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_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__)
|
#define verify_klass_ptr(reg) _verify_klass_ptr(reg, "broken klass " #reg, __FILE__, __LINE__)
|
||||||
|
|
||||||
|
|
|
@ -7452,7 +7452,9 @@ class StubGenerator: public StubCodeGenerator {
|
||||||
|
|
||||||
void generate_all() {
|
void generate_all() {
|
||||||
// support for verify_oop (must happen after universe_init)
|
// support for verify_oop (must happen after universe_init)
|
||||||
StubRoutines::_verify_oop_subroutine_entry = generate_verify_oop();
|
if (VerifyOops) {
|
||||||
|
StubRoutines::_verify_oop_subroutine_entry = generate_verify_oop();
|
||||||
|
}
|
||||||
StubRoutines::_throw_AbstractMethodError_entry =
|
StubRoutines::_throw_AbstractMethodError_entry =
|
||||||
generate_throw_exception("AbstractMethodError throw_exception",
|
generate_throw_exception("AbstractMethodError throw_exception",
|
||||||
CAST_FROM_FN_PTR(address,
|
CAST_FROM_FN_PTR(address,
|
||||||
|
|
|
@ -342,7 +342,7 @@ void C1_MacroAssembler::verify_stack_oop(int stack_offset) {
|
||||||
if (!VerifyOops) {
|
if (!VerifyOops) {
|
||||||
return;
|
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) {
|
void C1_MacroAssembler::verify_not_null_oop(Register r) {
|
||||||
|
|
|
@ -397,7 +397,7 @@ void ZBarrierSetAssembler::generate_c1_load_barrier_stub(LIR_Assembler* ce,
|
||||||
__ far_call(stub->runtime_stub());
|
__ far_call(stub->runtime_stub());
|
||||||
|
|
||||||
// Verify result
|
// Verify result
|
||||||
__ verify_oop(x10, "Bad oop");
|
__ verify_oop(x10);
|
||||||
|
|
||||||
|
|
||||||
// Move result into place
|
// Move result into place
|
||||||
|
|
|
@ -324,7 +324,7 @@ void MacroAssembler::call_VM_base(Register oop_result,
|
||||||
void MacroAssembler::get_vm_result(Register oop_result, Register java_thread) {
|
void MacroAssembler::get_vm_result(Register oop_result, Register java_thread) {
|
||||||
ld(oop_result, Address(java_thread, JavaThread::vm_result_offset()));
|
ld(oop_result, Address(java_thread, JavaThread::vm_result_offset()));
|
||||||
sd(zr, 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) {
|
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; }
|
if (!VerifyOops) { return; }
|
||||||
|
|
||||||
// Pass register number to verify_oop_subroutine
|
// Pass register number to verify_oop_subroutine
|
||||||
|
@ -370,7 +370,7 @@ void MacroAssembler::verify_oop(Register reg, const char* s) {
|
||||||
{
|
{
|
||||||
ResourceMark rm;
|
ResourceMark rm;
|
||||||
stringStream ss;
|
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());
|
b = code_string(ss.as_string());
|
||||||
}
|
}
|
||||||
BLOCK_COMMENT("verify_oop {");
|
BLOCK_COMMENT("verify_oop {");
|
||||||
|
@ -394,7 +394,7 @@ void MacroAssembler::verify_oop(Register reg, const char* s) {
|
||||||
BLOCK_COMMENT("} verify_oop");
|
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) {
|
if (!VerifyOops) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -403,7 +403,7 @@ void MacroAssembler::verify_oop_addr(Address addr, const char* s) {
|
||||||
{
|
{
|
||||||
ResourceMark rm;
|
ResourceMark rm;
|
||||||
stringStream ss;
|
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());
|
b = code_string(ss.as_string());
|
||||||
}
|
}
|
||||||
BLOCK_COMMENT("verify_oop_addr {");
|
BLOCK_COMMENT("verify_oop_addr {");
|
||||||
|
@ -1823,7 +1823,7 @@ void MacroAssembler::access_store_at(BasicType type, DecoratorSet decorators,
|
||||||
|
|
||||||
// Algorithm must match CompressedOops::encode.
|
// Algorithm must match CompressedOops::encode.
|
||||||
void MacroAssembler::encode_heap_oop(Register d, Register s) {
|
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::base() == NULL) {
|
||||||
if (CompressedOops::shift() != 0) {
|
if (CompressedOops::shift() != 0) {
|
||||||
assert (LogMinObjAlignmentInBytes == CompressedOops::shift(), "decode alg wrong");
|
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);
|
shadd(d, s, xheapbase, d, LogMinObjAlignmentInBytes);
|
||||||
bind(done);
|
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,
|
void MacroAssembler::store_heap_oop(Address dst, Register src, Register tmp1,
|
||||||
|
|
|
@ -314,12 +314,26 @@ class MacroAssembler: public Assembler {
|
||||||
Address argument_address(RegisterOrConstant arg_slot, int extra_slot_offset = 0);
|
Address argument_address(RegisterOrConstant arg_slot, int extra_slot_offset = 0);
|
||||||
|
|
||||||
// only if +VerifyOops
|
// only if +VerifyOops
|
||||||
void verify_oop(Register reg, const char* s = "broken oop");
|
void _verify_oop(Register reg, const char* s, const char* file, int line);
|
||||||
void verify_oop_addr(Address addr, const char* s = "broken oop addr");
|
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_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) {}
|
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_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__)
|
#define verify_klass_ptr(reg) _verify_method_ptr(reg, "broken klass " #reg, __FILE__, __LINE__)
|
||||||
|
|
||||||
|
|
|
@ -3731,7 +3731,9 @@ class StubGenerator: public StubCodeGenerator {
|
||||||
|
|
||||||
void generate_all() {
|
void generate_all() {
|
||||||
// support for verify_oop (must happen after universe_init)
|
// support for verify_oop (must happen after universe_init)
|
||||||
StubRoutines::_verify_oop_subroutine_entry = generate_verify_oop();
|
if (VerifyOops) {
|
||||||
|
StubRoutines::_verify_oop_subroutine_entry = generate_verify_oop();
|
||||||
|
}
|
||||||
StubRoutines::_throw_AbstractMethodError_entry =
|
StubRoutines::_throw_AbstractMethodError_entry =
|
||||||
generate_throw_exception("AbstractMethodError throw_exception",
|
generate_throw_exception("AbstractMethodError throw_exception",
|
||||||
CAST_FROM_FN_PTR(address,
|
CAST_FROM_FN_PTR(address,
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue