Skip to content

Commit e020752

Browse files
committed
8354484: SIGSEGV when supertype of an AOT-cached class is excluded
Reviewed-by: ccheung, shade
1 parent 594b265 commit e020752

File tree

2 files changed

+28
-2
lines changed

2 files changed

+28
-2
lines changed

src/hotspot/share/cds/aotArtifactFinder.cpp

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -207,11 +207,36 @@ void AOTArtifactFinder::add_aot_inited_class(InstanceKlass* ik) {
207207
}
208208
}
209209

210+
void AOTArtifactFinder::append_to_all_cached_classes(Klass* k) {
211+
precond(!SystemDictionaryShared::should_be_excluded(k));
212+
_all_cached_classes->append(k);
213+
}
214+
210215
void AOTArtifactFinder::add_cached_instance_class(InstanceKlass* ik) {
216+
if (CDSConfig::is_dumping_dynamic_archive() && ik->is_shared()) {
217+
// This class is already included in the base archive. No need to cache
218+
// it again in the dynamic archive.
219+
return;
220+
}
221+
211222
bool created;
212223
_seen_classes->put_if_absent(ik, &created);
213224
if (created) {
214-
_all_cached_classes->append(ik);
225+
append_to_all_cached_classes(ik);
226+
227+
// All super types must be added.
228+
InstanceKlass* s = ik->java_super();
229+
if (s != nullptr) {
230+
add_cached_instance_class(s);
231+
}
232+
233+
Array<InstanceKlass*>* interfaces = ik->local_interfaces();
234+
int len = interfaces->length();
235+
for (int i = 0; i < len; i++) {
236+
InstanceKlass* intf = interfaces->at(i);
237+
add_cached_instance_class(intf);
238+
}
239+
215240
if (CDSConfig::is_dumping_final_static_archive() && ik->is_shared_unregistered_class()) {
216241
// The following are not appliable to unregistered classes
217242
return;
@@ -229,7 +254,7 @@ void AOTArtifactFinder::add_cached_type_array_class(TypeArrayKlass* tak) {
229254
bool created;
230255
_seen_classes->put_if_absent(tak, &created);
231256
if (created) {
232-
_all_cached_classes->append(tak);
257+
append_to_all_cached_classes(tak);
233258
scan_oops_in_array_class(tak);
234259
}
235260
}

src/hotspot/share/cds/aotArtifactFinder.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@ class AOTArtifactFinder : AllStatic {
7979
static void scan_oops_in_array_class(ArrayKlass* ak);
8080
static void add_cached_type_array_class(TypeArrayKlass* tak);
8181
static void add_cached_instance_class(InstanceKlass* ik);
82+
static void append_to_all_cached_classes(Klass* k);
8283
public:
8384
static void initialize();
8485
static void find_artifacts();

0 commit comments

Comments
 (0)