Skip to content

Commit d1b6110

Browse files
committedAug 31, 2023
8315431: ArchiveHeapWriter::get_filler_size_at() cannot handle buffer expansion

File tree

2 files changed

+9
-8
lines changed

2 files changed

+9
-8
lines changed
 

‎src/hotspot/share/cds/archiveHeapWriter.cpp

+8-7
Original file line numberDiff line numberDiff line change
@@ -63,15 +63,15 @@ address ArchiveHeapWriter::_requested_top;
6363
GrowableArrayCHeap<ArchiveHeapWriter::NativePointerInfo, mtClassShared>* ArchiveHeapWriter::_native_pointers;
6464
GrowableArrayCHeap<oop, mtClassShared>* ArchiveHeapWriter::_source_objs;
6565

66-
static GrowableArrayCHeap<address, mtClassShared> *_permobj_seg_buffered_addrs = nullptr;
66+
static GrowableArrayCHeap<size_t, mtClassShared> *_permobj_seg_buffered_addrs = nullptr;
6767
static GrowableArrayCHeap<size_t, mtClassShared> *_permobj_seg_bytesizes = nullptr;
6868
static GrowableArrayCHeap<int, mtClassShared> *_permobj_seg_lengths = nullptr;
6969

7070
ArchiveHeapWriter::BufferOffsetToSourceObjectTable*
7171
ArchiveHeapWriter::_buffer_offset_to_source_obj_table = nullptr;
7272

7373

74-
typedef ResourceHashtable<address, size_t,
74+
typedef ResourceHashtable<size_t, size_t,
7575
127, // prime number
7676
AnyObj::C_HEAP,
7777
mtClassShared> FillersTable;
@@ -88,7 +88,7 @@ void ArchiveHeapWriter::init() {
8888

8989
_native_pointers = new GrowableArrayCHeap<NativePointerInfo, mtClassShared>(2048);
9090
_source_objs = new GrowableArrayCHeap<oop, mtClassShared>(10000);
91-
_permobj_seg_buffered_addrs = new GrowableArrayCHeap<address, mtClassShared>(5);
91+
_permobj_seg_buffered_addrs = new GrowableArrayCHeap<size_t, mtClassShared>(5);
9292
_permobj_seg_bytesizes = new GrowableArrayCHeap<size_t, mtClassShared>(5);
9393
_permobj_seg_lengths = new GrowableArrayCHeap<int, mtClassShared>(5);
9494

@@ -272,7 +272,7 @@ int ArchiveHeapWriter::copy_source_objs_to_buffer(GrowableArrayCHeap<oop, mtClas
272272
size_t word_size;
273273
size_t permobj_seg_bottom_offset = create_objarray_in_buffer(permobjs, from, num_elems, 0, word_size);
274274
permobj_seg_offsets->append(permobj_seg_bottom_offset);
275-
_permobj_seg_buffered_addrs->append(offset_to_buffered_address<address>(permobj_seg_bottom_offset));
275+
_permobj_seg_buffered_addrs->append(permobj_seg_bottom_offset);
276276
_permobj_seg_bytesizes->append(word_size * HeapWordSize);
277277
_permobj_seg_lengths->append(num_elems);
278278
}
@@ -347,13 +347,13 @@ void ArchiveHeapWriter::maybe_fill_gc_region_gap(size_t required_byte_size) {
347347
log_info(cds, heap)("Inserting filler obj array of %d elements (" SIZE_FORMAT " bytes total) @ buffer offset " SIZE_FORMAT,
348348
array_length, fill_bytes, _buffer_used);
349349
HeapWord* filler = init_filler_array_at_buffer_top(array_length, fill_bytes);
350+
_fillers->put(_buffer_used, fill_bytes);
350351
_buffer_used = filler_end;
351-
_fillers->put((address)filler, fill_bytes);
352352
}
353353
}
354354

355355
size_t ArchiveHeapWriter::get_filler_size_at(address buffered_addr) {
356-
size_t* p = _fillers->get(buffered_addr);
356+
size_t* p = _fillers->get(buffered_addr - buffer_bottom());
357357
if (p != nullptr) {
358358
assert(*p > 0, "filler must be larger than zero bytes");
359359
return *p;
@@ -611,8 +611,9 @@ template <typename T> void ArchiveHeapWriter::add_permobj_segments_to_roots(Grow
611611

612612
// If the buffered_addr is one of the permobj segments, returns the size information about this segment.
613613
int ArchiveHeapWriter::get_permobj_segment_at(address buffered_addr, size_t* byte_size, int* permobj_segment_length) {
614+
size_t offset = buffered_addr - buffer_bottom();
614615
for (int i = 0; i < _permobj_seg_buffered_addrs->length(); i++) {
615-
if (buffered_addr == _permobj_seg_buffered_addrs->at(i)) {
616+
if (offset == _permobj_seg_buffered_addrs->at(i)) {
616617
*byte_size = _permobj_seg_bytesizes->at(i);
617618
*permobj_segment_length = _permobj_seg_lengths->at(i);
618619
return i;

‎test/hotspot/jtreg/runtime/cds/CDSMapReader.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -263,7 +263,7 @@ public static MapFile read(String fileName) {
263263
}
264264

265265
private static void mustContain(HashMap<Long, HeapObject> allObjects, Field field, long pointer, boolean isNarrow) {
266-
if (allObjects.get(pointer) == null) {
266+
if (pointer != 0x0 && allObjects.get(pointer) == null) {
267267
throw new RuntimeException((isNarrow ? "narrowOop" : "oop") + " pointer 0x" + Long.toHexString(pointer) +
268268
" on line " + field.lineCount + " doesn't point to a valid heap object");
269269
}

0 commit comments

Comments
 (0)
Please sign in to comment.