protected GraphBuilderConfiguration createHostedGraphBuilderConfiguration(HostedProviders providers, @SuppressWarnings("unused") HostedMethod method) { GraphBuilderConfiguration gbConf = GraphBuilderConfiguration.getDefault(providers.getGraphBuilderPlugins()).withBytecodeExceptionMode(BytecodeExceptionMode.CheckAll); return gbConf; }
private static GraphBuilderConfiguration buildLambdaParserConfig() { Plugins plugins = new Plugins(new InvocationPlugins()); plugins.setClassInitializationPlugin(new NoClassInitializationPlugin()); return GraphBuilderConfiguration.getDefault(plugins).withEagerResolving(true); }
protected GraphBuilderConfiguration createGraphBuilderConfig(GraphBuilderConfiguration config, boolean canDelayIntrinsification) { GraphBuilderConfiguration newConfig = config.copy(); InvocationPlugins invocationPlugins = newConfig.getPlugins().getInvocationPlugins(); registerTruffleInvocationPlugins(invocationPlugins, canDelayIntrinsification); boolean mustInstrumentBranches = TruffleCompilerOptions.getValue(TruffleInstrumentBranches) || TruffleCompilerOptions.getValue(TruffleInstrumentBoundaries); return newConfig.withNodeSourcePosition(newConfig.trackNodeSourcePosition() || mustInstrumentBranches || TruffleCompilerOptions.getValue(TraceTrufflePerformanceWarnings)); }
/** * Compiles a method denoted as a * {@linkplain HotSpotTruffleCompilerRuntime#getTruffleCallBoundaryMethods() Truffle call * boundary}. The compiled code has a special entry point generated by an * {@link TruffleCallBoundaryInstrumentationFactory}. */ private CompilationResult compileTruffleCallBoundaryMethod(ResolvedJavaMethod javaMethod, CompilationIdentifier compilationId, DebugContext debug) { Suites newSuites = this.lastTierSuites.copy(); removeInliningPhase(newSuites); OptionValues options = TruffleCompilerOptions.getOptions(); StructuredGraph graph = new StructuredGraph.Builder(options, debug, AllowAssumptions.NO).method(javaMethod).compilationId(compilationId).build(); MetaAccessProvider metaAccess = lastTierProviders.getMetaAccess(); Plugins plugins = new Plugins(new InvocationPlugins()); HotSpotCodeCacheProvider codeCache = (HotSpotCodeCacheProvider) lastTierProviders.getCodeCache(); boolean infoPoints = codeCache.shouldDebugNonSafepoints(); GraphBuilderConfiguration newConfig = GraphBuilderConfiguration.getDefault(plugins).withEagerResolving(true).withUnresolvedIsError(true).withNodeSourcePosition(infoPoints); new GraphBuilderPhase.Instance(metaAccess, lastTierProviders.getStampProvider(), lastTierProviders.getConstantReflection(), lastTierProviders.getConstantFieldProvider(), newConfig, OptimisticOptimizations.ALL, null).apply(graph); PhaseSuite<HighTierContext> graphBuilderSuite = getGraphBuilderSuite(codeCache, backend.getSuites()); CompilationResultBuilderFactory factory = getTruffleCallBoundaryInstrumentationFactory(backend.getTarget().arch.getName()); return compileGraph(graph, javaMethod, lastTierProviders, backend, graphBuilderSuite, OptimisticOptimizations.ALL, graph.getProfilingInfo(), newSuites, lastTierLirSuites, new CompilationResult(compilationId), factory, false); }
public TruffleCompilerImpl(TruffleCompilerRuntime runtime, Plugins plugins, Suites lastTierSuites, LIRSuites lastTierLirSuites, Backend backend, Suites firstTierSuites, LIRSuites firstTierLirSuites, Providers firstTierProviders, SnippetReflectionProvider snippetReflection) { this.backend = backend; this.snippetReflection = snippetReflection; this.lastTierProviders = backend.getProviders(); this.lastTierSuites = lastTierSuites; this.lastTierLirSuites = lastTierLirSuites; this.codeInstallationTaskFactory = new TrufflePostCodeInstallationTaskFactory(); backend.addCodeInstallationTask(codeInstallationTaskFactory); ResolvedJavaType[] skippedExceptionTypes = getSkippedExceptionTypes(runtime); boolean needSourcePositions = TruffleCompilerOptions.getValue(TruffleEnableInfopoints) || TruffleCompilerOptions.getValue(TruffleInstrumentBranches) || TruffleCompilerOptions.getValue(TruffleInstrumentBoundaries); GraphBuilderConfiguration baseConfig = GraphBuilderConfiguration.getDefault(new Plugins(plugins)).withNodeSourcePosition(needSourcePositions); this.config = baseConfig.withSkippedExceptionTypes(skippedExceptionTypes).withOmitAssertions(TruffleCompilerOptions.getValue(TruffleExcludeAssertions)).withBytecodeExceptionMode( BytecodeExceptionMode.ExplicitOnly); this.partialEvaluator = createPartialEvaluator(); this.firstTierProviders = firstTierProviders; this.firstTierSuites = firstTierSuites; this.firstTierLirSuites = firstTierLirSuites; }
protected void notifyAfterInline(ResolvedJavaMethod inlinedMethod) { for (InlineInvokePlugin plugin : graphBuilderConfig.getPlugins().getInlineInvokePlugins()) { plugin.notifyAfterInline(inlinedMethod); } }
this.parent = parent; ClassInitializationPlugin classInitializationPlugin = graphBuilderConfig.getPlugins().getClassInitializationPlugin(); if (classInitializationPlugin != null && graphBuilderConfig.eagerResolving()) { uninitializedIsError = eagerInitializing = !classInitializationPlugin.supportsLazyInitialization(constantPool); } else { eagerInitializing = graphBuilderConfig.eagerResolving(); uninitializedIsError = graphBuilderConfig.unresolvedIsError(); if (graphBuilderConfig.insertFullInfopoints() && !parsingIntrinsic()) { lnt = code.getLineNumberTable(); previousLineNumber = -1; if (graphBuilderConfig.trackNodeSourcePosition() || (parent != null && parent.graph.trackNodeSourcePosition())) { graph.setTrackNodeSourcePosition();
public void initializeRuntimeCompilationConfiguration(HostedProviders newHostedProviders, GraphBuilderConfiguration newGraphBuilderConfig, IncludeCalleePredicate newIncludeCalleePredicate, Predicate<ResolvedJavaMethod> newDeoptimizeOnExceptionPredicate) { guarantee(initialized == false, "runtime compilation configuration already initialized"); initialized = true; hostedProviders = newHostedProviders; graphBuilderConfig = newGraphBuilderConfig; includeCalleePredicate = newIncludeCalleePredicate; deoptimizeOnExceptionPredicate = newDeoptimizeOnExceptionPredicate; if (SubstrateOptions.IncludeNodeSourcePositions.getValue()) { graphBuilderConfig = graphBuilderConfig.withNodeSourcePosition(true); } }
protected PhaseSuite<HighTierContext> createGraphBuilderSuite(Plugins plugins) { PhaseSuite<HighTierContext> suite = new PhaseSuite<>(); suite.appendPhase(new GraphBuilderPhase(GraphBuilderConfiguration.getDefault(plugins))); return suite; }
protected void maybeEagerlyResolve(int cpi, int bytecode) { if (intrinsicContext != null) { constantPool.loadReferencedType(cpi, bytecode); } else if (graphBuilderConfig.eagerResolving()) { /* * Since we're potentially triggering class initialization here, we need synchronization * to mitigate the potential for class initialization related deadlock being caused by * the compiler (e.g., https://github.com/graalvm/graal-core/pull/232/files#r90788550). */ synchronized (BytecodeParser.class) { ClassInitializationPlugin classInitializationPlugin = graphBuilderConfig.getPlugins().getClassInitializationPlugin(); if (classInitializationPlugin != null) { classInitializationPlugin.loadReferencedType(this, constantPool, cpi, bytecode); } else { constantPool.loadReferencedType(cpi, bytecode); } } } }
@SuppressWarnings("try") @Override public StructuredGraph getIntrinsicGraph(ResolvedJavaMethod method, CompilationIdentifier compilationId, DebugContext debug) { Bytecode subst = getSubstitutionBytecode(method); if (subst != null) { ResolvedJavaMethod substMethod = subst.getMethod(); assert !substMethod.equals(method); BytecodeProvider bytecodeProvider = subst.getOrigin(); // @formatter:off StructuredGraph graph = new StructuredGraph.Builder(options, debug, StructuredGraph.AllowAssumptions.YES). method(substMethod). compilationId(compilationId). recordInlinedMethods(bytecodeProvider.shouldRecordMethodDependencies()). setIsSubstitution(true). build(); // @formatter:on try (DebugContext.Scope scope = debug.scope("GetIntrinsicGraph", graph)) { Plugins plugins = new Plugins(getGraphBuilderPlugins()); GraphBuilderConfiguration config = GraphBuilderConfiguration.getSnippetDefault(plugins); IntrinsicContext initialReplacementContext = new IntrinsicContext(method, substMethod, bytecodeProvider, ROOT_COMPILATION); new GraphBuilderPhase.Instance(providers.getMetaAccess(), providers.getStampProvider(), providers.getConstantReflection(), providers.getConstantFieldProvider(), config, OptimisticOptimizations.NONE, initialReplacementContext).apply(graph); assert !graph.isFrozen(); return graph; } catch (Throwable e) { debug.handle(e); } } return null; }
@SuppressWarnings("unused") protected PEGraphDecoder createGraphDecoder(StructuredGraph graph, final HighTierContext tierContext, LoopExplosionPlugin loopExplosionPlugin, InvocationPlugins invocationPlugins, InlineInvokePlugin[] inlineInvokePlugins, ParameterPlugin parameterPlugin, NodePlugin[] nodePluginList, ResolvedJavaMethod callInlined, SourceLanguagePositionProvider sourceLanguagePositionProvider) { final GraphBuilderConfiguration newConfig = configForParsing.copy(); InvocationPlugins parsingInvocationPlugins = newConfig.getPlugins().getInvocationPlugins(); Plugins plugins = newConfig.getPlugins(); ReplacementsImpl replacements = (ReplacementsImpl) providers.getReplacements(); plugins.clearInlineInvokePlugins(); plugins.appendInlineInvokePlugin(replacements); plugins.appendInlineInvokePlugin(new ParsingInlineInvokePlugin(replacements, parsingInvocationPlugins, loopExplosionPlugin)); if (!TruffleCompilerOptions.getValue(PrintTruffleExpansionHistogram)) { plugins.appendInlineInvokePlugin(new InlineDuringParsingPlugin()); } Providers compilationUnitProviders = providers.copyWith(new TruffleConstantFieldProvider(providers.getConstantFieldProvider(), providers.getMetaAccess())); return new CachingPEGraphDecoder(architecture, graph, compilationUnitProviders, newConfig, TruffleCompilerImpl.Optimizations, AllowAssumptions.ifNonNull(graph.getAssumptions()), loopExplosionPlugin, decodingInvocationPlugins, inlineInvokePlugins, parameterPlugin, nodePluginList, callInlined, sourceLanguagePositionProvider); }
protected void genNewInstance(ResolvedJavaType resolvedType) { if (resolvedType.isAbstract() || resolvedType.isInterface()) { handleIllegalNewInstance(resolvedType); return; } maybeEagerlyInitialize(resolvedType); ClassInitializationPlugin classInitializationPlugin = graphBuilderConfig.getPlugins().getClassInitializationPlugin(); if (!resolvedType.isInitialized() && classInitializationPlugin == null) { handleIllegalNewInstance(resolvedType); return; } for (ResolvedJavaType exceptionType : this.graphBuilderConfig.getSkippedExceptionTypes()) { if (exceptionType.isAssignableFrom(resolvedType)) { append(new DeoptimizeNode(DeoptimizationAction.InvalidateRecompile, RuntimeConstraint)); return; } } if (classInitializationPlugin != null) { classInitializationPlugin.apply(this, resolvedType, this::createCurrentFrameState); } for (NodePlugin plugin : graphBuilderConfig.getPlugins().getNodePlugins()) { if (plugin.handleNewInstance(this, resolvedType)) { return; } } frameState.push(JavaKind.Object, append(createNewInstance(resolvedType, true))); }
if (parsingIntrinsic()) { throw new GraalError("Cannot use an assertion within the context of an intrinsic."); } else if (graphBuilderConfig.omitAssertions()) { frameState.push(field.getJavaKind(), ConstantNode.forBoolean(true, graph)); return; ClassInitializationPlugin classInitializationPlugin = this.graphBuilderConfig.getPlugins().getClassInitializationPlugin(); if (classInitializationPlugin != null) { classInitializationPlugin.apply(this, holder, this::createCurrentFrameState); for (NodePlugin plugin : graphBuilderConfig.getPlugins().getNodePlugins()) { if (plugin.handleLoadStaticField(this, resolvedField)) { return;
public GraphBuilderConfiguration withEagerResolving(boolean newEagerResolving) { return new GraphBuilderConfiguration( newEagerResolving, unresolvedIsError, bytecodeExceptionMode, omitAssertions, insertFullInfopoints, trackNodeSourcePosition, skippedExceptionTypes, plugins); }
GraphBuilderConfiguration config = GraphBuilderConfiguration.getDefault(bb.getProviders().getGraphBuilderPlugins()).withEagerResolving(true) .withUnresolvedIsError(PointstoOptions.UnresolvedIsError.getValue(bb.getOptions())) .withNodeSourcePosition(true).withBytecodeExceptionMode(BytecodeExceptionMode.CheckAll); bb.getHostVM().createGraphBuilderPhase(bb.getProviders(), config, OptimisticOptimizations.NONE, null).apply(graph);
private boolean tryNodePluginForInvocation(ValueNode[] args, ResolvedJavaMethod targetMethod) { for (NodePlugin plugin : graphBuilderConfig.getPlugins().getNodePlugins()) { if (plugin.handleInvoke(this, targetMethod, args)) { return true; } } return false; }
/** * Modifies a given {@link GraphBuilderConfiguration} to record per node source information. * * @param gbs the current graph builder suite to modify */ public static PhaseSuite<HighTierContext> withNodeSourcePosition(PhaseSuite<HighTierContext> gbs) { PhaseSuite<HighTierContext> newGbs = gbs.copy(); GraphBuilderPhase graphBuilderPhase = (GraphBuilderPhase) newGbs.findPhase(GraphBuilderPhase.class).previous(); GraphBuilderConfiguration graphBuilderConfig = graphBuilderPhase.getGraphBuilderConfig(); GraphBuilderPhase newGraphBuilderPhase = new GraphBuilderPhase(graphBuilderConfig.withNodeSourcePosition(true)); newGbs.findPhase(GraphBuilderPhase.class).set(newGraphBuilderPhase); return newGbs; }
builderPhase = new GraphBuilderPhase(GraphBuilderConfiguration.getDefault(plugins));
@SuppressWarnings("try") protected void buildRootMethod() { FrameStateBuilder startFrameState = new FrameStateBuilder(this, code, graph); startFrameState.initializeForMethodStart(graph.getAssumptions(), graphBuilderConfig.eagerResolving() || intrinsicContext != null, graphBuilderConfig.getPlugins()); try (IntrinsicScope s = intrinsicContext != null ? new IntrinsicScope(this) : null) { build(graph.start(), startFrameState); } cleanupFinalGraph(); ComputeLoopFrequenciesClosure.compute(graph); }