c++ - llvm builder 向基本 block 添加终止符

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

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

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->getTerminator(); 返回 0,因此显然没有设置终止符。

最佳答案

您提供的代码经过一些更改后似乎可以正常工作..

#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->getTerminator()->print(errs(), false) 显示使用的 br 是 block 的终止符。

IR 输出看起来也不错

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

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

关于c++ - llvm builder 向基本 block 添加终止符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53056310/

相关文章:

c - 使用Clang编译器通过Make构建LLVM项目时出现怪异标志

llvm-clang - Linux 的 BPF 程序中允许循环吗?

c++ - 如何在给定起点和终点的字符串中查找子字符串的出现次数?

c++ - 具有完全透明背景的qt小部件

c++ - 我应该使用引用吗?

haskell - 首先通过 LLVM 位码链接器运行 GHC 的 LLVM 输出

iphone - XCode4 不显示 "C/C++ Compiler Version"选项

c++ - 您可以在 Windows 可执行文件中执行逻辑的最后一个地方是什么?

objective-c - 启用模块的 Prefix.pch?

llvm - LLVM 中的抽象解释