Skip to content

Commit 47c9c9d

Browse files
[GR-62838] Verify that DynamicHubs are addressable.
PullRequest: graal/20253
2 parents ffad82a + cb07bf7 commit 47c9c9d

File tree

6 files changed

+21
-6
lines changed

6 files changed

+21
-6
lines changed

substratevm/src/com.oracle.svm.core.genscavenge/src/com/oracle/svm/core/genscavenge/ChunkedImageHeapLayouter.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,7 @@ private ImageHeapLayoutInfo doLayout(ImageHeap imageHeap, int pageSize) {
158158
for (ChunkedImageHeapPartition partition : getPartitions()) {
159159
partition.layout(allocator);
160160
}
161-
return populateInfoObjects(imageHeap.countDynamicHubs(), pageSize);
161+
return populateInfoObjects(imageHeap.countAndVerifyDynamicHubs(), pageSize);
162162
}
163163

164164
private ImageHeapLayoutInfo populateInfoObjects(int dynamicHubCount, int pageSize) {

substratevm/src/com.oracle.svm.core.genscavenge/src/com/oracle/svm/core/genscavenge/ObjectHeaderImpl.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -303,7 +303,6 @@ public static boolean isConsumedHeapChunkZapped(UnsignedWord header) {
303303
@Override
304304
public long encodeAsImageHeapObjectHeader(ImageHeapObject obj, long hubOffsetFromHeapBase) {
305305
long header = hubOffsetFromHeapBase << numReservedExtraBits;
306-
VMError.guarantee((header >>> numReservedExtraBits) == hubOffsetFromHeapBase, "Hub is too far from heap base for encoding in object header");
307306
assert (header & reservedBitsMask) == 0 : "Object header bits must be zero initially";
308307
if (obj.getPartition() instanceof ChunkedImageHeapPartition partition) {
309308
if (partition.isWritable() && HeapImpl.usesImageHeapCardMarking()) {
@@ -321,6 +320,16 @@ public long encodeAsImageHeapObjectHeader(ImageHeapObject obj, long hubOffsetFro
321320
return header;
322321
}
323322

323+
@Override
324+
public void verifyDynamicHubOffsetInImageHeap(long offsetFromHeapBase) {
325+
long referenceSizeMask = getReferenceSize() == Integer.BYTES ? 0xFFFF_FFFFL : -1L;
326+
long encoded = (offsetFromHeapBase << numReservedExtraBits) & referenceSizeMask;
327+
boolean shiftLosesInformation = (encoded >>> numReservedExtraBits != offsetFromHeapBase);
328+
if (shiftLosesInformation) {
329+
throw VMError.shouldNotReachHere("Hub is too far from heap base for encoding in object header: " + offsetFromHeapBase);
330+
}
331+
}
332+
324333
@Uninterruptible(reason = "Called from uninterruptible code.", mayBeInlined = true)
325334
public static boolean isAlignedObject(Object o) {
326335
return !isUnalignedObject(o);

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/heap/ObjectHeader.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,8 @@ protected ObjectHeader() {
6969

7070
public abstract Word encodeAsUnmanagedObjectHeader(DynamicHub hub);
7171

72+
public abstract void verifyDynamicHubOffsetInImageHeap(long offsetFromHeapBase);
73+
7274
@Uninterruptible(reason = "Called from uninterruptible code.", mayBeInlined = true)
7375
public DynamicHub dynamicHubFromObjectHeader(Word header) {
7476
return (DynamicHub) extractPotentialDynamicHubFromHeader(header).toObject();

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/image/ImageHeap.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,5 +33,5 @@ public interface ImageHeap {
3333

3434
ImageHeapObject addFillerObject(int size);
3535

36-
int countDynamicHubs();
36+
int countAndVerifyDynamicHubs();
3737
}

substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/image/NativeImageHeap.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,8 @@
6161
import com.oracle.svm.core.config.ConfigurationValues;
6262
import com.oracle.svm.core.config.ObjectLayout;
6363
import com.oracle.svm.core.heap.FillerObject;
64+
import com.oracle.svm.core.heap.Heap;
65+
import com.oracle.svm.core.heap.ObjectHeader;
6466
import com.oracle.svm.core.hub.DynamicHub;
6567
import com.oracle.svm.core.hub.DynamicHubCompanion;
6668
import com.oracle.svm.core.hub.LayoutEncoding;
@@ -415,10 +417,12 @@ private int computeIdentityHashCode(JavaConstant constant) {
415417
}
416418

417419
@Override
418-
public int countDynamicHubs() {
420+
public int countAndVerifyDynamicHubs() {
421+
ObjectHeader objHeader = Heap.getHeap().getObjectHeader();
419422
int count = 0;
420423
for (ObjectInfo o : getObjects()) {
421424
if (!o.constant.isWrittenInPreviousLayer() && hMetaAccess.isInstanceOf(o.getConstant(), DynamicHub.class)) {
425+
objHeader.verifyDynamicHubOffsetInImageHeap(o.getOffset());
422426
count++;
423427
}
424428
}

substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/image/NativeImageHeapWriter.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -278,7 +278,7 @@ private void writeObjectHeader(RelocatableBuffer buffer, int index, ObjectInfo o
278278
DynamicHub hub = obj.getClazz().getHub();
279279
assert hub != null : "Null DynamicHub found during native image generation.";
280280
ObjectInfo hubInfo = heap.getObjectInfo(hub);
281-
assert hubInfo != null : "Unknown object " + hub.toString() + " found. Static field or an object referenced from a static field changed during native image generation?";
281+
assert hubInfo != null : "Unknown object " + hub + " found. Static field or an object referenced from a static field changed during native image generation?";
282282

283283
ObjectHeader objectHeader = Heap.getHeap().getObjectHeader();
284284
if (NativeImageHeap.useHeapBase()) {
@@ -356,7 +356,7 @@ private void writeReferenceValue(RelocatableBuffer buffer, int index, long value
356356
if (referenceSize() == Long.BYTES) {
357357
buffer.getByteBuffer().putLong(index, value);
358358
} else if (referenceSize() == Integer.BYTES) {
359-
buffer.getByteBuffer().putInt(index, NumUtil.safeToInt(value));
359+
buffer.getByteBuffer().putInt(index, NumUtil.safeToUInt(value));
360360
} else {
361361
throw shouldNotReachHere("Unsupported reference size: " + referenceSize());
362362
}

0 commit comments

Comments
 (0)