Skip to content

Commit 86871c8

Browse files
committed
Skip scanning base layer static fields.
1 parent 4593f9b commit 86871c8

File tree

7 files changed

+33
-3
lines changed

7 files changed

+33
-3
lines changed

substratevm/src/com.oracle.graal.pointsto/src/com/oracle/graal/pointsto/BigBang.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,10 @@ default boolean isCallAllowed(PointsToAnalysis bb, AnalysisMethod caller, Analys
108108
default void onFieldAccessed(AnalysisField field) {
109109
}
110110

111+
@SuppressWarnings("unused")
112+
default void injectFieldTypes(AnalysisField aField, AnalysisType... customTypes) {
113+
}
114+
111115
@SuppressWarnings("unused")
112116
default void onTypeInstantiated(AnalysisType type, UsageKind usageKind) {
113117
}

substratevm/src/com.oracle.graal.pointsto/src/com/oracle/graal/pointsto/ObjectScanner.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,10 @@ protected void scanEmbeddedRoot(JavaConstant root, Object position) {
156156
* @param field the scanned root field
157157
*/
158158
protected final void scanRootField(AnalysisField field) {
159+
if (field.isInBaseLayer()) {
160+
// skip base layer roots
161+
return;
162+
}
159163
scanField(field, null, null);
160164
}
161165

substratevm/src/com.oracle.graal.pointsto/src/com/oracle/graal/pointsto/heap/ImageHeapScanner.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,23 @@ public void onFieldRead(AnalysisField field) {
130130
AnalysisType declaringClass = field.getDeclaringClass();
131131
if (field.isStatic()) {
132132
FieldScan reason = new FieldScan(field);
133+
if (field.isInBaseLayer()) {
134+
/*
135+
* For base layer static fields we don't want to scan the constant value, but
136+
* instead inject its type state in the field flow. This will be propagated to any
137+
* corresponding field loads.
138+
*
139+
* GR-52421: the field state needs to be serialized from the base layer analysis
140+
*/
141+
if (field.getJavaKind().isObject()) {
142+
AnalysisType fieldType = field.getType();
143+
if (fieldType.isArray() || (fieldType.isInstanceClass() && !fieldType.isAbstract())) {
144+
fieldType.registerAsInHeap(field);
145+
}
146+
bb.injectFieldTypes(field, fieldType);
147+
}
148+
return;
149+
}
133150
if (isValueAvailable(field)) {
134151
JavaConstant fieldValue = readStaticFieldValue(field);
135152
markReachable(fieldValue, reason);

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ private void injectFieldTypes(AnalysisField field, List<AnalysisType> customType
8585
injectFieldTypes(field, customTypes.toArray(new AnalysisType[0]));
8686
}
8787

88-
protected abstract void injectFieldTypes(AnalysisField aField, AnalysisType... customTypes);
88+
public abstract void injectFieldTypes(AnalysisField aField, AnalysisType... customTypes);
8989

9090
private List<AnalysisType> transformTypes(AnalysisField field, List<Class<?>> types) {
9191
List<AnalysisType> customTypes = new ArrayList<>();

substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/analysis/NativeImagePointsToAnalysis.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,11 @@ public void onFieldAccessed(AnalysisField field) {
118118
customTypeFieldHandler.handleField(field);
119119
}
120120

121+
@Override
122+
public void injectFieldTypes(AnalysisField aField, AnalysisType... customTypes) {
123+
customTypeFieldHandler.injectFieldTypes(aField, customTypes);
124+
}
125+
121126
@Override
122127
public void onTypeReachable(AnalysisType type) {
123128
postTask(d -> {

substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/analysis/NativeImageReachabilityAnalysisEngine.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ public NativeImageReachabilityAnalysisEngine(OptionValues options, AnalysisUnive
5858
this.dynamicHubInitializer = new DynamicHubInitializer(this);
5959
this.unknownFieldHandler = new CustomTypeFieldHandler(this, metaAccess) {
6060
@Override
61-
protected void injectFieldTypes(AnalysisField aField, AnalysisType... declaredTypes) {
61+
public void injectFieldTypes(AnalysisField aField, AnalysisType... declaredTypes) {
6262
assert aField.getJavaKind().isObject();
6363
markFieldAccessed(aField, "@UnknownObjectField annotated field.");
6464
for (AnalysisType declaredType : declaredTypes) {

substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/analysis/PointsToCustomTypeFieldHandler.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ public PointsToCustomTypeFieldHandler(BigBang bb, AnalysisMetaAccess metaAccess)
4141
* which are not available during analysis.
4242
*/
4343
@Override
44-
protected void injectFieldTypes(AnalysisField aField, AnalysisType... customTypes) {
44+
public void injectFieldTypes(AnalysisField aField, AnalysisType... customTypes) {
4545
NativeImagePointsToAnalysis analysis = (NativeImagePointsToAnalysis) bb;
4646

4747
assert aField.getJavaKind().isObject();

0 commit comments

Comments
 (0)