protected ForeignCallsProvider createForeignCallsProvider() { return new SubstrateForeignCallsProvider(); }
@Override public Optional<AnalysisMethod> handleForeignCall(ForeignCallDescriptor foreignCallDescriptor, ForeignCallsProvider foreignCallsProvider) { SubstrateForeignCallsProvider foreignCalls = (SubstrateForeignCallsProvider) foreignCallsProvider; /* In unit tests, we run with no registered foreign calls. */ Optional<AnalysisMethod> targetMethod = Optional.empty(); if (foreignCalls.getForeignCalls().size() > 0) { SubstrateForeignCallLinkage linkage = foreignCalls.lookupForeignCall(foreignCallDescriptor); targetMethod = Optional.of((AnalysisMethod) linkage.getMethod()); } return targetMethod; }
@Override public boolean isReexecutable(ForeignCallDescriptor descriptor) { return lookupForeignCall(descriptor).getDescriptor().isReexecutable(); }
/** * Regular compiled methods. Only entry points and manually marked methods are compiled, all * transitively reachable methods are then identified by looking at the callees of already * parsed methods. */ private void parseAheadOfTimeCompiledMethods() { universe.getMethods().stream() .filter(method -> method.isEntryPoint() || CompilationInfoSupport.singleton().isForcedCompilation(method)) .forEach(method -> ensureParsed(method, new EntryPointReason())); SubstrateForeignCallsProvider foreignCallsProvider = (SubstrateForeignCallsProvider) runtimeConfig.getProviders().getForeignCalls(); foreignCallsProvider.getForeignCalls().keySet().stream() .map(descriptor -> (HostedMethod) descriptor.findMethod(runtimeConfig.getProviders().getMetaAccess())) .filter(method -> method.wrapped.isRootMethod()) .forEach(method -> ensureParsed(method, new EntryPointReason())); }
@Override public LocationIdentity[] getKilledLocations(ForeignCallDescriptor descriptor) { return lookupForeignCall(descriptor).getDescriptor().getKilledLocations(); }
SubstrateForeignCallsProvider foreignCallsProvider = (SubstrateForeignCallsProvider) providers.getForeignCalls(); for (SubstrateForeignCallDescriptor descriptor : SnippetRuntime.getRuntimeCalls()) { foreignCallsProvider.getForeignCalls().put(descriptor, new SubstrateForeignCallLinkage(runtimeCallProviders, descriptor)); featureHandler.forEachGraalFeature(feature -> feature.registerForeignCalls(runtimeConfig, runtimeCallProviders, snippetReflection, foreignCallsProvider.getForeignCalls(), hosted));
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); }