Skip to content

Commit 16fd904

Browse files
committed
AOT Logging needs to recognize FlatArrayOops.
1 parent 4edcf9c commit 16fd904

File tree

6 files changed

+59
-31
lines changed

6 files changed

+59
-31
lines changed

src/hotspot/share/cds/aotMapLogger.cpp

Lines changed: 37 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -492,7 +492,7 @@ void AOTMapLogger::log_as_hex(address base, address top, address requested_base,
492492
}
493493

494494
#if INCLUDE_CDS_JAVA_HEAP
495-
// FakeOop (and subclasses FakeMirror, FakeString, FakeObjArray, FakeTypeArray) are used to traverse
495+
// FakeOop (and subclasses FakeMirror, FakeString, FakeRefArray, FakeFlatArray, FakeTypeArray) are used to traverse
496496
// and print the (image of) heap objects stored in the AOT cache. These objects are different than regular oops:
497497
// - They do not reside inside the range of the heap.
498498
// - For +UseCompressedOops: pointers may use a different narrowOop encoding: see FakeOop::read_oop_at(narrowOop*)
@@ -554,7 +554,8 @@ class AOTMapLogger::FakeOop {
554554
}
555555

556556
FakeMirror& as_mirror();
557-
FakeObjArray& as_obj_array();
557+
FakeRefArray& as_ref_array();
558+
FakeFlatArray& as_flat_array();
558559
FakeString& as_string();
559560
FakeTypeArray& as_type_array();
560561

@@ -656,23 +657,38 @@ class AOTMapLogger::FakeMirror : public AOTMapLogger::FakeOop {
656657
}
657658
}; // AOTMapLogger::FakeMirror
658659

