From 93ab76963898281cadb175b49cbe36cf75c5bd97 Mon Sep 17 00:00:00 2001 From: Christian Haeubl Date: Thu, 13 Nov 2025 16:43:18 +0100 Subject: [PATCH] Verify that objects in the young gen don't have a remembered set bit. --- .../com/oracle/svm/core/genscavenge/FillerObjectUtil.java | 6 +++--- .../src/com/oracle/svm/core/genscavenge/HeapVerifier.java | 5 +++++ .../src/com/oracle/svm/core/genscavenge/TlabSupport.java | 2 +- .../svm/core/genscavenge/compacting/SweepingVisitor.java | 2 +- 4 files changed, 10 insertions(+), 5 deletions(-) diff --git a/substratevm/src/com.oracle.svm.core.genscavenge/src/com/oracle/svm/core/genscavenge/FillerObjectUtil.java b/substratevm/src/com.oracle.svm.core.genscavenge/src/com/oracle/svm/core/genscavenge/FillerObjectUtil.java index ffbfe5c3c750..c790b5bf8d5d 100644 --- a/substratevm/src/com.oracle.svm.core.genscavenge/src/com/oracle/svm/core/genscavenge/FillerObjectUtil.java +++ b/substratevm/src/com.oracle.svm.core.genscavenge/src/com/oracle/svm/core/genscavenge/FillerObjectUtil.java @@ -65,13 +65,13 @@ static int arrayBaseOffset() { } @Uninterruptible(reason = CALLED_FROM_UNINTERRUPTIBLE_CODE, mayBeInlined = true) - public static void writeFillerObjectAt(Pointer p, UnsignedWord size) { + public static void writeFillerObjectAt(Pointer p, UnsignedWord size, boolean rememberedSet) { assert size.aboveThan(0); if (size.aboveOrEqual(arrayMinSize())) { int length = UnsignedUtils.safeToInt(size.subtract(arrayBaseOffset()).unsignedDivide(ARRAY_ELEMENT_SIZE)); - FormatArrayNode.formatArray(p, ARRAY_CLASS, length, true, false, WITH_GARBAGE_IF_ASSERTIONS_ENABLED, false); + FormatArrayNode.formatArray(p, ARRAY_CLASS, length, rememberedSet, false, WITH_GARBAGE_IF_ASSERTIONS_ENABLED, false); } else { - FormatObjectNode.formatObject(p, FillerObject.class, true, WITH_GARBAGE_IF_ASSERTIONS_ENABLED, false); + FormatObjectNode.formatObject(p, FillerObject.class, rememberedSet, WITH_GARBAGE_IF_ASSERTIONS_ENABLED, false); } assert LayoutEncoding.getSizeFromObjectInGC(p.toObject()).equal(size); } diff --git a/substratevm/src/com.oracle.svm.core.genscavenge/src/com/oracle/svm/core/genscavenge/HeapVerifier.java b/substratevm/src/com.oracle.svm.core.genscavenge/src/com/oracle/svm/core/genscavenge/HeapVerifier.java index 47d89662c684..f90ec6b46dbd 100644 --- a/substratevm/src/com.oracle.svm.core.genscavenge/src/com/oracle/svm/core/genscavenge/HeapVerifier.java +++ b/substratevm/src/com.oracle.svm.core.genscavenge/src/com/oracle/svm/core/genscavenge/HeapVerifier.java @@ -323,6 +323,11 @@ private static boolean verifyObject(Object obj, AlignedHeader aChunk, UnalignedH Log.log().string("Object ").zhex(ptr).string(" is in ").string(space.getName()).string(" chunk ").zhex(chunk).string(" but does not have a remembered set.").newline(); return false; } + } else if (space.isYoungSpace()) { + if (SerialGCOptions.useRememberedSet() && RememberedSet.get().hasRememberedSet(header)) { + Log.log().string("Object ").zhex(ptr).string(" is in ").string(space.getName()).string(" chunk ").zhex(chunk).string(" but has a remembered set.").newline(); + return false; + } } return verifyReferences(obj); diff --git a/substratevm/src/com.oracle.svm.core.genscavenge/src/com/oracle/svm/core/genscavenge/TlabSupport.java b/substratevm/src/com.oracle.svm.core.genscavenge/src/com/oracle/svm/core/genscavenge/TlabSupport.java index 504d39982867..20a35e9f2405 100644 --- a/substratevm/src/com.oracle.svm.core.genscavenge/src/com/oracle/svm/core/genscavenge/TlabSupport.java +++ b/substratevm/src/com.oracle.svm.core.genscavenge/src/com/oracle/svm/core/genscavenge/TlabSupport.java @@ -363,7 +363,7 @@ private static void insertFiller(ThreadLocalAllocation.Descriptor tlab) { UnsignedWord size = hardEnd.subtract(top); if (top.belowThan(hardEnd)) { - FillerObjectUtil.writeFillerObjectAt(top, size); + FillerObjectUtil.writeFillerObjectAt(top, size, false); } } diff --git a/substratevm/src/com.oracle.svm.core.genscavenge/src/com/oracle/svm/core/genscavenge/compacting/SweepingVisitor.java b/substratevm/src/com.oracle.svm.core.genscavenge/src/com/oracle/svm/core/genscavenge/compacting/SweepingVisitor.java index 16b999e37cdc..c523740f3f69 100644 --- a/substratevm/src/com.oracle.svm.core.genscavenge/src/com/oracle/svm/core/genscavenge/compacting/SweepingVisitor.java +++ b/substratevm/src/com.oracle.svm.core.genscavenge/src/com/oracle/svm/core/genscavenge/compacting/SweepingVisitor.java @@ -43,7 +43,7 @@ public boolean visit(Pointer objSeq, UnsignedWord size, Pointer newAddress, Poin if (nextObjSeq.isNonNull()) { Pointer gapStart = objSeq.add(size); assert gapStart.belowThan(nextObjSeq); - FillerObjectUtil.writeFillerObjectAt(gapStart, nextObjSeq.subtract(gapStart)); + FillerObjectUtil.writeFillerObjectAt(gapStart, nextObjSeq.subtract(gapStart), true); // Note that we have already added first object table entries for fillers during fixup. } else { AlignedHeapChunk.AlignedHeader chunk = AlignedHeapChunk.getEnclosingChunkFromObjectPointer(objSeq);