Skip to content

Commit 7b118dc

Browse files
author
duke
committed
Backport 462519935827e25475f2fb35746ad81a14bc5da7
1 parent 9d467de commit 7b118dc

File tree

3 files changed

+22
-1
lines changed

3 files changed

+22
-1
lines changed

src/hotspot/cpu/riscv/interp_masm_riscv.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1937,6 +1937,15 @@ void InterpreterMacroAssembler::load_method_entry(Register cache, Register index
19371937
}
19381938

19391939
#ifdef ASSERT
1940+
void InterpreterMacroAssembler::verify_field_offset(Register reg) {
1941+
// Verify the field offset is not in the header, implicitly checks for 0
1942+
Label L;
1943+
mv(t0, oopDesc::base_offset_in_bytes());
1944+
bge(reg, t0, L);
1945+
stop("bad field offset");
1946+
bind(L);
1947+
}
1948+
19401949
void InterpreterMacroAssembler::verify_access_flags(Register access_flags, uint32_t flag,
19411950
const char* msg, bool stop_by_hit) {
19421951
Label L;

src/hotspot/cpu/riscv/interp_masm_riscv.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -300,6 +300,8 @@ class InterpreterMacroAssembler: public MacroAssembler {
300300
void load_field_entry(Register cache, Register index, int bcp_offset = 1);
301301
void load_method_entry(Register cache, Register index, int bcp_offset = 1);
302302

303+
void verify_field_offset(Register reg) NOT_DEBUG_RETURN;
304+
303305
#ifdef ASSERT
304306
void verify_access_flags(Register access_flags, uint32_t flag,
305307
const char* msg, bool stop_by_hit = true);

src/hotspot/cpu/riscv/templateTable_riscv.cpp

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,7 @@ Address TemplateTable::at_bcp(int offset) {
133133
void TemplateTable::patch_bytecode(Bytecodes::Code bc, Register bc_reg,
134134
Register temp_reg, bool load_bc_into_bc_reg /*=true*/,
135135
int byte_no) {
136+
assert_different_registers(bc_reg, temp_reg);
136137
if (!RewriteBytecodes) { return; }
137138
Label L_patch_done;
138139

@@ -196,7 +197,11 @@ void TemplateTable::patch_bytecode(Bytecodes::Code bc, Register bc_reg,
196197
__ bind(L_okay);
197198
#endif
198199

199-
// patch bytecode
200+
// Patch bytecode with release store to coordinate with ResolvedFieldEntry loads
201+
// in fast bytecode codelets. load_field_entry has a memory barrier that gains
202+
// the needed ordering, together with control dependency on entering the fast codelet
203+
// itself.
204+
__ membar(MacroAssembler::LoadStore | MacroAssembler::StoreStore);
200205
__ sb(bc_reg, at_bcp(0));
201206
__ bind(L_patch_done);
202207
}
@@ -3017,6 +3022,7 @@ void TemplateTable::fast_storefield(TosState state) {
30173022

30183023
// X11: field offset, X12: field holder, X13: flags
30193024
load_resolved_field_entry(x12, x12, noreg, x11, x13);
3025+
__ verify_field_offset(x11);
30203026

30213027
{
30223028
Label notVolatile;
@@ -3104,6 +3110,8 @@ void TemplateTable::fast_accessfield(TosState state) {
31043110
__ load_field_entry(x12, x11);
31053111

31063112
__ load_sized_value(x11, Address(x12, in_bytes(ResolvedFieldEntry::field_offset_offset())), sizeof(int), true /*is_signed*/);
3113+
__ verify_field_offset(x11);
3114+
31073115
__ load_unsigned_byte(x13, Address(x12, in_bytes(ResolvedFieldEntry::flags_offset())));
31083116

31093117
// x10: object
@@ -3159,7 +3167,9 @@ void TemplateTable::fast_xaccess(TosState state) {
31593167
__ ld(x10, aaddress(0));
31603168
// access constant pool cache
31613169
__ load_field_entry(x12, x13, 2);
3170+
31623171
__ load_sized_value(x11, Address(x12, in_bytes(ResolvedFieldEntry::field_offset_offset())), sizeof(int), true /*is_signed*/);
3172+
__ verify_field_offset(x11);
31633173

31643174
// make sure exception is reported in correct bcp range (getfield is
31653175
// next instruction)

0 commit comments

Comments
 (0)