From 993a4292d5a5be291f0db92ee4c2c910278b4065 Mon Sep 17 00:00:00 2001 From: Christian Haeubl Date: Fri, 3 Nov 2023 11:44:29 +0100 Subject: [PATCH] Add an option to artificially increase the header size. --- .../com/oracle/svm/core/SubstrateOptions.java | 10 ++++++ .../oracle/svm/core/config/ObjectLayout.java | 7 +++-- .../svm/hosted/HostedConfiguration.java | 31 ++++++++++--------- 3 files changed, 31 insertions(+), 17 deletions(-) diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/SubstrateOptions.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/SubstrateOptions.java index f06cf70dc159..3e14d17b3bc5 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/SubstrateOptions.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/SubstrateOptions.java @@ -554,6 +554,16 @@ public static final boolean hasColorsEnabled(OptionValues values) { @Option(help = "How many bytes to pad fields and classes marked @Contended with.") // public static final HostedOptionKey ContendedPaddingWidth = new HostedOptionKey<>(128); + @Option(help = "Add additional header bytes to each object, for diagnostic purposes.", type = OptionType.Debug) // + public static final HostedOptionKey AdditionalHeaderBytes = new HostedOptionKey<>(0, SubstrateOptions::validateAdditionalHeaderBytes); + + private static void validateAdditionalHeaderBytes(HostedOptionKey optionKey) { + int value = optionKey.getValue(); + if (value < 0 || value % 4 != 0) { + throw UserError.abort("The option '%s' must be 0 or a multiple of 4.", optionKey.getName()); + } + } + /* * Isolate tear down options. */ diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/config/ObjectLayout.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/config/ObjectLayout.java index 43499f456026..f8ef0f3122ff 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/config/ObjectLayout.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/config/ObjectLayout.java @@ -24,9 +24,6 @@ */ package com.oracle.svm.core.config; -import jdk.graal.compiler.api.directives.GraalDirectives; -import jdk.graal.compiler.core.common.NumUtil; -import jdk.graal.compiler.replacements.ReplacementsUtil; import org.graalvm.nativeimage.AnnotationAccess; import org.graalvm.nativeimage.c.constant.CEnum; import org.graalvm.word.WordBase; @@ -35,6 +32,9 @@ import com.oracle.svm.core.Uninterruptible; import com.oracle.svm.core.deopt.DeoptimizedFrame; +import jdk.graal.compiler.api.directives.GraalDirectives; +import jdk.graal.compiler.core.common.NumUtil; +import jdk.graal.compiler.replacements.ReplacementsUtil; import jdk.vm.ci.code.CodeUtil; import jdk.vm.ci.code.TargetDescription; import jdk.vm.ci.meta.JavaKind; @@ -60,6 +60,7 @@ public ObjectLayout(SubstrateTargetDescription target, int referenceSize, int ob int firstFieldOffset, int arrayLengthOffset, int arrayBaseOffset, int fixedIdentityHashOffset) { assert CodeUtil.isPowerOf2(referenceSize) : referenceSize; assert CodeUtil.isPowerOf2(objectAlignment) : objectAlignment; + assert arrayLengthOffset % Integer.BYTES == 0; assert hubOffset < firstFieldOffset && hubOffset < arrayLengthOffset : hubOffset; assert fixedIdentityHashOffset == -1 || (fixedIdentityHashOffset > 0 && fixedIdentityHashOffset < arrayLengthOffset) : fixedIdentityHashOffset; diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/HostedConfiguration.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/HostedConfiguration.java index 769a01f4c27a..d9e5eea7935b 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/HostedConfiguration.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/HostedConfiguration.java @@ -31,12 +31,6 @@ import java.util.Optional; import java.util.Set; -import jdk.graal.compiler.api.replacements.SnippetReflectionProvider; -import jdk.graal.compiler.core.common.CompressEncoding; -import jdk.graal.compiler.core.common.spi.MetaAccessExtensionProvider; -import jdk.graal.compiler.debug.DebugContext; -import jdk.graal.compiler.nodes.StructuredGraph; -import jdk.graal.compiler.options.OptionValues; import org.graalvm.nativeimage.ImageSingletons; import org.graalvm.nativeimage.Platform; @@ -76,6 +70,12 @@ import com.oracle.svm.hosted.meta.HostedUniverse; import com.oracle.svm.hosted.substitute.UnsafeAutomaticSubstitutionProcessor; +import jdk.graal.compiler.api.replacements.SnippetReflectionProvider; +import jdk.graal.compiler.core.common.CompressEncoding; +import jdk.graal.compiler.core.common.spi.MetaAccessExtensionProvider; +import jdk.graal.compiler.debug.DebugContext; +import jdk.graal.compiler.nodes.StructuredGraph; +import jdk.graal.compiler.options.OptionValues; import jdk.internal.ValueBased; import jdk.vm.ci.meta.JavaKind; import jdk.vm.ci.meta.MetaAccessProvider; @@ -138,13 +138,13 @@ public static ObjectLayout createObjectLayout() { public static ObjectLayout createObjectLayout(JavaKind referenceKind, boolean disableOptionalIdentityHash) { SubstrateTargetDescription target = ConfigurationValues.getTarget(); int referenceSize = target.arch.getPlatformKind(referenceKind).getSizeInBytes(); - int headerSize = referenceSize; int intSize = target.arch.getPlatformKind(JavaKind.Int).getSizeInBytes(); int objectAlignment = 8; - int headerOffset = 0; + int hubOffset = 0; + int headerSize = hubOffset + referenceSize; + int identityHashCodeOffset; - int firstFieldOffset; if (!disableOptionalIdentityHash && SubstrateOptions.SpawnIsolates.getValue() && headerSize + referenceSize <= objectAlignment) { /* * References are relative to the heap base, so we should be able to use fewer bits in @@ -156,15 +156,18 @@ public static ObjectLayout createObjectLayout(JavaKind referenceKind, boolean di * individual object was assigned an identity hash code after allocation. */ identityHashCodeOffset = -1; - firstFieldOffset = headerOffset + headerSize; } else { // need all object header bits except for lowest-order bits freed up by alignment - identityHashCodeOffset = headerOffset + referenceSize; - firstFieldOffset = identityHashCodeOffset + intSize; + identityHashCodeOffset = headerSize; + headerSize += intSize; } - int arrayLengthOffset = firstFieldOffset; + + headerSize += SubstrateOptions.AdditionalHeaderBytes.getValue(); + + int firstFieldOffset = headerSize; + int arrayLengthOffset = headerSize; int arrayBaseOffset = arrayLengthOffset + intSize; - return new ObjectLayout(target, referenceSize, objectAlignment, headerOffset, firstFieldOffset, arrayLengthOffset, arrayBaseOffset, identityHashCodeOffset); + return new ObjectLayout(target, referenceSize, objectAlignment, hubOffset, firstFieldOffset, arrayLengthOffset, arrayBaseOffset, identityHashCodeOffset); } public SVMHost createHostVM(OptionValues options, ClassLoader classLoader, ClassInitializationSupport classInitializationSupport,