package com.oracle.svm.truffle.api;
import java.util.concurrent.ConcurrentHashMap;
import org.graalvm.collections.EconomicMap;
import org.graalvm.compiler.graph.SourceLanguagePositionProvider;
import org.graalvm.compiler.nodes.EncodedGraph;
import org.graalvm.compiler.nodes.StructuredGraph;
import org.graalvm.compiler.nodes.graphbuilderconf.GraphBuilderConfiguration;
import org.graalvm.compiler.nodes.graphbuilderconf.GraphBuilderConfiguration.Plugins;
import org.graalvm.compiler.nodes.graphbuilderconf.InlineInvokePlugin;
import org.graalvm.compiler.nodes.graphbuilderconf.InvocationPlugins;
import org.graalvm.compiler.nodes.graphbuilderconf.LoopExplosionPlugin;
import org.graalvm.compiler.nodes.graphbuilderconf.NodePlugin;
import org.graalvm.compiler.nodes.graphbuilderconf.ParameterPlugin;
import org.graalvm.compiler.phases.util.Providers;
import org.graalvm.compiler.replacements.PEGraphDecoder;
import org.graalvm.compiler.replacements.PEGraphDecoder.SpecialCallTargetCacheKey;
import org.graalvm.compiler.truffle.compiler.PartialEvaluator;
import org.graalvm.compiler.truffle.compiler.PartialEvaluatorConfiguration;
import org.graalvm.compiler.truffle.compiler.TruffleCompilerConfiguration;
import org.graalvm.compiler.truffle.compiler.substitutions.TruffleDecodingPlugins;
import org.graalvm.nativeimage.Platform;
import org.graalvm.nativeimage.Platforms;
import com.oracle.svm.core.graal.phases.DeadStoreRemovalPhase;
import jdk.vm.ci.meta.ResolvedJavaMethod;
public class SubstratePartialEvaluator extends PartialEvaluator {
private final ConcurrentHashMap<ResolvedJavaMethod, Object> invocationPluginsCache;
private final ConcurrentHashMap<SpecialCallTargetCacheKey, Object> specialCallTargetCache;
@Platforms(Platform.HOSTED_ONLY.class)
public SubstratePartialEvaluator(TruffleCompilerConfiguration config, GraphBuilderConfiguration graphBuilderConfigForRoot) {
super(config, graphBuilderConfigForRoot, new SubstrateKnownTruffleTypes(config.lastTier().providers().getMetaAccess()));
this.invocationPluginsCache = new ConcurrentHashMap<>();
this.specialCallTargetCache = new ConcurrentHashMap<>();
}
@Override
protected PEGraphDecoder createGraphDecoder(Request request, LoopExplosionPlugin loopExplosionPlugin,
InvocationPlugins invocationPlugins,
InlineInvokePlugin[] inlineInvokePlugins, ParameterPlugin parameterPlugin, NodePlugin[] nodePlugins, SourceLanguagePositionProvider sourceLanguagePositionProvider,
EconomicMap<ResolvedJavaMethod, EncodedGraph> graphCache) {
return new SubstratePEGraphDecoder(architecture, request.graph, providers.copyWith(compilationLocalConstantProvider), loopExplosionPlugin, invocationPlugins, inlineInvokePlugins,
parameterPlugin, nodePlugins, callInlined, sourceLanguagePositionProvider,
specialCallTargetCache, invocationPluginsCache);
}
@Override
protected StructuredGraph.Builder customizeStructuredGraphBuilder(StructuredGraph.Builder builder) {
return super.customizeStructuredGraphBuilder(builder).recordInlinedMethods(false);
}
@Override
public void doGraphPE(Request request, InlineInvokePlugin inlineInvokePlugin, EconomicMap<ResolvedJavaMethod, EncodedGraph> graphCache) {
super.doGraphPE(request, inlineInvokePlugin, graphCache);
new DeadStoreRemovalPhase().apply(request.graph);
new TruffleBoundaryPhase().apply(request.graph);
}
@Override
protected void registerGraphBuilderInvocationPlugins(InvocationPlugins invocationPlugins, boolean canDelayIntrinsification) {
super.registerGraphBuilderInvocationPlugins(invocationPlugins, canDelayIntrinsification);
SubstrateTruffleGraphBuilderPlugins.registerInvocationPlugins(invocationPlugins, canDelayIntrinsification, (SubstrateKnownTruffleTypes) getKnownTruffleTypes());
}
@Platforms(Platform.HOSTED_ONLY.class)
@Override
protected InvocationPlugins createDecodingInvocationPlugins(PartialEvaluatorConfiguration peConfig, Plugins parent, Providers tierProviders) {
InvocationPlugins decodingInvocationPlugins = new InvocationPlugins();
registerGraphBuilderInvocationPlugins(decodingInvocationPlugins, false);
TruffleDecodingPlugins.registerInvocationPlugins(decodingInvocationPlugins, tierProviders);
peConfig.registerDecodingInvocationPlugins(decodingInvocationPlugins, false, providers, config.architecture());
decodingInvocationPlugins.closeRegistration();
return decodingInvocationPlugins;
}
@Override
protected NodePlugin[] createNodePlugins(Plugins plugins) {
return null;
}
}