--- old/src/hotspot/share/memory/filemap.hpp 2019-10-03 11:39:42.177894899 -0700 +++ new/src/hotspot/share/memory/filemap.hpp 2019-10-03 11:39:41.837889647 -0700 @@ -26,6 +26,7 @@ #define SHARE_VM_MEMORY_FILEMAP_HPP #include "classfile/classLoader.hpp" +#include "include/cds.h" #include "memory/metaspaceShared.hpp" #include "memory/metaspace.hpp" #include "memory/universe.hpp" @@ -87,17 +88,86 @@ } }; +struct FileMapHeader : public CDSFileMapHeaderBase { + size_t _alignment; // how shared archive should be aligned + int _obj_alignment; // value of ObjectAlignmentInBytes + address _narrow_oop_base; // compressed oop encoding base + int _narrow_oop_shift; // compressed oop encoding shift + bool _compact_strings; // value of CompactStrings + uintx _max_heap_size; // java max heap size during dumping + Universe::NARROW_OOP_MODE _narrow_oop_mode; // compressed oop encoding mode + int _narrow_klass_shift; // save narrow klass base and shift + address _narrow_klass_base; + char* _misc_data_patching_start; + char* _read_only_tables_start; + address _cds_i2i_entry_code_buffers; + size_t _cds_i2i_entry_code_buffers_size; + size_t _core_spaces_size; // number of bytes allocated by the core spaces + // (mc, md, ro, rw and od). + + // The following fields are all sanity checks for whether this archive + // will function correctly with this JVM and the bootclasspath it's + // invoked with. + char _jvm_ident[JVM_IDENT_MAX]; // identifier for jvm + + // The _paths_misc_info is a variable-size structure that records "miscellaneous" + // information during dumping. It is generated and validated by the + // SharedPathsMiscInfo class. See SharedPathsMiscInfo.hpp for + // detailed description. + // + // The _paths_misc_info data is stored as a byte array in the archive file header, + // immediately after the _header field. This information is used only when + // checking the validity of the archive and is deallocated after the archive is loaded. + // + // Note that the _paths_misc_info does NOT include information for JAR files + // that existed during dump time. Their information is stored in _shared_path_table. + int _paths_misc_info_size; + + // The following is a table of all the class path entries that were used + // during dumping. At run time, we require these files to exist and have the same + // size/modification time, or else the archive will refuse to load. + // + // All of these entries must be JAR files. The dumping process would fail if a non-empty + // directory was specified in the classpaths. If an empty directory was specified + // it is checked by the _paths_misc_info as described above. + // + // FIXME -- if JAR files in the tail of the list were specified but not used during dumping, + // they should be removed from this table, to save space and to avoid spurious + // loading failures during runtime. + int _shared_path_table_size; + size_t _shared_path_entry_size; + Array* _shared_path_table; + + jshort _app_class_paths_start_index; // Index of first app classpath entry + jshort _app_module_paths_start_index; // Index of first module path entry + jshort _max_used_path_index; // max path index referenced during CDS dump + bool _verify_local; // BytecodeVerificationLocal setting + bool _verify_remote; // BytecodeVerificationRemote setting + bool _has_platform_or_app_classes; // Archive contains app classes + + void set_has_platform_or_app_classes(bool v) { + _has_platform_or_app_classes = v; + } + bool has_platform_or_app_classes() { return _has_platform_or_app_classes; } + jshort max_used_path_index() { return _max_used_path_index; } + jshort app_module_paths_start_index() { return _app_module_paths_start_index; } + + char* region_addr(int idx); + + bool validate(); + void populate(FileMapInfo* info, size_t alignment); + int compute_crc(); +}; + + class FileMapInfo : public CHeapObj { private: friend class ManifestStream; friend class VMStructs; - enum { - _invalid_version = -1, - _current_version = 3 - }; + friend struct FileMapHeader; - bool _file_open; - int _fd; + bool _file_open; + int _fd; size_t _file_offset; private: @@ -116,100 +186,7 @@ // methods, we would get sizeof(FileMapHeaderBase) == 1 with gcc. intx _dummy; }; - struct FileMapHeader : FileMapHeaderBase { - // Use data() and data_size() to memcopy to/from the FileMapHeader. We need to - // avoid read/writing the C++ vtable pointer. - static size_t data_size() { - return sizeof(FileMapHeader) - sizeof(FileMapInfo::FileMapHeaderBase); - } - char* data() { - return ((char*)this) + sizeof(FileMapHeaderBase); - } - - int _magic; // identify file type. - int _crc; // header crc checksum. - int _version; // (from enum, above.) - size_t _alignment; // how shared archive should be aligned - int _obj_alignment; // value of ObjectAlignmentInBytes - address _narrow_oop_base; // compressed oop encoding base - int _narrow_oop_shift; // compressed oop encoding shift - bool _compact_strings; // value of CompactStrings - uintx _max_heap_size; // java max heap size during dumping - Universe::NARROW_OOP_MODE _narrow_oop_mode; // compressed oop encoding mode - int _narrow_klass_shift; // save narrow klass base and shift - address _narrow_klass_base; - char* _misc_data_patching_start; - char* _read_only_tables_start; - address _cds_i2i_entry_code_buffers; - size_t _cds_i2i_entry_code_buffers_size; - size_t _core_spaces_size; // number of bytes allocated by the core spaces - // (mc, md, ro, rw and od). - struct space_info { - int _crc; // crc checksum of the current space - size_t _file_offset; // sizeof(this) rounded to vm page size - union { - char* _base; // copy-on-write base address - intx _offset; // offset from the compressed oop encoding base, only used - // by archive heap space - } _addr; - size_t _used; // for setting space top on read - bool _read_only; // read only space? - bool _allow_exec; // executable code in space? - } _space[MetaspaceShared::n_regions]; - - // The following fields are all sanity checks for whether this archive - // will function correctly with this JVM and the bootclasspath it's - // invoked with. - char _jvm_ident[JVM_IDENT_MAX]; // identifier for jvm - - // The _paths_misc_info is a variable-size structure that records "miscellaneous" - // information during dumping. It is generated and validated by the - // SharedPathsMiscInfo class. See SharedPathsMiscInfo.hpp for - // detailed description. - // - // The _paths_misc_info data is stored as a byte array in the archive file header, - // immediately after the _header field. This information is used only when - // checking the validity of the archive and is deallocated after the archive is loaded. - // - // Note that the _paths_misc_info does NOT include information for JAR files - // that existed during dump time. Their information is stored in _shared_path_table. - int _paths_misc_info_size; - - // The following is a table of all the class path entries that were used - // during dumping. At run time, we require these files to exist and have the same - // size/modification time, or else the archive will refuse to load. - // - // All of these entries must be JAR files. The dumping process would fail if a non-empty - // directory was specified in the classpaths. If an empty directory was specified - // it is checked by the _paths_misc_info as described above. - // - // FIXME -- if JAR files in the tail of the list were specified but not used during dumping, - // they should be removed from this table, to save space and to avoid spurious - // loading failures during runtime. - int _shared_path_table_size; - size_t _shared_path_entry_size; - Array* _shared_path_table; - - jshort _app_class_paths_start_index; // Index of first app classpath entry - jshort _app_module_paths_start_index; // Index of first module path entry - jshort _max_used_path_index; // max path index referenced during CDS dump - bool _verify_local; // BytecodeVerificationLocal setting - bool _verify_remote; // BytecodeVerificationRemote setting - bool _has_platform_or_app_classes; // Archive contains app classes - void set_has_platform_or_app_classes(bool v) { - _has_platform_or_app_classes = v; - } - bool has_platform_or_app_classes() { return _has_platform_or_app_classes; } - jshort max_used_path_index() { return _max_used_path_index; } - jshort app_module_paths_start_index() { return _app_module_paths_start_index; } - - char* region_addr(int idx); - - bool validate(); - void populate(FileMapInfo* info, size_t alignment); - int compute_crc(); - }; FileMapHeader * _header; @@ -227,7 +204,6 @@ FileMapInfo(); ~FileMapInfo(); - static int current_version() { return _current_version; } int compute_header_crc() { return _header->compute_crc(); } void set_header_crc(int crc) { _header->_crc = crc; } void populate_header(size_t alignment); @@ -278,8 +254,8 @@ bool read_only, bool allow_exec); size_t write_archive_heap_regions(GrowableArray *heap_mem, int first_region_id, int max_num_regions); - void write_bytes(const void* buffer, int count); - void write_bytes_aligned(const void* buffer, int count); + void write_bytes(const void* buffer, size_t count); + void write_bytes_aligned(const void* buffer, size_t count); char* map_region(int i, char** top_ret); void map_heap_regions() NOT_CDS_JAVA_HEAP_RETURN; void fixup_mapped_heap_regions() NOT_CDS_JAVA_HEAP_RETURN; @@ -332,6 +308,11 @@ bool is_open = false) NOT_CDS_JAVA_HEAP_RETURN_(false); bool verify_mapped_heap_regions(int first, int num) NOT_CDS_JAVA_HEAP_RETURN_(false); void dealloc_archive_heap_regions(MemRegion* regions, int num, bool is_open) NOT_CDS_JAVA_HEAP_RETURN; + + CDSFileMapRegion* space_at(int i) { + assert(i >= 0 && i < NUM_CDS_REGIONS, "invalid region"); + return &_header->_space[i]; + } }; #endif // SHARE_VM_MEMORY_FILEMAP_HPP