【问题标题】:llvm builder adding terminator to basic blockllvm builder将终结器添加到基本块
【发布时间】:2018-10-30 17:21:13
【问题描述】:

如果我在函数 F 中声明了一个基本块,如下所示:

BasicBlock* loopSetup = BasicBlock::Create(F.getContext(), "loop_setup", &F);

如何向它添加终止符指令?如果我这样做:

IRBuilder<> builder(loopSetup);
builder.SetInsertPoint(loopSetup);
BranchInst *end = builder.CreateBr(loopStart);

然后我在使用 opt 运行 pass 时收到此错误:

Basic Block in function 'main' does not have terminator!
label %loop_setup

显然没有设置终止符,因为loopSetup-&gt;getTerminator(); 返回 0。

【问题讨论】:

  • 它最终会在哪里结束呢?尝试调用 F.dump()。 (专业提示:几乎每个班级都有一个 dump(),如果景观似乎与您的地图不匹配,这是查看景观的快速方法。)

标签: c++ llvm llvm-clang llvm-c++-api


【解决方案1】:

您提供的代码进行了一些更改,似乎可以正常工作..

#include "llvm/IR/LLVMContext.h"
#include "llvm/IR/Module.h"
#include "llvm/IR/IRBuilder.h"
#include "llvm/Support/raw_ostream.h"
#include <vector>
#include <memory>
#include <iostream>

using namespace llvm;

int main() {
    LLVMContext context;

    std::unique_ptr<Module> TheModule = std::make_unique<Module>(std::string("mod"), context);

    FunctionType *FT = FunctionType::get(Type::getVoidTy(context), std::vector<Type*>(), false);

    Function *F = Function::Create(FT, Function::ExternalLinkage, "main", TheModule.get());

    BasicBlock* loopSetup = BasicBlock::Create(context, "loop_setup", F);

    IRBuilder<> builder(loopSetup);
    builder.SetInsertPoint(loopSetup);
    BranchInst *end = builder.CreateBr(loopSetup);

    TheModule->print(errs(), nullptr);
}

这会创建一个无限循环。调用loopSetup-&gt;getTerminator()-&gt;print(errs(), false)表明使用的br是块的终止符。

红外输出看起来也不错

define void @main() {
loop_setup:
  br label %loop_setup
}

问题可能出在您使用的 loopStart 上,因为您没有说明您是如何创建它的。

【讨论】:

    猜你喜欢
    • 2018-06-14
    • 2013-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-07
    • 1970-01-01
    相关资源
    最近更新 更多