@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; }
/** * 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())); }
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));