Skip to content

Commit 096e70d

Browse files
committed
8352437: Support --add-exports with -XX:+AOTClassLinking
Reviewed-by: matsaave
1 parent 6970cf6 commit 096e70d

File tree

15 files changed

+516
-117
lines changed

15 files changed

+516
-117
lines changed

src/hotspot/share/cds/archiveBuilder.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1544,6 +1544,7 @@ void ArchiveBuilder::write_archive(FileMapInfo* mapinfo, ArchiveHeapInfo* heap_i
15441544
mapinfo->close();
15451545

15461546
if (log_is_enabled(Info, cds)) {
1547+
log_info(cds)("Full module graph = %s", CDSConfig::is_dumping_full_module_graph() ? "enabled" : "disabled");
15471548
print_stats();
15481549
}
15491550

src/hotspot/share/classfile/modules.cpp

Lines changed: 85 additions & 98 deletions
Original file line numberDiff line numberDiff line change
@@ -541,132 +541,103 @@ void Modules::verify_archived_modules() {
541541
ModuleEntry::verify_archived_module_entries();
542542
}
543543

544-
char* Modules::_archived_main_module_name = nullptr;
545-
char* Modules::_archived_addmods_names = nullptr;
546-
char* Modules::_archived_native_access_flags = nullptr;
547-
548-
void Modules::dump_main_module_name() {
549-
const char* module_name = Arguments::get_property("jdk.module.main");
550-
if (module_name != nullptr) {
551-
_archived_main_module_name = ArchiveBuilder::current()->ro_strdup(module_name);
552-
}
553-
}
554-
555-
void Modules::check_archived_flag_consistency(char* archived_flag, const char* runtime_flag, const char* property) {
556-
log_info(cds)("%s %s", property,
557-
archived_flag != nullptr ? archived_flag : "(null)");
558-
bool disable = false;
559-
if (runtime_flag == nullptr) {
560-
if (archived_flag != nullptr) {
561-
log_info(cds)("Mismatched values for property %s: %s specified during dump time but not during runtime", property, archived_flag);
562-
disable = true;
563-
}
564-
} else {
565-
if (archived_flag == nullptr) {
566-
log_info(cds)("Mismatched values for property %s: %s specified during runtime but not during dump time", property, runtime_flag);
567-
disable = true;
568-
} else if (strcmp(runtime_flag, archived_flag) != 0) {
569-
log_info(cds)("Mismatched values for property %s: runtime %s dump time %s", property, runtime_flag, archived_flag);
570-
disable = true;
544+
class Modules::ArchivedProperty {
545+
const char* _prop;
546+
const bool _numbered;
547+
const char* _archived_value;
548+
549+
const char* get_flattened_value() const {
550+
if (_numbered) {
551+
return get_numbered_property_as_sorted_string();
552+
} else {
553+
return Arguments::get_property(_prop);
571554
}
572555
}
573556

574-
if (disable) {
575-
log_info(cds)("Disabling optimized module handling");
576-
CDSConfig::stop_using_optimized_module_handling();
577-
}
578-
log_info(cds)("optimized module handling: %s", CDSConfig::is_using_optimized_module_handling() ? "enabled" : "disabled");
579-
log_info(cds)("full module graph: %s", CDSConfig::is_using_full_module_graph() ? "enabled" : "disabled");
580-
}
557+
void runtime_check() const;
558+
const char* get_numbered_property_as_sorted_string() const;
581559

582-
void Modules::dump_archived_module_info() {
583-
// Write module name into archive
584-
CDS_JAVA_HEAP_ONLY(Modules::dump_main_module_name();)
585-
// Write module names from --add-modules into archive
586-
CDS_JAVA_HEAP_ONLY(Modules::dump_addmods_names();)
587-
// Write native enable-native-access flag into archive
588-
CDS_JAVA_HEAP_ONLY(Modules::dump_native_access_flag());
589-
}
590-
591-
void Modules::serialize_archived_module_info(SerializeClosure* soc) {
592-
CDS_JAVA_HEAP_ONLY(Modules::serialize(soc);)
593-
CDS_JAVA_HEAP_ONLY(Modules::serialize_addmods_names(soc);)
594-
CDS_JAVA_HEAP_ONLY(Modules::serialize_native_access_flags(soc);)
595-
}
560+
public:
561+
ArchivedProperty(const char* prop, bool numbered)
562+
: _prop(prop), _numbered(numbered), _archived_value(nullptr) {}
596563

597-
void Modules::serialize(SerializeClosure* soc) {
598-
soc->do_ptr(&_archived_main_module_name);
599-
if (soc->reading()) {
600-
const char* runtime_main_module = Arguments::get_property("jdk.module.main");
601-
log_info(cds)("_archived_main_module_name %s",
602-
_archived_main_module_name != nullptr ? _archived_main_module_name : "(null)");
603-
604-
check_archived_flag_consistency(_archived_main_module_name, runtime_main_module, "jdk.module.main");
605-
606-
// Don't hold onto the pointer, in case we might decide to unmap the archive.
607-
_archived_main_module_name = nullptr;
564+
void dump() {
565+
ResourceMark rm;
566+
const char* str = get_flattened_value();
567+
if (str != nullptr) {
568+
_archived_value = ArchiveBuilder::current()->ro_strdup(str);
569+
}
608570
}
609-
}
610571

611-
void Modules::dump_native_access_flag() {
612-
ResourceMark rm;
613-
const char* native_access_names = get_native_access_flags_as_sorted_string();
614-
if (native_access_names != nullptr) {
615-
_archived_native_access_flags = ArchiveBuilder::current()->ro_strdup(native_access_names);
572+
void serialize(SerializeClosure* soc) {
573+
soc->do_ptr(&_archived_value);
574+
if (soc->reading()) {
575+
runtime_check();
576+
// Don't hold onto the pointer, in case we might decide to unmap the archive.
577+
_archived_value = nullptr;
578+
}
616579
}
617-
}
580+
};
618581

619-
// Caller needs ResourceMark
620-
const char* Modules::get_native_access_flags_as_sorted_string() {
621-
return get_numbered_property_as_sorted_string("jdk.module.enable.native.access");
622-
}
582+
Modules::ArchivedProperty Modules::_archived_props[] = {
583+
// numbered
584+
{"jdk.module.main", false},
623585

624-
void Modules::serialize_native_access_flags(SerializeClosure* soc) {
625-
soc->do_ptr(&_archived_native_access_flags);
626-
if (soc->reading()) {
627-
ResourceMark rm;
628-
check_archived_flag_consistency(_archived_native_access_flags, get_native_access_flags_as_sorted_string(), "jdk.module.enable.native.access");
586+
// non-numbered
587+
{"jdk.module.addexports", true}, // --add-exports
588+
{"jdk.module.addmods", true}, // --add-modules
589+
{"jdk.module.enable.native.access", true}, // --enable-native-access
590+
};
629591

630-
// Don't hold onto the pointer, in case we might decide to unmap the archive.
631-
_archived_native_access_flags = nullptr;
632-
}
592+
constexpr size_t Modules::num_archived_props() {
593+
return sizeof(_archived_props) / sizeof(_archived_props[0]);
633594
}
634595

635-
void Modules::dump_addmods_names() {
636-
ResourceMark rm;
637-
const char* addmods_names = get_addmods_names_as_sorted_string();
638-
if (addmods_names != nullptr) {
639-
_archived_addmods_names = ArchiveBuilder::current()->ro_strdup(addmods_names);
640-
}
596+
Modules::ArchivedProperty& Modules::archived_prop(size_t i) {
597+
assert(i < num_archived_props(), "oob");
598+
return _archived_props[i];
641599
}
642600

643-
// Caller needs ResourceMark
644-
const char* Modules::get_addmods_names_as_sorted_string() {
645-
return get_numbered_property_as_sorted_string("jdk.module.addmods");
646-
}
601+
void Modules::ArchivedProperty::runtime_check() const {
602+
ResourceMark rm;
603+
const char* runtime_value = get_flattened_value();
604+
log_info(cds)("archived module property %s: %s", _prop,
605+
_archived_value != nullptr ? _archived_value : "(null)");
647606

648-
void Modules::serialize_addmods_names(SerializeClosure* soc) {
649-
soc->do_ptr(&_archived_addmods_names);
650-
if (soc->reading()) {
651-
ResourceMark rm;
652-
check_archived_flag_consistency(_archived_addmods_names, get_addmods_names_as_sorted_string(), "jdk.module.addmods");
607+
bool disable = false;
608+
if (runtime_value == nullptr) {
609+
if (_archived_value != nullptr) {
610+
log_info(cds)("Mismatched values for property %s: %s specified during dump time but not during runtime", _prop, _archived_value);
611+
disable = true;
612+
}
613+
} else {
614+
if (_archived_value == nullptr) {
615+
log_info(cds)("Mismatched values for property %s: %s specified during runtime but not during dump time", _prop, runtime_value);
616+
disable = true;
617+
} else if (strcmp(runtime_value, _archived_value) != 0) {
618+
log_info(cds)("Mismatched values for property %s: runtime %s dump time %s", _prop, runtime_value, _archived_value);
619+
disable = true;
620+
}
621+
}
653622

654-
// Don't hold onto the pointer, in case we might decide to unmap the archive.
655-
_archived_addmods_names = nullptr;
623+
if (disable) {
624+
log_info(cds)("Disabling optimized module handling");
625+
CDSConfig::stop_using_optimized_module_handling();
656626
}
657627
}
658628

659629
// Caller needs ResourceMark
660-
const char* Modules::get_numbered_property_as_sorted_string(const char* property) {
630+
const char* Modules::ArchivedProperty::get_numbered_property_as_sorted_string() const {
631+
assert(_numbered, "sanity");
661632
// theoretical string size limit for decimal int, but the following loop will end much sooner due to
662633
// OS command-line size limit.
663634
const int max_digits = 10;
664635
const int extra_symbols_count = 2; // includes '.', '\0'
665-
size_t prop_len = strlen(property) + max_digits + extra_symbols_count;
636+
size_t prop_len = strlen(_prop) + max_digits + extra_symbols_count;
666637
char* prop_name = resource_allocate_bytes(prop_len);
667638
GrowableArray<const char*> list;
668639
for (unsigned int i = 0;; i++) {
669-
jio_snprintf(prop_name, prop_len, "%s.%d", property, i);
640+
jio_snprintf(prop_name, prop_len, "%s.%d", _prop, i);
670641
const char* prop_value = Arguments::get_property(prop_name);
671642
if (prop_value == nullptr) {
672643
break;
@@ -713,6 +684,22 @@ const char* Modules::get_numbered_property_as_sorted_string(const char* property
713684
return (st.size() > 0) ? st.as_string() : nullptr; // Example: "java.base,java.compiler"
714685
}
715686

687+
void Modules::dump_archived_module_info() {
688+
for (size_t i = 0; i < num_archived_props(); i++) {
689+
archived_prop(i).dump();
690+
}
691+
}
692+
693+
void Modules::serialize_archived_module_info(SerializeClosure* soc) {
694+
for (size_t i = 0; i < num_archived_props(); i++) {
695+
archived_prop(i).serialize(soc);
696+
}
697+
if (soc->reading()) {
698+
log_info(cds)("optimized module handling: %s", CDSConfig::is_using_optimized_module_handling() ? "enabled" : "disabled");
699+
log_info(cds)("full module graph: %s", CDSConfig::is_using_full_module_graph() ? "enabled" : "disabled");
700+
}
701+
}
702+
716703
void Modules::define_archived_modules(Handle h_platform_loader, Handle h_system_loader, TRAPS) {
717704
assert(CDSConfig::is_using_full_module_graph(), "must be");
718705

src/hotspot/share/classfile/modules.hpp

Lines changed: 7 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -59,23 +59,15 @@ class Modules : AllStatic {
5959
static void verify_archived_modules() NOT_CDS_JAVA_HEAP_RETURN;
6060
static void dump_archived_module_info() NOT_CDS_JAVA_HEAP_RETURN;
6161
static void serialize_archived_module_info(SerializeClosure* soc) NOT_CDS_JAVA_HEAP_RETURN;
62-
static void dump_main_module_name() NOT_CDS_JAVA_HEAP_RETURN;
63-
static void serialize(SerializeClosure* soc) NOT_CDS_JAVA_HEAP_RETURN;
64-
static void check_archived_flag_consistency(char* archived_flag, const char* runtime_flag, const char* property) NOT_CDS_JAVA_HEAP_RETURN;
6562

66-
static void dump_native_access_flag() NOT_CDS_JAVA_HEAP_RETURN;
67-
static const char* get_native_access_flags_as_sorted_string() NOT_CDS_JAVA_HEAP_RETURN_(nullptr);
68-
static void serialize_native_access_flags(SerializeClosure* soc) NOT_CDS_JAVA_HEAP_RETURN;
69-
70-
static void dump_addmods_names() NOT_CDS_JAVA_HEAP_RETURN;
71-
static const char* get_addmods_names_as_sorted_string() NOT_CDS_JAVA_HEAP_RETURN_(nullptr);
72-
static void serialize_addmods_names(SerializeClosure* soc) NOT_CDS_JAVA_HEAP_RETURN;
73-
74-
static const char* get_numbered_property_as_sorted_string(const char* property) NOT_CDS_JAVA_HEAP_RETURN_(nullptr);
7563
#if INCLUDE_CDS_JAVA_HEAP
76-
static char* _archived_main_module_name;
77-
static char* _archived_addmods_names;
78-
static char* _archived_native_access_flags;
64+
private:
65+
class ArchivedProperty;
66+
67+
static ArchivedProperty _archived_props[];
68+
static constexpr size_t num_archived_props();
69+
static ArchivedProperty& archived_prop(size_t i);
70+
public:
7971
#endif
8072

8173
// Provides the java.lang.Module for the unnamed module defined

src/hotspot/share/runtime/arguments.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -331,8 +331,7 @@ bool Arguments::is_incompatible_cds_internal_module_property(const char* propert
331331
bool Arguments::internal_module_property_helper(const char* property, bool check_for_cds) {
332332
if (strncmp(property, MODULE_PROPERTY_PREFIX, MODULE_PROPERTY_PREFIX_LEN) == 0) {
333333
const char* property_suffix = property + MODULE_PROPERTY_PREFIX_LEN;
334-
if (matches_property_suffix(property_suffix, ADDEXPORTS, ADDEXPORTS_LEN) ||
335-
matches_property_suffix(property_suffix, ADDREADS, ADDREADS_LEN) ||
334+
if (matches_property_suffix(property_suffix, ADDREADS, ADDREADS_LEN) ||
336335
matches_property_suffix(property_suffix, ADDOPENS, ADDOPENS_LEN) ||
337336
matches_property_suffix(property_suffix, PATCH, PATCH_LEN) ||
338337
matches_property_suffix(property_suffix, LIMITMODS, LIMITMODS_LEN) ||
@@ -343,7 +342,8 @@ bool Arguments::internal_module_property_helper(const char* property, bool check
343342

344343
if (!check_for_cds) {
345344
// CDS notes: these properties are supported by CDS archived full module graph.
346-
if (matches_property_suffix(property_suffix, PATH, PATH_LEN) ||
345+
if (matches_property_suffix(property_suffix, ADDEXPORTS, ADDEXPORTS_LEN) ||
346+
matches_property_suffix(property_suffix, PATH, PATH_LEN) ||
347347
matches_property_suffix(property_suffix, ADDMODS, ADDMODS_LEN) ||
348348
matches_property_suffix(property_suffix, ENABLE_NATIVE_ACCESS, ENABLE_NATIVE_ACCESS_LEN)) {
349349
return true;

src/java.base/share/classes/jdk/internal/module/ModuleBootstrap.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,6 @@ private static boolean canUseArchivedBootLayer() {
143143
getProperty("jdk.module.patch.0") == null && // --patch-module
144144
getProperty("jdk.module.limitmods") == null && // --limit-modules
145145
getProperty("jdk.module.addreads.0") == null && // --add-reads
146-
getProperty("jdk.module.addexports.0") == null && // --add-exports
147146
getProperty("jdk.module.addopens.0") == null; // --add-opens
148147
}
149148

test/hotspot/jtreg/TEST.groups

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -412,6 +412,8 @@ hotspot_appcds_dynamic = \
412412
-runtime/cds/appcds/complexURI \
413413
-runtime/cds/appcds/customLoader \
414414
-runtime/cds/appcds/dynamicArchive \
415+
-runtime/cds/appcds/jigsaw/ExactOptionMatch.java \
416+
-runtime/cds/appcds/jigsaw/modulepath/AddExports.java \
415417
-runtime/cds/appcds/jigsaw/modulepath/ModulePathAndFMG.java \
416418
-runtime/cds/appcds/jigsaw/modulepath/OptimizeModuleHandlingTest.java \
417419
-runtime/cds/appcds/loaderConstraints/DynamicLoaderConstraintsTest.java \
@@ -527,7 +529,9 @@ hotspot_aot_classlinking = \
527529
-runtime/cds/appcds/javaldr/GCDuringDump.java \
528530
-runtime/cds/appcds/javaldr/LockDuringDump.java \
529531
-runtime/cds/appcds/jigsaw/classpathtests/EmptyClassInBootClassPath.java \
532+
-runtime/cds/appcds/jigsaw/ExactOptionMatch.java \
530533
-runtime/cds/appcds/jigsaw/JigsawOptionsCombo.java \
534+
-runtime/cds/appcds/jigsaw/modulepath/AddExports.java \
531535
-runtime/cds/appcds/jigsaw/modulepath/AddOpens.java \
532536
-runtime/cds/appcds/jigsaw/modulepath/AddModules.java \
533537
-runtime/cds/appcds/jigsaw/modulepath/JvmtiAddPath.java \

0 commit comments

Comments
 (0)