Skip to content

Commit 0bc7cc4

Browse files
committedApr 21, 2020
8241158: SA TestHeapDumpForInvokeDynamic.java fails when CDS archive is relocated
Reviewed-by: ccheung
1 parent 7b8c373 commit 0bc7cc4

File tree

5 files changed

+70
-14
lines changed

5 files changed

+70
-14
lines changed
 

‎src/hotspot/share/classfile/javaClasses.cpp

+9-10
Original file line numberDiff line numberDiff line change
@@ -1283,16 +1283,16 @@ void java_lang_Class::update_archived_primitive_mirror_native_pointers(oop archi
12831283
}
12841284

12851285
void java_lang_Class::update_archived_mirror_native_pointers(oop archived_mirror) {
1286-
if (MetaspaceShared::relocation_delta() != 0) {
1287-
Klass* k = ((Klass*)archived_mirror->metadata_field(_klass_offset));
1288-
archived_mirror->metadata_field_put(_klass_offset,
1289-
(Klass*)(address(k) + MetaspaceShared::relocation_delta()));
1286+
assert(MetaspaceShared::relocation_delta() != 0, "must be");
12901287

1291-
Klass* ak = ((Klass*)archived_mirror->metadata_field(_array_klass_offset));
1292-
if (ak != NULL) {
1293-
archived_mirror->metadata_field_put(_array_klass_offset,
1294-
(Klass*)(address(ak) + MetaspaceShared::relocation_delta()));
1295-
}
1288+
Klass* k = ((Klass*)archived_mirror->metadata_field(_klass_offset));
1289+
archived_mirror->metadata_field_put(_klass_offset,
1290+
(Klass*)(address(k) + MetaspaceShared::relocation_delta()));
1291+
1292+
Klass* ak = ((Klass*)archived_mirror->metadata_field(_array_klass_offset));
1293+
if (ak != NULL) {
1294+
archived_mirror->metadata_field_put(_array_klass_offset,
1295+
(Klass*)(address(ak) + MetaspaceShared::relocation_delta()));
12961296
}
12971297
}
12981298

@@ -1319,7 +1319,6 @@ bool java_lang_Class::restore_archived_mirror(Klass *k,
13191319
// mirror is archived, restore
13201320
log_debug(cds, mirror)("Archived mirror is: " PTR_FORMAT, p2i(m));
13211321
assert(HeapShared::is_archived_object(m), "must be archived mirror object");
1322-
update_archived_mirror_native_pointers(m);
13231322
assert(as_Klass(m) == k, "must be");
13241323
Handle mirror(THREAD, m);
13251324

‎src/hotspot/share/classfile/systemDictionaryShared.cpp

+50
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
#include "memory/allocation.hpp"
4141
#include "memory/archiveUtils.hpp"
4242
#include "memory/filemap.hpp"
43+
#include "memory/heapShared.hpp"
4344
#include "memory/metadataFactory.hpp"
4445
#include "memory/metaspaceClosure.hpp"
4546
#include "memory/oopFactory.hpp"
@@ -1541,3 +1542,52 @@ bool SystemDictionaryShared::empty_dumptime_table() {
15411542
}
15421543
return false;
15431544
}
1545+
1546+
#if INCLUDE_CDS_JAVA_HEAP
1547+
1548+
class ArchivedMirrorPatcher {
1549+
static void update(Klass* k) {
1550+
if (k->has_raw_archived_mirror()) {
1551+
oop m = HeapShared::materialize_archived_object(k->archived_java_mirror_raw_narrow());
1552+
if (m != NULL) {
1553+
java_lang_Class::update_archived_mirror_native_pointers(m);
1554+
}
1555+
}
1556+
}
1557+
1558+
public:
1559+
static void update_array_klasses(Klass* ak) {
1560+
while (ak != NULL) {
1561+
update(ak);
1562+
ak = ArrayKlass::cast(ak)->higher_dimension();
1563+
}
1564+
}
1565+
1566+
void do_value(const RunTimeSharedClassInfo* info) {
1567+
InstanceKlass* ik = info->_klass;
1568+
update(ik);
1569+
update_array_klasses(ik->array_klasses());
1570+
}
1571+
};
1572+
1573+
void SystemDictionaryShared::update_archived_mirror_native_pointers_for(RunTimeSharedDictionary* dict) {
1574+
ArchivedMirrorPatcher patcher;
1575+
dict->iterate(&patcher);
1576+
}
1577+
1578+
void SystemDictionaryShared::update_archived_mirror_native_pointers() {
1579+
if (!HeapShared::open_archive_heap_region_mapped()) {
1580+
return;
1581+
}
1582+
if (MetaspaceShared::relocation_delta() == 0) {
1583+
return;
1584+
}
1585+
update_archived_mirror_native_pointers_for(&_builtin_dictionary);
1586+
update_archived_mirror_native_pointers_for(&_unregistered_dictionary);
1587+
1588+
for (int t = T_BOOLEAN; t <= T_LONG; t++) {
1589+
Klass* k = Universe::typeArrayKlassObj((BasicType)t);
1590+
ArchivedMirrorPatcher::update_array_klasses(k);
1591+
}
1592+
}
1593+
#endif

‎src/hotspot/share/classfile/systemDictionaryShared.hpp

+8
Original file line numberDiff line numberDiff line change
@@ -222,6 +222,7 @@ class SystemDictionaryShared: public SystemDictionary {
222222
static bool should_be_excluded(InstanceKlass* k);
223223

224224
DEBUG_ONLY(static bool _no_class_loading_should_happen;)
225+
225226
public:
226227
static InstanceKlass* find_builtin_class(Symbol* class_name);
227228

@@ -326,6 +327,13 @@ class SystemDictionaryShared: public SystemDictionary {
326327
address p = address(ptr) - SharedBaseAddress;
327328
return primitive_hash<address>(p);
328329
}
330+
331+
#if INCLUDE_CDS_JAVA_HEAP
332+
private:
333+
static void update_archived_mirror_native_pointers_for(RunTimeSharedDictionary* dict);
334+
public:
335+
static void update_archived_mirror_native_pointers() NOT_CDS_RETURN;
336+
#endif
329337
};
330338

331339
#endif // SHARE_CLASSFILE_SYSTEMDICTIONARYSHARED_HPP

‎src/hotspot/share/memory/heapShared.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,7 @@ void HeapShared::fixup_mapped_heap_regions() {
9797
FileMapInfo *mapinfo = FileMapInfo::current_info();
9898
mapinfo->fixup_mapped_heap_regions();
9999
set_archive_heap_region_fixed();
100+
SystemDictionaryShared::update_archived_mirror_native_pointers();
100101
}
101102

102103
unsigned HeapShared::oop_hash(oop const& p) {

‎test/hotspot/jtreg/ProblemList.txt

+2-4
Original file line numberDiff line numberDiff line change
@@ -101,11 +101,9 @@ runtime/CompactStrings/TestMethodNames.java 8242921 generic-all
101101

102102
# :hotspot_serviceability
103103

104-
serviceability/sa/ClhsdbDumpheap.java 8241158 macosx-x64
105-
serviceability/sa/ClhsdbScanOops.java#id0 8241158 macosx-x64
106-
serviceability/sa/ClhsdbScanOops.java#id1 8241158 macosx-x64
104+
serviceability/sa/ClhsdbScanOops.java#id0 8243210 macosx-x64
105+
serviceability/sa/ClhsdbScanOops.java#id1 8243210 macosx-x64
107106
serviceability/sa/sadebugd/DebugdConnectTest.java 8239062 macosx-x64
108-
serviceability/sa/TestHeapDumpForInvokeDynamic.java 8241158 macosx-x64
109107
serviceability/sa/TestInstanceKlassSize.java 8230664 linux-ppc64le,linux-ppc64
110108
serviceability/sa/TestInstanceKlassSizeForInterface.java 8230664 linux-ppc64le,linux-ppc64
111109
serviceability/sa/TestRevPtrsForInvokeDynamic.java 8241235 generic-all

0 commit comments

Comments
 (0)
Please sign in to comment.