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");