Skip to content

Commit ed21796

Browse files
committed
8364483: [lworld] Pre-register migrated classes in class loaders
Reviewed-by: heidinga
1 parent 4ce51bf commit ed21796

File tree

5 files changed

+119
-18
lines changed

5 files changed

+119
-18
lines changed

src/hotspot/share/classfile/systemDictionary.cpp

Lines changed: 14 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -191,23 +191,19 @@ inline ClassLoaderData* class_loader_data(Handle class_loader) {
191191
return ClassLoaderData::class_loader_data(class_loader());
192192
}
193193

194-
static void add_wrapper_class(JavaThread* current, ClassLoaderData* cld, Symbol* classname) {
195-
InstanceKlass* ik = SystemDictionary::find_instance_klass(current, classname, Handle(current, nullptr));
196-
assert(ik != nullptr, "Must exist");
197-
SystemDictionary::add_to_initiating_loader(current, ik, cld);
198-
}
194+
// These migrated value classes are loaded by the bootstrap class loader but are added to the initiating
195+
// loaders automatically so that fields of these types can be found and potentially flattened during
196+
// field layout.
197+
static void add_migrated_value_classes(ClassLoaderData* cld) {
198+
JavaThread* current = JavaThread::current();
199+
auto add_klass = [&] (Symbol* classname) {
200+
InstanceKlass* ik = SystemDictionary::find_instance_klass(current, classname, Handle(current, nullptr));
201+
assert(ik != nullptr, "Must exist");
202+
SystemDictionary::add_to_initiating_loader(current, ik, cld);
203+
};
199204

200-
static void add_wrapper_classes(ClassLoaderData* cld) {
201205
MonitorLocker mu1(SystemDictionary_lock);
202-
JavaThread* current = JavaThread::current();
203-
add_wrapper_class(current, cld, vmSymbols::java_lang_Boolean());
204-
add_wrapper_class(current, cld, vmSymbols::java_lang_Byte());
205-
add_wrapper_class(current, cld, vmSymbols::java_lang_Character());
206-
add_wrapper_class(current, cld, vmSymbols::java_lang_Short());
207-
add_wrapper_class(current, cld, vmSymbols::java_lang_Integer());
208-
add_wrapper_class(current, cld, vmSymbols::java_lang_Long());
209-
add_wrapper_class(current, cld, vmSymbols::java_lang_Float());
210-
add_wrapper_class(current, cld, vmSymbols::java_lang_Double());
206+
vmSymbols::migrated_class_names_do(add_klass);
211207
}
212208

213209
ClassLoaderData* SystemDictionary::register_loader(Handle class_loader, bool create_mirror_cld) {
@@ -219,7 +215,9 @@ ClassLoaderData* SystemDictionary::register_loader(Handle class_loader, bool cre
219215
return ClassLoaderData::the_null_class_loader_data();
220216
} else {
221217
ClassLoaderData* cld = ClassLoaderDataGraph::find_or_create(class_loader);
222-
add_wrapper_classes(cld);
218+
if (EnableValhalla) {
219+
add_migrated_value_classes(cld);
220+
}
223221
return cld;
224222
}
225223
}

src/hotspot/share/classfile/vmClassMacros.hpp

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,30 @@
173173
do_klass(Long_klass, java_lang_Long ) \
174174
do_klass(Void_klass, java_lang_Void ) \
175175
\
176+
/* Other valhalla migrated klasses. */ \
177+
do_klass(Number_klass, java_lang_Number ) \
178+
do_klass(Optional_klass, java_util_Optional ) \
179+
do_klass(OptionalInt_klass, java_util_OptionalInt ) \
180+
do_klass(OptionalLong_klass, java_util_OptionalLong ) \
181+
do_klass(OptionalDouble_klass, java_util_OptionalDouble ) \
182+
do_klass(LocalDate_klass, java_time_LocalDate ) \
183+
do_klass(LocalDateTime_klass, java_time_LocalDateTime ) \
184+
do_klass(LocalTime_klass, java_time_LocalTime ) \
185+
do_klass(Duration_klass, java_time_Duration ) \
186+
do_klass(Instant_klass, java_time_Instant ) \
187+
do_klass(MonthDay_klass, java_time_MonthDay ) \
188+
do_klass(ZonedDateTime_klass, java_time_ZonedDateTime ) \
189+
do_klass(OffsetDateTime_klass, java_time_OffsetDateTime ) \
190+
do_klass(OffsetTime_klass, java_time_OffsetTime ) \
191+
do_klass(YearMonth_klass, java_time_YearMonth ) \
192+
do_klass(Year_klass, java_time_Year ) \
193+
do_klass(Period_klass, java_time_Period ) \
194+
do_klass(chrono_ChronoLocalDateImpl_klass, java_time_chrono_ChronoLocalDateImpl ) \
195+
do_klass(chrono_MinguoDate_klass, java_time_chrono_MinguoDate ) \
196+
do_klass(chrono_HijrahDate_klass, java_time_chrono_HijrahDate ) \
197+
do_klass(chrono_JapaneseDate_klass, java_time_chrono_JapaneseDate ) \
198+
do_klass(chrono_ThaiBuddhistDate_klass, java_time_chrono_ThaiBuddhistDate ) \
199+
\
176200
/* force inline of iterators */ \
177201
do_klass(Iterator_klass, java_util_Iterator ) \
178202
\

src/hotspot/share/classfile/vmSymbols.cpp

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,8 @@ void vmSymbols::initialize() {
110110
#endif
111111
}
112112

113+
initialize_migrated_class_names();
114+
113115
#ifdef ASSERT
114116
// Check for duplicates:
115117

@@ -296,3 +298,44 @@ vmSymbolID vmSymbols::find_sid(const char* symbol_name) {
296298
if (symbol == nullptr) return vmSymbolID::NO_SID;
297299
return find_sid(symbol);
298300
}
301+
302+
// The list of these migrated value classes is in
303+
// open/make/modules/java.base/gensrc/GensrcValueClasses.gmk.
304+
305+
Symbol* vmSymbols::_migrated_class_names[_migrated_class_names_length];
306+
307+
void vmSymbols::initialize_migrated_class_names() {
308+
int i = 0;
309+
_migrated_class_names[i++] = java_lang_Byte();
310+
_migrated_class_names[i++] = java_lang_Short();
311+
_migrated_class_names[i++] = java_lang_Integer();
312+
_migrated_class_names[i++] = java_lang_Long();
313+
_migrated_class_names[i++] = java_lang_Float();
314+
_migrated_class_names[i++] = java_lang_Double();
315+
_migrated_class_names[i++] = java_lang_Boolean();
316+
_migrated_class_names[i++] = java_lang_Character();
317+
_migrated_class_names[i++] = java_lang_Number();
318+
_migrated_class_names[i++] = java_lang_Record();
319+
_migrated_class_names[i++] = java_util_Optional();
320+
_migrated_class_names[i++] = java_util_OptionalInt();
321+
_migrated_class_names[i++] = java_util_OptionalLong();
322+
_migrated_class_names[i++] = java_util_OptionalDouble();
323+
_migrated_class_names[i++] = java_time_LocalDate();
324+
_migrated_class_names[i++] = java_time_LocalDateTime();
325+
_migrated_class_names[i++] = java_time_LocalTime();
326+
_migrated_class_names[i++] = java_time_Duration();
327+
_migrated_class_names[i++] = java_time_Instant();
328+
_migrated_class_names[i++] = java_time_MonthDay();
329+
_migrated_class_names[i++] = java_time_ZonedDateTime();
330+
_migrated_class_names[i++] = java_time_OffsetDateTime();
331+
_migrated_class_names[i++] = java_time_OffsetTime();
332+
_migrated_class_names[i++] = java_time_YearMonth();
333+
_migrated_class_names[i++] = java_time_Year();
334+
_migrated_class_names[i++] = java_time_Period();
335+
_migrated_class_names[i++] = java_time_chrono_ChronoLocalDateImpl();
336+
_migrated_class_names[i++] = java_time_chrono_MinguoDate();
337+
_migrated_class_names[i++] = java_time_chrono_HijrahDate();
338+
_migrated_class_names[i++] = java_time_chrono_JapaneseDate();
339+
_migrated_class_names[i++] = java_time_chrono_ThaiBuddhistDate();
340+
assert(i == _migrated_class_names_length, "should be");
341+
}

src/hotspot/share/classfile/vmSymbols.hpp

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,31 @@ class SerializeClosure;
9191
template(java_lang_Long_LongCache, "java/lang/Long$LongCache") \
9292
template(java_lang_Void, "java/lang/Void") \
9393
\
94+
/* Valhalla migrated classes. */ \
95+
template(java_lang_Number, "java/lang/Number") \
96+
template(java_lang_Record, "java/lang/Record") \
97+
template(java_util_Optional, "java/util/Optional") \
98+
template(java_util_OptionalInt, "java/util/OptionalInt") \
99+
template(java_util_OptionalLong, "java/util/OptionalLong") \
100+
template(java_util_OptionalDouble, "java/util/OptionalDouble") \
101+
template(java_time_LocalDate, "java/time/LocalDate") \
102+
template(java_time_LocalDateTime, "java/time/LocalDateTime") \
103+
template(java_time_LocalTime, "java/time/LocalTime") \
104+
template(java_time_Duration, "java/time/Duration") \
105+
template(java_time_Instant, "java/time/Instant") \
106+
template(java_time_MonthDay, "java/time/MonthDay") \
107+
template(java_time_ZonedDateTime, "java/time/ZonedDateTime") \
108+
template(java_time_OffsetDateTime, "java/time/OffsetDateTime") \
109+
template(java_time_OffsetTime, "java/time/OffsetTime") \
110+
template(java_time_YearMonth, "java/time/YearMonth") \
111+
template(java_time_Year, "java/time/Year") \
112+
template(java_time_Period, "java/time/Period") \
113+
template(java_time_chrono_ChronoLocalDateImpl, "java/time/chrono/ChronoLocalDateImpl") \
114+
template(java_time_chrono_MinguoDate, "java/time/chrono/MinguoDate") \
115+
template(java_time_chrono_HijrahDate, "java/time/chrono/HijrahDate") \
116+
template(java_time_chrono_JapaneseDate, "java/time/chrono/JapaneseDate") \
117+
template(java_time_chrono_ThaiBuddhistDate, "java/time/chrono/ThaiBuddhistDate") \
118+
\
94119
template(jdk_internal_vm_vector_VectorSupport, "jdk/internal/vm/vector/VectorSupport") \
95120
template(jdk_internal_vm_vector_Float16Math, "jdk/internal/vm/vector/Float16Math") \
96121
template(jdk_internal_vm_vector_VectorPayload, "jdk/internal/vm/vector/VectorSupport$VectorPayload") \
@@ -137,7 +162,6 @@ class SerializeClosure;
137162
template(java_lang_AssertionStatusDirectives, "java/lang/AssertionStatusDirectives") \
138163
template(jdk_internal_vm_PostVMInitHook, "jdk/internal/vm/PostVMInitHook") \
139164
template(java_util_Iterator, "java/util/Iterator") \
140-
template(java_lang_Record, "java/lang/Record") \
141165
template(sun_instrument_InstrumentationImpl, "sun/instrument/InstrumentationImpl") \
142166
template(sun_invoke_util_ValueConversions, "sun/invoke/util/ValueConversions") \
143167
\
@@ -830,6 +854,10 @@ class vmSymbols: AllStatic {
830854

831855
// Field signatures indexed by BasicType.
832856
static Symbol* _type_signatures[T_VOID+1];
857+
static void initialize_migrated_class_names();
858+
859+
static const int _migrated_class_names_length = 31;
860+
static Symbol* _migrated_class_names[_migrated_class_names_length];
833861

834862
public:
835863
// Initialization
@@ -865,6 +893,13 @@ class vmSymbols: AllStatic {
865893
// No need for this in the product:
866894
static const char* name_for(vmSymbolID sid);
867895
#endif //PRODUCT
896+
897+
template<typename Function>
898+
static void migrated_class_names_do(Function f) {
899+
for (int i = 0; i < _migrated_class_names_length; i++) {
900+
f(_migrated_class_names[i]);
901+
}
902+
}
868903
};
869904

870905
#endif // SHARE_CLASSFILE_VMSYMBOLS_HPP

src/hotspot/share/gc/z/zBarrierSet.inline.hpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2017, 2025, Oracle and/or its affiliates. All rights reserved.
33
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
44
*
55
* This code is free software; you can redistribute it and/or modify it
@@ -35,6 +35,7 @@
3535
#include "memory/iterator.inline.hpp"
3636
#include "oops/inlineKlass.inline.hpp"
3737
#include "utilities/debug.hpp"
38+
#include "utilities/copy.hpp"
3839

3940
template <DecoratorSet decorators, typename BarrierSetT>
4041
template <DecoratorSet expected>

0 commit comments

Comments
 (0)