Skip to content

Commit 4593f9b

Browse files
committed
Load base layer static fields via base layer array base.
1 parent 4c3a038 commit 4593f9b

File tree

8 files changed

+69
-5
lines changed

8 files changed

+69
-5
lines changed

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

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@
5454
import jdk.graal.compiler.phases.util.Providers;
5555
import jdk.vm.ci.meta.JavaConstant;
5656
import jdk.vm.ci.meta.JavaKind;
57+
import jdk.vm.ci.meta.ResolvedJavaField;
5758
import jdk.vm.ci.meta.ResolvedJavaMethod;
5859

5960
/**
@@ -109,6 +110,10 @@ public static Object getStaticPrimitiveFields() {
109110
return result;
110111
}
111112

113+
public static FloatingNode createStaticFieldBaseNode(ResolvedJavaField field) {
114+
return new StaticFieldBaseNode(field);
115+
}
116+
112117
public static FloatingNode createStaticFieldBaseNode(boolean primitive) {
113118
return new StaticFieldBaseNode(primitive);
114119
}
@@ -118,16 +123,24 @@ public static final class StaticFieldBaseNode extends FloatingNode implements Lo
118123
public static final NodeClass<StaticFieldBaseNode> TYPE = NodeClass.create(StaticFieldBaseNode.class);
119124

120125
public final boolean primitive;
126+
public final ResolvedJavaField field;
121127

122128
/**
123129
* We must not expose that the stamp will eventually be an array, to avoid memory graph
124130
* problems. See the comment on {@link StaticFieldsSupport}.
125131
*/
126132
protected StaticFieldBaseNode(boolean primitive) {
127133
super(TYPE, StampFactory.objectNonNull());
134+
this.field = null;
128135
this.primitive = primitive;
129136
}
130137

138+
protected StaticFieldBaseNode(ResolvedJavaField field) {
139+
super(TYPE, StampFactory.objectNonNull());
140+
this.field = Objects.requireNonNull(field);
141+
this.primitive = false; // this value doesn't matter if field is not-null
142+
}
143+
131144
/**
132145
* At first glance, this method looks like a circular dependency:
133146
* {@link StaticFieldsSupport#getStaticPrimitiveFields} is intrinsified to a
@@ -156,8 +169,22 @@ public void lower(LoweringTool tool) {
156169
*/
157170
return;
158171
}
159-
160-
JavaConstant constant = tool.getSnippetReflection().forObject(primitive ? StaticFieldsSupport.getStaticPrimitiveFields() : StaticFieldsSupport.getStaticObjectFields());
172+
JavaConstant constant;
173+
if (field != null) {
174+
SharedField sharedField = (SharedField) field;
175+
if (sharedField.isInBaseLayer()) {
176+
constant = sharedField.getStaticFieldBase();
177+
} else {
178+
/*
179+
* Cannot check primitive flag before we know that the field is SharedField, so
180+
* we can access the storage kind.
181+
*/
182+
boolean isPrimitive = sharedField.getStorageKind().isPrimitive();
183+
constant = tool.getSnippetReflection().forObject(isPrimitive ? StaticFieldsSupport.getStaticPrimitiveFields() : StaticFieldsSupport.getStaticObjectFields());
184+
}
185+
} else {
186+
constant = tool.getSnippetReflection().forObject(primitive ? StaticFieldsSupport.getStaticPrimitiveFields() : StaticFieldsSupport.getStaticObjectFields());
187+
}
161188
assert constant.isNonNull() : constant;
162189
replaceAndDelete(ConstantNode.forConstant(constant, tool.getMetaAccess(), graph()));
163190
}

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

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,6 @@
9292
import jdk.graal.compiler.replacements.nodes.AssertionNode;
9393
import jdk.vm.ci.code.CodeUtil;
9494
import jdk.vm.ci.code.TargetDescription;
95-
import jdk.vm.ci.meta.JavaKind;
9695
import jdk.vm.ci.meta.MetaAccessProvider;
9796
import jdk.vm.ci.meta.ResolvedJavaField;
9897

