2012-08-31 5 views
1

나는 llvm-fs 바인딩을 사용하고 있는데, 호출하고자하는 한 가지 방법은 LLVM C API의 네이티브 메소드 LLVMCreateJITCompilerForModule의 extern 인 createJITCompilerForModule입니다.F #에서이 네이티브 함수를 어떻게 호출 할 수 있습니까? (LLVMCreateJITCompilerForModule)

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 번호에서이 함수를 호출 할 방법을 알고 있나요 LLVM-FS의 저자는 그가 F 번호에서이 함수 호출의 '좋은'버전을 만들 수 없습니다 진술했다 , 심지어 원주민이하는 일은 무엇입니까? OutJIT에 'out 매개 변수'가있는 것 같습니다 (기본 코드는 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; 
} 
+0

당신이 (다만 보통의 함수로) 명백한 방법으로 F 번호에서 호출 시도 유무 : 나는 그것을 호출하는 방법의 예를 여기에 넣어거야? 모든 것이 정확하다고 보입니다. –

+0

구체적으로 귀하의 질문은 무엇입니까? 'void * '에 대해 무엇을 전달해야합니까? 아마도'nativeint' 일 가능성이 높습니다. – Daniel

답변

3

.

llvm-fs:ExecutionEngine.fs

let private createEngineForModuleFromNativeFunc 
     (nativeFunc : (nativeint * nativeint * nativeint) -> bool) 
     (moduleRef : ModuleRef) = 

    use outEnginePtr = new NativePtrs([|0n|]) 
    use outErrPtr = new NativePtrs([|0n|]) 
    let createFailed = 
      nativeFunc (
       outEnginePtr.Ptrs, 
       moduleRef.Ptr, 
       outErrPtr.Ptrs) 
    if createFailed then 
     let errStr = Marshal.PtrToStringAuto (Marshal.ReadIntPtr outErrPtr.Ptrs) 
     Marshal.FreeHGlobal (Marshal.ReadIntPtr outErrPtr.Ptrs) 
     failwith errStr 
    else 
     ExecutionEngineRef (Marshal.ReadIntPtr outEnginePtr.Ptrs) 

let createJITCompilerForModule (modRef : ModuleRef) (optLvl : uint32) = 
    let f (engPtr, modPtr, outErrPtr) = 
     createJITCompilerForModuleNative (engPtr, modPtr, optLvl, outErrPtr) 

    createEngineForModuleFromNativeFunc f modRef 
+1

나는 너 자신을 알아 냈다. 참고로 다른 충돌이 발생하면 https://groups.google.com/forum/?fromgroups#!forum/llvm-fs에서 볼 수있는 더 나은 기회가 있습니다. – Keith

관련 문제