如何构建一个空的基本块并在前面插入一条指令?
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());
假设您的 builder
和 context
实例是全局变量(我建议它们应该如此)。
看起来您也没有经常使用 builder
实例。尝试探索它的一些方法,例如 builder.SetInsertPoint
和 builder.CreateCondBr
我写了一个函数来创建一个空的基本块:
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());
假设您的 builder
和 context
实例是全局变量(我建议它们应该如此)。
看起来您也没有经常使用 builder
实例。尝试探索它的一些方法,例如 builder.SetInsertPoint
和 builder.CreateCondBr