Skip to content

Commit a0b4e3d

Browse files
Review feedback.
1 parent cd1f983 commit a0b4e3d

File tree

9 files changed

+42
-62
lines changed

9 files changed

+42
-62
lines changed

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

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -355,8 +355,7 @@ public static boolean isAlignedHeader(UnsignedWord header) {
355355

356356
@Uninterruptible(reason = "Called from uninterruptible code.", mayBeInlined = true)
357357
public static boolean isUnalignedObject(Object obj) {
358-
ObjectHeader oh = Heap.getHeap().getObjectHeader();
359-
UnsignedWord header = oh.readHeaderFromObject(obj);
358+
UnsignedWord header = getObjectHeaderImpl().readHeaderFromObject(obj);
360359
return isUnalignedHeader(header);
361360
}
362361

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

368367
@Uninterruptible(reason = "Called from uninterruptible code.", mayBeInlined = true)
369368
public static void setRememberedSetBit(Object o) {
370-
ObjectHeader oh = Heap.getHeap().getObjectHeader();
371-
UnsignedWord oldHeader = oh.readHeaderFromObject(o);
369+
UnsignedWord oldHeader = getObjectHeaderImpl().readHeaderFromObject(o);
372370
assert oldHeader.and(FORWARDED_OR_MARKED2_BIT).equal(0);
373371
UnsignedWord newHeader = oldHeader.or(REMSET_OR_MARKED1_BIT);
374372
writeHeaderToObject(o, newHeader);
@@ -384,8 +382,7 @@ public static void setMarked(Object o) {
384382
if (!SerialGCOptions.useCompactingOldGen()) { // not guarantee(): always folds, prevent call
385383
throw VMError.shouldNotReachHere("Only for compacting GC.");
386384
}
387-
ObjectHeader oh = Heap.getHeap().getObjectHeader();
388-
UnsignedWord header = oh.readHeaderFromObject(o);
385+
UnsignedWord header = getObjectHeaderImpl().readHeaderFromObject(o);
389386
assert header.and(FORWARDED_OR_MARKED2_BIT).equal(0) : "forwarded or already marked";
390387
/*
391388
* The remembered bit is already set if the object was in the old generation before, or
@@ -396,16 +393,14 @@ public static void setMarked(Object o) {
396393

397394
@Uninterruptible(reason = "Called from uninterruptible code.", mayBeInlined = true)
398395
public static void unsetMarkedAndKeepRememberedSetBit(Object o) {
399-
ObjectHeader oh = Heap.getHeap().getObjectHeader();
400-
UnsignedWord header = oh.readHeaderFromObject(o);
396+
UnsignedWord header = getObjectHeaderImpl().readHeaderFromObject(o);
401397
assert isMarkedHeader(header);
402398
writeHeaderToObject(o, header.and(FORWARDED_OR_MARKED2_BIT.not()));
403399
}
404400

405401
@Uninterruptible(reason = "Called from uninterruptible code.", mayBeInlined = true)
406402
public static boolean isMarked(Object o) {
407-
ObjectHeader oh = Heap.getHeap().getObjectHeader();
408-
return isMarkedHeader(oh.readHeaderFromObject(o));
403+
return isMarkedHeader(getObjectHeaderImpl().readHeaderFromObject(o));
409404
}
410405

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

419414
@Uninterruptible(reason = "Called from uninterruptible code.", mayBeInlined = true)
420415
static boolean isPointerToForwardedObject(Pointer p) {
421-
ObjectHeader oh = Heap.getHeap().getObjectHeader();
422-
Word header = oh.readHeaderFromPointer(p);
416+
Word header = getObjectHeaderImpl().readHeaderFromPointer(p);
423417
return isForwardedHeader(header);
424418
}
425419

substratevm/src/com.oracle.svm.core.genscavenge/src/com/oracle/svm/core/genscavenge/remset/CardTableBasedRememberedSet.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,8 @@ public void dirtyCardIfNecessary(Object holderObject, Object object) {
188188
@Override
189189
@Uninterruptible(reason = CALLED_FROM_UNINTERRUPTIBLE_CODE, mayBeInlined = true)
190190
public void dirtyAllReferencesIfNecessary(Object obj) {
191-
Word header = ObjectHeader.readHeaderFromObject(obj);
191+
ObjectHeader oh = Heap.getHeap().getObjectHeader();
192+
Word header = oh.readHeaderFromObject(obj);
192193
if (RememberedSet.get().hasRememberedSet(header) && mayContainReferences(obj)) {
193194
ForcedSerialPostWriteBarrier.force(OffsetAddressNode.address(obj, 0), false);
194195
}

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/graal/meta/SubstrateBasicLoweringProvider.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -260,7 +260,7 @@ protected ValueNode createReadHub(StructuredGraph graph, ValueNode object, Lower
260260
int hubOffset = ol.getHubOffset();
261261
int bytesToRead = ol.getHubSize();
262262
long reservedHubBitsMask = oh.getReservedHubBitsMask();
263-
if (hubOffset > 0 && hubOffset + ol.getHubSize() <= Long.BYTES && target.arch.getByteOrder() == ByteOrder.LITTLE_ENDIAN) {
263+
if (hubOffset == Integer.BYTES && hubOffset + ol.getHubSize() == Long.BYTES && target.arch.getByteOrder() == ByteOrder.LITTLE_ENDIAN) {
264264
/* Prepare to emit a 64-bit read at offset 0 (reduces the code size). */
265265
hubOffset = 0;
266266
bytesToRead = Long.BYTES;

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/hub/DynamicHub.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -572,12 +572,12 @@ public void setClassInitializationInfo(ClassInitializationInfo classInitializati
572572
@Platforms(Platform.HOSTED_ONLY.class)
573573
public void setSharedData(int layoutEncoding, int monitorOffset, int identityHashOffset, long referenceMapIndex,
574574
boolean isInstantiated) {
575-
VMError.guarantee(monitorOffset == (char) monitorOffset, "Class %s has an invalid monitor field offset. Most likely, its objects are larger than supported.", name);
575+
VMError.guarantee(monitorOffset == -1 || monitorOffset == (char) monitorOffset, "Class %s has an invalid monitor field offset. Most likely, its objects are larger than supported.", name);
576576
VMError.guarantee(identityHashOffset == -1 || identityHashOffset == (char) identityHashOffset,
577577
"Class %s has an invalid identity hash code field offset. Most likely, its objects are larger than supported.", name);
578578

579579
this.layoutEncoding = layoutEncoding;
580-
this.monitorOffset = (char) monitorOffset;
580+
this.monitorOffset = monitorOffset == -1 ? 0 : (char) monitorOffset;
581581
this.identityHashOffset = identityHashOffset == -1 ? 0 : (char) identityHashOffset;
582582

583583
if ((int) referenceMapIndex != referenceMapIndex) {

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/identityhashcode/IdentityHashCodeSupport.java

Lines changed: 9 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,8 @@
2626

2727
import static com.oracle.svm.core.Uninterruptible.CALLED_FROM_UNINTERRUPTIBLE_CODE;
2828

29-
import java.nio.ByteBuffer;
3029
import java.util.SplittableRandom;
3130

32-
import org.graalvm.nativeimage.Platform;
33-
import org.graalvm.nativeimage.Platforms;
3431
import org.graalvm.word.LocationIdentity;
3532
import org.graalvm.word.Pointer;
3633
import org.graalvm.word.SignedWord;
@@ -44,6 +41,7 @@
4441
import com.oracle.svm.core.snippets.SubstrateForeignCallTarget;
4542
import com.oracle.svm.core.threadlocal.FastThreadLocalFactory;
4643
import com.oracle.svm.core.threadlocal.FastThreadLocalObject;
44+
import com.oracle.svm.core.util.VMError;
4745

4846
import jdk.graal.compiler.api.directives.GraalDirectives;
4947
import jdk.graal.compiler.nodes.NamedLocationIdentity;
@@ -175,6 +173,9 @@ public static int readIdentityHashCodeFromField(Object obj) {
175173

176174
@SubstrateForeignCallTarget(stubCallingConvention = false)
177175
public static int generateIdentityHashCode(Object obj) {
176+
/* The guarantee makes the code a bit smaller as obj is non-null afterward. */
177+
VMError.guarantee(obj != null);
178+
178179
ObjectLayout ol = ConfigurationValues.getObjectLayout();
179180
assert !ol.isIdentityHashFieldOptional();
180181

@@ -193,7 +194,7 @@ public static int generateIdentityHashCode(Object obj) {
193194
int existingValue;
194195
int newValue;
195196
do {
196-
existingValue = Unsafe.getUnsafe().getIntVolatile(obj, offset);
197+
existingValue = Unsafe.getUnsafe().getIntOpaque(obj, offset);
197198
int existingHash = extractIdentityHashCode(existingValue, numBits, shift);
198199
if (existingHash != 0) {
199200
return existingHash;
@@ -205,7 +206,7 @@ public static int generateIdentityHashCode(Object obj) {
205206
long existingValue;
206207
long newValue;
207208
do {
208-
existingValue = Unsafe.getUnsafe().getLongVolatile(obj, offset);
209+
existingValue = Unsafe.getUnsafe().getLongOpaque(obj, offset);
209210
int existingHash = extractIdentityHashCode(existingValue, numBits, shift);
210211
if (existingHash != 0) {
211212
return existingHash;
@@ -219,7 +220,7 @@ public static int generateIdentityHashCode(Object obj) {
219220
}
220221

221222
/** This method may only be called after the hub pointer was already written. */
222-
public static void writeIdentityHashCodeToAuxImage(Pointer hashCodePtr, int value) {
223+
public static void writeIdentityHashCodeToImageHeap(Pointer hashCodePtr, int value) {
223224
ObjectLayout ol = ConfigurationValues.getObjectLayout();
224225
int numBits = ol.getIdentityHashCodeNumBits();
225226
int shift = ol.getIdentityHashCodeShift();
@@ -238,27 +239,6 @@ public static void writeIdentityHashCodeToAuxImage(Pointer hashCodePtr, int valu
238239
}
239240
}
240241

241-
/** This method may only be called after the object header was already written. */
242-
@Platforms(Platform.HOSTED_ONLY.class)
243-
public static void writeIdentityHashCodeToImageHeap(ByteBuffer buffer, int hashCodePos, int value) {
244-
ObjectLayout ol = ConfigurationValues.getObjectLayout();
245-
int numBits = ol.getIdentityHashCodeNumBits();
246-
int shift = ol.getIdentityHashCodeShift();
247-
long mask = ol.getIdentityHashCodeMask();
248-
249-
int totalBits = numBits + shift;
250-
if (totalBits <= Integer.SIZE) {
251-
int oldValue = buffer.getInt(hashCodePos);
252-
assertIdentityHashCodeZero(oldValue, mask);
253-
buffer.putInt(hashCodePos, encodeIdentityHashCode(oldValue, value, shift));
254-
} else {
255-
assert totalBits <= Long.SIZE;
256-
long oldValue = buffer.getLong(hashCodePos);
257-
assertIdentityHashCodeZero(oldValue, mask);
258-
buffer.putLong(hashCodePos, encodeIdentityHashCode(oldValue, value, shift));
259-
}
260-
}
261-
262242
@Uninterruptible(reason = CALLED_FROM_UNINTERRUPTIBLE_CODE, mayBeInlined = true)
263243
private static int extractIdentityHashCode(int value, int numBits, int shift) {
264244
int left = Integer.SIZE - numBits - shift;
@@ -300,8 +280,8 @@ private static void assertHasIdentityHashField(Object obj) {
300280

301281
/**
302282
* Note that the result of this method is prone to race conditions. All races that can happen
303-
* don't matter for the current caller though (we only want to identify objects that definitely
304-
* don't have an identity hash code field).
283+
* don't matter for the current callers though (we only want to know if the given object
284+
* definitely has an identity hash code field - once it has one, it won't be taken away).
305285
*/
306286
@Uninterruptible(reason = CALLED_FROM_UNINTERRUPTIBLE_CODE, mayBeInlined = true)
307287
private static boolean hasIdentityHashField(Object obj) {

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -502,7 +502,7 @@ private void addObjectToImageHeap(final JavaConstant constant, boolean immutable
502502
if (type.isInstanceClass()) {
503503
final HostedInstanceClass clazz = (HostedInstanceClass) type;
504504
// If the type has a monitor field, it has a reference field that is written.
505-
if (clazz.getMonitorFieldOffset() != 0) {
505+
if (clazz.getMonitorFieldOffset() >= 0) {
506506
written = true;
507507
references = true;
508508
// also not immutable: users of registerAsImmutable() must take precautions

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

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@
5555
import com.oracle.svm.core.image.ImageHeapLayoutInfo;
5656
import com.oracle.svm.core.imagelayer.ImageLayerBuildingSupport;
5757
import com.oracle.svm.core.meta.MethodPointer;
58+
import com.oracle.svm.core.util.HostedByteBufferPointer;
5859
import com.oracle.svm.core.util.VMError;
5960
import com.oracle.svm.hosted.DeadlockWatchdog;
6061
import com.oracle.svm.hosted.code.CEntryPointLiteralFeature;
@@ -286,13 +287,7 @@ private void writeHubPointer(RelocatableBuffer buffer, int index, ObjectInfo obj
286287
if (NativeImageHeap.useHeapBase()) {
287288
long targetOffset = hubInfo.getOffset();
288289
long encoding = objectHeader.encodeHubPointerForImageHeap(obj, targetOffset);
289-
290-
if (hubSize == Long.BYTES) {
291-
buffer.getByteBuffer().putLong(index, encoding);
292-
} else {
293-
assert hubSize == Integer.BYTES;
294-
buffer.getByteBuffer().putInt(index, NumUtil.safeToUInt(encoding));
295-
}
290+
writeValue(buffer, index, encoding, hubSize);
296291
} else {
297292
assert hubSize == referenceSize();
298293
// The address of the DynamicHub target will be added by the link editor.
@@ -361,12 +356,16 @@ private static void writePrimitive(RelocatableBuffer buffer, int index, JavaCons
361356
}
362357

363358
private void writeReferenceValue(RelocatableBuffer buffer, int index, long value) {
364-
if (referenceSize() == Long.BYTES) {
359+
writeValue(buffer, index, value, referenceSize());
360+
}
361+
362+
private static void writeValue(RelocatableBuffer buffer, int index, long value, int size) {
363+
if (size == Long.BYTES) {
365364
buffer.getByteBuffer().putLong(index, value);
366-
} else if (referenceSize() == Integer.BYTES) {
365+
} else if (size == Integer.BYTES) {
367366
buffer.getByteBuffer().putInt(index, NumUtil.safeToUInt(value));
368367
} else {
369-
throw shouldNotReachHere("Unsupported reference size: " + referenceSize());
368+
throw shouldNotReachHere("Unsupported value size: " + size);
370369
}
371370
}
372371

@@ -468,15 +467,17 @@ private void writeObject(ObjectInfo info, RelocatableBuffer buffer) {
468467

469468
/* Write the identity hashcode */
470469
assert idHashOffset >= 0;
471-
IdentityHashCodeSupport.writeIdentityHashCodeToImageHeap(bufferBytes, getIndexInBuffer(info, idHashOffset), info.getIdentityHashCode());
470+
HostedByteBufferPointer identityHashPtr = new HostedByteBufferPointer(bufferBytes, getIndexInBuffer(info, idHashOffset));
471+
IdentityHashCodeSupport.writeIdentityHashCodeToImageHeap(identityHashPtr, info.getIdentityHashCode());
472472
} else if (clazz.isArray()) {
473473

474474
JavaKind kind = clazz.getComponentType().getStorageKind();
475475
ImageHeapConstant constant = info.getConstant();
476476

477477
int length = heap.hConstantReflection.readArrayLength(constant);
478478
bufferBytes.putInt(getIndexInBuffer(info, objectLayout.getArrayLengthOffset()), length);
479-
IdentityHashCodeSupport.writeIdentityHashCodeToImageHeap(bufferBytes, getIndexInBuffer(info, objectLayout.getArrayIdentityHashOffset(kind, length)), info.getIdentityHashCode());
479+
HostedByteBufferPointer identityHashPtr = getHashCodePtr(info, bufferBytes, objectLayout, kind, length);
480+
IdentityHashCodeSupport.writeIdentityHashCodeToImageHeap(identityHashPtr, info.getIdentityHashCode());
480481

481482
if (clazz.getComponentType().isPrimitive()) {
482483
ImageHeapPrimitiveArray imageHeapArray = (ImageHeapPrimitiveArray) constant;
@@ -492,6 +493,10 @@ private void writeObject(ObjectInfo info, RelocatableBuffer buffer) {
492493
}
493494
}
494495

496+
private HostedByteBufferPointer getHashCodePtr(ObjectInfo info, ByteBuffer bufferBytes, ObjectLayout objectLayout, JavaKind kind, int length) {
497+
return new HostedByteBufferPointer(bufferBytes, getIndexInBuffer(info, objectLayout.getArrayIdentityHashOffset(kind, length)));
498+
}
499+
495500
private int getIndexInBuffer(ObjectInfo objInfo, long offset) {
496501
long index = objInfo.getOffset() + offset - heapLayout.getStartOffset();
497502
return NumUtil.safeToInt(index);

substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/meta/HostedInstanceClass.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ public class HostedInstanceClass extends HostedClass {
3939
protected int afterFieldsOffset;
4040
protected int instanceSize;
4141
protected boolean monitorFieldNeeded = false;
42-
protected int monitorFieldOffset = 0;
42+
protected int monitorFieldOffset = -1;
4343
protected int identityHashOffset = -1;
4444

4545
public HostedInstanceClass(HostedUniverse universe, AnalysisType wrapped, JavaKind kind, JavaKind storageKind, HostedClass superClass, HostedInterface[] interfaces) {
@@ -127,8 +127,8 @@ public int getMonitorFieldOffset() {
127127
}
128128

129129
public void setMonitorFieldOffset(int offset) {
130-
assert this.monitorFieldOffset == 0 : "setting monitor field offset twice";
131-
assert offset > 0;
130+
assert this.monitorFieldOffset == -1 : "setting monitor field offset twice";
131+
assert offset >= 0;
132132
this.monitorFieldOffset = offset;
133133
}
134134

substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/meta/UniverseBuilder.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -989,7 +989,7 @@ private static ReferenceMapEncoder.Input createReferenceMap(HostedType type) {
989989
* If the instance type has a monitor field, add it to the reference map.
990990
*/
991991
final int monitorOffset = instanceClass.getMonitorFieldOffset();
992-
if (monitorOffset != 0) {
992+
if (monitorOffset >= 0) {
993993
referenceMap.markReferenceAtOffset(monitorOffset, true);
994994
}
995995
}

0 commit comments

Comments
 (0)