diff --git a/src/hotspot/share/ci/ciMethodData.cpp b/src/hotspot/share/ci/ciMethodData.cpp index 096a674ad56b9..533e86599682f 100644 --- a/src/hotspot/share/ci/ciMethodData.cpp +++ b/src/hotspot/share/ci/ciMethodData.cpp @@ -57,11 +57,7 @@ ciMethodData::ciMethodData(MethodData* md) static bool is_klass_loaded(Klass* k) { - if (TrainingData::have_data()) { - // If we're running in AOT mode some classes may not be loaded yet - return !k->is_instance_klass() || InstanceKlass::cast(k)->is_loaded(); - } - return true; + return TrainingData::is_klass_loaded(k); } // Check for entries that reference an unloaded method diff --git a/src/hotspot/share/jvmci/jvmciCompilerToVM.cpp b/src/hotspot/share/jvmci/jvmciCompilerToVM.cpp index b4b8150917dd5..6ad039d88391b 100644 --- a/src/hotspot/share/jvmci/jvmciCompilerToVM.cpp +++ b/src/hotspot/share/jvmci/jvmciCompilerToVM.cpp @@ -49,6 +49,7 @@ #include "oops/instanceMirrorKlass.hpp" #include "oops/method.inline.hpp" #include "oops/objArrayKlass.inline.hpp" +#include "oops/trainingData.hpp" #include "oops/typeArrayOop.inline.hpp" #include "prims/jvmtiExport.hpp" #include "prims/methodHandles.hpp" @@ -505,11 +506,15 @@ C2V_VMENTRY_NULL(jobject, getResolvedJavaType0, (JNIEnv* env, jobject, jobject b } } else if (JVMCIENV->isa_HotSpotMethodData(base_object)) { jlong base_address = (intptr_t) JVMCIENV->asMethodData(base_object); - klass = *((Klass**) (intptr_t) (base_address + offset)); - if (klass == nullptr || !klass->is_loader_alive()) { + Klass* k = *((Klass**) (intptr_t) (base_address + offset)); + if (k == nullptr || k->class_loader_data() == nullptr || !TrainingData::is_klass_loaded(k)) { + return nullptr; + } + if (!k->is_loader_alive()) { // Klasses in methodData might be concurrently unloading so return null in that case. return nullptr; } + klass = k; } else { goto unexpected; } diff --git a/src/hotspot/share/oops/trainingData.hpp b/src/hotspot/share/oops/trainingData.hpp index d79ffaef13ef7..2be3026881a41 100644 --- a/src/hotspot/share/oops/trainingData.hpp +++ b/src/hotspot/share/oops/trainingData.hpp @@ -283,6 +283,14 @@ class TrainingData : public Metadata { static bool need_data() { return AOTRecordTraining; } // Going to write static bool assembling_data() { return have_data() && CDSConfig::is_dumping_final_static_archive() && CDSConfig::is_dumping_aot_linked_classes(); } + static bool is_klass_loaded(Klass* k) { + if (have_data()) { + // If we're running in AOT mode some classes may not be loaded yet + return !k->is_instance_klass() || InstanceKlass::cast(k)->is_loaded(); + } + return true; + } + template static void iterate(const Function& fn) { iterate(const_cast(fn)); } diff --git a/src/jdk.internal.vm.ci/share/classes/jdk/vm/ci/hotspot/HotSpotMethodData.java b/src/jdk.internal.vm.ci/share/classes/jdk/vm/ci/hotspot/HotSpotMethodData.java index 454949a2e2527..2478b97a5b240 100644 --- a/src/jdk.internal.vm.ci/share/classes/jdk/vm/ci/hotspot/HotSpotMethodData.java +++ b/src/jdk.internal.vm.ci/share/classes/jdk/vm/ci/hotspot/HotSpotMethodData.java @@ -443,19 +443,7 @@ public StringBuilder appendTo(StringBuilder sb, HotSpotMethodData data, int pos) } } - static class RawItemProfile { - final int entries; - final T[] items; - final long[] counts; - final long totalCount; - - RawItemProfile(int entries, T[] items, long[] counts, long totalCount) { - this.entries = entries; - this.items = items; - this.counts = counts; - this.totalCount = totalCount; - } - } + record RawItemProfile(int entries, T[] items, long[] counts, long totalCount) {} abstract static class AbstractTypeData extends CounterData {