如何解决使用 LLVM IR Builder CreateAlloca
我有以下代码行在 LLVM IR C++ API 中引发异常:
AllocaInst *allocate = builder->Createalloca(objectType);
运行时抛出如下异常:
* thread #1,queue = 'com.apple.main-thread',stop reason = EXC_BAD_ACCESS (code=1,address=0x38)
* frame #0: 0x00000001000302fa birdd`llvm::BasicBlock::getModule() const + 4
frame #1: 0x0000000100003018 birdd`llvm::IRBuilderBase::Createalloca(llvm::Type*,llvm::Value*,llvm::Twine const&) [inlined] llvm::BasicBlock::getModule(this=<unavailable>) at BasicBlock.h:117:68 [opt]
frame #2: 0x0000000100003013 birdd`llvm::IRBuilderBase::Createalloca(this=0x0000000101102230,Ty=0x0000000101801000,ArraySize=0x0000000000000000,Name=0x00007ffeefbff038) at IRBuilder.h:1598 [opt]
这给了我一个指示,即 getModule() 正在返回一个无效的指针。有趣的是 builder
和 module
共享相同的 LLVMContext
。
所以我决定通过 verifyModule
运行它,如下所示:
verifyModule(*builder->GetInsertBlock()->getModule());
同样的错误。但是当我直接访问 module
对象时,它似乎没问题。
这是我的初始化代码:
static LLVMContext context;
std::unique_ptr<Module> module = std::make_unique<Module>("Main",context);
std::unique_ptr<IRBuilder<>> builder = std::make_unique<llvm::IRBuilder<>>(context);
我被卡住了。任何帮助将不胜感激!
解决方法
IRBuilder
将无法从上下文中获取 Module
(多个模块可能使用相同的上下文)并且在任何情况下仅 Module
是不够的 - 构建器还需要知道应该插入指令的点。因此,您需要在构建时为其提供 BasicBlock
或通过
builder->SetInsertPoint(BB);
甚至
builder->SetInsertPoint(Inst);
如果你不想在 BB 的末尾插入。
一些旁注:
- 我建议遵循 LLVM 的大写变量名称编码风格(这将使以后的维护更容易)。
- 构建器的创建成本很低,因此大多数情况下,它们只是在需要它们的函数中创建为局部变量:
IRBuilder<> IRB;
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。