From 4e169d1ed7501d1de8fd4ea326f84b6c1a34270d Mon Sep 17 00:00:00 2001 From: Albert Mingkun Yang Date: Tue, 21 May 2024 08:34:00 +0000 Subject: [PATCH] 8332401: G1: TestFromCardCacheIndex.java with -XX:GCCardSizeInBytes=128 triggers underflow assertion Reviewed-by: tschatzl, iwalulya --- src/hotspot/share/gc/g1/g1BlockOffsetTable.inline.hpp | 3 ++- src/hotspot/share/gc/parallel/objectStartArray.hpp | 3 ++- src/hotspot/share/gc/serial/serialBlockOffsetTable.inline.hpp | 3 ++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/hotspot/share/gc/g1/g1BlockOffsetTable.inline.hpp b/src/hotspot/share/gc/g1/g1BlockOffsetTable.inline.hpp index b875f2f5c6d..7e6b0e56d93 100644 --- a/src/hotspot/share/gc/g1/g1BlockOffsetTable.inline.hpp +++ b/src/hotspot/share/gc/g1/g1BlockOffsetTable.inline.hpp @@ -62,7 +62,8 @@ inline uint8_t* G1BlockOffsetTable::entry_for_addr(const void* const p) const { } inline HeapWord* G1BlockOffsetTable::addr_for_entry(const uint8_t* const p) const { - size_t delta = pointer_delta(p, _offset_base, sizeof(uint8_t)); + // _offset_base can be "negative", so can't use pointer_delta(). + size_t delta = p - _offset_base; HeapWord* result = (HeapWord*) (delta << CardTable::card_shift()); assert(_reserved.contains(result), "out of bounds accessor from block offset table"); diff --git a/src/hotspot/share/gc/parallel/objectStartArray.hpp b/src/hotspot/share/gc/parallel/objectStartArray.hpp index dec703cbb19..aadf2651f2c 100644 --- a/src/hotspot/share/gc/parallel/objectStartArray.hpp +++ b/src/hotspot/share/gc/parallel/objectStartArray.hpp @@ -57,7 +57,8 @@ class ObjectStartArray : public CHeapObj { // Mapping from object start array entry to address of first word HeapWord* addr_for_entry(const uint8_t* const p) const { - size_t delta = pointer_delta(p, _offset_base, sizeof(uint8_t)); + // _offset_base can be "negative", so can't use pointer_delta(). + size_t delta = p - _offset_base; HeapWord* result = (HeapWord*) (delta << CardTable::card_shift()); assert(_covered_region.contains(result), "out of bounds accessor from card marking array"); diff --git a/src/hotspot/share/gc/serial/serialBlockOffsetTable.inline.hpp b/src/hotspot/share/gc/serial/serialBlockOffsetTable.inline.hpp index fe003774eae..d8224cb774e 100644 --- a/src/hotspot/share/gc/serial/serialBlockOffsetTable.inline.hpp +++ b/src/hotspot/share/gc/serial/serialBlockOffsetTable.inline.hpp @@ -35,7 +35,8 @@ inline uint8_t* SerialBlockOffsetTable::entry_for_addr(const void* const p) cons } inline HeapWord* SerialBlockOffsetTable::addr_for_entry(const uint8_t* const p) const { - size_t delta = pointer_delta(p, _offset_base, sizeof(uint8_t)); + // _offset_base can be "negative", so can't use pointer_delta(). + size_t delta = p - _offset_base; HeapWord* result = (HeapWord*) (delta << CardTable::card_shift()); assert(_reserved.contains(result), "out of bounds accessor from block offset array");