@Override public void encodeSnippets() { /* Copy over all snippets from the analysis replacements, changing out metadata objects. */ super.copyFrom(aReplacements, this::replaceAnalysisObjects); }
@Platforms(Platform.HOSTED_ONLY.class) protected void copyFrom(SubstrateReplacements copyFrom, Function<Object, Object> objectReplacer) { snippetInvocationPlugins = makeInvocationPlugins(getGraphBuilderPlugins(), copyFrom.builder, objectReplacer); snippetEncoding = Arrays.copyOf(copyFrom.snippetEncoding, copyFrom.snippetEncoding.length); snippetNodeClasses = Arrays.copyOf(copyFrom.snippetNodeClasses, copyFrom.snippetNodeClasses.length); snippetObjects = new Object[copyFrom.snippetObjects.length]; for (int i = 0; i < snippetObjects.length; i++) { snippetObjects[i] = objectReplacer.apply(copyFrom.snippetObjects[i]); } snippetStartOffsets = new HashMap<>(copyFrom.snippetStartOffsets.size()); for (Map.Entry<ResolvedJavaMethod, Integer> entry : copyFrom.snippetStartOffsets.entrySet()) { snippetStartOffsets.put((ResolvedJavaMethod) objectReplacer.apply(entry.getKey()), entry.getValue()); } }
@Override public InlineInfo shouldInlineInvoke(GraphBuilderContext b, ResolvedJavaMethod method, ValueNode[] args) { assert b.parsingIntrinsic(); assert builder != null; Class<? extends GraphBuilderPlugin> intrinsifyingPlugin = getIntrinsifyingPlugin(method); if (intrinsifyingPlugin != null && GeneratedInvocationPlugin.class.isAssignableFrom(intrinsifyingPlugin)) { builder.delayedInvocationPluginMethods.add(method); return InlineInfo.DO_NOT_INLINE_NO_EXCEPTION; } // Force inlining when parsing replacements return createIntrinsicInlineInfo(method, null, defaultBytecodeProvider); } }
BytecodeProvider replacementBytecodeProvider = replacements.getDefaultReplacementBytecodeProvider(); final boolean explicitUnsafeNullChecks = SubstrateOptions.SpawnIsolates.getValue(); registerInvocationPlugins(providers.getMetaAccess(), providers.getSnippetReflection(), plugins.getInvocationPlugins(), replacementBytecodeProvider, !hosted, explicitUnsafeNullChecks); replacements.setGraphBuilderPlugins(plugins); if (runtimeConfig != null && runtimeConfig.getProviders() instanceof HostedProviders) { ((HostedProviders) runtimeConfig.getProviders()).setGraphBuilderPlugins(plugins);
GraalSupport.setRuntimeConfig(runtimeConfig, suites, lirSuites, firstTierSuites, firstTierLirSuites); NodeClass<?>[] snippetNodeClasses = ((SubstrateReplacements) runtimeProviders.getReplacements()).getSnippetNodeClasses(); for (NodeClass<?> nodeClass : snippetNodeClasses) { config.getMetaAccess().lookupJavaType(nodeClass.getClazz()).registerAsAllocated(null); for (ResolvedJavaMethod method : ((SubstrateReplacements) runtimeProviders.getReplacements()).getSnippetMethods()) { objectReplacer.apply(method);
@Override public void registerSnippet(ResolvedJavaMethod method, ResolvedJavaMethod original, Object receiver, boolean trackNodeSourcePosition) { /* We must have the snippet already available in the analysis replacements. */ assert aReplacements.getSnippet(((HostedMethod) method).wrapped, null, null, trackNodeSourcePosition, null) != null; }
@Override protected Replacements createReplacements(Providers p, SnippetReflectionProvider snippetReflection) { BytecodeProvider bytecodeProvider = new ResolvedJavaMethodBytecodeProvider(); return new SubstrateReplacements(options, p, snippetReflection, bytecodeProvider, ConfigurationValues.getTarget(), new SubstrateGraphMakerFactory(wordTypes)); } }
private static boolean checkInvocationPluginMethods(SubstrateReplacements replacements) { for (ResolvedJavaMethod method : replacements.getDelayedInvocationPluginMethods()) { ResolvedJavaMethod unwrapped = method; while (unwrapped instanceof WrappedJavaMethod) { unwrapped = ((WrappedJavaMethod) unwrapped).getWrapped(); } if (method != unwrapped) { String runtimeDescriptor = method.getSignature().toMethodDescriptor(); String hostedDescriptor = unwrapped.getSignature().toMethodDescriptor(); if (!runtimeDescriptor.equals(hostedDescriptor)) { String name = method.format("%H.%n"); throw new AssertionError( String.format("Cannot have invocation plugin for a method whose runtime signature is different from its hosted signature:%n" + " method: %s%n" + " hosted signature: %s%n" + " runtime signature: %s", name, runtimeDescriptor, hostedDescriptor)); } } assert method == unwrapped || method.getSignature().toMethodDescriptor().equals(unwrapped.getSignature().toMethodDescriptor()); } return true; }
replacements.encodeSnippets();
for (StructuredGraph graph : aReplacements.getSnippetGraphs(GraalOptions.TrackNodeSourcePosition.getValue(options))) { new SVMMethodTypeFlowBuilder(bigbang, graph).registerUsedElements();
@Platforms(Platform.HOSTED_ONLY.class) public Collection<StructuredGraph> getSnippetGraphs(boolean trackNodeSourcePosition) { List<StructuredGraph> result = new ArrayList<>(snippetStartOffsets.size()); for (ResolvedJavaMethod method : snippetStartOffsets.keySet()) { result.add(getSnippet(method, null, null, trackNodeSourcePosition, null)); } return result; }
private Inflation setupBigBang(TargetDescription target, OptionValues options, ForkJoinPool analysisExecutor, AnalysisMetaAccess aMetaAccess, AnalysisConstantReflectionProvider aConstantReflection, WordTypes aWordTypes, SnippetReflectionProvider aSnippetReflection) { assert aUniverse != null : "Analysis universe must be initialized."; assert nativeLibraries != null : "Native libraries must be set."; AnalysisConstantFieldProvider aConstantFieldProvider = new AnalysisConstantFieldProvider(aUniverse, aMetaAccess, aConstantReflection); /* * Install all snippets so that the types, methods, and fields used in the snippets get * added to the universe. */ ForeignCallsProvider aForeignCalls = new SubstrateForeignCallsProvider(); LoweringProvider aLoweringProvider = SubstrateLoweringProvider.create(aMetaAccess, null); StampProvider aStampProvider = new SubstrateStampProvider(aMetaAccess); HostedProviders aProviders = new HostedProviders(aMetaAccess, null, aConstantReflection, aConstantFieldProvider, aForeignCalls, aLoweringProvider, null, aStampProvider, aSnippetReflection, aWordTypes); BytecodeProvider bytecodeProvider = new ResolvedJavaMethodBytecodeProvider(); SubstrateReplacements aReplacments = new SubstrateReplacements(options, aProviders, aSnippetReflection, bytecodeProvider, target, new SubstrateGraphMakerFactory(aWordTypes)); aProviders = new HostedProviders(aMetaAccess, null, aConstantReflection, aConstantFieldProvider, aForeignCalls, aLoweringProvider, aReplacments, aStampProvider, aSnippetReflection, aWordTypes); return new Inflation(options, aUniverse, aProviders, analysisExecutor); }
@Platforms(Platform.HOSTED_ONLY.class) public void encodeSnippets() { GraphEncoder encoder = new GraphEncoder(ConfigurationValues.getTarget().arch); for (StructuredGraph graph : builder.graphs.values()) { encoder.prepare(graph); } encoder.finishPrepare(); snippetStartOffsets = new HashMap<>(); for (Map.Entry<ResolvedJavaMethod, StructuredGraph> entry : builder.graphs.entrySet()) { snippetStartOffsets.put(entry.getKey(), encoder.encode(entry.getValue())); } snippetEncoding = encoder.getEncoding(); snippetObjects = encoder.getObjects(); snippetNodeClasses = encoder.getNodeClasses(); snippetInvocationPlugins = makeInvocationPlugins(getGraphBuilderPlugins(), builder, Function.identity()); }