llvm builder 向基本块添加终止符
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();
returns 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
上,因为您没有说明您是如何创建它的。
如果我在函数 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();
returns 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
上,因为您没有说明您是如何创建它的。