Skip to content

Commit 0ae2183

Browse files
[GR-68584] [GR-68813] Only support a metaspace if there is a contiguous address space.
PullRequest: graal/21969
2 parents 60a01fc + bd93b56 commit 0ae2183

File tree

15 files changed

+59
-81
lines changed

15 files changed

+59
-81
lines changed

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
import static jdk.graal.compiler.word.Word.nullPointer;
3232
import static jdk.graal.compiler.word.Word.unsigned;
3333

34+
import org.graalvm.nativeimage.ImageSingletons;
3435
import org.graalvm.nativeimage.Isolate;
3536
import org.graalvm.nativeimage.Platform;
3637
import org.graalvm.nativeimage.Platforms;
@@ -65,6 +66,7 @@
6566
import com.oracle.svm.core.nmt.NativeMemoryTracking;
6667
import com.oracle.svm.core.nmt.NmtCategory;
6768
import com.oracle.svm.core.os.ChunkBasedCommittedMemoryProvider;
69+
import com.oracle.svm.core.os.CommittedMemoryProvider;
6870
import com.oracle.svm.core.os.ImageHeapProvider;
6971
import com.oracle.svm.core.os.VirtualMemoryProvider;
7072
import com.oracle.svm.core.snippets.KnownIntrinsics;
@@ -149,6 +151,11 @@ public AddressRangeCommittedMemoryProvider() {
149151
assert SubstrateOptions.SpawnIsolates.getValue();
150152
}
151153

