微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用 LLVM IR Builder CreateAlloca

如何解决使用 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() 正在返回一个无效的指针。有趣的是 buildermodule 共享相同的 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 的末尾插入。

一些旁注:

  1. 我建议遵循 LLVM 的大写变量名称编码风格(这将使以后的维护更容易)。
  2. 构建器的创建成本很低,因此大多数情况下,它们只是在需要它们的函数中创建为局部变量:
IRBuilder<> IRB;

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。