Skip to content

Commit cb1baa2

Browse files
committed
Write first object table during fix-up instead.
1 parent 996913e commit cb1baa2

File tree

3 files changed

+40
-47
lines changed

3 files changed

+40
-47
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -449,7 +449,7 @@ private Object copyAlignedObject(Object originalObj) {
449449
if (SerialGCOptions.useCompactingOldGen() && GCImpl.getGCImpl().isCompleteCollection()) {
450450
/*
451451
* In a compacting complete collection, the remembered set bit is set already during
452-
* marking and the first object table is built during planning.
452+
* marking and the first object table is built later during fix-up.
453453
*/
454454
} else {
455455
/*

substratevm/src/com.oracle.svm.core.genscavenge/src/com/oracle/svm/core/genscavenge/compacting/ObjectMoveInfo.java

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,11 @@
3636
import com.oracle.svm.core.genscavenge.AlignedHeapChunk;
3737
import com.oracle.svm.core.genscavenge.HeapChunk;
3838
import com.oracle.svm.core.genscavenge.ObjectHeaderImpl;
39+
import com.oracle.svm.core.genscavenge.remset.AlignedChunkRememberedSet;
3940
import com.oracle.svm.core.genscavenge.remset.BrickTable;
41+
import com.oracle.svm.core.genscavenge.remset.FirstObjectTable;
4042
import com.oracle.svm.core.hub.LayoutEncoding;
43+
import com.oracle.svm.core.util.VMError;
4144

4245
import jdk.graal.compiler.api.replacements.Fold;
4346

@@ -164,18 +167,28 @@ static boolean useCompressedLayout() {
164167
* @see AlignedHeapChunk#walkObjects
165168
*/
166169
@Uninterruptible(reason = CALLED_FROM_UNINTERRUPTIBLE_CODE, mayBeInlined = true)
167-
public static void walkObjects(AlignedHeapChunk.AlignedHeader chunkHeader, ObjectFixupVisitor visitor) {
168-
Pointer p = AlignedHeapChunk.getObjectsStart(chunkHeader);
170+
public static void walkObjects(AlignedHeapChunk.AlignedHeader chunk, ObjectFixupVisitor visitor) {
171+
Pointer p = AlignedHeapChunk.getObjectsStart(chunk);
169172
do {
170-
Pointer nextObjSeq = getNextObjectSeqAddress(p);
171-
Pointer objSeqEnd = p.add(getObjectSeqSize(p));
172-
assert objSeqEnd.belowOrEqual(HeapChunk.getTopPointer(chunkHeader));
173+
Pointer objSeq = p;
174+
Pointer nextObjSeq = getNextObjectSeqAddress(objSeq);
175+
Pointer objSeqNewAddress = getNewAddress(objSeq);
176+
AlignedHeapChunk.AlignedHeader objSeqNewChunk = AlignedHeapChunk.getEnclosingChunkFromObjectPointer(objSeqNewAddress);
177+
Pointer objSeqEnd = objSeq.add(getObjectSeqSize(objSeq));
178+
assert objSeqEnd.belowOrEqual(HeapChunk.getTopPointer(chunk));
173179
while (p.notEqual(objSeqEnd)) {
174180
assert p.belowThan(objSeqEnd);
175181
Object obj = p.toObject();
176182
UnsignedWord objSize = LayoutEncoding.getSizeFromObjectInlineInGC(obj);
177183
if (!visitor.visitObjectInline(obj)) {
178-
return;
184+
throw VMError.shouldNotReachHereAtRuntime();
185+
}
186+
if (objSeqNewChunk.getShouldSweepInsteadOfCompact()) {
187+
assert objSeqNewChunk.equal(chunk);
188+
} else {
189+
Pointer newAddress = objSeqNewAddress.add(p.subtract(objSeq));
190+
UnsignedWord offset = newAddress.subtract(AlignedHeapChunk.getObjectsStart(objSeqNewChunk));
191+
FirstObjectTable.setTableForObject(AlignedChunkRememberedSet.getFirstObjectTableStart(objSeqNewChunk), offset, offset.add(objSize));
179192
}
180193
p = p.add(objSize);
181194
}

substratevm/src/com.oracle.svm.core.genscavenge/src/com/oracle/svm/core/genscavenge/compacting/PlanningVisitor.java

Lines changed: 20 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -121,43 +121,12 @@ public boolean visitChunk(AlignedHeapChunk.AlignedHeader chunk) {
121121
}
122122

123123
objSeqSize = objSeqSize.add(objSize);
124-
if (!sweeping) {
125-
if (allocPointer.add(objSeqSize).aboveThan(AlignedHeapChunk.getObjectsEnd(allocChunk))) {
126-
/* Out of space, move to the start of the next chunk. */
127-
allocChunk = HeapChunk.getNext(allocChunk);
128-
assert allocChunk.isNonNull();
129-
assert !allocChunk.getShouldSweepInsteadOfCompact();
130-
allocPointer = AlignedHeapChunk.getObjectsStart(allocChunk);
131-
132-
/*
133-
* TODO: we should reset the FOT entries we already wrote in the last chunk
134-
* (but they should not be accessed, not even by heap verification)
135-
*/
136-
137-
/* Visit previous objects in sequence again to write new FOT entries. */
138-
FirstObjectTable.initializeTable(AlignedChunkRememberedSet.getFirstObjectTableStart(allocChunk), AlignedChunkRememberedSet.getFirstObjectTableSize());
139-
Pointer q = objSeq;
140-
while (q.notEqual(p)) {
141-
UnsignedWord offset = q.subtract(objSeq);
142-
UnsignedWord size = LayoutEncoding.getSizeFromObjectInlineInGC(q.toObject());
143-
FirstObjectTable.setTableForObject(AlignedChunkRememberedSet.getFirstObjectTableStart(allocChunk), offset, offset.add(size));
144-
q = q.add(size);
145-
}
146-
}
147-
148-
Pointer allocEndOffset = allocPointer.add(objSeqSize).subtract(AlignedHeapChunk.getObjectsStart(allocChunk));
149-
FirstObjectTable.setTableForObject(AlignedChunkRememberedSet.getFirstObjectTableStart(allocChunk), allocEndOffset.subtract(objSize), allocEndOffset);
150-
}
151124

152125
} else { // not marked, i.e. not alive and start of a gap of yet unknown size
153126
if (objSeqSize.notEqual(0)) { // end of an object sequence
127+
Pointer newAddress = sweeping ? objSeq : allocate(objSeqSize);
128+
ObjectMoveInfo.setNewAddress(objSeq, newAddress);
154129
ObjectMoveInfo.setObjectSeqSize(objSeq, objSeqSize);
155-
if (sweeping) {
156-
ObjectMoveInfo.setNewAddress(objSeq, objSeq);
157-
} else {
158-
ObjectMoveInfo.setNewAddress(objSeq, allocPointer);
159-
allocPointer = allocPointer.add(objSeqSize); // ensured enough memory above
160-
}
161130

162131
objSeqSize = WordFactory.zero();
163132

@@ -176,15 +145,10 @@ public boolean visitChunk(AlignedHeapChunk.AlignedHeader chunk) {
176145

177146
if (gapSize.notEqual(0)) {
178147
chunk.setTopOffset(chunk.getTopOffset().subtract(gapSize));
179-
180148
} else if (objSeqSize.notEqual(0)) {
149+
Pointer newAddress = sweeping ? objSeq : allocate(objSeqSize);
150+
ObjectMoveInfo.setNewAddress(objSeq, newAddress);
181151
ObjectMoveInfo.setObjectSeqSize(objSeq, objSeqSize);
182-
if (sweeping) {
183-
ObjectMoveInfo.setNewAddress(objSeq, objSeq);
184-
} else {
185-
ObjectMoveInfo.setNewAddress(objSeq, allocPointer);
186-
allocPointer = allocPointer.add(objSeqSize); // ensured enough memory above
187-
}
188152
}
189153

190154
if (sweeping) {
@@ -210,4 +174,20 @@ public boolean visitChunk(AlignedHeapChunk.AlignedHeader chunk) {
210174

211175
return true;
212176
}
177+
178+
private Pointer allocate(UnsignedWord size) {
179+
Pointer p = allocPointer;
180+
allocPointer = allocPointer.add(size);
181+
if (allocPointer.aboveThan(AlignedHeapChunk.getObjectsEnd(allocChunk))) {
182+
allocChunk = HeapChunk.getNext(allocChunk);
183+
assert allocChunk.isNonNull();
184+
assert !allocChunk.getShouldSweepInsteadOfCompact();
185+
186+
p = AlignedHeapChunk.getObjectsStart(allocChunk);
187+
allocPointer = p.add(size);
188+
189+
FirstObjectTable.initializeTable(AlignedChunkRememberedSet.getFirstObjectTableStart(allocChunk), AlignedChunkRememberedSet.getFirstObjectTableSize());
190+
}
191+
return p;
192+
}
213193
}

0 commit comments

Comments
 (0)