@@ -203,7 +202,7 @@ public int arrayLengthOffset() {
203202
public ValueNode staticFieldBase(StructuredGraph graph, ResolvedJavaField f) {
204203
SharedField field = (SharedField) f;
205204
assert field.isStatic();
206-
return graph.unique(StaticFieldsSupport.createStaticFieldBaseNode(field.getStorageKind() != JavaKind.Object));
205+
return graph.unique(StaticFieldsSupport.createStaticFieldBaseNode(field));
207206
}
208207

209208
private static ValueNode maybeUncompress(ValueNode node) {

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/meta/SharedField.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626

2727
import com.oracle.svm.core.StaticFieldsSupport;
2828

29+
import jdk.vm.ci.meta.JavaConstant;
2930
import jdk.vm.ci.meta.JavaKind;
3031
import jdk.vm.ci.meta.ResolvedJavaField;
3132

@@ -63,4 +64,9 @@ public interface SharedField extends ResolvedJavaField {
6364
boolean isValueAvailable();
6465

6566
JavaKind getStorageKind();
67+
68+
/** Returns true if this field is defined in a base layer. */
69+
boolean isInBaseLayer();
70+
71+
JavaConstant getStaticFieldBase();
6672
}

substratevm/src/com.oracle.svm.graal/src/com/oracle/svm/graal/meta/SubstrateField.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,16 @@ public boolean isValueAvailable() {
170170
return true;
171171
}
172172

173+
@Override
174+
public boolean isInBaseLayer() {
175+
return false;
176+
}
177+
178+
@Override
179+
public JavaConstant getStaticFieldBase() {
180+
throw intentionallyUnimplemented(); // ExcludeFromJacocoGeneratedReport
181+
}
182+
173183
@Override
174184
public String toString() {
175185
return "SubstrateField<" + format("%h.%n") + " location: " + location + ">";

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -279,6 +279,7 @@ private void addStaticFields() {
279279
*/
280280
for (HostedField field : hUniverse.getFields()) {
281281
if (field.wrapped.isInBaseLayer()) {
282+
/* Base layer static field values are accessed via the base layer arrays. */
282283
continue;
283284
}
284285
if (Modifier.isStatic(field.getModifiers()) && field.hasLocation() && field.getType().getStorageKind() == JavaKind.Object && field.isRead()) {

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,7 @@ private void writeStaticFields(RelocatableBuffer buffer) {
127127
ObjectInfo objectFields = heap.getObjectInfo(StaticFieldsSupport.getStaticObjectFields());
128128
for (HostedField field : heap.hUniverse.getFields()) {
129129
if (field.wrapped.isInBaseLayer()) {
130+
/* Base layer static field values are accessed via the base layer arrays. */
130131
continue;
131132
}
132133
if (Modifier.isStatic(field.getModifiers()) && field.hasLocation() && field.isRead()) {

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

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,16 @@
2424
*/
2525
package com.oracle.svm.hosted.meta;
2626

27+
import com.oracle.graal.pointsto.heap.ImageLayerLoader;
2728
import com.oracle.graal.pointsto.infrastructure.OriginalFieldProvider;
2829
import com.oracle.graal.pointsto.infrastructure.WrappedJavaField;
2930
import com.oracle.graal.pointsto.meta.AnalysisField;
31+
import com.oracle.graal.pointsto.meta.AnalysisUniverse;
32+
import com.oracle.svm.core.StaticFieldsSupport;
3033
import com.oracle.svm.core.meta.SharedField;
3134
import com.oracle.svm.hosted.ameta.FieldValueInterceptionSupport;
3235

36+
import jdk.vm.ci.meta.JavaConstant;
3337
import jdk.vm.ci.meta.JavaKind;
3438
import jdk.vm.ci.meta.ResolvedJavaField;
3539

@@ -168,4 +172,20 @@ public JavaKind getStorageKind() {
168172
public ResolvedJavaField unwrapTowardsOriginalField() {
169173
return wrapped;
170174
}
175+
176+
@Override
177+
public boolean isInBaseLayer() {
178+
return wrapped.isInBaseLayer();
179+
}
180+
181+
@Override
182+
public JavaConstant getStaticFieldBase() {
183+
AnalysisUniverse universe = type.wrapped.getUniverse();
184+
boolean primitive = getStorageKind().isPrimitive();
185+
if (isInBaseLayer()) {
186+
ImageLayerLoader imageLayerLoader = universe.getImageLayerLoader();
187+
return primitive ? imageLayerLoader.getBaseLayerStaticPrimitiveFields() : imageLayerLoader.getBaseLayerStaticObjectFields();
188+
}
189+
return universe.getSnippetReflection().forObject(primitive ? StaticFieldsSupport.getStaticPrimitiveFields() : StaticFieldsSupport.getStaticObjectFields());
190+
}
171191
}

substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/snippets/SubstrateGraphBuilderPlugins.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -860,7 +860,7 @@ private static boolean processStaticFieldBase(GraphBuilderContext b, Receiver re
860860

861861
/* Emits a null-check for the otherwise unused receiver. */
862862
receiver.get(true);
863-
b.addPush(JavaKind.Object, StaticFieldsSupport.createStaticFieldBaseNode(targetField.getType().isPrimitive()));
863+
b.addPush(JavaKind.Object, StaticFieldsSupport.createStaticFieldBaseNode(b.getMetaAccess().lookupJavaField(targetField)));
864864
return true;
865865
}
866866

0 commit comments

Comments
 (0)