mirror of
https://github.com/openjdk/jdk.git
synced 2025-08-28 15:24:43 +02:00
8241158: SA TestHeapDumpForInvokeDynamic.java fails when CDS archive is relocated
Reviewed-by: ccheung
This commit is contained in:
parent
7b8c373494
commit
0bc7cc4d28
5 changed files with 70 additions and 14 deletions
|
@ -1283,7 +1283,8 @@ void java_lang_Class::update_archived_primitive_mirror_native_pointers(oop archi
|
|||
}
|
||||
|
||||
void java_lang_Class::update_archived_mirror_native_pointers(oop archived_mirror) {
|
||||
if (MetaspaceShared::relocation_delta() != 0) {
|
||||
assert(MetaspaceShared::relocation_delta() != 0, "must be");
|
||||
|
||||
Klass* k = ((Klass*)archived_mirror->metadata_field(_klass_offset));
|
||||
archived_mirror->metadata_field_put(_klass_offset,
|
||||
(Klass*)(address(k) + MetaspaceShared::relocation_delta()));
|
||||
|
@ -1294,7 +1295,6 @@ void java_lang_Class::update_archived_mirror_native_pointers(oop archived_mirror
|
|||
(Klass*)(address(ak) + MetaspaceShared::relocation_delta()));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Returns true if the mirror is updated, false if no archived mirror
|
||||
|
@ -1319,7 +1319,6 @@ bool java_lang_Class::restore_archived_mirror(Klass *k,
|
|||
// mirror is archived, restore
|
||||
log_debug(cds, mirror)("Archived mirror is: " PTR_FORMAT, p2i(m));
|
||||
assert(HeapShared::is_archived_object(m), "must be archived mirror object");
|
||||
update_archived_mirror_native_pointers(m);
|
||||
assert(as_Klass(m) == k, "must be");
|
||||
Handle mirror(THREAD, m);
|
||||
|
||||
|
|
|
@ -40,6 +40,7 @@
|
|||
#include "memory/allocation.hpp"
|
||||
#include "memory/archiveUtils.hpp"
|
||||
#include "memory/filemap.hpp"
|
||||
#include "memory/heapShared.hpp"
|
||||
#include "memory/metadataFactory.hpp"
|
||||
#include "memory/metaspaceClosure.hpp"
|
||||
#include "memory/oopFactory.hpp"
|
||||
|
@ -1541,3 +1542,52 @@ bool SystemDictionaryShared::empty_dumptime_table() {
|
|||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
#if INCLUDE_CDS_JAVA_HEAP
|
||||
|
||||
class ArchivedMirrorPatcher {
|
||||
static void update(Klass* k) {
|
||||
if (k->has_raw_archived_mirror()) {
|
||||
oop m = HeapShared::materialize_archived_object(k->archived_java_mirror_raw_narrow());
|
||||
if (m != NULL) {
|
||||
java_lang_Class::update_archived_mirror_native_pointers(m);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public:
|
||||
static void update_array_klasses(Klass* ak) {
|
||||
while (ak != NULL) {
|
||||
update(ak);
|
||||
ak = ArrayKlass::cast(ak)->higher_dimension();
|
||||
}
|
||||
}
|
||||
|
||||
void do_value(const RunTimeSharedClassInfo* info) {
|
||||
InstanceKlass* ik = info->_klass;
|
||||
update(ik);
|
||||
update_array_klasses(ik->array_klasses());
|
||||
}
|
||||
};
|
||||
|
||||
void SystemDictionaryShared::update_archived_mirror_native_pointers_for(RunTimeSharedDictionary* dict) {
|
||||
ArchivedMirrorPatcher patcher;
|
||||
dict->iterate(&patcher);
|
||||
}
|
||||
|
||||
void SystemDictionaryShared::update_archived_mirror_native_pointers() {
|
||||
if (!HeapShared::open_archive_heap_region_mapped()) {
|
||||
return;
|
||||
}
|
||||
if (MetaspaceShared::relocation_delta() == 0) {
|
||||
return;
|
||||
}
|
||||
update_archived_mirror_native_pointers_for(&_builtin_dictionary);
|
||||
update_archived_mirror_native_pointers_for(&_unregistered_dictionary);
|
||||
|
||||
for (int t = T_BOOLEAN; t <= T_LONG; t++) {
|
||||
Klass* k = Universe::typeArrayKlassObj((BasicType)t);
|
||||
ArchivedMirrorPatcher::update_array_klasses(k);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
|
|
@ -222,6 +222,7 @@ private:
|
|||
static bool should_be_excluded(InstanceKlass* k);
|
||||
|
||||
DEBUG_ONLY(static bool _no_class_loading_should_happen;)
|
||||
|
||||
public:
|
||||
static InstanceKlass* find_builtin_class(Symbol* class_name);
|
||||
|
||||
|
@ -326,6 +327,13 @@ public:
|
|||
address p = address(ptr) - SharedBaseAddress;
|
||||
return primitive_hash<address>(p);
|
||||
}
|
||||
|
||||
#if INCLUDE_CDS_JAVA_HEAP
|
||||
private:
|
||||
static void update_archived_mirror_native_pointers_for(RunTimeSharedDictionary* dict);
|
||||
public:
|
||||
static void update_archived_mirror_native_pointers() NOT_CDS_RETURN;
|
||||
#endif
|
||||
};
|
||||
|
||||
#endif // SHARE_CLASSFILE_SYSTEMDICTIONARYSHARED_HPP
|
||||
|
|
|
@ -97,6 +97,7 @@ void HeapShared::fixup_mapped_heap_regions() {
|
|||
FileMapInfo *mapinfo = FileMapInfo::current_info();
|
||||
mapinfo->fixup_mapped_heap_regions();
|
||||
set_archive_heap_region_fixed();
|
||||
SystemDictionaryShared::update_archived_mirror_native_pointers();
|
||||
}
|
||||
|
||||
unsigned HeapShared::oop_hash(oop const& p) {
|
||||
|
|
|
@ -101,11 +101,9 @@ runtime/CompactStrings/TestMethodNames.java 8242921 generic-all
|
|||
|
||||
# :hotspot_serviceability
|
||||
|
||||
serviceability/sa/ClhsdbDumpheap.java 8241158 macosx-x64
|
||||
serviceability/sa/ClhsdbScanOops.java#id0 8241158 macosx-x64
|
||||
serviceability/sa/ClhsdbScanOops.java#id1 8241158 macosx-x64
|
||||
serviceability/sa/ClhsdbScanOops.java#id0 8243210 macosx-x64
|
||||
serviceability/sa/ClhsdbScanOops.java#id1 8243210 macosx-x64
|
||||
serviceability/sa/sadebugd/DebugdConnectTest.java 8239062 macosx-x64
|
||||
serviceability/sa/TestHeapDumpForInvokeDynamic.java 8241158 macosx-x64
|
||||
serviceability/sa/TestInstanceKlassSize.java 8230664 linux-ppc64le,linux-ppc64
|
||||
serviceability/sa/TestInstanceKlassSizeForInterface.java 8230664 linux-ppc64le,linux-ppc64
|
||||
serviceability/sa/TestRevPtrsForInvokeDynamic.java 8241235 generic-all
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue