Skip to content

Commit c8981cd

Browse files
Refactor identity hashcode access.
1 parent ad521f0 commit c8981cd

25 files changed

+377
-147
lines changed

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

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@
4848
import com.oracle.svm.core.genscavenge.remset.BrickTable;
4949
import com.oracle.svm.core.genscavenge.remset.RememberedSet;
5050
import com.oracle.svm.core.graal.RuntimeCompilation;
51+
import com.oracle.svm.core.heap.Heap;
5152
import com.oracle.svm.core.heap.ObjectHeader;
5253
import com.oracle.svm.core.heap.ObjectVisitor;
5354
import com.oracle.svm.core.log.Log;
@@ -179,7 +180,8 @@ public Object promoteAlignedObject(Object original, AlignedHeapChunk.AlignedHead
179180
return space.copyAlignedObject(original, originalSpace);
180181
}
181182
assert originalSpace == space;
182-
Word header = ObjectHeader.readHeaderFromObject(original);
183+
ObjectHeader oh = Heap.getHeap().getObjectHeader();
184+
Word header = oh.readHeaderFromObject(original);
183185
if (ObjectHeaderImpl.isMarkedHeader(header)) {
184186
return original;
185187
}
@@ -193,7 +195,7 @@ public Object promoteAlignedObject(Object original, AlignedHeapChunk.AlignedHead
193195
* object's size. The easiest way to handle this is to copy the object.
194196
*/
195197
result = space.copyAlignedObject(original, originalSpace);
196-
assert !ObjectHeaderImpl.hasIdentityHashFromAddressInline(ObjectHeader.readHeaderFromObject(result));
198+
assert !ObjectHeaderImpl.hasIdentityHashFromAddressInline(oh.readHeaderFromObject(result));
197199
}
198200
ObjectHeaderImpl.setMarked(result);
199201
markStack.push(result);

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

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@
3131
import com.oracle.svm.core.AlwaysInline;
3232
import com.oracle.svm.core.Uninterruptible;
3333
import com.oracle.svm.core.genscavenge.remset.RememberedSet;
34-
import com.oracle.svm.core.heap.ObjectHeader;
3534
import com.oracle.svm.core.heap.ObjectReferenceVisitor;
3635
import com.oracle.svm.core.heap.ReferenceAccess;
3736
import com.oracle.svm.core.hub.LayoutEncoding;
@@ -91,7 +90,7 @@ public boolean visitObjectReferenceInline(Pointer objRef, int innerOffset, boole
9190
// This is the most expensive check as it accesses the heap fairly randomly, which results
9291
// in a lot of cache misses.
9392
ObjectHeaderImpl ohi = ObjectHeaderImpl.getObjectHeaderImpl();
94-
Word header = ObjectHeader.readHeaderFromPointer(p);
93+
Word header = ohi.readHeaderFromPointer(p);
9594
if (GCImpl.getGCImpl().isCompleteCollection() || !RememberedSet.get().hasRememberedSet(header)) {
9695

9796
if (ObjectHeaderImpl.isForwardedHeader(header)) {

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

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
import com.oracle.svm.core.genscavenge.AlignedHeapChunk.AlignedHeader;
3636
import com.oracle.svm.core.genscavenge.UnalignedHeapChunk.UnalignedHeader;
3737
import com.oracle.svm.core.genscavenge.remset.RememberedSet;
38+
import com.oracle.svm.core.heap.Heap;
3839
import com.oracle.svm.core.heap.ObjectHeader;
3940
import com.oracle.svm.core.heap.ObjectReferenceVisitor;
4041
import com.oracle.svm.core.heap.ObjectVisitor;
@@ -241,7 +242,8 @@ private static boolean verifyObject(Object obj, AlignedHeader aChunk, UnalignedH
241242
return false;
242243
}
243244

244-
Word header = ObjectHeader.readHeaderFromPointer(ptr);
245+
ObjectHeader oh = Heap.getHeap().getObjectHeader();
246+
Word header = oh.readHeaderFromPointer(ptr);
245247
if (ObjectHeaderImpl.isProducedHeapChunkZapped(header) || ObjectHeaderImpl.isConsumedHeapChunkZapped(header)) {
246248
Log.log().string("Object ").zhex(ptr).string(" has a zapped header: ").zhex(header).newline();
247249
return false;
@@ -352,7 +354,8 @@ private static boolean verifyReference(Object parentObject, Pointer reference, P
352354
return false;
353355
}
354356

355-
Word header = ObjectHeader.readHeaderFromPointer(referencedObject);
357+
ObjectHeader oh = Heap.getHeap().getObjectHeader();
358+
Word header = oh.readHeaderFromPointer(referencedObject);
356359
if (!ObjectHeaderImpl.getObjectHeaderImpl().isEncodedObjectHeader(header)) {
357360
Log.log().string("Object reference at ").zhex(reference).string(" does not point to a Java object or the object header of the Java object is invalid: ").zhex(referencedObject)
358361
.string(". ");

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

Lines changed: 30 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,24 @@ protected void initializeObjectHeader(Pointer objectPointer, Word encodedHub, bo
156156
}
157157
}
158158

159+
@Uninterruptible(reason = "Called from uninterruptible code.", mayBeInlined = true)
160+
@Override
161+
public Word readHeaderFromPointer(Pointer objectPointer) {
162+
if (getReferenceSize() == Integer.BYTES) {
163+
return Word.unsigned(objectPointer.readInt(getHubOffset()));
164+
}
165+
return objectPointer.readWord(getHubOffset());
166+
}
167+
168+
@Uninterruptible(reason = "Called from uninterruptible code.", mayBeInlined = true)
169+
@Override
170+
public Word readHeaderFromObject(Object o) {
171+
if (getReferenceSize() == Integer.BYTES) {
172+
return Word.unsigned(ObjectAccess.readInt(o, getHubOffset()));
173+
}
174+
return ObjectAccess.readWord(o, getHubOffset());
175+
}
176+
159177
@Uninterruptible(reason = "Called from uninterruptible code.", mayBeInlined = true)
160178
@Override
161179
public boolean hasOptionalIdentityHashField(Word header) {
@@ -337,7 +355,8 @@ public static boolean isAlignedHeader(UnsignedWord header) {
337355

338356
@Uninterruptible(reason = "Called from uninterruptible code.", mayBeInlined = true)
339357
public static boolean isUnalignedObject(Object obj) {
340-
UnsignedWord header = readHeaderFromObject(obj);
358+
ObjectHeader oh = Heap.getHeap().getObjectHeader();
359+
UnsignedWord header = oh.readHeaderFromObject(obj);
341360
return isUnalignedHeader(header);
342361
}
343362

@@ -348,7 +367,8 @@ public static boolean isUnalignedHeader(UnsignedWord header) {
348367

349368
@Uninterruptible(reason = "Called from uninterruptible code.", mayBeInlined = true)
350369
public static void setRememberedSetBit(Object o) {
351-
UnsignedWord oldHeader = readHeaderFromObject(o);
370+
ObjectHeader oh = Heap.getHeap().getObjectHeader();
371+
UnsignedWord oldHeader = oh.readHeaderFromObject(o);
352372
assert oldHeader.and(FORWARDED_OR_MARKED2_BIT).equal(0);
353373
UnsignedWord newHeader = oldHeader.or(REMSET_OR_MARKED1_BIT);
354374
writeHeaderToObject(o, newHeader);
@@ -364,7 +384,8 @@ public static void setMarked(Object o) {
364384
if (!SerialGCOptions.useCompactingOldGen()) { // not guarantee(): always folds, prevent call
365385
throw VMError.shouldNotReachHere("Only for compacting GC.");
366386
}
367-
UnsignedWord header = readHeaderFromObject(o);
387+
ObjectHeader oh = Heap.getHeap().getObjectHeader();
388+
UnsignedWord header = oh.readHeaderFromObject(o);
368389
assert header.and(FORWARDED_OR_MARKED2_BIT).equal(0) : "forwarded or already marked";
369390
/*
370391
* The remembered bit is already set if the object was in the old generation before, or
@@ -375,14 +396,16 @@ public static void setMarked(Object o) {
375396

376397
@Uninterruptible(reason = "Called from uninterruptible code.", mayBeInlined = true)
377398
public static void unsetMarkedAndKeepRememberedSetBit(Object o) {
378-
UnsignedWord header = readHeaderFromObject(o);
399+
ObjectHeader oh = Heap.getHeap().getObjectHeader();
400+
UnsignedWord header = oh.readHeaderFromObject(o);
379401
assert isMarkedHeader(header);
380402
writeHeaderToObject(o, header.and(FORWARDED_OR_MARKED2_BIT.not()));
381403
}
382404

383405
@Uninterruptible(reason = "Called from uninterruptible code.", mayBeInlined = true)
384406
public static boolean isMarked(Object o) {
385-
return isMarkedHeader(readHeaderFromObject(o));
407+
ObjectHeader oh = Heap.getHeap().getObjectHeader();
408+
return isMarkedHeader(oh.readHeaderFromObject(o));
386409
}
387410

388411
@Uninterruptible(reason = "Called from uninterruptible code.", mayBeInlined = true)
@@ -395,7 +418,8 @@ public static boolean isMarkedHeader(UnsignedWord header) {
395418

396419
@Uninterruptible(reason = "Called from uninterruptible code.", mayBeInlined = true)
397420
static boolean isPointerToForwardedObject(Pointer p) {
398-
Word header = readHeaderFromPointer(p);
421+
ObjectHeader oh = Heap.getHeap().getObjectHeader();
422+
Word header = oh.readHeaderFromPointer(p);
399423
return isForwardedHeader(header);
400424
}
401425

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

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@
3131
import java.lang.ref.ReferenceQueue;
3232
import java.lang.ref.SoftReference;
3333

34-
import jdk.graal.compiler.word.Word;
3534
import org.graalvm.word.Pointer;
3635
import org.graalvm.word.UnsignedWord;
3736

@@ -47,6 +46,8 @@
4746
import com.oracle.svm.core.thread.VMOperation;
4847
import com.oracle.svm.core.util.UnsignedUtils;
4948

49+
import jdk.graal.compiler.word.Word;
50+
5051
/** Discovers and handles {@link Reference} objects during garbage collection. */
5152
final class ReferenceObjectProcessing {
5253
/** Head of the linked list of discovered references that need to be revisited. */
@@ -230,7 +231,7 @@ private static boolean processRememberedRef(Reference<?> dr) {
230231
@Uninterruptible(reason = "Called from uninterruptible code.", mayBeInlined = true)
231232
private static boolean maybeUpdateForwardedReference(Reference<?> dr, Pointer referentAddr) {
232233
ObjectHeaderImpl ohi = ObjectHeaderImpl.getObjectHeaderImpl();
233-
UnsignedWord header = ObjectHeader.readHeaderFromPointer(referentAddr);
234+
UnsignedWord header = ohi.readHeaderFromPointer(referentAddr);
234235
if (ObjectHeaderImpl.isForwardedHeader(header)) {
235236
Object forwardedObj = ohi.getForwardedObject(referentAddr);
236237
ReferenceInternals.setReferent(dr, forwardedObj);
@@ -261,7 +262,8 @@ static void updateForwardedRefs() {
261262

262263
Pointer refPointer = ReferenceInternals.getReferentPointer(current);
263264
if (!maybeUpdateForwardedReference(current, refPointer)) {
264-
UnsignedWord header = ObjectHeader.readHeaderFromPointer(refPointer);
265+
ObjectHeader oh = Heap.getHeap().getObjectHeader();
266+
UnsignedWord header = oh.readHeaderFromPointer(refPointer);
265267
if (!ObjectHeaderImpl.isMarkedHeader(header)) {
266268
ReferenceInternals.setReferent(current, null);
267269
}

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

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@
2828
import org.graalvm.nativeimage.Platforms;
2929
import org.graalvm.word.Pointer;
3030

31-
import com.oracle.svm.core.heap.ObjectHeader;
3231
import com.oracle.svm.core.heap.ObjectReferenceVisitor;
3332
import com.oracle.svm.core.heap.ReferenceAccess;
3433
import com.oracle.svm.core.heap.RuntimeCodeCacheCleaner;
@@ -71,7 +70,7 @@ public static boolean isReachable(Pointer ptrToObj) {
7170
}
7271

7372
ObjectHeaderImpl ohi = ObjectHeaderImpl.getObjectHeaderImpl();
74-
Word header = ObjectHeader.readHeaderFromPointer(ptrToObj);
73+
Word header = ohi.readHeaderFromPointer(ptrToObj);
7574
if (ObjectHeaderImpl.isForwardedHeader(header)) {
7675
return true;
7776
}

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
import com.oracle.svm.core.config.ConfigurationValues;
4141
import com.oracle.svm.core.genscavenge.GCImpl.ChunkReleaser;
4242
import com.oracle.svm.core.genscavenge.remset.RememberedSet;
43+
import com.oracle.svm.core.heap.Heap;
4344
import com.oracle.svm.core.heap.ObjectHeader;
4445
import com.oracle.svm.core.heap.ObjectVisitor;
4546
import com.oracle.svm.core.hub.LayoutEncoding;
@@ -416,7 +417,8 @@ private Object copyAlignedObject(Object originalObj) {
416417
UnsignedWord copySize = originalSize;
417418
boolean addIdentityHashField = false;
418419
if (ConfigurationValues.getObjectLayout().isIdentityHashFieldOptional()) {
419-
Word header = ObjectHeader.readHeaderFromObject(originalObj);
420+
ObjectHeader oh = Heap.getHeap().getObjectHeader();
421+
Word header = oh.readHeaderFromObject(originalObj);
420422
if (probability(SLOW_PATH_PROBABILITY, ObjectHeaderImpl.hasIdentityHashFromAddressInline(header))) {
421423
addIdentityHashField = true;
422424
copySize = LayoutEncoding.getSizeFromObjectInlineInGC(originalObj, true);

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
import com.oracle.svm.core.AlwaysInline;
3434
import com.oracle.svm.core.Uninterruptible;
3535
import com.oracle.svm.core.genscavenge.GCImpl.ChunkReleaser;
36+
import com.oracle.svm.core.heap.Heap;
3637
import com.oracle.svm.core.heap.ObjectHeader;
3738
import com.oracle.svm.core.heap.ObjectVisitor;
3839
import com.oracle.svm.core.log.Log;
@@ -262,7 +263,8 @@ public boolean contains(Object object) {
262263
return HeapChunk.getSpace(HeapChunk.getEnclosingHeapChunk(object)).isYoungSpace();
263264
}
264265
// Only objects in the young generation have no remembered set
265-
UnsignedWord header = ObjectHeader.readHeaderFromObject(object);
266+
ObjectHeader oh = Heap.getHeap().getObjectHeader();
267+
UnsignedWord header = oh.readHeaderFromObject(object);
266268
boolean young = !ObjectHeaderImpl.hasRememberedSet(header);
267269
assert young == HeapChunk.getSpace(HeapChunk.getEnclosingHeapChunk(object)).isYoungSpace();
268270
return young;

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@
3535
import com.oracle.svm.core.genscavenge.ObjectHeaderImpl;
3636
import com.oracle.svm.core.genscavenge.Space;
3737
import com.oracle.svm.core.genscavenge.remset.BrickTable;
38+
import com.oracle.svm.core.heap.Heap;
39+
import com.oracle.svm.core.heap.ObjectHeader;
3840
import com.oracle.svm.core.hub.LayoutEncoding;
3941

4042
import jdk.graal.compiler.word.Word;
@@ -77,7 +79,8 @@ public boolean visitChunk(AlignedHeapChunk.AlignedHeader chunk) {
7779

7880
Pointer p = objSeq;
7981
while (p.belowThan(initialTop)) {
80-
Word header = ObjectHeaderImpl.readHeaderFromPointer(p);
82+
ObjectHeader oh = Heap.getHeap().getObjectHeader();
83+
Word header = oh.readHeaderFromPointer(p);
8184

8285
UnsignedWord objSize;
8386
if (ObjectHeaderImpl.isForwardedHeader(header)) {

substratevm/src/com.oracle.svm.core.genscavenge/src/com/oracle/svm/core/genscavenge/graal/BarrierSnippets.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
import com.oracle.svm.core.graal.meta.SubstrateForeignCallsProvider;
3939
import com.oracle.svm.core.graal.snippets.NodeLoweringProvider;
4040
import com.oracle.svm.core.graal.snippets.SubstrateTemplates;
41+
import com.oracle.svm.core.heap.Heap;
4142
import com.oracle.svm.core.heap.ObjectHeader;
4243
import com.oracle.svm.core.heap.StoredContinuation;
4344
import com.oracle.svm.core.snippets.SnippetRuntime;
@@ -98,7 +99,8 @@ public static void registerForeignCalls(SubstrateForeignCallsProvider provider)
9899
@SubstrateForeignCallTarget(stubCallingConvention = false, fullyUninterruptible = true)
99100
@Uninterruptible(reason = "Called from uninterruptible code.", mayBeInlined = true)
100101
public static void postWriteBarrierStub(Object object) {
101-
UnsignedWord objectHeader = ObjectHeader.readHeaderFromObject(object);
102+
ObjectHeader oh = Heap.getHeap().getObjectHeader();
103+
UnsignedWord objectHeader = oh.readHeaderFromObject(object);
102104
if (ObjectHeaderImpl.isUnalignedHeader(objectHeader)) {
103105
RememberedSet.get().dirtyCardForUnalignedObject(object, false);
104106
} else {
@@ -112,7 +114,8 @@ public static void postWriteBarrierStub(Object object) {
112114
@Snippet
113115
public static void postWriteBarrierSnippet(Object object, @ConstantParameter boolean shouldOutline, @ConstantParameter boolean alwaysAlignedChunk, @ConstantParameter boolean verifyOnly) {
114116
Object fixedObject = FixedValueAnchorNode.getObject(object);
115-
UnsignedWord objectHeader = ObjectHeader.readHeaderFromObject(fixedObject);
117+
ObjectHeader oh = Heap.getHeap().getObjectHeader();
118+
UnsignedWord objectHeader = oh.readHeaderFromObject(fixedObject);
116119

117120
if (SerialGCOptions.VerifyWriteBarriers.getValue() && alwaysAlignedChunk) {
118121
/*

0 commit comments

Comments
 (0)