1. 程式人生 > >LLVM IR和C/C++函式相互呼叫時的注意事項

LLVM IR和C/C++函式相互呼叫時的注意事項

已下敘述,主要針對LLVM 3.6。

一、從C/C++呼叫LLVM IR函式
主要有兩種辦法。 1、通過llvm::ExecutionEngine::runFunction()呼叫。     存在的問題:可以直接呼叫llvm::Function,但目前LLVM專案沒有實現引數傳遞,只提供了介面,因此我們只能呼叫無參函式 2、通過llvm::ExecutionEngine::getPointerToFunction()即時編譯為本機程式碼,並獲得一個指向C函式的void *指標。然後,可以將其轉換為合適的C/C++函式指標,進行呼叫。     存在的問題:LLVM指令被編譯為ELF格式,而不是COFF格式,導致在Windows平臺
載入時錯誤"
Incompatible object format"。 二、從LLVM IR呼叫C/C++函式     主要有三種辦法。    1、將被呼叫函式宣告為動態連結匯出函式,LLVM自動在執行時解析並呼叫。     這是官方“標準”的做法。     存在的問題:windows平臺可執行檔案中的函式一般不會被匯出,不能通過這一機制解析。     解決辦法是,通過llvm::sys::DynamicLibrary::AddSymbol()顯示註冊函式。LLVM在查詢外部函式時,首先查詢通過AddSymbol註冊的函式,然後才通過系統呼叫查詢可執行檔案或動態連結庫中的符號。     2、通過llvm::ExecutionEngine::addGlobalMapping()將被呼叫的C/C++函式指標註冊為LLVM中的全域性變數。
    這樣做的好處是,被呼叫函式不需要宣告為動態連結庫的匯出函式,只要知道函式指標就可以。     解決辦法同1,通過AddSymbol()來實現。     3、通過自定義的記憶體分配器來直接解析函式。     原理同addGlobalMapping類似,這一方法我沒有驗證,有空可以試驗一下。