Skip to content

Commit 7edc294

Browse files
committed
[GR-49879] Backport to 23.0: Add an option to artificially increase the header size.
PullRequest: graal/16103
2 parents ed0e1de + 2abe819 commit 7edc294

File tree

3 files changed

+26
-12
lines changed

3 files changed

+26
-12
lines changed

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/SubstrateOptions.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -452,6 +452,16 @@ protected void onValueUpdate(EconomicMap<OptionKey<?>, Object> values, Boolean o
452452
@Option(help = "How many bytes to pad fields and classes marked @Contended with.") //
453453
public static final HostedOptionKey<Integer> ContendedPaddingWidth = new HostedOptionKey<>(128);
454454

455+
@Option(help = "Add additional header bytes to each object, for diagnostic purposes.", type = OptionType.Debug) //
456+
public static final HostedOptionKey<Integer> AdditionalHeaderBytes = new HostedOptionKey<>(0, SubstrateOptions::validateAdditionalHeaderBytes);
457+
458+
private static void validateAdditionalHeaderBytes(HostedOptionKey<Integer> optionKey) {
459+
int value = optionKey.getValue();
460+
if (value < 0 || value % 4 != 0) {
461+
throw UserError.abort("The option '%s' must be 0 or a multiple of 4.", optionKey.getName());
462+
}
463+
}
464+
455465
/*
456466
* Isolate tear down options.
457467
*/

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/config/ObjectLayout.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -58,10 +58,11 @@ public final class ObjectLayout {
5858

5959
public ObjectLayout(SubstrateTargetDescription target, int referenceSize, int objectAlignment, int hubOffset,
6060
int firstFieldOffset, int arrayLengthOffset, int arrayBaseOffset, int fixedIdentityHashOffset) {
61-
assert CodeUtil.isPowerOf2(referenceSize);
62-
assert CodeUtil.isPowerOf2(objectAlignment);
63-
assert hubOffset < firstFieldOffset && hubOffset < arrayLengthOffset;
64-
assert fixedIdentityHashOffset == -1 || (fixedIdentityHashOffset > 0 && fixedIdentityHashOffset < arrayLengthOffset);
61+
assert CodeUtil.isPowerOf2(referenceSize) : referenceSize;
62+
assert CodeUtil.isPowerOf2(objectAlignment) : objectAlignment;
63+
assert arrayLengthOffset % Integer.BYTES == 0;
64+
assert hubOffset < firstFieldOffset && hubOffset < arrayLengthOffset : hubOffset;
65+
assert fixedIdentityHashOffset == -1 || (fixedIdentityHashOffset > 0 && fixedIdentityHashOffset < arrayLengthOffset) : fixedIdentityHashOffset;
6566

6667
this.target = target;
6768
this.referenceSize = referenceSize;

substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/HostedConfiguration.java

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -140,13 +140,13 @@ public static ObjectLayout createObjectLayout() {
140140
public static ObjectLayout createObjectLayout(JavaKind referenceKind, boolean disableOptionalIdentityHash) {
141141
SubstrateTargetDescription target = ConfigurationValues.getTarget();
142142
int referenceSize = target.arch.getPlatformKind(referenceKind).getSizeInBytes();
143-
int headerSize = referenceSize;
144143
int intSize = target.arch.getPlatformKind(JavaKind.Int).getSizeInBytes();
145144
int objectAlignment = 8;
146145

147-
int headerOffset = 0;
146+
int hubOffset = 0;
147+
int headerSize = hubOffset + referenceSize;
148+
148149
int identityHashCodeOffset;
149-
int firstFieldOffset;
150150
if (!disableOptionalIdentityHash && SubstrateOptions.SpawnIsolates.getValue() && headerSize + referenceSize <= objectAlignment) {
151151
/*
152152
* References are relative to the heap base, so we should be able to use fewer bits in
@@ -158,15 +158,18 @@ public static ObjectLayout createObjectLayout(JavaKind referenceKind, boolean di
158158
* individual object was assigned an identity hash code after allocation.
159159
*/
160160
identityHashCodeOffset = -1;
161-
firstFieldOffset = headerOffset + headerSize;
162161
} else { // need all object header bits except for lowest-order bits freed up by alignment
163-
identityHashCodeOffset = headerOffset + referenceSize;
164-
firstFieldOffset = identityHashCodeOffset + intSize;
162+
identityHashCodeOffset = headerSize;
163+
headerSize += intSize;
165164
}
166-
int arrayLengthOffset = firstFieldOffset;
165+
166+
headerSize += SubstrateOptions.AdditionalHeaderBytes.getValue();
167+
168+
int firstFieldOffset = headerSize;
169+
int arrayLengthOffset = headerSize;
167170
int arrayBaseOffset = arrayLengthOffset + intSize;
168171

169-
return new ObjectLayout(target, referenceSize, objectAlignment, headerOffset, firstFieldOffset, arrayLengthOffset, arrayBaseOffset, identityHashCodeOffset);
172+
return new ObjectLayout(target, referenceSize, objectAlignment, hubOffset, firstFieldOffset, arrayLengthOffset, arrayBaseOffset, identityHashCodeOffset);
170173
}
171174

172175
public SVMHost createHostVM(OptionValues options, ClassLoader classLoader, ClassInitializationSupport classInitializationSupport,

0 commit comments

Comments
 (0)