3636#include " classfile/systemDictionary.hpp"
3737#include " classfile/systemDictionaryShared.hpp"
3838#include " code/codeCache.hpp"
39+ #include " interpreter/abstractInterpreter.hpp"
3940#include " interpreter/bytecodeStream.hpp"
4041#include " interpreter/bytecodes.hpp"
4142#include " logging/log.hpp"
6162#include " runtime/handles.inline.hpp"
6263#include " runtime/os.hpp"
6364#include " runtime/safepointVerifiers.hpp"
65+ #include " runtime/sharedRuntime.hpp"
6466#include " runtime/timerTrace.hpp"
6567#include " runtime/vmThread.hpp"
6668#include " runtime/vmOperations.hpp"
@@ -82,7 +84,6 @@ bool MetaspaceShared::_has_error_classes;
8284bool MetaspaceShared::_archive_loading_failed = false ;
8385bool MetaspaceShared::_remapped_readwrite = false ;
8486address MetaspaceShared::_i2i_entry_code_buffers = NULL ;
85- size_t MetaspaceShared::_i2i_entry_code_buffers_size = 0 ;
8687void * MetaspaceShared::_shared_metaspace_static_top = NULL ;
8788intx MetaspaceShared::_relocation_delta;
8889char * MetaspaceShared::_requested_base_address;
@@ -339,10 +340,6 @@ void MetaspaceShared::initialize_dumptime_shared_and_meta_spaces() {
339340 log_info (cds)(" Allocated shared space: " SIZE_FORMAT " bytes at " PTR_FORMAT,
340341 _shared_rs.size (), p2i (_shared_rs.base ()));
341342
342- // We don't want any valid object to be at the very bottom of the archive.
343- // See ArchivePtrMarker::mark_pointer().
344- MetaspaceShared::misc_code_space_alloc (16 );
345-
346343 size_t symbol_rs_size = LP64_ONLY (3 * G) NOT_LP64 (128 * M);
347344 _symbol_rs = ReservedSpace (symbol_rs_size);
348345 if (!_symbol_rs.is_reserved ()) {
@@ -510,19 +507,19 @@ void MetaspaceShared::serialize(SerializeClosure* soc) {
510507 soc->do_tag (666 );
511508}
512509
513- address MetaspaceShared::i2i_entry_code_buffers (size_t total_size) {
514- if (DumpSharedSpaces) {
515- if (_i2i_entry_code_buffers == NULL ) {
516- _i2i_entry_code_buffers = (address)misc_code_space_alloc (total_size);
517- _i2i_entry_code_buffers_size = total_size;
518- }
519- } else if (UseSharedSpaces) {
520- assert (_i2i_entry_code_buffers != NULL , " must already been initialized" );
521- } else {
522- return NULL ;
523- }
510+ void MetaspaceShared::init_misc_code_space () {
511+ // We don't want any valid object to be at the very bottom of the archive.
512+ // See ArchivePtrMarker::mark_pointer().
513+ MetaspaceShared::misc_code_space_alloc (16 );
524514
525- assert (_i2i_entry_code_buffers_size == total_size, " must not change" );
515+ size_t trampoline_size = SharedRuntime::trampoline_size ();
516+ size_t buf_size = (size_t )AbstractInterpreter::number_of_method_entries * trampoline_size;
517+ _i2i_entry_code_buffers = (address)misc_code_space_alloc (buf_size);
518+ }
519+
520+ address MetaspaceShared::i2i_entry_code_buffers () {
521+ assert (DumpSharedSpaces || UseSharedSpaces, " must be" );
522+ assert (_i2i_entry_code_buffers != NULL , " must already been initialized" );
526523 return _i2i_entry_code_buffers;
527524}
528525
@@ -733,6 +730,10 @@ void VM_PopulateDumpSharedSpace::doit() {
733730
734731 builder.gather_source_objs ();
735732
733+ MetaspaceShared::init_misc_code_space ();
734+ builder.allocate_method_trampoline_info ();
735+ builder.allocate_method_trampolines ();
736+
736737 char * cloned_vtables = CppVtables::dumptime_init ();
737738
738739 {
@@ -785,8 +786,6 @@ void VM_PopulateDumpSharedSpace::doit() {
785786 // The vtable clones contain addresses of the current process.
786787 // We don't want to write these addresses into the archive. Same for i2i buffer.
787788 CppVtables::zero_archived_vtables ();
788- memset (MetaspaceShared::i2i_entry_code_buffers (), 0 ,
789- MetaspaceShared::i2i_entry_code_buffers_size ());
790789
791790 // relocate the data so that it can be mapped to MetaspaceShared::requested_base_address()
792791 // without runtime relocation.
@@ -798,8 +797,7 @@ void VM_PopulateDumpSharedSpace::doit() {
798797 mapinfo->populate_header (os::vm_allocation_granularity ());
799798 mapinfo->set_serialized_data (serialized_data);
800799 mapinfo->set_cloned_vtables (cloned_vtables);
801- mapinfo->set_i2i_entry_code_buffers (MetaspaceShared::i2i_entry_code_buffers (),
802- MetaspaceShared::i2i_entry_code_buffers_size ());
800+ mapinfo->set_i2i_entry_code_buffers (MetaspaceShared::i2i_entry_code_buffers ());
803801 mapinfo->open_for_write ();
804802 size_t bitmap_size_in_bytes;
805803 char * bitmap = MetaspaceShared::write_core_archive_regions (mapinfo, _closed_archive_heap_oopmaps,
@@ -1720,7 +1718,6 @@ void MetaspaceShared::unmap_archive(FileMapInfo* mapinfo) {
17201718void MetaspaceShared::initialize_shared_spaces () {
17211719 FileMapInfo *static_mapinfo = FileMapInfo::current_info ();
17221720 _i2i_entry_code_buffers = static_mapinfo->i2i_entry_code_buffers ();
1723- _i2i_entry_code_buffers_size = static_mapinfo->i2i_entry_code_buffers_size ();
17241721
17251722 // Verify various attributes of the archive, plus initialize the
17261723 // shared string/symbol tables
0 commit comments