154+
@Fold
155+
public static AddressRangeCommittedMemoryProvider singleton() {
156+
return (AddressRangeCommittedMemoryProvider) ImageSingletons.lookup(CommittedMemoryProvider.class);
157+
}
158+
152159
@Override
153160
@Uninterruptible(reason = "Still being initialized.")
154161
public int initialize(WordPointer heapBaseOut, IsolateArguments arguments) {

substratevm/src/com.oracle.svm.core.genscavenge/src/com/oracle/svm/core/genscavenge/metaspace/ChunkedMetaspaceMemory.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,14 +34,14 @@
3434
import org.graalvm.word.UnsignedWord;
3535

3636
import com.oracle.svm.core.Uninterruptible;
37+
import com.oracle.svm.core.genscavenge.AddressRangeCommittedMemoryProvider;
3738
import com.oracle.svm.core.genscavenge.AlignedHeapChunk;
3839
import com.oracle.svm.core.genscavenge.AlignedHeapChunk.AlignedHeader;
3940
import com.oracle.svm.core.genscavenge.HeapChunk.Header;
4041
import com.oracle.svm.core.genscavenge.HeapParameters;
4142
import com.oracle.svm.core.genscavenge.Space;
4243
import com.oracle.svm.core.genscavenge.remset.RememberedSet;
4344
import com.oracle.svm.core.metaspace.Metaspace;
44-
import com.oracle.svm.core.os.ChunkBasedCommittedMemoryProvider;
4545
import com.oracle.svm.core.thread.JavaSpinLockUtils;
4646
import com.oracle.svm.core.thread.VMOperation;
4747
import com.oracle.svm.core.util.VMError;
@@ -129,7 +129,7 @@ private AlignedHeader requestNewChunk() {
129129
assert JavaSpinLockUtils.isLocked(this, LOCK_OFFSET);
130130

131131
UnsignedWord chunkSize = HeapParameters.getAlignedHeapChunkAlignment();
132-
AlignedHeader newChunk = (AlignedHeader) ChunkBasedCommittedMemoryProvider.get().allocateMetaspaceChunk(HeapParameters.getAlignedHeapChunkSize(), chunkSize);
132+
AlignedHeader newChunk = (AlignedHeader) AddressRangeCommittedMemoryProvider.singleton().allocateMetaspaceChunk(HeapParameters.getAlignedHeapChunkSize(), chunkSize);
133133
assert newChunk.isNonNull();
134134

135135
AlignedHeapChunk.initialize(newChunk, chunkSize);

substratevm/src/com.oracle.svm.core.genscavenge/src/com/oracle/svm/core/genscavenge/metaspace/MetaspaceImpl.java

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,6 @@
4444
import com.oracle.svm.core.hub.DynamicHub;
4545
import com.oracle.svm.core.log.Log;
4646
import com.oracle.svm.core.metaspace.Metaspace;
47-
import com.oracle.svm.core.os.CommittedMemoryProvider;
4847
import com.oracle.svm.core.thread.VMOperation;
4948

5049
import jdk.graal.compiler.api.replacements.Fold;
@@ -98,13 +97,8 @@ public boolean isInAddressSpace(Object obj) {
9897
@Override
9998
@Uninterruptible(reason = CALLED_FROM_UNINTERRUPTIBLE_CODE, mayBeInlined = true)
10099
public boolean isInAddressSpace(Pointer ptr) {
101-
CommittedMemoryProvider memoryProvider = ImageSingletons.lookup(CommittedMemoryProvider.class);
102-
if (memoryProvider instanceof AddressRangeCommittedMemoryProvider p) {
103-
return p.isInMetaspace(ptr);
104-
}
105-
106-
/* Metaspace does not have a contiguous address space. */
107-
return isInAllocatedMemory(ptr);
100+
AddressRangeCommittedMemoryProvider m = AddressRangeCommittedMemoryProvider.singleton();
101+
return m.isInMetaspace(ptr);
108102
}
109103

110104
@Override

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ public class DynamicHubOffsets {
8181
private int componentTypeOffset = UNINITIALIZED;
8282

8383
@UnknownPrimitiveField(availability = BuildPhaseProvider.ReadyForCompilation.class) //
84-
private int compressedReferenceMapOffsetOffset = UNINITIALIZED;
84+
private int referenceMapCompressedOffsetOffset = UNINITIALIZED;
8585
@UnknownPrimitiveField(availability = BuildPhaseProvider.ReadyForCompilation.class) //
8686
private int layerIdOffset = UNINITIALIZED;
8787

@@ -185,8 +185,8 @@ public int getComponentTypeOffset() {
185185
return componentTypeOffset;
186186
}
187187

188-
public int getCompressedReferenceMapOffsetOffset() {
189-
return compressedReferenceMapOffsetOffset;
188+
public int getReferenceMapCompressedOffsetOffset() {
189+
return referenceMapCompressedOffsetOffset;
190190
}
191191

192192
public int getLayerIdOffset() {

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/heap/Heap.java

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -140,13 +140,6 @@ public void visitLoadedClasses(Consumer<Class<?>> visitor) {
140140
/** Reset the heap to the normal execution state. */
141141
public abstract void endSafepoint();
142142

143-
/* Only used by legacy code, see GR-68813. */
144-
@Fold
145-
@Deprecated
146-
public int getPreferredAddressSpaceAlignment() {
147-
return getHeapBaseAlignment();
148-
}
149-
150143
/**
151144
* Returns the alignment in bytes that the heap base must adhere to at runtime. Note that this
152145
* alignment is not enforced if {@link SubstrateOptions#SpawnIsolates} is disabled.

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/heap/InstanceReferenceMapDecoder.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
package com.oracle.svm.core.heap;
2626

2727
import static com.oracle.svm.core.Uninterruptible.CALLED_FROM_UNINTERRUPTIBLE_CODE;
28-
import static com.oracle.svm.core.heap.InstanceReferenceMapEncoder.COMPRESSED_REFERENCE_MAP_OFFSET_SHIFT;
28+
import static com.oracle.svm.core.heap.InstanceReferenceMapEncoder.REFERENCE_MAP_COMPRESSED_OFFSET_SHIFT;
2929

3030
import org.graalvm.word.Pointer;
3131
import org.graalvm.word.UnsignedWord;
@@ -87,8 +87,8 @@ public static InstanceReferenceMap getReferenceMap(NonmovableArray<Byte> referen
8787

8888
@AlwaysInline("GC performance")
8989
@Uninterruptible(reason = CALLED_FROM_UNINTERRUPTIBLE_CODE, mayBeInlined = true)
90-
public static InstanceReferenceMap getReferenceMap(long compressedReferenceMapOffset) {
91-
long uncompressedOffset = (compressedReferenceMapOffset << COMPRESSED_REFERENCE_MAP_OFFSET_SHIFT);
90+
public static InstanceReferenceMap getReferenceMap(long referenceMapCompressedOffset) {
91+
long uncompressedOffset = (referenceMapCompressedOffset << REFERENCE_MAP_COMPRESSED_OFFSET_SHIFT);
9292
return (InstanceReferenceMap) KnownIntrinsics.heapBase().add(Word.unsigned(uncompressedOffset));
9393
}
9494

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/heap/InstanceReferenceMapEncoder.java

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -56,32 +56,32 @@
5656
* </ul>
5757
*/
5858
public class InstanceReferenceMapEncoder extends ReferenceMapEncoder {
59-
public static final int COMPRESSED_REFERENCE_MAP_OFFSET_SHIFT = 2;
59+
public static final int REFERENCE_MAP_COMPRESSED_OFFSET_SHIFT = 2;
6060

6161
public static final int MAP_HEADER_SIZE = 4;
6262
public static final int MAP_ENTRY_SIZE = 8;
6363

6464
@Platforms(Platform.HOSTED_ONLY.class)
65-
public static int computeCompressedReferenceMapOffset(long currentLayerRefMapDataStart, int referenceMapIndex) {
65+
public static int computeReferenceMapCompressedOffset(long currentLayerRefMapDataStart, int referenceMapIndex) {
6666
long uncompressedOffset = currentLayerRefMapDataStart + referenceMapIndex;
67-
return computeCompressedReferenceMapOffset(uncompressedOffset);
67+
return computeReferenceMapCompressedOffset(uncompressedOffset);
6868
}
6969

70-
public static int computeCompressedReferenceMapOffset(InstanceReferenceMap refMap) {
70+
public static int computeReferenceMapCompressedOffset(InstanceReferenceMap refMap) {
7171
long uncompressedOffset = ((Pointer) refMap).subtract(KnownIntrinsics.heapBase()).rawValue();
72-
return computeCompressedReferenceMapOffset(uncompressedOffset);
72+
return computeReferenceMapCompressedOffset(uncompressedOffset);
7373
}
7474

7575
/**
7676
* Computes a compressed, heap-base relative offset that points to the start of an
7777
* {@link InstanceReferenceMap}. Due to the compression, all {@link InstanceReferenceMap}s must
78-
* be within the first 16 GB of the address space.
78+
* be within the first 16 GB of the heap base.
7979
*
8080
* @param uncompressedOffset heap-base relative offset of an {@link InstanceReferenceMap}.
8181
*/
82-
private static int computeCompressedReferenceMapOffset(long uncompressedOffset) {
83-
long compressedOffset = uncompressedOffset >>> COMPRESSED_REFERENCE_MAP_OFFSET_SHIFT;
84-
assert uncompressedOffset == (compressedOffset << COMPRESSED_REFERENCE_MAP_OFFSET_SHIFT) : "wrong alignment";
82+
private static int computeReferenceMapCompressedOffset(long uncompressedOffset) {
83+
long compressedOffset = uncompressedOffset >>> REFERENCE_MAP_COMPRESSED_OFFSET_SHIFT;
84+
assert uncompressedOffset == (compressedOffset << REFERENCE_MAP_COMPRESSED_OFFSET_SHIFT) : "wrong alignment";
8585

8686
VMError.guarantee(NumUtil.isUInt(compressedOffset), "Compressed reference map offset is not within unsigned integer range");
8787
return (int) compressedOffset;

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

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -372,7 +372,7 @@ public final class DynamicHub implements AnnotatedElement, java.lang.reflect.Typ
372372
* {@link DynamicHubSupport#getInstanceReferenceMap}).
373373
*/
374374
@UnknownPrimitiveField(availability = AfterHeapLayout.class)//
375-
private int compressedReferenceMapOffset = -1;
375+
private int referenceMapCompressedOffset = -1;
376376

377377
private final byte layerId;
378378

@@ -552,7 +552,7 @@ public static DynamicHub allocate(String name, DynamicHub superHub, Object inter
552552
// GR-61330: only write if the field exists according to analysis
553553
// companion.metaType = null;
554554

555-
int compressedReferenceMapOffset = RuntimeInstanceReferenceMapSupport.singleton().getOrCreateReferenceMap(superHub);
555+
int referenceMapCompressedOffset = RuntimeInstanceReferenceMapSupport.singleton().getOrCreateReferenceMap(superHub);
556556

557557
// GR-57813
558558
companion.hubMetadata = null;
@@ -585,7 +585,7 @@ public static DynamicHub allocate(String name, DynamicHub superHub, Object inter
585585

586586
writeObject(hub, dynamicHubOffsets.getComponentTypeOffset(), componentHub);
587587

588-
writeInt(hub, dynamicHubOffsets.getCompressedReferenceMapOffsetOffset(), compressedReferenceMapOffset);
588+
writeInt(hub, dynamicHubOffsets.getReferenceMapCompressedOffsetOffset(), referenceMapCompressedOffset);
589589
writeByte(hub, dynamicHubOffsets.getLayerIdOffset(), NumUtil.safeToByte(DynamicImageLayerInfo.CREMA_LAYER_ID));
590590

591591
// skip vtable (special treatment)
@@ -943,25 +943,25 @@ public DynamicHub getArrayHub() {
943943

944944
@AlwaysInline("GC performance")
945945
@Uninterruptible(reason = "Called from uninterruptible code.", mayBeInlined = true)
946-
public int getCompressedReferenceMapOffset() {
947-
assert compressedReferenceMapOffset >= 0;
948-
return compressedReferenceMapOffset;
946+
public int getReferenceMapCompressedOffset() {
947+
assert referenceMapCompressedOffset >= 0;
948+
return referenceMapCompressedOffset;
949949
}
950950

951951
/**
952-
* Initializes the {@link #compressedReferenceMapOffset} based on the
952+
* Initializes the {@link #referenceMapCompressedOffset} based on the
953953
* {@link #referenceMapIndex}.
954954
*/
955955
@Platforms(Platform.HOSTED_ONLY.class)
956-
public void initializeCompressedReferenceMapOffset(long currentLayerRefMapDataStart) {
957-
assert compressedReferenceMapOffset == -1;
956+
public void initializeReferenceMapCompressedOffset(long currentLayerRefMapDataStart) {
957+
assert referenceMapCompressedOffset == -1;
958958
assert ReferenceMapIndex.denotesValidReferenceMap(referenceMapIndex);
959959

960960
if (Platform.includedIn(NATIVE_ONLY.class)) {
961-
this.compressedReferenceMapOffset = InstanceReferenceMapEncoder.computeCompressedReferenceMapOffset(currentLayerRefMapDataStart, referenceMapIndex);
961+
this.referenceMapCompressedOffset = InstanceReferenceMapEncoder.computeReferenceMapCompressedOffset(currentLayerRefMapDataStart, referenceMapIndex);
962962
} else {
963963
/* Remove once a heap base is supported, see GR-68847. */
964-
this.compressedReferenceMapOffset = referenceMapIndex;
964+
this.referenceMapCompressedOffset = referenceMapIndex;
965965
}
966966
}
967967

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,11 +60,11 @@ public static DynamicHubSupport currentLayer() {
6060
@Uninterruptible(reason = CALLED_FROM_UNINTERRUPTIBLE_CODE, mayBeInlined = true)
6161
public static InstanceReferenceMap getInstanceReferenceMap(DynamicHub hub) {
6262
if (Platform.includedIn(NATIVE_ONLY.class)) {
63-
return InstanceReferenceMapDecoder.getReferenceMap(hub.getCompressedReferenceMapOffset());
63+
return InstanceReferenceMapDecoder.getReferenceMap(hub.getReferenceMapCompressedOffset());
6464
} else {
6565
/* Remove once a heap base is supported, see GR-68847. */
6666
byte[] referenceMapEncoding = MultiLayeredImageSingleton.getForLayer(DynamicHubSupport.class, 0).referenceMapEncoding;
67-
return InstanceReferenceMapDecoder.getReferenceMap(NonmovableArrays.fromImageHeap(referenceMapEncoding), hub.getCompressedReferenceMapOffset());
67+
return InstanceReferenceMapDecoder.getReferenceMap(NonmovableArrays.fromImageHeap(referenceMapEncoding), hub.getReferenceMapCompressedOffset());
6868
}
6969
}
7070

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

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -88,18 +88,26 @@ private static void validateRuntimeClassLoading(HostedOptionKey<Boolean> optionK
8888
if (!optionKey.getValue()) {
8989
return;
9090
}
91+
if (!SubstrateOptions.SpawnIsolates.getValue()) {
92+
/*
93+
* A metaspace is only supported if there is a contiguous address space, which is
94+
* only the case with isolate support enabled.
95+
*/
96+
throw UserError.invalidOptionValue(RuntimeClassLoading, RuntimeClassLoading.getValue(),
97+
"Requires isolate support, please use " + SubstrateOptionsParser.commandArgument(SubstrateOptions.SpawnIsolates, "+"));
98+
}
9199
if (SubstrateOptions.ClosedTypeWorld.getValue()) {
92100
throw UserError.invalidOptionValue(RuntimeClassLoading, RuntimeClassLoading.getValue(),
93-
"Requires an open type world, Please use " + SubstrateOptionsParser.commandArgument(SubstrateOptions.ClosedTypeWorld, "-"));
101+
"Requires an open type world, please use " + SubstrateOptionsParser.commandArgument(SubstrateOptions.ClosedTypeWorld, "-"));
94102
}
95103
if (!ClassForNameSupport.Options.ClassForNameRespectsClassLoader.getValue()) {
96104
throw UserError.invalidOptionValue(RuntimeClassLoading, RuntimeClassLoading.getValue(),
97-
"Requires Class.forName to respect the classloader argument, Please use " +
105+
"Requires Class.forName to respect the classloader argument, please use " +
98106
SubstrateOptionsParser.commandArgument(ClassForNameSupport.Options.ClassForNameRespectsClassLoader, "+"));
99107
}
100108
if (PredefinedClassesSupport.Options.SupportPredefinedClasses.getValue()) {
101109
throw UserError.invalidOptionValue(RuntimeClassLoading, RuntimeClassLoading.getValue(),
102-
"Requires predefined class support to be disabled, Please use " +
110+
"Requires predefined class support to be disabled, please use " +
103111
SubstrateOptionsParser.commandArgument(PredefinedClassesSupport.Options.SupportPredefinedClasses, "-"));
104112
}
105113
}

0 commit comments

Comments
 (0)