8241158: SA TestHeapDumpForInvokeDynamic.java fails when CDS archive is relocated

Reviewed-by: ccheung
This commit is contained in:
Ioi Lam 2020-04-20 17:33:52 -07:00
parent 7b8c373494
commit 0bc7cc4d28
5 changed files with 70 additions and 14 deletions

View file

@ -1283,16 +1283,16 @@ void java_lang_Class::update_archived_primitive_mirror_native_pointers(oop archi
} }
void java_lang_Class::update_archived_mirror_native_pointers(oop archived_mirror) { 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()));
Klass* ak = ((Klass*)archived_mirror->metadata_field(_array_klass_offset)); Klass* k = ((Klass*)archived_mirror->metadata_field(_klass_offset));
if (ak != NULL) { archived_mirror->metadata_field_put(_klass_offset,
archived_mirror->metadata_field_put(_array_klass_offset, (Klass*)(address(k) + MetaspaceShared::relocation_delta()));
(Klass*)(address(ak) + MetaspaceShared::relocation_delta()));
} Klass* ak = ((Klass*)archived_mirror->metadata_field(_array_klass_offset));
if (ak != NULL) {
archived_mirror->metadata_field_put(_array_klass_offset,
(Klass*)(address(ak) + MetaspaceShared::relocation_delta()));
} }
} }
@ -1319,7 +1319,6 @@ bool java_lang_Class::restore_archived_mirror(Klass *k,
// mirror is archived, restore // mirror is archived, restore
log_debug(cds, mirror)("Archived mirror is: " PTR_FORMAT, p2i(m)); log_debug(cds, mirror)("Archived mirror is: " PTR_FORMAT, p2i(m));
assert(HeapShared::is_archived_object(m), "must be archived mirror object"); assert(HeapShared::is_archived_object(m), "must be archived mirror object");
update_archived_mirror_native_pointers(m);
assert(as_Klass(m) == k, "must be"); assert(as_Klass(m) == k, "must be");
Handle mirror(THREAD, m); Handle mirror(THREAD, m);

View file

@ -40,6 +40,7 @@
#include "memory/allocation.hpp" #include "memory/allocation.hpp"
#include "memory/archiveUtils.hpp" #include "memory/archiveUtils.hpp"
#include "memory/filemap.hpp" #include "memory/filemap.hpp"
#include "memory/heapShared.hpp"
#include "memory/metadataFactory.hpp" #include "memory/metadataFactory.hpp"
#include "memory/metaspaceClosure.hpp" #include "memory/metaspaceClosure.hpp"
#include "memory/oopFactory.hpp" #include "memory/oopFactory.hpp"
@ -1541,3 +1542,52 @@ bool SystemDictionaryShared::empty_dumptime_table() {
} }
return false; 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

View file

@ -222,6 +222,7 @@ private:
static bool should_be_excluded(InstanceKlass* k); static bool should_be_excluded(InstanceKlass* k);
DEBUG_ONLY(static bool _no_class_loading_should_happen;) DEBUG_ONLY(static bool _no_class_loading_should_happen;)
public: public:
static InstanceKlass* find_builtin_class(Symbol* class_name); static InstanceKlass* find_builtin_class(Symbol* class_name);
@ -326,6 +327,13 @@ public:
address p = address(ptr) - SharedBaseAddress; address p = address(ptr) - SharedBaseAddress;
return primitive_hash<address>(p); 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 #endif // SHARE_CLASSFILE_SYSTEMDICTIONARYSHARED_HPP

View file

@ -97,6 +97,7 @@ void HeapShared::fixup_mapped_heap_regions() {
FileMapInfo *mapinfo = FileMapInfo::current_info(); FileMapInfo *mapinfo = FileMapInfo::current_info();
mapinfo->fixup_mapped_heap_regions(); mapinfo->fixup_mapped_heap_regions();
set_archive_heap_region_fixed(); set_archive_heap_region_fixed();
SystemDictionaryShared::update_archived_mirror_native_pointers();
} }
unsigned HeapShared::oop_hash(oop const& p) { unsigned HeapShared::oop_hash(oop const& p) {

View file

@ -101,11 +101,9 @@ runtime/CompactStrings/TestMethodNames.java 8242921 generic-all
# :hotspot_serviceability # :hotspot_serviceability
serviceability/sa/ClhsdbDumpheap.java 8241158 macosx-x64 serviceability/sa/ClhsdbScanOops.java#id0 8243210 macosx-x64
serviceability/sa/ClhsdbScanOops.java#id0 8241158 macosx-x64 serviceability/sa/ClhsdbScanOops.java#id1 8243210 macosx-x64
serviceability/sa/ClhsdbScanOops.java#id1 8241158 macosx-x64
serviceability/sa/sadebugd/DebugdConnectTest.java 8239062 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/TestInstanceKlassSize.java 8230664 linux-ppc64le,linux-ppc64
serviceability/sa/TestInstanceKlassSizeForInterface.java 8230664 linux-ppc64le,linux-ppc64 serviceability/sa/TestInstanceKlassSizeForInterface.java 8230664 linux-ppc64le,linux-ppc64
serviceability/sa/TestRevPtrsForInvokeDynamic.java 8241235 generic-all serviceability/sa/TestRevPtrsForInvokeDynamic.java 8241235 generic-all