@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 protected void emitForeignCallOp(ForeignCallLinkage linkage, Value result, Value[] arguments, Value[] temps, LIRFrameState info) { SubstrateForeignCallLinkage callTarget = (SubstrateForeignCallLinkage) linkage; ResolvedJavaMethod targetMethod = callTarget.getMethod(); append(new SubstrateAMD64DirectCallOp(targetMethod, result, arguments, temps, info)); }