如何构建一个空的基本块并在前面插入一条指令?

How to build a empty basicblock and insert a Instruction in the front?

我写了一个函数来创建一个空的基本块:

BasicBlock* createEmptyBlock(){
    llvm::LLVMContext context;
    IRBuilder<> builder(context);
    Function *mainFunction;
    mainFunction->setDoesNotReturn();
    BasicBlock* mainblock = BasicBlock::Create(context, "entrypoint", mainFunction);
    return mainblock;
}

但是当在这个主块的前面插入我的指令时:

 Instruction *newBInst_0 = setBranchInst(F, inst, 1);//product a inst
                            llvm::BasicBlock *bb;
                            bb=createEmptyBlock();                      
                            newBInst_0->insertBefore(bb->front());//there are some errors
                            bb->insertInto(&F,&block);

我在插入的时候发现了一些错误 这有什么问题吗?

您应该尝试在每次调用 createEmptyBlock 时停止 创建上下文和构建器实例 。每个线程只需要一个上下文,通常需要一个构建器实例,因此 llvm 可以帮助您跟踪插入 ir 的位置。这确实有助于方法调用,例如 builder.GetInsertBlock()

此外,您无需在每次创建函数时都将块附加到函数。你的功能现在看起来像这样

BasicBlock* createEmptyBlock(){
    BasicBlock* mainblock = BasicBlock::Create(context, "entrypoint");
    return mainblock;
}

假设您希望所有块标签都以 "entrypoint" 为前缀。另外,功能体几乎是单行的。为什么不像这样内联它

Instruction *newBInst_0 = setBranchInst(F, inst, 1);//product a inst
llvm::BasicBlock *bb = BasicBlock::Create(context, "entrypoint");                      
bb->insertInto(&F,&block);
newBInst_0->insertBefore(bb->front());

假设您的 buildercontext 实例是全局变量(我建议它们应该如此)。

看起来您也没有经常使用 builder 实例。尝试探索它的一些方法,例如 builder.SetInsertPointbuilder.CreateCondBr