Skip to content

Commit 9ce21d1

Browse files
author
Matias Saavedra Silva
committed
8327647: Occasional SIGSEGV in markWord::displaced_mark_helper() for SPECjvm2008 sunflow
Reviewed-by: coleenp, fyang, dlong
1 parent 130f71c commit 9ce21d1

File tree

5 files changed

+15
-21
lines changed

5 files changed

+15
-21
lines changed

src/hotspot/cpu/aarch64/interp_masm_aarch64.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1778,6 +1778,8 @@ void InterpreterMacroAssembler::load_field_entry(Register cache, Register index,
17781778
ldr(cache, Address(rcpool, ConstantPoolCache::field_entries_offset()));
17791779
add(cache, cache, Array<ResolvedFieldEntry>::base_offset_in_bytes());
17801780
lea(cache, Address(cache, index));
1781+
// Prevents stale data from being read after the bytecode is patched to the fast bytecode
1782+
membar(MacroAssembler::LoadLoad);
17811783
}
17821784

17831785
void InterpreterMacroAssembler::load_method_entry(Register cache, Register index, int bcp_offset) {

src/hotspot/cpu/aarch64/templateTable_aarch64.cpp

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2355,7 +2355,9 @@ void TemplateTable::load_resolved_field_entry(Register obj,
23552355
__ load_unsigned_byte(flags, Address(cache, in_bytes(ResolvedFieldEntry::flags_offset())));
23562356

23572357
// TOS state
2358-
__ load_unsigned_byte(tos_state, Address(cache, in_bytes(ResolvedFieldEntry::type_offset())));
2358+
if (tos_state != noreg) {
2359+
__ load_unsigned_byte(tos_state, Address(cache, in_bytes(ResolvedFieldEntry::type_offset())));
2360+
}
23592361

23602362
// Klass overwrite register
23612363
if (is_static) {
@@ -3069,13 +3071,9 @@ void TemplateTable::fast_storefield(TosState state)
30693071

30703072
// access constant pool cache
30713073
__ load_field_entry(r2, r1);
3072-
__ push(r0);
3073-
// R1: field offset, R2: TOS, R3: flags
3074-
load_resolved_field_entry(r2, r2, r0, r1, r3);
3075-
__ pop(r0);
30763074

3077-
// Must prevent reordering of the following cp cache loads with bytecode load
3078-
__ membar(MacroAssembler::LoadLoad);
3075+
// R1: field offset, R2: field holder, R3: flags
3076+
load_resolved_field_entry(r2, r2, noreg, r1, r3);
30793077

30803078
{
30813079
Label notVolatile;
@@ -3163,9 +3161,6 @@ void TemplateTable::fast_accessfield(TosState state)
31633161
// access constant pool cache
31643162
__ load_field_entry(r2, r1);
31653163

3166-
// Must prevent reordering of the following cp cache loads with bytecode load
3167-
__ membar(MacroAssembler::LoadLoad);
3168-
31693164
__ load_sized_value(r1, Address(r2, in_bytes(ResolvedFieldEntry::field_offset_offset())), sizeof(int), true /*is_signed*/);
31703165
__ load_unsigned_byte(r3, Address(r2, in_bytes(ResolvedFieldEntry::flags_offset())));
31713166

src/hotspot/cpu/riscv/interp_masm_riscv.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1881,6 +1881,8 @@ void InterpreterMacroAssembler::load_field_entry(Register cache, Register index,
18811881
ld(cache, Address(xcpool, ConstantPoolCache::field_entries_offset()));
18821882
add(cache, cache, Array<ResolvedIndyEntry>::base_offset_in_bytes());
18831883
add(cache, cache, index);
1884+
// Prevents stale data from being read after the bytecode is patched to the fast bytecode
1885+
membar(MacroAssembler::LoadLoad);
18841886
}
18851887

18861888
void InterpreterMacroAssembler::get_method_counters(Register method,

src/hotspot/cpu/riscv/templateTable_riscv.cpp

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2272,7 +2272,9 @@ void TemplateTable::load_resolved_field_entry(Register obj,
22722272
__ load_unsigned_byte(flags, Address(cache, in_bytes(ResolvedFieldEntry::flags_offset())));
22732273

22742274
// TOS state
2275-
__ load_unsigned_byte(tos_state, Address(cache, in_bytes(ResolvedFieldEntry::type_offset())));
2275+
if (tos_state != noreg) {
2276+
__ load_unsigned_byte(tos_state, Address(cache, in_bytes(ResolvedFieldEntry::type_offset())));
2277+
}
22762278

22772279
// Klass overwrite register
22782280
if (is_static) {
@@ -3036,13 +3038,9 @@ void TemplateTable::fast_storefield(TosState state) {
30363038

30373039
// access constant pool cache
30383040
__ load_field_entry(x12, x11);
3039-
__ push_reg(x10);
3040-
// X11: field offset, X12: TOS, X13: flags
3041-
load_resolved_field_entry(x12, x12, x10, x11, x13);
3042-
__ pop_reg(x10);
30433041

3044-
// Must prevent reordering of the following cp cache loads with bytecode load
3045-
__ membar(MacroAssembler::LoadLoad);
3042+
// X11: field offset, X12: field holder, X13: flags
3043+
load_resolved_field_entry(x12, x12, noreg, x11, x13);
30463044

30473045
{
30483046
Label notVolatile;
@@ -3133,9 +3131,6 @@ void TemplateTable::fast_accessfield(TosState state) {
31333131
// access constant pool cache
31343132
__ load_field_entry(x12, x11);
31353133

3136-
// Must prevent reordering of the following cp cache loads with bytecode load
3137-
__ membar(MacroAssembler::LoadLoad);
3138-
31393134
__ load_sized_value(x11, Address(x12, in_bytes(ResolvedFieldEntry::field_offset_offset())), sizeof(int), true /*is_signed*/);
31403135
__ load_unsigned_byte(x13, Address(x12, in_bytes(ResolvedFieldEntry::flags_offset())));
31413136

src/hotspot/cpu/x86/templateTable_x86.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3495,7 +3495,7 @@ void TemplateTable::fast_storefield(TosState state) {
34953495
__ push(rax);
34963496
__ load_field_entry(rcx, rax);
34973497
load_resolved_field_entry(noreg, cache, rax, rbx, rdx);
3498-
// RBX: field offset, RCX: RAX: TOS, RDX: flags
3498+
// RBX: field offset, RAX: TOS, RDX: flags
34993499
__ andl(rdx, (1 << ResolvedFieldEntry::is_volatile_shift));
35003500
__ pop(rax);
35013501

0 commit comments

Comments
 (0)