Skip to content

Commit 58ebbc8

Browse files
committed
[GR-69081] Remove isValueAvailable from SharedField
PullRequest: graal/21936
2 parents d18bce1 + 6b2a29e commit 58ebbc8

File tree

10 files changed

+23
-28
lines changed

10 files changed

+23
-28
lines changed

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/graal/nodes/SubstrateFieldLocationIdentity.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,9 @@
2424
*/
2525
package com.oracle.svm.core.graal.nodes;
2626

27-
import jdk.graal.compiler.nodes.FieldLocationIdentity;
28-
2927
import com.oracle.svm.core.meta.SharedField;
3028

29+
import jdk.graal.compiler.nodes.FieldLocationIdentity;
3130
import jdk.vm.ci.meta.ResolvedJavaField;
3231

3332
public class SubstrateFieldLocationIdentity extends FieldLocationIdentity {
@@ -42,6 +41,7 @@ public SubstrateFieldLocationIdentity(FieldLocationIdentity identity) {
4241

4342
@Override
4443
public boolean isImmutable() {
45-
return super.isImmutable() || (getField() instanceof SharedField sField && !sField.isWritten() && sField.isValueAvailable());
44+
/* We can also treat a field as immutable if the analysis determines it is never written. */
45+
return super.isImmutable() || (getField() instanceof SharedField sField && !sField.isWritten());
4646
}
4747
}

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

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -59,12 +59,6 @@ public interface SharedField extends ResolvedJavaField {
5959

6060
boolean isWritten();
6161

62-
/**
63-
* Returns true if the field's value is available at the time of querying. For unknown fields
64-
* this depends on the image build stage when the value is computed.
65-
*/
66-
boolean isValueAvailable();
67-
6862
JavaKind getStorageKind();
6963

7064
/**

substratevm/src/com.oracle.svm.graal/src/com/oracle/svm/graal/hosted/runtimecompilation/GraalGraphObjectReplacer.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -520,7 +520,7 @@ public void updateSubstrateDataAfterCompilation(HostedUniverse hUniverse, Provid
520520
? providers.getConstantReflection().readFieldValue(hField, null)
521521
: null;
522522
constantValue = SubstrateGraalUtils.hostedToRuntime(constantValue, providers.getConstantReflection());
523-
sField.setSubstrateDataAfterCompilation(hField.getLocation(), hField.isAccessed(), hField.isWritten() || !hField.isValueAvailable(), constantValue);
523+
sField.setSubstrateDataAfterCompilation(hField.getLocation(), hField.isAccessed(), hField.isWritten(), constantValue);
524524
}
525525

526526
methods.forEach((aMethod, sMethod) -> {

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

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -177,11 +177,6 @@ public boolean isSynthetic() {
177177
throw intentionallyUnimplemented(); // ExcludeFromJacocoGeneratedReport
178178
}
179179

180-
@Override
181-
public boolean isValueAvailable() {
182-
return true;
183-
}
184-
185180
@Override
186181
public int getInstalledLayerNum() {
187182
/*

substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/ameta/AnalysisConstantReflectionProvider.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,6 @@
4242
import com.oracle.graal.pointsto.meta.AnalysisField;
4343
import com.oracle.graal.pointsto.meta.AnalysisType;
4444
import com.oracle.graal.pointsto.meta.AnalysisUniverse;
45-
import com.oracle.graal.pointsto.util.AnalysisError;
4645
import com.oracle.svm.core.classinitialization.TypeReachedProvider;
4746
import com.oracle.svm.core.hub.DynamicHub;
4847
import com.oracle.svm.core.util.VMError;
@@ -230,13 +229,19 @@ public JavaConstant readValue(AnalysisField field, JavaConstant receiver, boolea
230229
}
231230

232231
if (field.preventConstantFolding()) {
232+
/* Reading this value is prohibited. */
233233
return null;
234234
}
235235

236236
if (receiver instanceof ImageHeapInstance imageHeapInstance && imageHeapInstance.isInBaseLayer() && imageHeapInstance.nullFieldValues()) {
237237
return null;
238238
}
239239

240+
if (!fieldValueInterceptionSupport.isValueAvailable(field)) {
241+
/* Value is not yet available. */
242+
return null;
243+
}
244+
240245
VMError.guarantee(receiver == null || receiver instanceof ImageHeapConstant, "Expected ImageHeapConstant, found: %s", receiver);
241246
JavaConstant value = null;
242247
if (returnSimulatedValues) {
@@ -260,7 +265,6 @@ public JavaConstant readValue(AnalysisField field, JavaConstant receiver, boolea
260265
}
261266
if (value == null && receiver instanceof ImageHeapConstant heapConstant) {
262267
heapConstant.ensureReaderInstalled();
263-
AnalysisError.guarantee(fieldValueInterceptionSupport.isValueAvailable(field), "Value not yet available for %s", field);
264268
ImageHeapInstance heapObject = (ImageHeapInstance) receiver;
265269
value = heapObject.readFieldValue(field);
266270
}

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

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -303,10 +303,6 @@ public Object readInlinedField(HostedField field, JavaConstant receiver) {
303303
return hUniverse.getSnippetReflection().asObject(Object.class, constant);
304304
}
305305

306-
private JavaConstant readConstantField(HostedField field, JavaConstant receiver) {
307-
return hConstantReflection.readFieldValue(field, receiver, true);
308-
}
309-
310306
private void addStaticFields() {
311307
addObject(StaticFieldsSupport.getCurrentLayerStaticObjectFields(), false, HeapInclusionReason.StaticObjectFields);
312308
addObject(StaticFieldsSupport.getCurrentLayerStaticPrimitiveFields(), false, HeapInclusionReason.StaticPrimitiveFields);
@@ -319,7 +315,7 @@ private void addStaticFields() {
319315
if (field.getWrapped().installableInLayer() && Modifier.isStatic(field.getModifiers()) && field.hasLocation() && field.getType().getStorageKind() == JavaKind.Object && field.isRead()) {
320316
assert field.isWritten() || !field.isValueAvailable() || MaterializedConstantFields.singleton().contains(field.wrapped);
321317
/* GR-56699 currently static fields cannot be ImageHeapRelocatableConstants. */
322-
addConstant(readConstantField(field, null), false, field);
318+
addConstant(hConstantReflection.readConstantField(field, null), false, field);
323319
}
324320
}
325321
}
@@ -600,7 +596,7 @@ private void addObjectToImageHeap(final JavaConstant constant, boolean immutable
600596
if (field.isRead() && field.isValueAvailable() && !ignoredFields.contains(field)) {
601597
if (field.getJavaKind() == JavaKind.Object) {
602598
assert field.hasLocation();
603-
JavaConstant fieldValueConstant = hConstantReflection.readFieldValue(field, constant, true);
599+
JavaConstant fieldValueConstant = hConstantReflection.readConstantField(field, constant);
604600
if (fieldValueConstant.getJavaKind() == JavaKind.Object) {
605601
if (spawnIsolates()) {
606602
fieldRelocatable = isRelocatableConstant(fieldValueConstant);

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,7 @@ private void writeField(RelocatableBuffer buffer, ObjectInfo fields, HostedField
174174
int index = getIndexInBuffer(fields, field.getLocation());
175175
JavaConstant value;
176176
try {
177-
value = heap.hConstantReflection.readFieldValue(field, receiver, true);
177+
value = heap.hConstantReflection.readConstantField(field, receiver);
178178
} catch (AnalysisError.TypeNotFoundError ex) {
179179
throw NativeImageHeap.reportIllegalType(ex.getType(), info);
180180
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ public boolean isFinalField(ResolvedJavaField f, ConstantFieldTool<?> tool) {
5858
public static boolean isFinalField(HostedField field) {
5959
if (field.location == HostedField.LOC_UNMATERIALIZED_STATIC_CONSTANT) {
6060
return true;
61-
} else if (!field.isWritten() && field.isValueAvailable()) {
61+
} else if (!field.isWritten()) {
6262
return true;
6363
}
6464
return false;

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

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@
2626

2727
import static com.oracle.svm.core.util.VMError.shouldNotReachHereAtRuntime;
2828

29+
import java.util.Objects;
30+
2931
import org.graalvm.nativeimage.Platform;
3032
import org.graalvm.nativeimage.Platforms;
3133

@@ -71,10 +73,15 @@ public JavaConstant asJavaClass(ResolvedJavaType type) {
7173

7274
@Override
7375
public JavaConstant readFieldValue(ResolvedJavaField field, JavaConstant receiver) {
74-
return readFieldValue(field, receiver, false);
76+
return readFieldValueHelper(field, receiver, false);
77+
}
78+
79+
/** Same as {@link #readFieldValue}, except that the field value must be available. */
80+
public JavaConstant readConstantField(ResolvedJavaField field, JavaConstant receiver) {
81+
return Objects.requireNonNull(readFieldValueHelper(field, receiver, true));
7582
}
7683

77-
public JavaConstant readFieldValue(ResolvedJavaField field, JavaConstant receiver, boolean readRelocatableValues) {
84+
private JavaConstant readFieldValueHelper(ResolvedJavaField field, JavaConstant receiver, boolean readRelocatableValues) {
7885
var hField = (HostedField) field;
7986
assert checkHub(receiver) : "Receiver " + receiver + " of field " + hField + " read should not be java.lang.Class. Expecting to see DynamicHub here.";
8087
return super.readValue(hField.getWrapped(), receiver, true, readRelocatableValues);

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

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,6 @@ public boolean isWritten() {
144144
return wrapped.isWritten();
145145
}
146146

147-
@Override
148147
public boolean isValueAvailable() {
149148
return FieldValueInterceptionSupport.singleton().isValueAvailable(wrapped);
150149
}

0 commit comments

Comments
 (0)