我正在使用llvm-fs绑定,我想调用的一种方法是 LLVM C api 中createJITCompilerForModule
本机方法的外部方法。LLVMCreateJITCompilerForModule
llvm-fs 的作者表示他不能在 F# 中制作这个函数调用的“好”版本:
createJITCompilerForModule in llvm-fs:Generated.fs
:
[<DllImport(
"LLVM-3.1.dll",
EntryPoint="LLVMCreateJITCompilerForModule",
CallingConvention=CallingConvention.Cdecl,
CharSet=CharSet.Ansi)>]
extern bool createJITCompilerForModuleNative(
void* (* LLVMExecutionEngineRef* *) OutJIT,
void* (* LLVMModuleRef *) M,
uint32 OptLevel,
void* OutError)
// I don't know how to generate an "F# friendly" version of LLVMCreateJITCompilerForModule
你知道我会如何从 F# 调用这个函数,甚至是原生函数的作用吗?看起来它有一个“输出参数” OutJIT
(因为本机代码重新分配了void*
指向的东西)。这是本机功能:
LLVMCreateJITCompilerForModule in llvm-c:ExecutionEngineBindings.cpp
:
LLVMBool LLVMCreateJITCompilerForModule(LLVMExecutionEngineRef *OutJIT,
LLVMModuleRef M,
unsigned OptLevel,
char **OutError) {
std::string Error;
EngineBuilder builder(unwrap(M));
builder.setEngineKind(EngineKind::JIT)
.setErrorStr(&Error)
.setOptLevel((CodeGenOpt::Level)OptLevel);
if (ExecutionEngine *JIT = builder.create()) {
*OutJIT = wrap(JIT);
return 0;
}
*OutError = strdup(Error.c_str());
return 1;
}