Skip to content

Commit 9c266ae

Browse files
committed
8365229: ARM32: c2i_no_clinit_check_entry assert failed after JDK-8364269
Reviewed-by: kvn, adinn, bulasevich, phh
1 parent 9660320 commit 9c266ae

File tree

3 files changed

+19
-9
lines changed

3 files changed

+19
-9
lines changed

src/hotspot/cpu/zero/sharedRuntime_zero.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -56,11 +56,11 @@ void SharedRuntime::generate_i2c2i_adapters(MacroAssembler *masm,
5656
const BasicType *sig_bt,
5757
const VMRegPair *regs,
5858
AdapterHandlerEntry* handler) {
59+
// VM expects i2c entry to be always filled. The rest can be unset.
5960
handler->set_entry_points(CAST_FROM_FN_PTR(address,zero_null_code_stub),
60-
CAST_FROM_FN_PTR(address,zero_null_code_stub),
61-
CAST_FROM_FN_PTR(address,zero_null_code_stub),
61+
nullptr,
62+
nullptr,
6263
nullptr);
63-
return;
6464
}
6565

6666
nmethod *SharedRuntime::generate_native_wrapper(MacroAssembler *masm,

src/hotspot/share/code/codeBlob.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -450,8 +450,10 @@ AdapterBlob::AdapterBlob(int size, CodeBuffer* cb, int entry_offset[AdapterBlob:
450450
BufferBlob("I2C/C2I adapters", CodeBlobKind::Adapter, cb, size, sizeof(AdapterBlob)) {
451451
assert(entry_offset[0] == 0, "sanity check");
452452
for (int i = 1; i < AdapterBlob::ENTRY_COUNT; i++) {
453-
assert(entry_offset[i] > 0 && entry_offset[i] < cb->insts()->size(),
454-
"invalid entry offset 0x%x", entry_offset[i]);
453+
// The entry is within the adapter blob or unset.
454+
assert((entry_offset[i] > 0 && entry_offset[i] < cb->insts()->size()) ||
455+
(entry_offset[i] == -1),
456+
"invalid entry offset[%d] = 0x%x", i, entry_offset[i]);
455457
}
456458
_c2i_offset = entry_offset[1];
457459
_c2i_unverified_offset = entry_offset[2];

src/hotspot/share/runtime/sharedRuntime.cpp

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2778,7 +2778,12 @@ AdapterBlob* AdapterHandlerLibrary::lookup_aot_cache(AdapterHandlerEntry* handle
27782778
adapter_blob->get_offsets(offsets);
27792779
address i2c_entry = adapter_blob->content_begin();
27802780
assert(offsets[0] == 0, "sanity check");
2781-
handler->set_entry_points(i2c_entry, i2c_entry + offsets[1], i2c_entry + offsets[2], i2c_entry + offsets[3]);
2781+
handler->set_entry_points(
2782+
i2c_entry,
2783+
(offsets[1] != -1) ? (i2c_entry + offsets[1]) : nullptr,
2784+
(offsets[2] != -1) ? (i2c_entry + offsets[2]) : nullptr,
2785+
(offsets[3] != -1) ? (i2c_entry + offsets[3]) : nullptr
2786+
);
27822787
}
27832788
return adapter_blob;
27842789
}
@@ -2842,9 +2847,12 @@ bool AdapterHandlerLibrary::generate_adapter_code(AdapterBlob*& adapter_blob,
28422847
assert(AdapterBlob::ENTRY_COUNT == 4, "sanity");
28432848
address i2c_entry = handler->get_i2c_entry();
28442849
entry_offset[0] = 0; // i2c_entry offset
2845-
entry_offset[1] = handler->get_c2i_entry() - i2c_entry;
2846-
entry_offset[2] = handler->get_c2i_unverified_entry() - i2c_entry;
2847-
entry_offset[3] = handler->get_c2i_no_clinit_check_entry() - i2c_entry;
2850+
entry_offset[1] = (handler->get_c2i_entry() != nullptr) ?
2851+
(handler->get_c2i_entry() - i2c_entry) : -1;
2852+
entry_offset[2] = (handler->get_c2i_unverified_entry() != nullptr) ?
2853+
(handler->get_c2i_unverified_entry() - i2c_entry) : -1;
2854+
entry_offset[3] = (handler->get_c2i_no_clinit_check_entry() != nullptr) ?
2855+
(handler->get_c2i_no_clinit_check_entry() - i2c_entry) : -1;
28482856

28492857
adapter_blob = AdapterBlob::create(&buffer, entry_offset);
28502858
if (adapter_blob == nullptr) {

0 commit comments

Comments
 (0)