我正在尝试使用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的正确方法是什么?
由于代码太长,因此将其发布为答案。如果可能并且没有其他限制,请尝试像这样使用 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)
| 归档时间: |
|
| 查看次数: |
425 次 |
| 最近记录: |