我試圖使用LLVM C API實現一個簡單的JIT編譯器。到目前爲止,我沒有生成IR代碼並執行它的問題,即:直到我開始處理對象並重新創建它們。LLVM API:正確的方式來創建/處置
我基本上想要做的就是在發動機不再使用的時候清理JIT的資源。什麼我基本上試圖做的是這樣的:
while (true)
{
// Initialize module & builder
InitializeCore(GetGlobalPassRegistry());
module = ModuleCreateWithName(some_unique_name);
builder = CreateBuilder();
// Initialize target & execution engine
InitializeNativeTarget();
engine = CreateExecutionEngineForModule(...);
passmgr = CreateFunctionPassManagerForModule(module);
AddTargetData(GetExecutionEngineTargetData(engine), passmgr);
InitializeFunctionPassManager(passmgr);
// [... my fancy JIT code ...] --** Will give a serious error the second iteration
// Destroy
DisposePassManager(passmgr);
DisposeExecutionEngine(engine);
DisposeBuilder(builder);
// DisposeModule(module); //--> Commented out: Deleted by execution engine
Shutdown();
}
然而,這似乎並沒有被正確的工作:循環,我得到一個非常糟糕的錯誤的第二次迭代...
所以總結一下:破壞和重新創建LLVM API的正確方法是什麼?
我想,你應該先刪除模塊。 – arrowd 2014-11-25 06:20:13
@arrowdodger在我看來,這是不可能的。執行引擎引用模塊並執行「刪除」。儘管我身體中的每一根纖維都希望將其刪除,但如果你這樣做,你的程序肯定會發生段錯誤。 – atlaste 2014-11-25 09:16:48
嘗試將'InitializeNativeTarget()'移出循環,然後。 – arrowd 2014-11-25 09:18:39