簡體   English   中英

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();顯然未設置終止符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是該塊的終止符。

紅外輸出似乎也很好

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

問題可能出在您使用的loopStart ,因為您沒有顯示如何創建它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM