Skip to content

Commit 232b41b

Browse files
committed
8373392: Replace CDS object subgraphs with @AOTSafeClassInitializer
Reviewed-by: liach, heidinga
1 parent b3fab41 commit 232b41b

30 files changed

+456
-236
lines changed

src/hotspot/share/cds/aotArtifactFinder.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,7 @@ void AOTArtifactFinder::find_artifacts() {
145145

146146
#if INCLUDE_CDS_JAVA_HEAP
147147
// Keep scanning until we discover no more class that need to be AOT-initialized.
148-
if (CDSConfig::is_initing_classes_at_dump_time()) {
148+
if (CDSConfig::is_dumping_aot_linked_classes()) {
149149
while (_pending_aot_inited_classes->length() > 0) {
150150
InstanceKlass* ik = _pending_aot_inited_classes->pop();
151151
HeapShared::copy_and_rescan_aot_inited_mirror(ik);
@@ -188,7 +188,7 @@ void AOTArtifactFinder::end_scanning_for_oops() {
188188
}
189189

190190
void AOTArtifactFinder::add_aot_inited_class(InstanceKlass* ik) {
191-
if (CDSConfig::is_initing_classes_at_dump_time()) {
191+
if (CDSConfig::is_dumping_aot_linked_classes()) {
192192
if (RegeneratedClasses::is_regenerated_object(ik)) {
193193
precond(RegeneratedClasses::get_original_object(ik)->is_initialized());
194194
} else {
@@ -258,7 +258,7 @@ void AOTArtifactFinder::add_cached_instance_class(InstanceKlass* ik) {
258258
return;
259259
}
260260
scan_oops_in_instance_class(ik);
261-
if (ik->is_hidden() && CDSConfig::is_initing_classes_at_dump_time()) {
261+
if (ik->is_hidden() && CDSConfig::is_dumping_aot_linked_classes()) {
262262
bool succeed = AOTClassLinker::try_add_candidate(ik);
263263
guarantee(succeed, "All cached hidden classes must be aot-linkable");
264264
add_aot_inited_class(ik);

src/hotspot/share/cds/aotClassInitializer.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ DEBUG_ONLY(InstanceKlass* _aot_init_class = nullptr;)
4040

4141
bool AOTClassInitializer::can_archive_initialized_mirror(InstanceKlass* ik) {
4242
assert(!ArchiveBuilder::is_active() || !ArchiveBuilder::current()->is_in_buffer_space(ik), "must be source klass");
43-
if (!CDSConfig::is_initing_classes_at_dump_time()) {
43+
if (!CDSConfig::is_dumping_aot_linked_classes()) {
4444
return false;
4545
}
4646

@@ -64,7 +64,7 @@ bool AOTClassInitializer::can_archive_initialized_mirror(InstanceKlass* ik) {
6464
// Automatic selection for aot-inited classes
6565
// ==========================================
6666
//
67-
// When CDSConfig::is_initing_classes_at_dump_time is enabled,
67+
// When CDSConfig::is_dumping_aot_linked_classes is enabled,
6868
// AOTArtifactFinder::find_artifacts() finds the classes of all
6969
// heap objects that are reachable from HeapShared::_run_time_special_subgraph,
7070
// and mark these classes as aot-inited. This preserves the initialized
@@ -310,7 +310,7 @@ void AOTClassInitializer::init_test_class(TRAPS) {
310310
//
311311
// -XX:AOTInitTestClass is NOT a general mechanism for including user-defined objects into
312312
// the AOT cache. Therefore, this option is NOT available in product JVM.
313-
if (AOTInitTestClass != nullptr && CDSConfig::is_initing_classes_at_dump_time()) {
313+
if (AOTInitTestClass != nullptr && CDSConfig::is_dumping_aot_linked_classes()) {
314314
log_info(aot)("Debug build only: force initialization of AOTInitTestClass %s", AOTInitTestClass);
315315
TempNewSymbol class_name = SymbolTable::new_symbol(AOTInitTestClass);
316316
Handle app_loader(THREAD, SystemDictionary::java_system_loader());

src/hotspot/share/cds/aotMetaspace.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1141,7 +1141,7 @@ void AOTMetaspace::dump_static_archive_impl(StaticArchiveBuilder& builder, TRAPS
11411141
AOTReferenceObjSupport::initialize(CHECK);
11421142
AOTReferenceObjSupport::stabilize_cached_reference_objects(CHECK);
11431143

1144-
if (CDSConfig::is_initing_classes_at_dump_time()) {
1144+
if (CDSConfig::is_dumping_aot_linked_classes()) {
11451145
// java.lang.Class::reflectionFactory cannot be archived yet. We set this field
11461146
// to null, and it will be initialized again at runtime.
11471147
log_debug(aot)("Resetting Class::reflectionFactory");

src/hotspot/share/cds/cdsConfig.cpp

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1026,23 +1026,19 @@ void CDSConfig::set_has_aot_linked_classes(bool has_aot_linked_classes) {
10261026
_has_aot_linked_classes |= has_aot_linked_classes;
10271027
}
10281028

1029-
bool CDSConfig::is_initing_classes_at_dump_time() {
1030-
return is_dumping_heap() && is_dumping_aot_linked_classes();
1031-
}
1032-
10331029
bool CDSConfig::is_dumping_invokedynamic() {
10341030
// Requires is_dumping_aot_linked_classes(). Otherwise the classes of some archived heap
10351031
// objects used by the archive indy callsites may be replaced at runtime.
10361032
return AOTInvokeDynamicLinking && is_dumping_aot_linked_classes() && is_dumping_heap();
10371033
}
10381034

1039-
// When we are dumping aot-linked classes and we are able to write archived heap objects, we automatically
1040-
// enable the archiving of MethodHandles. This will in turn enable the archiving of MethodTypes and hidden
1035+
// When we are dumping aot-linked classes, we automatically enable the archiving of MethodHandles.
1036+
// This will in turn enable the archiving of MethodTypes and hidden
10411037
// classes that are used in the implementation of MethodHandles.
10421038
// Archived MethodHandles are required for higher-level optimizations such as AOT resolution of invokedynamic
10431039
// and dynamic proxies.
10441040
bool CDSConfig::is_dumping_method_handles() {
1045-
return is_initing_classes_at_dump_time();
1041+
return is_dumping_aot_linked_classes();
10461042
}
10471043

10481044
#endif // INCLUDE_CDS_JAVA_HEAP

src/hotspot/share/cds/cdsConfig.hpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -187,7 +187,6 @@ class CDSConfig : public AllStatic {
187187
static void disable_heap_dumping() { CDS_ONLY(_disable_heap_dumping = true); }
188188
static bool is_dumping_heap() NOT_CDS_JAVA_HEAP_RETURN_(false);
189189
static bool is_loading_heap() NOT_CDS_JAVA_HEAP_RETURN_(false);
190-
static bool is_initing_classes_at_dump_time() NOT_CDS_JAVA_HEAP_RETURN_(false);
191190

192191
static bool is_dumping_invokedynamic() NOT_CDS_JAVA_HEAP_RETURN_(false);
193192
static bool is_dumping_method_handles() NOT_CDS_JAVA_HEAP_RETURN_(false);

src/hotspot/share/cds/cdsEnumKlass.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ bool CDSEnumKlass::is_enum_obj(oop orig_obj) {
4040
}
4141

4242
// !!! This is legacy support for enum classes before JEP 483. This file is not used when
43-
// !!! CDSConfig::is_initing_classes_at_dump_time()==true.
43+
// !!! CDSConfig::is_dumping_aot_linked_classes()==true.
4444
//
4545
// Java Enum classes have synthetic <clinit> methods that look like this
4646
// enum MyEnum {FOO, BAR}
@@ -63,7 +63,7 @@ bool CDSEnumKlass::is_enum_obj(oop orig_obj) {
6363
void CDSEnumKlass::handle_enum_obj(int level,
6464
KlassSubGraphInfo* subgraph_info,
6565
oop orig_obj) {
66-
assert(!CDSConfig::is_initing_classes_at_dump_time(), "only for legacy support of enums");
66+
assert(!CDSConfig::is_dumping_aot_linked_classes(), "only for legacy support of enums");
6767
assert(level > 1, "must never be called at the first (outermost) level");
6868
assert(is_enum_obj(orig_obj), "must be");
6969

src/hotspot/share/cds/cdsEnumKlass.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ class JavaFieldStream;
3535
class KlassSubGraphInfo;
3636

3737
// This is legacy support for enum classes before JEP 483. This code is not needed when
38-
// CDSConfig::is_initing_classes_at_dump_time()==true.
38+
// CDSConfig::is_dumping_aot_linked_classes()==true.
3939
class CDSEnumKlass: AllStatic {
4040
public:
4141
static bool is_enum_obj(oop orig_obj);

src/hotspot/share/cds/cdsHeapVerifier.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,7 @@ CDSHeapVerifier::CDSHeapVerifier() : _archived_objs(0), _problems(0)
156156

157157
# undef ADD_EXCL
158158

159-
if (CDSConfig::is_initing_classes_at_dump_time()) {
159+
if (CDSConfig::is_dumping_aot_linked_classes()) {
160160
add_shared_secret_accessors();
161161
}
162162
ClassLoaderDataGraph::classes_do(this);

src/hotspot/share/cds/finalImageRecipes.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,8 @@ void FinalImageRecipes::load_all_classes(TRAPS) {
206206

207207
if (ik->has_aot_safe_initializer() && (flags & WAS_INITED) != 0) {
208208
assert(ik->class_loader() == nullptr, "supported only for boot classes for now");
209+
ResourceMark rm(THREAD);
210+
log_info(aot, init)("Initializing %s", ik->external_name());
209211
ik->initialize(CHECK);
210212
}
211213
}

src/hotspot/share/cds/heapShared.cpp

Lines changed: 31 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -209,8 +209,14 @@ static bool is_subgraph_root_class_of(ArchivableStaticFieldInfo fields[], Instan
209209
}
210210

211211
bool HeapShared::is_subgraph_root_class(InstanceKlass* ik) {
212-
return is_subgraph_root_class_of(archive_subgraph_entry_fields, ik) ||
213-
is_subgraph_root_class_of(fmg_archive_subgraph_entry_fields, ik);
212+
assert(CDSConfig::is_dumping_heap(), "dump-time only");
213+
if (!CDSConfig::is_dumping_aot_linked_classes()) {
214+
// Legacy CDS archive support (to be deprecated)
215+
return is_subgraph_root_class_of(archive_subgraph_entry_fields, ik) ||
216+
is_subgraph_root_class_of(fmg_archive_subgraph_entry_fields, ik);
217+
} else {
218+
return false;
219+
}
214220
}
215221

216222
oop HeapShared::CachedOopInfo::orig_referrer() const {
@@ -934,12 +940,16 @@ void HeapShared::scan_java_class(Klass* orig_k) {
934940
void HeapShared::archive_subgraphs() {
935941
assert(CDSConfig::is_dumping_heap(), "must be");
936942

937-
archive_object_subgraphs(archive_subgraph_entry_fields,
938-
false /* is_full_module_graph */);
943+
if (!CDSConfig::is_dumping_aot_linked_classes()) {
944+
archive_object_subgraphs(archive_subgraph_entry_fields,
945+
false /* is_full_module_graph */);
946+
if (CDSConfig::is_dumping_full_module_graph()) {
947+
archive_object_subgraphs(fmg_archive_subgraph_entry_fields,
948+
true /* is_full_module_graph */);
949+
}
950+
}
939951

940952
if (CDSConfig::is_dumping_full_module_graph()) {
941-
archive_object_subgraphs(fmg_archive_subgraph_entry_fields,
942-
true /* is_full_module_graph */);
943953
Modules::verify_archived_modules();
944954
}
945955
}
@@ -1295,8 +1305,10 @@ void HeapShared::resolve_classes(JavaThread* current) {
12951305
if (!is_archived_heap_in_use()) {
12961306
return; // nothing to do
12971307
}
1298-
resolve_classes_for_subgraphs(current, archive_subgraph_entry_fields);
1299-
resolve_classes_for_subgraphs(current, fmg_archive_subgraph_entry_fields);
1308+
if (!CDSConfig::is_using_aot_linked_classes()) {
1309+
resolve_classes_for_subgraphs(current, archive_subgraph_entry_fields);
1310+
resolve_classes_for_subgraphs(current, fmg_archive_subgraph_entry_fields);
1311+
}
13001312
}
13011313

13021314
void HeapShared::resolve_classes_for_subgraphs(JavaThread* current, ArchivableStaticFieldInfo fields[]) {
@@ -1734,13 +1746,13 @@ bool HeapShared::walk_one_object(PendingOopStack* stack, int level, KlassSubGrap
17341746
}
17351747
}
17361748

1737-
if (CDSConfig::is_initing_classes_at_dump_time()) {
1749+
if (CDSConfig::is_dumping_aot_linked_classes()) {
17381750
if (java_lang_Class::is_instance(orig_obj)) {
17391751
orig_obj = scratch_java_mirror(orig_obj);
17401752
assert(orig_obj != nullptr, "must be archived");
17411753
}
17421754
} else if (java_lang_Class::is_instance(orig_obj) && subgraph_info != _dump_time_special_subgraph) {
1743-
// Without CDSConfig::is_initing_classes_at_dump_time(), we only allow archived objects to
1755+
// Without CDSConfig::is_dumping_aot_linked_classes(), we only allow archived objects to
17441756
// point to the mirrors of (1) j.l.Object, (2) primitive classes, and (3) box classes. These are initialized
17451757
// very early by HeapShared::init_box_classes().
17461758
if (orig_obj == vmClasses::Object_klass()->java_mirror()
@@ -1808,9 +1820,9 @@ bool HeapShared::walk_one_object(PendingOopStack* stack, int level, KlassSubGrap
18081820
orig_obj->oop_iterate(&pusher);
18091821
}
18101822

1811-
if (CDSConfig::is_initing_classes_at_dump_time()) {
1812-
// The classes of all archived enum instances have been marked as aot-init,
1813-
// so there's nothing else to be done in the production run.
1823+
if (CDSConfig::is_dumping_aot_linked_classes()) {
1824+
// The enum klasses are archived with aot-initialized mirror.
1825+
// See AOTClassInitializer::can_archive_initialized_mirror().
18141826
} else {
18151827
// This is legacy support for enum classes before JEP 483 -- we cannot rerun
18161828
// the enum's <clinit> in the production run, so special handling is needed.
@@ -1949,7 +1961,7 @@ void HeapShared::verify_reachable_objects_from(oop obj) {
19491961
#endif
19501962

19511963
void HeapShared::check_special_subgraph_classes() {
1952-
if (CDSConfig::is_initing_classes_at_dump_time()) {
1964+
if (CDSConfig::is_dumping_aot_linked_classes()) {
19531965
// We can have aot-initialized classes (such as Enums) that can reference objects
19541966
// of arbitrary types. Currently, we trust the JEP 483 implementation to only
19551967
// aot-initialize classes that are "safe".
@@ -2136,9 +2148,11 @@ void HeapShared::init_subgraph_entry_fields(ArchivableStaticFieldInfo fields[],
21362148
void HeapShared::init_subgraph_entry_fields(TRAPS) {
21372149
assert(CDSConfig::is_dumping_heap(), "must be");
21382150
_dump_time_subgraph_info_table = new (mtClass)DumpTimeKlassSubGraphInfoTable();
2139-
init_subgraph_entry_fields(archive_subgraph_entry_fields, CHECK);
2140-
if (CDSConfig::is_dumping_full_module_graph()) {
2141-
init_subgraph_entry_fields(fmg_archive_subgraph_entry_fields, CHECK);
2151+
if (!CDSConfig::is_dumping_aot_linked_classes()) {
2152+
init_subgraph_entry_fields(archive_subgraph_entry_fields, CHECK);
2153+
if (CDSConfig::is_dumping_full_module_graph()) {
2154+
init_subgraph_entry_fields(fmg_archive_subgraph_entry_fields, CHECK);
2155+
}
21422156
}
21432157
}
21442158

0 commit comments

Comments
 (0)