LLVM API:正确的创建/处置方式

atl*_*ste 5 dispose llvm

我正在尝试使用LLVM C API实现一个简单的JIT编译器.到目前为止,我没有生成IR代码并执行它的问题,即:直到我开始处理对象并重新创建它们.

我基本上想做的是在发动机不再使用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();
}
Run Code Online (Sandbox Code Playgroud)

但是,这似乎没有正常工作:循环的第二次迭代我得到一个非常糟糕的错误...

总结一下:破坏和重新创建LLVM API的正确方法是什么?

ant*_*ern 3

由于代码太长,因此将其发布为答案。如果可能并且没有其他限制,请尝试像这样使用 LLVM。我很确定Shutdown()循环内部是罪魁祸首。而且我认为保留在外面也没什么坏处Builder。这很好地反映了我在 JIT 中使用 LLVM 的方式。

InitializeCore(GetGlobalPassRegistry());
InitializeNativeTarget();
builder = CreateBuilder();

while (true)
{
    // Initialize module & builder

    module = ModuleCreateWithName(some_unique_name);


    // Initialize target & execution engine
    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);
Shutdown();
Run Code Online (Sandbox Code Playgroud)