mirror of
https://github.com/openjdk/jdk.git
synced 2026-01-28 12:09:14 +00:00
8365558: Fix stub entry init and blob creation on Zero
Reviewed-by: asmehra, kvn
This commit is contained in:
parent
b69a3849b2
commit
b023fea062
@ -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);
|
||||
}
|
||||
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
|
||||
@ -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());
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user