llvm builder добавляет терминатор в базовый блок - PullRequest
0 голосов
/ 30 октября 2018

Если у меня есть базовый блок, объявленный в функции F, примерно так:

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

Как мне добавить к нему инструкцию терминатора? Если я просто сделаю:

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

Тогда я получаю эту ошибку при запуске прохода с опцией:

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

Терминатор явно не установлен, так как loopSetup->getTerminator(); возвращает 0.

1 Ответ

0 голосов
/ 30 октября 2018

Код, который вы предоставили, с некоторыми изменениями, кажется, работает нормально ..

#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, который вы использовали, поскольку вы не показали, как вы его создали.

...