public CompileFunction createCustomCompileFunction() {
return (debug, method, identifier, reason, config) -> {
SubstrateBackend backend = config.getBackendForNormalMethod();
VMError.guarantee(backend.getTarget().arch instanceof AMD64, "currently only implemented on AMD64");
HostedProviders providers = (HostedProviders) config.getProviders();
List<JavaType> parameters = new ArrayList<>();
parameters.add(providers.getMetaAccess().lookupJavaType(JNIEnvironment.class));
parameters.add(providers.getMetaAccess().lookupJavaType(JNIObjectHandle.class));
if (nonVirtual) {
parameters.add(providers.getMetaAccess().lookupJavaType(JNIObjectHandle.class));
}
parameters.add(providers.getMetaAccess().lookupJavaType(JNIMethodId.class));
ResolvedJavaType returnType = providers.getWordTypes().getWordImplType();
CallingConvention callingConvention = backend.getCodeCache().getRegisterConfig().getCallingConvention(
SubstrateCallingConventionType.NativeCall, returnType, parameters.toArray(new JavaType[0]), backend);
RegisterValue methodIdArg = (RegisterValue) callingConvention.getArgument(parameters.size() - 1);
return backend.createJNITrampolineMethod(method, identifier, methodIdArg, getFieldOffset(providers));
};
}