Skip to content
This repository has been archived by the owner on Aug 27, 2022. It is now read-only.

Commit

Permalink
8241158: SA TestHeapDumpForInvokeDynamic.java fails when CDS archive …
Browse files Browse the repository at this point in the history
…is relocated

Reviewed-by: ccheung
  • Loading branch information
iklam committed Apr 21, 2020
1 parent 7b8c373 commit 0bc7cc4
Show file tree
Hide file tree
Showing 5 changed files with 70 additions and 14 deletions.
19 changes: 9 additions & 10 deletions src/hotspot/share/classfile/javaClasses.cpp
Expand Up @@ -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) {
if (MetaspaceShared::relocation_delta() != 0) {
Klass* k = ((Klass*)archived_mirror->metadata_field(_klass_offset));
archived_mirror->metadata_field_put(_klass_offset,
(Klass*)(address(k) + MetaspaceShared::relocation_delta()));
assert(MetaspaceShared::relocation_delta() != 0, "must be");

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()));
}
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));
if (ak != NULL) {
archived_mirror->metadata_field_put(_array_klass_offset,
(Klass*)(address(ak) + MetaspaceShared::relocation_delta()));
}
}

Expand All @@ -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);

Expand Down
50 changes: 50 additions & 0 deletions src/hotspot/share/classfile/systemDictionaryShared.cpp
Expand Up @@ -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"
Expand Down Expand Up @@ -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
8 changes: 8 additions & 0 deletions src/hotspot/share/classfile/systemDictionaryShared.hpp
Expand Up @@ -222,6 +222,7 @@ class SystemDictionaryShared: public SystemDictionary {
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);

Expand Down Expand Up @@ -326,6 +327,13 @@ class SystemDictionaryShared: public SystemDictionary {
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
1 change: 1 addition & 0 deletions src/hotspot/share/memory/heapShared.cpp
Expand Up @@ -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) {
Expand Down
6 changes: 2 additions & 4 deletions test/hotspot/jtreg/ProblemList.txt
Expand Up @@ -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
Expand Down

0 comments on commit 0bc7cc4

Please sign in to comment.