8365558: Fix stub entry init and blob creation on Zero

Reviewed-by: asmehra, kvn
This commit is contained in:
Andrew Dinn 2025-08-15 22:12:57 +00:00
parent b69a3849b2
commit b023fea062
4 changed files with 42 additions and 20 deletions

View File

@ -56,10 +56,10 @@ void SharedRuntime::generate_i2c2i_adapters(MacroAssembler *masm,
const BasicType *sig_bt,
const VMRegPair *regs,
AdapterHandlerEntry* handler) {
// VM expects i2c entry to be always filled. The rest can be unset.
// foil any attempt to call the i2c, c2i or unverified c2i entries
handler->set_entry_points(CAST_FROM_FN_PTR(address,zero_null_code_stub),
nullptr,
nullptr,
CAST_FROM_FN_PTR(address,zero_null_code_stub),
CAST_FROM_FN_PTR(address,zero_null_code_stub),
nullptr);
}

View File

@ -37,7 +37,7 @@
do_arch_blob, \
do_arch_entry, \
do_arch_entry_init) \
do_arch_blob(initial, 32) \
do_arch_blob(initial, 0) \
#define STUBGEN_CONTINUATION_BLOBS_ARCH_DO(do_stub, \
@ -58,7 +58,7 @@
do_arch_blob, \
do_arch_entry, \
do_arch_entry_init) \
do_arch_blob(final, 32) \
do_arch_blob(final, 0) \
#endif // CPU_ZERO_STUBDECLARATIONS_HPP

View File

@ -2602,19 +2602,24 @@ void AdapterHandlerLibrary::initialize() {
BasicType obj_obj_args[] = { T_OBJECT, T_OBJECT };
_obj_obj_arg_handler = create_adapter(obj_obj_arg_blob, 2, obj_obj_args);
assert(no_arg_blob != nullptr &&
obj_arg_blob != nullptr &&
int_arg_blob != nullptr &&
obj_int_arg_blob != nullptr &&
obj_obj_arg_blob != nullptr, "Initial adapters must be properly created");
// we should always get an entry back but we don't have any
// associated blob on Zero
assert(_no_arg_handler != nullptr &&
_obj_arg_handler != nullptr &&
_int_arg_handler != nullptr &&
_obj_int_arg_handler != nullptr &&
_obj_obj_arg_handler != nullptr, "Initial adapter handlers must be properly created");
}
// Outside of the lock
#ifndef ZERO
// no blobs to register when we are on Zero
post_adapter_creation(no_arg_blob, _no_arg_handler);
post_adapter_creation(obj_arg_blob, _obj_arg_handler);
post_adapter_creation(int_arg_blob, _int_arg_handler);
post_adapter_creation(obj_int_arg_blob, _obj_int_arg_handler);
post_adapter_creation(obj_obj_arg_blob, _obj_obj_arg_handler);
#endif // ZERO
}
AdapterHandlerEntry* AdapterHandlerLibrary::new_entry(AdapterFingerPrint* fingerprint) {
@ -2709,12 +2714,15 @@ const char* AdapterHandlerEntry::_entry_names[] = {
#ifdef ASSERT
void AdapterHandlerLibrary::verify_adapter_sharing(int total_args_passed, BasicType* sig_bt, AdapterHandlerEntry* cached_entry) {
// we can only check for the same code if there is any
#ifndef ZERO
AdapterBlob* comparison_blob = nullptr;
AdapterHandlerEntry* comparison_entry = create_adapter(comparison_blob, total_args_passed, sig_bt, true);
assert(comparison_blob == nullptr, "no blob should be created when creating an adapter for comparison");
assert(comparison_entry->compare_code(cached_entry), "code must match");
// Release the one just created
AdapterHandlerEntry::deallocate(comparison_entry);
# endif // ZERO
}
#endif /* ASSERT*/
@ -2792,8 +2800,13 @@ AdapterBlob* AdapterHandlerLibrary::lookup_aot_cache(AdapterHandlerEntry* handle
void AdapterHandlerLibrary::print_adapter_handler_info(outputStream* st, AdapterHandlerEntry* handler, AdapterBlob* adapter_blob) {
ttyLocker ttyl;
ResourceMark rm;
int insts_size = adapter_blob->code_size();
int insts_size;
// on Zero the blob may be null
handler->print_adapter_on(tty);
if (adapter_blob == nullptr) {
return;
}
insts_size = adapter_blob->code_size();
st->print_cr("i2c argument handler for: %s %s (%d bytes generated)",
handler->fingerprint()->as_basic_args_string(),
handler->fingerprint()->as_string(), insts_size);
@ -2834,6 +2847,11 @@ bool AdapterHandlerLibrary::generate_adapter_code(AdapterBlob*& adapter_blob,
sig_bt,
regs,
handler);
#ifdef ZERO
// On zero there is no code to save and no need to create a blob and
// or relocate the handler.
adapter_blob = nullptr;
#else
#ifdef ASSERT
if (VerifyAdapterSharing) {
handler->save_code(buf->code_begin(), buffer.insts_size());
@ -2869,12 +2887,15 @@ bool AdapterHandlerLibrary::generate_adapter_code(AdapterBlob*& adapter_blob,
assert(success || !AOTCodeCache::is_dumping_adapter(), "caching of adapter must be disabled");
}
handler->relocate(adapter_blob->content_begin());
#endif // ZERO
#ifndef PRODUCT
// debugging support
if (PrintAdapterHandlers || PrintStubCode) {
print_adapter_handler_info(tty, handler, adapter_blob);
}
#endif
return true;
}

View File

@ -168,14 +168,6 @@ static BufferBlob* initialize_stubs(BlobId blob_id,
const char* assert_msg) {
assert(StubInfo::is_stubgen(blob_id), "not a stubgen blob %s", StubInfo::name(blob_id));
ResourceMark rm;
if (code_size == 0) {
LogTarget(Info, stubs) lt;
if (lt.is_enabled()) {
LogStream ls(lt);
ls.print_cr("%s\t not generated", buffer_name);
}
return nullptr;
}
TraceTime timer(timer_msg, TRACETIME_LOG(Info, startuptime));
// Add extra space for large CodeEntryAlignment
int size = code_size + CodeEntryAlignment * max_aligned_stubs;
@ -196,9 +188,18 @@ static BufferBlob* initialize_stubs(BlobId blob_id,
}
CodeBuffer buffer(stubs_code);
StubGenerator_generate(&buffer, blob_id);
if (code_size == 0) {
assert(buffer.insts_size() == 0, "should not write into buffer when bob size declared as 0");
LogTarget(Info, stubs) lt;
if (lt.is_enabled()) {
LogStream ls(lt);
ls.print_cr("%s\t not generated", buffer_name);
}
return nullptr;
}
// When new stubs added we need to make sure there is some space left
// to catch situation when we should increase size again.
assert(code_size == 0 || buffer.insts_remaining() > 200,
assert(buffer.insts_remaining() > 200,
"increase %s, code_size: %d, used: %d, free: %d",
assert_msg, code_size, buffer.total_content_size(), buffer.insts_remaining());