llvm构建器向基本块添加终止符
llvm builder adding terminator to basic block
如果我在函数F中声明了一个基本块,如下所示:
BasicBlock* loopSetup = BasicBlock::Create(F.getContext(), "loop_setup", &F);
如何添加终止符指令?如果我只是这样做:
IRBuilder<> builder(loopSetup);
builder.SetInsertPoint(loopSetup);
BranchInst *end = builder.CreateBr(loopStart);
然后我在运行opt:的通行证时出现了这个错误
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
是该块的终止符。
IR输出似乎也不错
define void @main() {
loop_setup:
br label %loop_setup
}
问题可能出在你使用的loopStart
上,因为你没有展示你是如何创建它的
相关文章:
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 如何在C++中从两个单独的for循环中添加两个数组
- OpenGL - 在抛出"__gnu_cxx::recursive_init_error"实例后终止调用?
- POCO::PostgreSQL:如何将std::vector支持添加到`Binder::bind`
- 如何仅为一个函数添加延迟
- 如何防止 c++ 在从浮点型转换为双精度型(不适用于 IO)时添加额外的小数?
- 使用std::transform将一个范围的元素添加到另一个范围中
- 如何将更多文件夹添加到c++include路径
- 如何将元素添加到数组的线程安全函数?
- QT通过C++添加映射QML项目
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 如何将点击的信号和插槽添加到qt中的自定义按钮中
- 我收到以下错误:抛出'std::bad_alloc'实例后终止调用
- llvm构建器向基本块添加终止符
- 以这种方式初始化的 char 数组是否会自动添加空终止符?
- C++17 std::to_chars 是否在添加空终止符?
- 添加 NULL 以终止双指针
- 为 fstream 添加 NULL 终止符
- cin函数是否添加了在输入结束时终止的null
- 在流错误上添加空终止符