Skip to content

Commit e07a6f5

Browse files
committed
Make static field storage accesses layer-aware.
1 parent 6474ced commit e07a6f5

File tree

11 files changed

+68
-34
lines changed

11 files changed

+68
-34
lines changed

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/hub/crema/CremaSupport.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ interface CremaDispatchTable {
6969

7070
Class<?> findLoadedClass(JavaType unresolvedJavaType, ResolvedJavaType accessingClass);
7171

72-
Object getStaticStorage(Class<?> cls, boolean primitives);
72+
Object getStaticStorage(Class<?> cls, boolean primitives, int layerNum);
7373

7474
static CremaSupport singleton() {
7575
return ImageSingletons.lookup(CremaSupport.class);

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/reflect/target/Target_jdk_internal_misc_Unsafe_Reflection.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ public Object staticFieldBase(Target_java_lang_reflect_Field field) {
5959
int layerNumber = ImageLayerBuildingSupport.buildingImageLayer() ? field.installedLayerNumber : MultiLayeredImageSingleton.UNUSED_LAYER_NUMBER;
6060
if (RuntimeClassLoading.isSupported()) {
6161
Field reflectField = SubstrateUtil.cast(field, Field.class);
62-
return CremaSupport.singleton().getStaticStorage(reflectField.getDeclaringClass(), reflectField.getType().isPrimitive());
62+
return CremaSupport.singleton().getStaticStorage(reflectField.getDeclaringClass(), reflectField.getType().isPrimitive(), field.installedLayerNumber);
6363
}
6464
if (SubstrateUtil.cast(field, Field.class).getType().isPrimitive()) {
6565
return StaticFieldsSupport.getStaticPrimitiveFieldsAtRuntime(layerNumber);

substratevm/src/com.oracle.svm.interpreter.metadata/src/com/oracle/svm/interpreter/metadata/CremaResolvedJavaFieldImpl.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,10 @@
2727
import com.oracle.svm.core.hub.DynamicHub;
2828
import com.oracle.svm.core.hub.crema.CremaResolvedJavaField;
2929
import com.oracle.svm.core.hub.crema.CremaSupport;
30+
import com.oracle.svm.core.imagelayer.DynamicImageLayerInfo;
3031
import com.oracle.svm.espresso.classfile.ParserField;
3132

33+
import jdk.graal.compiler.core.common.NumUtil;
3234
import jdk.vm.ci.meta.JavaType;
3335
import jdk.vm.ci.meta.UnresolvedJavaType;
3436

@@ -42,6 +44,7 @@ public class CremaResolvedJavaFieldImpl extends InterpreterResolvedJavaField imp
4244
offset,
4345
/*- constantValue */ null,
4446
/*- isWordStorage */ false);
47+
this.layerNum = NumUtil.safeToByte(DynamicImageLayerInfo.CREMA_LAYER_ID);
4548
}
4649

4750
public static CremaResolvedJavaFieldImpl createAtRuntime(InterpreterResolvedObjectType declaringClass, ParserField f, int offset) {

substratevm/src/com.oracle.svm.interpreter.metadata/src/com/oracle/svm/interpreter/metadata/CremaResolvedObjectType.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import com.oracle.svm.core.hub.crema.CremaResolvedJavaMethod;
3030
import com.oracle.svm.core.hub.crema.CremaResolvedJavaRecordComponent;
3131
import com.oracle.svm.core.hub.crema.CremaResolvedJavaType;
32+
import com.oracle.svm.core.layeredimagesingleton.MultiLayeredImageSingleton;
3233
import com.oracle.svm.core.util.VMError;
3334
import com.oracle.svm.espresso.classfile.descriptors.Symbol;
3435
import com.oracle.svm.espresso.classfile.descriptors.Type;
@@ -49,7 +50,8 @@ public CremaResolvedObjectType(Symbol<Type> type, int modifiers, InterpreterReso
4950
}
5051

5152
@Override
52-
public Object getStaticStorage(boolean primitives) {
53+
public Object getStaticStorage(boolean primitives, int layerNum) {
54+
assert layerNum != MultiLayeredImageSingleton.NONSTATIC_FIELD_LAYER_NUMBER;
5355
return primitives ? primitiveStatics : referenceStatics;
5456
}
5557

substratevm/src/com.oracle.svm.interpreter.metadata/src/com/oracle/svm/interpreter/metadata/InterpreterResolvedJavaField.java

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
package com.oracle.svm.interpreter.metadata;
2626

2727
import java.lang.annotation.Annotation;
28+
import java.lang.reflect.Modifier;
2829
import java.util.function.Function;
2930

3031
import org.graalvm.nativeimage.Platform;
@@ -33,12 +34,14 @@
3334
import com.oracle.graal.pointsto.meta.AnalysisField;
3435
import com.oracle.svm.core.hub.DynamicHub;
3536
import com.oracle.svm.core.hub.registry.SymbolsSupport;
37+
import com.oracle.svm.core.layeredimagesingleton.MultiLayeredImageSingleton;
3638
import com.oracle.svm.core.util.VMError;
3739
import com.oracle.svm.espresso.classfile.descriptors.Name;
3840
import com.oracle.svm.espresso.classfile.descriptors.Symbol;
3941
import com.oracle.svm.espresso.classfile.descriptors.Type;
4042
import com.oracle.svm.espresso.classfile.descriptors.TypeSymbols;
4143

44+
import jdk.graal.compiler.core.common.NumUtil;
4245
import jdk.vm.ci.meta.JavaConstant;
4346
import jdk.vm.ci.meta.JavaKind;
4447
import jdk.vm.ci.meta.JavaType;
@@ -59,6 +62,7 @@ public class InterpreterResolvedJavaField implements ResolvedJavaField, CremaFie
5962

6063
// Computed after analysis.
6164
private int offset;
65+
protected byte layerNum;
6266

6367
private final InterpreterResolvedObjectType declaringClass;
6468
protected InterpreterResolvedJavaType resolvedType;
@@ -96,6 +100,9 @@ protected InterpreterResolvedJavaField(
96100
// Primitive types are trivially resolved.
97101
this.resolvedType = InterpreterResolvedPrimitiveType.fromKind(CremaTypeAccess.symbolToJvmciKind(typeSymbol));
98102
}
103+
this.layerNum = NumUtil.safeToByte(Modifier.isStatic(modifiers) /*- Prevents 'this-escape' warning. */
104+
? MultiLayeredImageSingleton.LAYER_NUM_UNINSTALLED
105+
: MultiLayeredImageSingleton.NONSTATIC_FIELD_LAYER_NUMBER);
99106
}
100107

101108
@Platforms(Platform.HOSTED_ONLY.class)
@@ -117,13 +124,18 @@ public static InterpreterResolvedJavaField createForInterpreter(String name, int
117124
JavaType type, InterpreterResolvedObjectType declaringClass,
118125
int offset,
119126
JavaConstant constant,
120-
boolean isWordStorage) {
127+
boolean isWordStorage,
128+
int layerNum) {
121129
MetadataUtil.requireNonNull(type);
122130
MetadataUtil.requireNonNull(declaringClass);
123131
Symbol<Name> nameSymbol = SymbolsSupport.getNames().getOrCreate(name);
124132
InterpreterResolvedJavaType resolvedType = type instanceof InterpreterResolvedJavaType ? (InterpreterResolvedJavaType) type : null;
125133
Symbol<Type> symbolicType = resolvedType == null ? CremaTypeAccess.jvmciNameToType(type.getName()) : resolvedType.getSymbolicType();
126-
return new InterpreterResolvedJavaField(nameSymbol, symbolicType, modifiers, resolvedType, declaringClass, offset, constant, isWordStorage);
134+
InterpreterResolvedJavaField result = new InterpreterResolvedJavaField(nameSymbol, symbolicType, modifiers, resolvedType, declaringClass, offset, constant, isWordStorage);
135+
if (result.isStatic()) {
136+
result.layerNum = NumUtil.safeToByte(layerNum);
137+
}
138+
return result;
127139
}
128140

129141
@Platforms(Platform.HOSTED_ONLY.class)
@@ -163,6 +175,14 @@ public final void setOffset(int offset) {
163175
this.offset = offset;
164176
}
165177

178+
@Platforms(Platform.HOSTED_ONLY.class)
179+
public final void setInstalledLayerNum(int layerNum) {
180+
assert isStatic();
181+
VMError.guarantee(this.layerNum == MultiLayeredImageSingleton.LAYER_NUM_UNINSTALLED || this.layerNum == layerNum);
182+
this.layerNum = NumUtil.safeToByte(layerNum);
183+
184+
}
185+
166186
@Platforms(Platform.HOSTED_ONLY.class)
167187
public final void setResolvedType(InterpreterResolvedJavaType resolvedType) {
168188
VMError.guarantee(this.resolvedType == null || this.resolvedType.equals(resolvedType),
@@ -180,6 +200,10 @@ public final int getOffset() {
180200
return offset;
181201
}
182202

203+
public final int getInstalledLayerNum() {
204+
return layerNum;
205+
}
206+
183207
@Override
184208
public final String getName() {
185209
return name.toString();

substratevm/src/com.oracle.svm.interpreter.metadata/src/com/oracle/svm/interpreter/metadata/InterpreterResolvedObjectType.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -228,11 +228,12 @@ public final boolean isAssignableFrom(ResolvedJavaType other) {
228228
return false;
229229
}
230230

231-
public Object getStaticStorage(boolean primitives) {
231+
public Object getStaticStorage(boolean primitives, int layerNum) {
232+
assert layerNum != MultiLayeredImageSingleton.NONSTATIC_FIELD_LAYER_NUMBER : "Requesting static storage for a non-static field: " + layerNum;
232233
if (primitives) {
233-
return StaticFieldsSupport.getStaticPrimitiveFieldsAtRuntime(MultiLayeredImageSingleton.UNKNOWN_LAYER_NUMBER);
234+
return StaticFieldsSupport.getStaticPrimitiveFieldsAtRuntime(layerNum);
234235
} else {
235-
return StaticFieldsSupport.getStaticObjectFieldsAtRuntime(MultiLayeredImageSingleton.UNKNOWN_LAYER_NUMBER);
236+
return StaticFieldsSupport.getStaticObjectFieldsAtRuntime(layerNum);
236237
}
237238
}
238239

substratevm/src/com.oracle.svm.interpreter.metadata/src/com/oracle/svm/interpreter/metadata/serialization/Serializers.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
package com.oracle.svm.interpreter.metadata.serialization;
2626

2727
import java.lang.invoke.MethodType;
28+
import java.lang.reflect.Modifier;
2829
import java.nio.charset.StandardCharsets;
2930
import java.util.HashSet;
3031
import java.util.List;
@@ -37,6 +38,7 @@
3738

3839
import com.oracle.svm.core.FunctionPointerHolder;
3940
import com.oracle.svm.core.hub.registry.SymbolsSupport;
41+
import com.oracle.svm.core.layeredimagesingleton.MultiLayeredImageSingleton;
4042
import com.oracle.svm.core.snippets.KnownIntrinsics;
4143
import com.oracle.svm.core.util.VMError;
4244
import com.oracle.svm.espresso.classfile.ParserConstantPool;
@@ -552,7 +554,8 @@ public static ValueSerializer<ReferenceConstant<?>> newReferenceConstantSerializ
552554
int offset = LEB128.readUnsignedInt(in);
553555
JavaConstant constant = context.readReference(in);
554556
boolean isWordStorage = in.readBoolean();
555-
return InterpreterResolvedJavaField.createForInterpreter(name, modifiers, type, declaringClass, offset, constant, isWordStorage);
557+
int layerNum = Modifier.isStatic(modifiers) ? in.readByte() : MultiLayeredImageSingleton.NONSTATIC_FIELD_LAYER_NUMBER;
558+
return InterpreterResolvedJavaField.createForInterpreter(name, modifiers, type, declaringClass, offset, constant, isWordStorage, layerNum);
556559
},
557560
(context, out, value) -> {
558561
context.writeReference(out, value.getName());
@@ -567,6 +570,10 @@ public static ValueSerializer<ReferenceConstant<?>> newReferenceConstantSerializ
567570
context.writeReference(out, null);
568571
}
569572
out.writeBoolean(value.isWordStorage());
573+
if (value.isStatic()) {
574+
out.writeByte(value.getInstalledLayerNum());
575+
}
576+
570577
});
571578

572579
static final ValueSerializer<InterpreterResolvedObjectType> OBJECT_TYPE = createSerializer(

substratevm/src/com.oracle.svm.interpreter/src/com/oracle/svm/interpreter/BuildTimeInterpreterUniverse.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,9 @@ public static InterpreterResolvedJavaField createResolvedJavaField(AnalysisField
178178
@Platforms(Platform.HOSTED_ONLY.class)
179179
public void initializeJavaFieldFromHosted(HostedField hostedField, InterpreterResolvedJavaField resolvedJavaField) {
180180
resolvedJavaField.setOffset(hostedField.getOffset());
181+
if (hostedField.hasInstalledLayerNum()) {
182+
resolvedJavaField.setInstalledLayerNum(hostedField.getInstalledLayerNum());
183+
}
181184
InterpreterResolvedJavaType fType = getType(hostedField.getType().getWrapped());
182185
if (fType != null) {
183186
// If the resolvedType is included, we can prepare it for the interpreter field.

substratevm/src/com.oracle.svm.interpreter/src/com/oracle/svm/interpreter/CremaSupportImpl.java

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -295,55 +295,55 @@ private static void initStaticFields(CremaResolvedObjectType type, ParserField[]
295295
case Boolean: {
296296
assert type.getConstantPool().tagAt(constantValueIndex) == ConstantPool.Tag.INTEGER;
297297
boolean c = type.getConstantPool().intAt(constantValueIndex) != 0;
298-
InterpreterToVM.setFieldBoolean(c, type.getStaticStorage(true), resolvedField);
298+
InterpreterToVM.setFieldBoolean(c, type.getStaticStorage(true, resolvedField.getInstalledLayerNum()), resolvedField);
299299
break;
300300
}
301301
case Byte: {
302302
assert type.getConstantPool().tagAt(constantValueIndex) == ConstantPool.Tag.INTEGER;
303303
byte c = (byte) type.getConstantPool().intAt(constantValueIndex);
304-
InterpreterToVM.setFieldByte(c, type.getStaticStorage(true), resolvedField);
304+
InterpreterToVM.setFieldByte(c, type.getStaticStorage(true, resolvedField.getInstalledLayerNum()), resolvedField);
305305
break;
306306
}
307307
case Short: {
308308
assert type.getConstantPool().tagAt(constantValueIndex) == ConstantPool.Tag.INTEGER;
309309
short c = (short) type.getConstantPool().intAt(constantValueIndex);
310-
InterpreterToVM.setFieldShort(c, type.getStaticStorage(true), resolvedField);
310+
InterpreterToVM.setFieldShort(c, type.getStaticStorage(true, resolvedField.getInstalledLayerNum()), resolvedField);
311311
break;
312312
}
313313
case Char: {
314314
assert type.getConstantPool().tagAt(constantValueIndex) == ConstantPool.Tag.INTEGER;
315315
char c = (char) type.getConstantPool().intAt(constantValueIndex);
316-
InterpreterToVM.setFieldChar(c, type.getStaticStorage(true), resolvedField);
316+
InterpreterToVM.setFieldChar(c, type.getStaticStorage(true, resolvedField.getInstalledLayerNum()), resolvedField);
317317
break;
318318
}
319319
case Int: {
320320
assert type.getConstantPool().tagAt(constantValueIndex) == ConstantPool.Tag.INTEGER;
321321
int c = type.getConstantPool().intAt(constantValueIndex);
322-
InterpreterToVM.setFieldInt(c, type.getStaticStorage(true), resolvedField);
322+
InterpreterToVM.setFieldInt(c, type.getStaticStorage(true, resolvedField.getInstalledLayerNum()), resolvedField);
323323
break;
324324
}
325325
case Float: {
326326
assert type.getConstantPool().tagAt(constantValueIndex) == ConstantPool.Tag.FLOAT;
327327
float c = type.getConstantPool().floatAt(constantValueIndex);
328-
InterpreterToVM.setFieldFloat(c, type.getStaticStorage(true), resolvedField);
328+
InterpreterToVM.setFieldFloat(c, type.getStaticStorage(true, resolvedField.getInstalledLayerNum()), resolvedField);
329329
break;
330330
}
331331
case Long: {
332332
assert type.getConstantPool().tagAt(constantValueIndex) == ConstantPool.Tag.LONG;
333333
long c = type.getConstantPool().longAt(constantValueIndex);
334-
InterpreterToVM.setFieldLong(c, type.getStaticStorage(true), resolvedField);
334+
InterpreterToVM.setFieldLong(c, type.getStaticStorage(true, resolvedField.getInstalledLayerNum()), resolvedField);
335335
break;
336336
}
337337
case Double: {
338338
assert type.getConstantPool().tagAt(constantValueIndex) == ConstantPool.Tag.DOUBLE;
339339
double c = type.getConstantPool().doubleAt(constantValueIndex);
340-
InterpreterToVM.setFieldDouble(c, type.getStaticStorage(true), resolvedField);
340+
InterpreterToVM.setFieldDouble(c, type.getStaticStorage(true, resolvedField.getInstalledLayerNum()), resolvedField);
341341
break;
342342
}
343343
case Object: {
344344
assert type.getConstantPool().tagAt(constantValueIndex) == ConstantPool.Tag.STRING;
345345
String c = type.getConstantPool().resolveStringAt(constantValueIndex);
346-
InterpreterToVM.setFieldObject(c, type.getStaticStorage(false), resolvedField);
346+
InterpreterToVM.setFieldObject(c, type.getStaticStorage(false, resolvedField.getInstalledLayerNum()), resolvedField);
347347
break;
348348
}
349349
}
@@ -685,8 +685,8 @@ public Class<?> findLoadedClass(JavaType unresolvedJavaType, ResolvedJavaType ac
685685
}
686686

687687
@Override
688-
public Object getStaticStorage(Class<?> cls, boolean primitives) {
689-
return ((InterpreterResolvedObjectType) DynamicHub.fromClass(cls).getInterpreterType()).getStaticStorage(primitives);
688+
public Object getStaticStorage(Class<?> cls, boolean primitives, int layerNum) {
689+
return ((InterpreterResolvedObjectType) DynamicHub.fromClass(cls).getInterpreterType()).getStaticStorage(primitives, layerNum);
690690
}
691691

692692
@Override

substratevm/src/com.oracle.svm.interpreter/src/com/oracle/svm/interpreter/Interpreter.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1501,7 +1501,7 @@ private static int putField(InterpreterFrame frame, int top, InterpreterResolved
15011501

15021502
int slotCount = kind.getSlotCount();
15031503
Object receiver = (opcode == PUTSTATIC)
1504-
? field.getDeclaringClass().getStaticStorage(kind.isPrimitive())
1504+
? field.getDeclaringClass().getStaticStorage(kind.isPrimitive(), field.getInstalledLayerNum())
15051505
: nullCheck(popObject(frame, top - slotCount - 1));
15061506

15071507
if (field.isStatic()) {
@@ -1544,7 +1544,7 @@ private static int getField(InterpreterFrame frame, int top, InterpreterResolved
15441544
assert kind != JavaKind.Illegal;
15451545

15461546
Object receiver = opcode == GETSTATIC
1547-
? field.getDeclaringClass().getStaticStorage(kind.isPrimitive())
1547+
? field.getDeclaringClass().getStaticStorage(kind.isPrimitive(), field.getInstalledLayerNum())
15481548
: nullCheck(popObject(frame, top - 1));
15491549

15501550
if (field.isStatic()) {

0 commit comments

Comments
 (0)