659-
class AOTMapLogger::FakeObjArray : public AOTMapLogger::FakeOop {
660-
objArrayOop raw_objArrayOop() {
661-
return (objArrayOop)raw_oop();
660+
class AOTMapLogger::FakeRefArray : public AOTMapLogger::FakeOop {
661+
refArrayOop raw_refArrayOop() {
662+
return (refArrayOop)raw_oop();
662663
}
663664

664665
public:
665666
int length() {
666-
return raw_objArrayOop()->length();
667+
return raw_refArrayOop()->length();
667668
}
668669
FakeOop obj_at(int i) {
669670
if (UseCompressedOops) {
670-
return read_oop_at(raw_objArrayOop()->obj_at_addr<narrowOop>(i));
671+
return read_oop_at(raw_refArrayOop()->obj_at_addr<narrowOop>(i));
671672
} else {
672-
return read_oop_at(raw_objArrayOop()->obj_at_addr<oop>(i));
673+
return read_oop_at(raw_refArrayOop()->obj_at_addr<oop>(i));
673674
}
674675
}
675-
}; // AOTMapLogger::FakeObjArray
676+
}; // AOTMapLogger::FakeRefArray
677+
678+
class AOTMapLogger::FakeFlatArray : public AOTMapLogger::FakeOop {
679+
flatArrayOop raw_flatArrayOop() {
680+
return (flatArrayOop)raw_oop();
681+
}
682+
683+
public:
684+
int length() {
685+
return raw_flatArrayOop()->length();
686+
}
687+
void print_elements_on(outputStream* st) {
688+
FlatArrayKlass::cast(real_klass())->oop_print_elements_on(raw_flatArrayOop(), st);
689+
}
690+
691+
}; // AOTMapLogger::FakeRefArray
676692

677693
class AOTMapLogger::FakeString : public AOTMapLogger::FakeOop {
678694
public:
@@ -708,9 +724,14 @@ AOTMapLogger::FakeMirror& AOTMapLogger::FakeOop::as_mirror() {
708724
return (FakeMirror&)*this;
709725
}
710726

711-
AOTMapLogger::FakeObjArray& AOTMapLogger::FakeOop::as_obj_array() {
712-
precond(real_klass()->is_objArray_klass());
713-
return (FakeObjArray&)*this;
727+
AOTMapLogger::FakeRefArray& AOTMapLogger::FakeOop::as_ref_array() {
728+
precond(real_klass()->is_refArray_klass());
729+
return (FakeRefArray&)*this;
730+
}
731+
732+
AOTMapLogger::FakeFlatArray& AOTMapLogger::FakeOop::as_flat_array() {
733+
precond(real_klass()->is_flatArray_klass());
734+
return (FakeFlatArray&)*this;
714735
}
715736

716737
AOTMapLogger::FakeTypeArray& AOTMapLogger::FakeOop::as_type_array() {
@@ -940,8 +961,10 @@ void AOTMapLogger::print_oop_details(FakeOop fake_oop, outputStream* st) {
940961

941962
if (real_klass->is_typeArray_klass()) {
942963
fake_oop.as_type_array().print_elements_on(st);
943-
} else if (real_klass->is_objArray_klass()) {
944-
FakeObjArray fake_obj_array = fake_oop.as_obj_array();
964+
} else if (real_klass->is_flatArray_klass()) {
965+
fake_oop.as_flat_array().print_elements_on(st);
966+
} else if (real_klass->is_refArray_klass()) {
967+
FakeRefArray fake_obj_array = fake_oop.as_ref_array();
945968
bool is_logging_root_segment = _num_obj_arrays_logged < _num_root_segments;
946969

947970
for (int i = 0; i < fake_obj_array.length(); i++) {

src/hotspot/share/cds/aotMapLogger.hpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,8 @@ class AOTMapLogger : AllStatic {
6767
// FakeOop and subtypes
6868
class FakeOop;
6969
class FakeMirror;
70-
class FakeObjArray;
70+
class FakeRefArray;
71+
class FakeFlatArray;
7172
class FakeString;
7273
class FakeTypeArray;
7374

src/hotspot/share/oops/flatArrayKlass.cpp

Lines changed: 18 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -403,25 +403,11 @@ void FlatArrayKlass::print_value_on(outputStream* st) const {
403403
st->print("[]");
404404
}
405405

406-
407406
#ifndef PRODUCT
408407
void FlatArrayKlass::oop_print_on(oop obj, outputStream* st) {
409408
ArrayKlass::oop_print_on(obj, st);
410409
flatArrayOop va = flatArrayOop(obj);
411-
InlineKlass* vk = element_klass();
412-
int print_len = MIN2(va->length(), MaxElementPrintSize);
413-
for(int index = 0; index < print_len; index++) {
414-
int off = (address) va->value_at_addr(index, layout_helper()) - cast_from_oop<address>(obj);
415-
st->print_cr(" - Index %3d offset %3d: ", index, off);
416-
oop obj = cast_to_oop((address)va->value_at_addr(index, layout_helper()) - vk->payload_offset());
417-
FieldPrinter print_field(st, obj);
418-
vk->do_nonstatic_fields(&print_field);
419-
st->cr();
420-
}
421-
int remaining = va->length() - print_len;
422-
if (remaining > 0) {
423-
st->print_cr(" - <%d more elements, increase MaxElementPrintSize to print>", remaining);
424-
}
410+
oop_print_elements_on(va, st);
425411
}
426412
#endif //PRODUCT
427413

@@ -445,6 +431,23 @@ void FlatArrayKlass::oop_print_value_on(oop obj, outputStream* st) {
445431
}
446432
}
447433

434+
void FlatArrayKlass::oop_print_elements_on(flatArrayOop fa, outputStream* st) {
435+
InlineKlass* vk = element_klass();
436+
int print_len = MIN2(fa->length(), MaxElementPrintSize);
437+
for(int index = 0; index < print_len; index++) {
438+
int off = (address) fa->value_at_addr(index, layout_helper()) - cast_from_oop<address>(fa);
439+
st->print_cr(" - Index %3d offset %3d: ", index, off);
440+
oop obj = cast_to_oop((address)fa->value_at_addr(index, layout_helper()) - vk->payload_offset());
441+
FieldPrinter print_field(st, obj);
442+
vk->do_nonstatic_fields(&print_field);
443+
st->cr();
444+
}
445+
int remaining = fa->length() - print_len;
446+
if (remaining > 0) {
447+
st->print_cr(" - <%d more elements, increase MaxElementPrintSize to print>", remaining);
448+
}
449+
}
450+
448451
// Verification
449452
class VerifyElementClosure: public BasicOopIterateClosure {
450453
public:

src/hotspot/share/oops/flatArrayKlass.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,7 @@ class FlatArrayKlass : public ObjArrayKlass {
145145
#ifndef PRODUCT
146146
void oop_print_on(oop obj, outputStream* st);
147147
#endif
148+
void oop_print_elements_on(flatArrayOop fa, outputStream* st);
148149

149150
// Verification
150151
void verify_on(outputStream* st);

src/hotspot/share/oops/objArrayOop.hpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,6 @@ class objArrayOopDesc : public arrayOopDesc {
4343
friend class Continuation;
4444
template <typename T>
4545
friend class RawOopWriter;
46-
friend class AOTMapLogger;
4746

4847
template <class T> T* obj_at_addr(int index) const;
4948

src/hotspot/share/oops/refArrayOop.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ class refArrayOopDesc : public arrayOopDesc {
4444
friend class Continuation;
4545
template <typename T>
4646
friend class RawOopWriter;
47+
friend class AOTMapLogger;
4748

4849
template <class T> T* obj_at_addr(int index) const;
4950

0 commit comments

Comments
 (0)