< prev index next > src/hotspot/share/runtime/stubRoutines.cpp
Print this page
}
#endif // ASSERT
// Initialization
- //
- // Note: to break cycle with universe initialization, stubs are generated in two phases.
- // The first one generates stubs needed during universe init (e.g., _handle_must_compile_first_entry).
- // The second phase includes all other stubs (which may depend on universe being initialized.)
extern void StubGenerator_generate(CodeBuffer* code, StubGenBlobId blob_id); // only interface to generators
void UnsafeMemoryAccess::create_table(int max_size) {
UnsafeMemoryAccess::_table = new UnsafeMemoryAccess[max_size];
UnsafeMemoryAccess::_table_max_length = max_size;
}
bool UnsafeMemoryAccess::contains_pc(address pc) {
+ assert(UnsafeMemoryAccess::_table != nullptr, "");
for (int i = 0; i < UnsafeMemoryAccess::_table_length; i++) {
UnsafeMemoryAccess* entry = &UnsafeMemoryAccess::_table[i];
if (pc >= entry->start_pc() && pc < entry->end_pc()) {
return true;
}
}
return false;
}
address UnsafeMemoryAccess::page_error_continue_pc(address pc) {
+ assert(UnsafeMemoryAccess::_table != nullptr, "");
for (int i = 0; i < UnsafeMemoryAccess::_table_length; i++) {
UnsafeMemoryAccess* entry = &UnsafeMemoryAccess::_table[i];
if (pc >= entry->start_pc() && pc < entry->end_pc()) {
return entry->error_exit_pc();
}
int code_size, int max_aligned_stubs,
const char* timer_msg,
const char* buffer_name,
const char* assert_msg) {
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;
BufferBlob* stubs_code = BufferBlob::create(buffer_name, size);
if (stubs_code == nullptr) {
< prev index next >