Skip to content

[GR-45250] [GR-45734] Reachability proofs for reflective operations #11079

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 14 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,7 @@
import jdk.graal.compiler.nodes.type.StampTool;
import jdk.internal.misc.ScopedMemoryAccess;
import jdk.vm.ci.code.BailoutException;
import jdk.vm.ci.code.BytecodePosition;
import jdk.vm.ci.meta.Assumptions;
import jdk.vm.ci.meta.DeoptimizationAction;
import jdk.vm.ci.meta.DeoptimizationReason;
Expand Down Expand Up @@ -281,6 +282,19 @@ default int getDepth() {
return result;
}

/**
* Gets the inlining chain of this context. A null return value implies that this is the context
* for the parse root.
*/
default BytecodePosition getInliningChain() {
BytecodePosition inliningContext = null;
for (GraphBuilderContext cur = getParent(); cur != null; cur = cur.getParent()) {
BytecodePosition caller = new BytecodePosition(null, cur.getMethod(), cur.bci());
inliningContext = inliningContext == null ? caller : inliningContext.addCaller(caller);
}
return inliningContext;
}

/**
* Computes the recursive inlining depth of the provided method, i.e., counts how often the
* provided method is already in the {@link #getParent()} chain starting at this context.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,7 @@
import jdk.graal.compiler.nodes.spi.CoreProvidersDelegate;
import jdk.graal.compiler.options.OptionValues;
import jdk.vm.ci.code.BailoutException;
import jdk.vm.ci.code.BytecodePosition;
import jdk.vm.ci.meta.DeoptimizationAction;
import jdk.vm.ci.meta.DeoptimizationReason;
import jdk.vm.ci.meta.JavaKind;
Expand Down Expand Up @@ -325,6 +326,11 @@ public int getDepth() {
return 0;
}

@Override
public BytecodePosition getInliningChain() {
return null;
}

@Override
public boolean parsingIntrinsic() {
return false;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

import jdk.vm.ci.code.BytecodePosition;
import org.graalvm.collections.Pair;

import jdk.graal.compiler.api.replacements.Fold;
Expand Down Expand Up @@ -412,6 +413,18 @@ public int getDepth() {
return methodScope.inliningDepth;
}

@Override
public BytecodePosition getInliningChain() {
BytecodePosition inliningContext = null;
int bci = methodScope.invokeData == null ? 0 : methodScope.invokeData.invoke.bci();
for (PEMethodScope cur = methodScope.caller; cur != null; cur = cur.caller) {
BytecodePosition caller = new BytecodePosition(null, cur.method, bci);
inliningContext = inliningContext == null ? caller : inliningContext.addCaller(caller);
bci = cur.invokeData == null ? 0 : cur.invokeData.invoke.bci();
}
return inliningContext;
}

@Override
public int recursiveInliningDepth(ResolvedJavaMethod method) {
int result = 0;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -218,4 +218,8 @@ public List<JavaConstant> getStaticArguments() {
return wrapped.getStaticArguments().stream().map(WrappedConstantPool.this::lookupConstant).collect(Collectors.toList());
}
}

public ConstantPool getWrapped() {
return wrapped;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -477,6 +477,11 @@ protected boolean tryInvocationPlugin(CallTargetNode.InvokeKind invokeKind, Valu
protected boolean shouldVerifyFrameStates() {
return Options.VerifyRuntimeCompilationFrameStates.getValue();
}

@Override
protected boolean strictDynamicAccessInferenceIsApplicable() {
return false;
}
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,8 @@
import java.util.regex.Pattern;
import java.util.stream.Collectors;

import com.oracle.svm.hosted.dynamicaccessinference.DynamicAccessInferenceLog;
import com.oracle.svm.hosted.dynamicaccessinference.StrictDynamicAccessInferenceFeature;
import org.graalvm.nativeimage.ImageSingletons;
import org.graalvm.nativeimage.hosted.RuntimeResourceAccess;
import org.graalvm.nativeimage.impl.ConfigurationCondition;
Expand Down Expand Up @@ -174,6 +176,8 @@ private record CompiledConditionalPattern(ConfigurationCondition condition, Reso
private int loadedConfigurations;
private ImageClassLoader imageClassLoader;

private DynamicAccessInferenceLog inferenceLog;

private class ResourcesRegistryImpl extends ConditionalConfigurationRegistry implements ResourcesRegistry<ConfigurationCondition> {
private final ClassInitializationSupport classInitializationSupport = ClassInitializationSupport.singleton();

Expand Down Expand Up @@ -392,6 +396,7 @@ public void afterRegistration(AfterRegistrationAccess a) {
ImageSingletons.add(RuntimeResourceSupport.class, resourcesRegistry);
EmbeddedResourcesInfo embeddedResourcesInfo = new EmbeddedResourcesInfo();
ImageSingletons.add(EmbeddedResourcesInfo.class, embeddedResourcesInfo);
inferenceLog = ImageSingletons.contains(DynamicAccessInferenceLog.class) ? DynamicAccessInferenceLog.singleton() : null;
}

private static ResourcesRegistryImpl resourceRegistryImpl() {
Expand Down Expand Up @@ -672,7 +677,7 @@ public void beforeCompilation(BeforeCompilationAccess access) {

@Override
public void registerInvocationPlugins(Providers providers, GraphBuilderConfiguration.Plugins plugins, ParsingReason reason) {
if (!reason.duringAnalysis() || reason == ParsingReason.JITCompilation) {
if (!reason.duringAnalysis() || reason == ParsingReason.JITCompilation || StrictDynamicAccessInferenceFeature.isEnforced()) {
return;
}

Expand Down Expand Up @@ -712,6 +717,9 @@ public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Rec
throw VMError.shouldNotReachHere(e);
}
b.add(ReachabilityRegistrationNode.create(() -> RuntimeResourceAccess.addResource(clazz.getModule(), resourceName), reason));
if (inferenceLog != null) {
inferenceLog.logRegistration(b, reason, targetMethod, clazz, new String[]{resource});
}
return true;
}
return false;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,8 @@
import java.util.function.Function;
import java.util.function.Predicate;

import com.oracle.svm.hosted.dynamicaccessinference.StrictDynamicAccessInferenceFeature;
import com.oracle.svm.hosted.dynamicaccessinference.StrictDynamicAccessInferenceSupport;
import org.graalvm.nativeimage.AnnotationAccess;
import org.graalvm.nativeimage.ImageSingletons;
import org.graalvm.nativeimage.Platform;
Expand Down Expand Up @@ -219,6 +221,8 @@ public enum UsageKind {
private final boolean buildingImageLayer = ImageLayerBuildingSupport.buildingImageLayer();
private final LayeredStaticFieldSupport layeredStaticFieldSupport;

private final StrictDynamicAccessInferenceSupport strictDynamicAccessInferenceSupport;

@SuppressWarnings("this-escape")
public SVMHost(OptionValues options, ImageClassLoader loader, ClassInitializationSupport classInitializationSupport, AnnotationSubstitutionProcessor annotationSubstitutions,
MissingRegistrationSupport missingRegistrationSupport) {
Expand Down Expand Up @@ -255,6 +259,8 @@ public SVMHost(OptionValues options, ImageClassLoader loader, ClassInitializatio
enableTrackAcrossLayers = ImageLayerBuildingSupport.buildingSharedLayer();
enableReachableInCurrentLayer = ImageLayerBuildingSupport.buildingExtensionLayer();
layeredStaticFieldSupport = ImageLayerBuildingSupport.buildingImageLayer() ? LayeredStaticFieldSupport.singleton() : null;

strictDynamicAccessInferenceSupport = StrictDynamicAccessInferenceFeature.isDisabled() ? null : StrictDynamicAccessInferenceSupport.singleton();
}

/**
Expand Down Expand Up @@ -1270,4 +1276,8 @@ public boolean allowConstantFolding(AnalysisMethod method) {
public SimulateClassInitializerSupport createSimulateClassInitializerSupport(AnalysisMetaAccess aMetaAccess) {
return new SimulateClassInitializerSupport(aMetaAccess, this);
}

public StrictDynamicAccessInferenceSupport getStrictDynamicAccessInferenceSupport() {
return strictDynamicAccessInferenceSupport;
}
}
Loading