Skip to content

Commit a931870

Browse files
committed
[GR-45250] [GR-45734] Strict Dynamic Access Inference
PullRequest: graal/20642
2 parents 7bc32da + 63e4d07 commit a931870

File tree

19 files changed

+3499
-110
lines changed

19 files changed

+3499
-110
lines changed

compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/nodes/graphbuilderconf/GraphBuilderContext.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@
7575
import jdk.graal.compiler.nodes.type.StampTool;
7676
import jdk.internal.misc.ScopedMemoryAccess;
7777
import jdk.vm.ci.code.BailoutException;
78+
import jdk.vm.ci.code.BytecodePosition;
7879
import jdk.vm.ci.meta.Assumptions;
7980
import jdk.vm.ci.meta.DeoptimizationAction;
8081
import jdk.vm.ci.meta.DeoptimizationReason;
@@ -281,6 +282,21 @@ default int getDepth() {
281282
return result;
282283
}
283284

285+
/**
286+
* Gets the inlining chain of this context.
287+
*
288+
* @return the inlining chain of this context represented as a {@link BytecodePosition}, or
289+
* {@code null} if this is the context for the parse root.
290+
*/
291+
default BytecodePosition getInliningChain() {
292+
BytecodePosition inliningContext = null;
293+
for (GraphBuilderContext cur = getParent(); cur != null; cur = cur.getParent()) {
294+
BytecodePosition caller = new BytecodePosition(null, cur.getMethod(), cur.bci());
295+
inliningContext = inliningContext == null ? caller : inliningContext.addCaller(caller);
296+
}
297+
return inliningContext;
298+
}
299+
284300
/**
285301
* Computes the recursive inlining depth of the provided method, i.e., counts how often the
286302
* provided method is already in the {@link #getParent()} chain starting at this context.

compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/replacements/IntrinsicGraphBuilder.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@
6868
import jdk.graal.compiler.nodes.spi.CoreProvidersDelegate;
6969
import jdk.graal.compiler.options.OptionValues;
7070
import jdk.vm.ci.code.BailoutException;
71+
import jdk.vm.ci.code.BytecodePosition;
7172
import jdk.vm.ci.meta.DeoptimizationAction;
7273
import jdk.vm.ci.meta.DeoptimizationReason;
7374
import jdk.vm.ci.meta.JavaKind;
@@ -325,6 +326,11 @@ public int getDepth() {
325326
return 0;
326327
}
327328

329+
@Override
330+
public BytecodePosition getInliningChain() {
331+
return null;
332+
}
333+
328334
@Override
329335
public boolean parsingIntrinsic() {
330336
return false;

compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/replacements/PEGraphDecoder.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,7 @@
141141
import jdk.vm.ci.code.Architecture;
142142
import jdk.vm.ci.code.BailoutException;
143143
import jdk.vm.ci.code.BytecodeFrame;
144+
import jdk.vm.ci.code.BytecodePosition;
144145
import jdk.vm.ci.meta.DeoptimizationAction;
145146
import jdk.vm.ci.meta.DeoptimizationReason;
146147
import jdk.vm.ci.meta.JavaConstant;
@@ -412,6 +413,18 @@ public int getDepth() {
412413
return methodScope.inliningDepth;
413414
}
414415

416+
@Override
417+
public BytecodePosition getInliningChain() {
418+
BytecodePosition inliningContext = null;
419+
int bci = methodScope.invokeData == null ? 0 : methodScope.invokeData.invoke.bci();
420+
for (PEMethodScope cur = methodScope.caller; cur != null; cur = cur.caller) {
421+
BytecodePosition caller = new BytecodePosition(null, cur.method, bci);
422+
inliningContext = inliningContext == null ? caller : inliningContext.addCaller(caller);
423+
bci = cur.invokeData == null ? 0 : cur.invokeData.invoke.bci();
424+
}
425+
return inliningContext;
426+
}
427+
415428
@Override
416429
public int recursiveInliningDepth(ResolvedJavaMethod method) {
417430
int result = 0;

substratevm/src/com.oracle.graal.pointsto/src/com/oracle/graal/pointsto/infrastructure/WrappedConstantPool.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -233,4 +233,8 @@ public JavaConstant lookup() {
233233
return lookupConstant(wrapped.lookup());
234234
}
235235
}
236+
237+
public ConstantPool getWrapped() {
238+
return wrapped;
239+
}
236240
}

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -477,6 +477,11 @@ protected boolean tryInvocationPlugin(CallTargetNode.InvokeKind invokeKind, Valu
477477
protected boolean shouldVerifyFrameStates() {
478478
return Options.VerifyRuntimeCompilationFrameStates.getValue();
479479
}
480+
481+
@Override
482+
protected boolean strictDynamicAccessInferenceIsApplicable() {
483+
return false;
484+
}
480485
}
481486

482487
/**

substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/ResourcesFeature.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,8 @@
9191
import com.oracle.svm.core.util.VMError;
9292
import com.oracle.svm.hosted.classinitialization.ClassInitializationSupport;
9393
import com.oracle.svm.hosted.config.ConfigurationParserUtils;
94+
import com.oracle.svm.hosted.dynamicaccessinference.DynamicAccessInferenceLog;
95+
import com.oracle.svm.hosted.dynamicaccessinference.StrictDynamicAccessInferenceFeature;
9496
import com.oracle.svm.hosted.imagelayer.HostedImageLayerBuildingSupport;
9597
import com.oracle.svm.hosted.jdk.localization.LocalizationFeature;
9698
import com.oracle.svm.hosted.reflect.NativeImageConditionResolver;
@@ -175,6 +177,8 @@ private record CompiledConditionalPattern(ConfigurationCondition condition, Reso
175177
private int loadedConfigurations;
176178
private ImageClassLoader imageClassLoader;
177179

180+
private DynamicAccessInferenceLog inferenceLog;
181+
178182
private class ResourcesRegistryImpl extends ConditionalConfigurationRegistry implements ResourcesRegistry<ConfigurationCondition> {
179183
private final ClassInitializationSupport classInitializationSupport = ClassInitializationSupport.singleton();
180184

@@ -491,6 +495,8 @@ public void beforeAnalysis(BeforeAnalysisAccess a) {
491495
globWorkSet = Set.of();
492496

493497
resourceRegistryImpl().setAnalysisAccess(access);
498+
499+
inferenceLog = DynamicAccessInferenceLog.singletonOrNull();
494500
}
495501

496502
private static final class ResourceCollectorImpl extends ConditionalConfigurationRegistry implements ResourceCollector {
@@ -692,7 +698,7 @@ public void beforeCompilation(BeforeCompilationAccess access) {
692698

693699
@Override
694700
public void registerInvocationPlugins(Providers providers, GraphBuilderConfiguration.Plugins plugins, ParsingReason reason) {
695-
if (!reason.duringAnalysis() || reason == ParsingReason.JITCompilation) {
701+
if (!reason.duringAnalysis() || reason == ParsingReason.JITCompilation || StrictDynamicAccessInferenceFeature.isEnforced()) {
696702
return;
697703
}
698704

@@ -732,6 +738,9 @@ public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Rec
732738
throw VMError.shouldNotReachHere(e);
733739
}
734740
b.add(ReachabilityRegistrationNode.create(() -> RuntimeResourceAccess.addResource(clazz.getModule(), resourceName), reason));
741+
if (inferenceLog != null) {
742+
inferenceLog.logRegistration(b, reason, targetMethod, clazz, new String[]{resource});
743+
}
735744
return true;
736745
}
737746
return false;

substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/SVMHost.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,8 @@
120120
import com.oracle.svm.hosted.code.InliningUtilities;
121121
import com.oracle.svm.hosted.code.SubstrateCompilationDirectives;
122122
import com.oracle.svm.hosted.code.UninterruptibleAnnotationChecker;
123+
import com.oracle.svm.hosted.dynamicaccessinference.ConstantExpressionRegistry;
124+
import com.oracle.svm.hosted.dynamicaccessinference.StrictDynamicAccessInferenceFeature;
123125
import com.oracle.svm.hosted.fieldfolding.StaticFinalFieldFoldingPhase;
124126
import com.oracle.svm.hosted.heap.PodSupport;
125127
import com.oracle.svm.hosted.imagelayer.HostedDynamicLayerInfo;
@@ -229,6 +231,8 @@ public enum UsageKind {
229231
private final LayeredStaticFieldSupport layeredStaticFieldSupport;
230232
private final MetaAccessProvider originalMetaAccess;
231233

234+
private final ConstantExpressionRegistry constantExpressionRegistry;
235+
232236
@SuppressWarnings("this-escape")
233237
public SVMHost(OptionValues options, ImageClassLoader loader, ClassInitializationSupport classInitializationSupport, AnnotationSubstitutionProcessor annotationSubstitutions,
234238
MissingRegistrationSupport missingRegistrationSupport) {
@@ -268,6 +272,8 @@ public SVMHost(OptionValues options, ImageClassLoader loader, ClassInitializatio
268272
featureType = lookupOriginalType(Feature.class);
269273

270274
verifyNamingConventions = SubstrateOptions.VerifyNamingConventions.getValue();
275+
276+
constantExpressionRegistry = StrictDynamicAccessInferenceFeature.isActive() ? ConstantExpressionRegistry.singleton() : null;
271277
}
272278

273279
/**
@@ -1387,4 +1393,8 @@ public boolean allowConstantFolding(AnalysisMethod method) {
13871393
public SimulateClassInitializerSupport createSimulateClassInitializerSupport(AnalysisMetaAccess aMetaAccess) {
13881394
return new SimulateClassInitializerSupport(aMetaAccess, this);
13891395
}
1396+
1397+
public ConstantExpressionRegistry getConstantExpressionRegistry() {
1398+
return constantExpressionRegistry;
1399+
}
13901400
}

0 commit comments

Comments
 (0)