Skip to content

Commit 187710e

Browse files
author
Tom Rodriguez
committed
8333300: [JVMCI] add support for generational ZGC
Reviewed-by: dnsimon, kvn, eosterlund
1 parent de8ee97 commit 187710e

16 files changed

+235
-51
lines changed

src/hotspot/cpu/aarch64/jvmciCodeInstaller_aarch64.cpp

Lines changed: 24 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,9 @@
3434
#include "runtime/jniHandles.hpp"
3535
#include "runtime/sharedRuntime.hpp"
3636
#include "vmreg_aarch64.inline.hpp"
37+
#if INCLUDE_ZGC
38+
#include "gc/z/zBarrierSetAssembler.hpp"
39+
#endif
3740

3841
jint CodeInstaller::pd_next_offset(NativeInstruction* inst, jint pc_offset, JVMCI_TRAPS) {
3942
if (inst->is_call() || inst->is_jump() || inst->is_blr()) {
@@ -164,24 +167,35 @@ void CodeInstaller::pd_relocate_JavaMethod(CodeBuffer &cbuf, methodHandle& metho
164167
}
165168
}
166169

167-
void CodeInstaller::pd_relocate_poll(address pc, jint mark, JVMCI_TRAPS) {
170+
bool CodeInstaller::pd_relocate(address pc, jint mark) {
168171
switch (mark) {
169172
case POLL_NEAR:
170-
JVMCI_ERROR("unimplemented");
171-
break;
173+
// This is unhandled and will be reported by the caller
174+
return false;
172175
case POLL_FAR:
173176
_instructions->relocate(pc, relocInfo::poll_type);
174-
break;
177+
return true;
175178
case POLL_RETURN_NEAR:
176-
JVMCI_ERROR("unimplemented");
177-
break;
179+
// This is unhandled and will be reported by the caller
180+
return false;
178181
case POLL_RETURN_FAR:
179182
_instructions->relocate(pc, relocInfo::poll_return_type);
180-
break;
181-
default:
182-
JVMCI_ERROR("invalid mark value");
183-
break;
183+
return true;
184+
case Z_BARRIER_RELOCATION_FORMAT_LOAD_GOOD_BEFORE_TB_X:
185+
_instructions->relocate(pc, barrier_Relocation::spec(), ZBarrierRelocationFormatLoadGoodBeforeTbX);
186+
return true;
187+
case Z_BARRIER_RELOCATION_FORMAT_MARK_BAD_BEFORE_MOV:
188+
_instructions->relocate(pc, barrier_Relocation::spec(), ZBarrierRelocationFormatMarkBadBeforeMov);
189+
return true;
190+
case Z_BARRIER_RELOCATION_FORMAT_STORE_GOOD_BEFORE_MOV:
191+
_instructions->relocate(pc, barrier_Relocation::spec(), ZBarrierRelocationFormatStoreGoodBeforeMov);
192+
return true;
193+
case Z_BARRIER_RELOCATION_FORMAT_STORE_BAD_BEFORE_MOV:
194+
_instructions->relocate(pc, barrier_Relocation::spec(), ZBarrierRelocationFormatStoreBadBeforeMov);
195+
return true;
196+
184197
}
198+
return false;
185199
}
186200

187201
// convert JVMCI register indices (as used in oop maps) to HotSpot registers

src/hotspot/cpu/riscv/jvmciCodeInstaller_riscv.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,8 +105,9 @@ void CodeInstaller::pd_relocate_JavaMethod(CodeBuffer &cbuf, methodHandle& metho
105105
Unimplemented();
106106
}
107107

108-
void CodeInstaller::pd_relocate_poll(address pc, jint mark, JVMCI_TRAPS) {
108+
bool CodeInstaller::pd_relocate(address pc, jint mark) {
109109
Unimplemented();
110+
return false;
110111
}
111112

112113
// convert JVMCI register indices (as used in oop maps) to HotSpot registers

src/hotspot/cpu/x86/jvmciCodeInstaller_x86.cpp

Lines changed: 28 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,9 @@
3939
#include "classfile/vmSymbols.hpp"
4040
#include "code/vmreg.hpp"
4141
#include "vmreg_x86.inline.hpp"
42+
#if INCLUDE_ZGC
43+
#include "gc/z/zBarrierSetAssembler.hpp"
44+
#endif
4245

4346
jint CodeInstaller::pd_next_offset(NativeInstruction* inst, jint pc_offset, JVMCI_TRAPS) {
4447
if (inst->is_call() || inst->is_jump()) {
@@ -197,7 +200,7 @@ void CodeInstaller::pd_relocate_JavaMethod(CodeBuffer &, methodHandle& method, j
197200
}
198201
}
199202

200-
void CodeInstaller::pd_relocate_poll(address pc, jint mark, JVMCI_TRAPS) {
203+
bool CodeInstaller::pd_relocate(address pc, jint mark) {
201204
switch (mark) {
202205
case POLL_NEAR:
203206
case POLL_FAR:
@@ -206,15 +209,35 @@ void CodeInstaller::pd_relocate_poll(address pc, jint mark, JVMCI_TRAPS) {
206209
// so that poll_Relocation::fix_relocation_after_move does the right
207210
// thing (i.e. ignores this relocation record)
208211
_instructions->relocate(pc, relocInfo::poll_type, Assembler::imm_operand);
209-
break;
212+
return true;
210213
case POLL_RETURN_NEAR:
211214
case POLL_RETURN_FAR:
212215
// see comment above for POLL_FAR
213216
_instructions->relocate(pc, relocInfo::poll_return_type, Assembler::imm_operand);
214-
break;
217+
return true;
218+
case Z_BARRIER_RELOCATION_FORMAT_LOAD_GOOD_BEFORE_SHL:
219+
_instructions->relocate(pc, barrier_Relocation::spec(), ZBarrierRelocationFormatLoadGoodBeforeShl);
220+
return true;
221+
case Z_BARRIER_RELOCATION_FORMAT_LOAD_BAD_AFTER_TEST:
222+
_instructions->relocate(pc, barrier_Relocation::spec(), ZBarrierRelocationFormatLoadBadAfterTest);
223+
return true;
224+
case Z_BARRIER_RELOCATION_FORMAT_MARK_BAD_AFTER_TEST:
225+
_instructions->relocate(pc, barrier_Relocation::spec(), ZBarrierRelocationFormatMarkBadAfterTest);
226+
return true;
227+
case Z_BARRIER_RELOCATION_FORMAT_STORE_GOOD_AFTER_CMP:
228+
_instructions->relocate(pc, barrier_Relocation::spec(), ZBarrierRelocationFormatStoreGoodAfterCmp);
229+
return true;
230+
case Z_BARRIER_RELOCATION_FORMAT_STORE_BAD_AFTER_TEST:
231+
_instructions->relocate(pc, barrier_Relocation::spec(), ZBarrierRelocationFormatStoreBadAfterTest);
232+
return true;
233+
case Z_BARRIER_RELOCATION_FORMAT_STORE_GOOD_AFTER_OR:
234+
_instructions->relocate(pc, barrier_Relocation::spec(), ZBarrierRelocationFormatStoreGoodAfterOr);
235+
return true;
236+
case Z_BARRIER_RELOCATION_FORMAT_STORE_GOOD_AFTER_MOV:
237+
_instructions->relocate(pc, barrier_Relocation::spec(), ZBarrierRelocationFormatStoreGoodAfterMov);
238+
return true;
215239
default:
216-
JVMCI_ERROR("invalid mark value: %d", mark);
217-
break;
240+
return false;
218241
}
219242
}
220243

src/hotspot/share/code/nmethod.cpp

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3638,10 +3638,22 @@ const char* nmethod::reloc_string_for(u_char* begin, u_char* end) {
36383638
case relocInfo::poll_type: return "poll";
36393639
case relocInfo::poll_return_type: return "poll_return";
36403640
case relocInfo::trampoline_stub_type: return "trampoline_stub";
3641+
case relocInfo::entry_guard_type: return "entry_guard";
3642+
case relocInfo::post_call_nop_type: return "post_call_nop";
3643+
case relocInfo::barrier_type: {
3644+
barrier_Relocation* const reloc = iter.barrier_reloc();
3645+
stringStream st;
3646+
st.print("barrier format=%d", reloc->format());
3647+
return st.as_string();
3648+
}
3649+
36413650
case relocInfo::type_mask: return "type_bit_mask";
36423651

3643-
default:
3644-
break;
3652+
default: {
3653+
stringStream st;
3654+
st.print("unknown relocInfo=%d", (int) iter.type());
3655+
return st.as_string();
3656+
}
36453657
}
36463658
}
36473659
return have_one ? "other" : nullptr;

src/hotspot/share/gc/z/zBarrier.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,8 @@ class ZBarrier : public AllStatic {
151151
static zaddress load_barrier_on_oop_field(volatile zpointer* p);
152152
static zaddress load_barrier_on_oop_field_preloaded(volatile zpointer* p, zpointer o);
153153

154+
static void load_barrier_on_oop_array(volatile zpointer* p, size_t length);
155+
154156
static zaddress keep_alive_load_barrier_on_oop_field_preloaded(volatile zpointer* p, zpointer o);
155157

156158
// Load barriers on non-strong oop refs

src/hotspot/share/gc/z/zBarrier.inline.hpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -475,6 +475,12 @@ inline zaddress ZBarrier::keep_alive_load_barrier_on_oop_field_preloaded(volatil
475475
return barrier(is_mark_good_fast_path, keep_alive_slow_path, color_mark_good, p, o);
476476
}
477477

478+
inline void ZBarrier::load_barrier_on_oop_array(volatile zpointer* p, size_t length) {
479+
for (volatile const zpointer* const end = p + length; p < end; p++) {
480+
load_barrier_on_oop_field(p);
481+
}
482+
}
483+
478484
//
479485
// Load barrier on non-strong oop refs
480486
//

src/hotspot/share/gc/z/zBarrierSetRuntime.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,10 @@ JRT_LEAF(void, ZBarrierSetRuntime::store_barrier_on_native_oop_field_without_hea
6363
ZBarrier::store_barrier_on_native_oop_field((zpointer*)p, false /* heal */);
6464
JRT_END
6565

66+
JRT_LEAF(void, ZBarrierSetRuntime::load_barrier_on_oop_array(oop* p, size_t length))
67+
ZBarrier::load_barrier_on_oop_array((zpointer*)p, length);
68+
JRT_END
69+
6670
JRT_LEAF(void, ZBarrierSetRuntime::clone(oopDesc* src, oopDesc* dst, size_t size))
6771
HeapAccess<>::clone(src, dst, size);
6872
JRT_END
@@ -126,6 +130,10 @@ address ZBarrierSetRuntime::store_barrier_on_native_oop_field_without_healing_ad
126130
return reinterpret_cast<address>(store_barrier_on_native_oop_field_without_healing);
127131
}
128132

133+
address ZBarrierSetRuntime::load_barrier_on_oop_array_addr() {
134+
return reinterpret_cast<address>(load_barrier_on_oop_array);
135+
}
136+
129137
address ZBarrierSetRuntime::clone_addr() {
130138
return reinterpret_cast<address>(clone);
131139
}

src/hotspot/share/gc/z/zBarrierSetRuntime.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ class ZBarrierSetRuntime : public AllStatic {
4141
static void store_barrier_on_oop_field_with_healing(oop* p);
4242
static void store_barrier_on_oop_field_without_healing(oop* p);
4343
static void store_barrier_on_native_oop_field_without_healing(oop* p);
44+
static void load_barrier_on_oop_array(oop* p, size_t length);
4445
static void clone(oopDesc* src, oopDesc* dst, size_t size);
4546

4647
public:
@@ -54,6 +55,7 @@ class ZBarrierSetRuntime : public AllStatic {
5455
static address store_barrier_on_oop_field_with_healing_addr();
5556
static address store_barrier_on_oop_field_without_healing_addr();
5657
static address store_barrier_on_native_oop_field_without_healing_addr();
58+
static address load_barrier_on_oop_array_addr();
5759
static address clone_addr();
5860
};
5961

src/hotspot/share/jvmci/jvmciCodeInstaller.cpp

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1297,6 +1297,10 @@ void CodeInstaller::site_Mark(CodeBuffer& buffer, jint pc_offset, HotSpotCompile
12971297
u1 id = stream->read_u1("mark:id");
12981298
address pc = _instructions->start() + pc_offset;
12991299

1300+
if (pd_relocate(pc, id)) {
1301+
return;
1302+
}
1303+
13001304
switch (id) {
13011305
case UNVERIFIED_ENTRY:
13021306
_offsets.set_value(CodeOffsets::Entry, pc_offset);
@@ -1330,12 +1334,6 @@ void CodeInstaller::site_Mark(CodeBuffer& buffer, jint pc_offset, HotSpotCompile
13301334
_next_call_type = (MarkId) id;
13311335
_invoke_mark_pc = pc;
13321336
break;
1333-
case POLL_NEAR:
1334-
case POLL_FAR:
1335-
case POLL_RETURN_NEAR:
1336-
case POLL_RETURN_FAR:
1337-
pd_relocate_poll(pc, id, JVMCI_CHECK);
1338-
break;
13391337
case CARD_TABLE_SHIFT:
13401338
case CARD_TABLE_ADDRESS:
13411339
case HEAP_TOP_ADDRESS:
@@ -1350,6 +1348,7 @@ void CodeInstaller::site_Mark(CodeBuffer& buffer, jint pc_offset, HotSpotCompile
13501348
case VERIFY_OOP_MASK:
13511349
case VERIFY_OOP_COUNT_ADDRESS:
13521350
break;
1351+
13531352
default:
13541353
JVMCI_ERROR("invalid mark id: %d%s", id, stream->context());
13551354
break;

src/hotspot/share/jvmci/jvmciCodeInstaller.hpp

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,23 @@ class CodeInstaller : public StackObj {
176176
VERIFY_OOP_BITS,
177177
VERIFY_OOP_MASK,
178178
VERIFY_OOP_COUNT_ADDRESS,
179+
180+
#ifdef X86
181+
Z_BARRIER_RELOCATION_FORMAT_LOAD_GOOD_BEFORE_SHL,
182+
Z_BARRIER_RELOCATION_FORMAT_LOAD_BAD_AFTER_TEST,
183+
Z_BARRIER_RELOCATION_FORMAT_MARK_BAD_AFTER_TEST,
184+
Z_BARRIER_RELOCATION_FORMAT_STORE_GOOD_AFTER_CMP,
185+
Z_BARRIER_RELOCATION_FORMAT_STORE_BAD_AFTER_TEST,
186+
Z_BARRIER_RELOCATION_FORMAT_STORE_GOOD_AFTER_OR,
187+
Z_BARRIER_RELOCATION_FORMAT_STORE_GOOD_AFTER_MOV,
188+
#endif
189+
#ifdef AARCH64
190+
Z_BARRIER_RELOCATION_FORMAT_LOAD_GOOD_BEFORE_TB_X,
191+
Z_BARRIER_RELOCATION_FORMAT_MARK_BAD_BEFORE_MOV,
192+
Z_BARRIER_RELOCATION_FORMAT_STORE_GOOD_BEFORE_MOV,
193+
Z_BARRIER_RELOCATION_FORMAT_STORE_BAD_BEFORE_MOV,
194+
#endif
195+
179196
INVOKE_INVALID = -1
180197
};
181198

@@ -312,7 +329,7 @@ class CodeInstaller : public StackObj {
312329
void pd_patch_DataSectionReference(int pc_offset, int data_offset, JVMCI_TRAPS);
313330
void pd_relocate_ForeignCall(NativeInstruction* inst, jlong foreign_call_destination, JVMCI_TRAPS);
314331
void pd_relocate_JavaMethod(CodeBuffer &cbuf, methodHandle& method, jint pc_offset, JVMCI_TRAPS);
315-
void pd_relocate_poll(address pc, jint mark, JVMCI_TRAPS);
332+
bool pd_relocate(address pc, jint mark);
316333

317334
public:
318335

0 commit comments

Comments
 (0)