我想为每个基本块添加一条指令,一旦指定了一个块,我就可以使用LLVMAppendBasicBlock。但是如何迭代函数中的所有基本块? LLVM API中是否有迭代器?
答案 0 :(得分:4)
你可以简单地使用迭代器而不是像:
for (Function::iterator b = func->begin(), be = func->end(); b != be; ++b) {
BasicBlock* BB = b;
....
}
答案 1 :(得分:1)
有
link()
和
LLVMBasicBlockRef LLVMGetFirstBasicBlock (LLVMValueRef Fn)
LLVMGetNextBasicBlock (LLVMBasicBlockRef BB)
的文档说:
获取函数中的第一个基本块。
返回的基本块可以用作迭代器。您最终可能会使用它来调用LLVMGetFirstBasicBlock
。
所以每个函数调用一次LLVMGetNextBasicBlock()
,然后反复LLVMGetFirstBasicBlock
,直到你完成该函数的所有基本块(按the source为例,你将获得LLVMGetNextBasicBlock
nullptr
1}}当发生这种情况时)。
答案 2 :(得分:-1)
有一个你想以某种方式转换的Function实例是很常见的;特别是,你想操纵它的BasicBlocks。为此,您需要遍历构成函数的所有BasicBlock。以下是打印BasicBlock名称及其包含的说明数的示例:
Function &Func = ...
for (BasicBlock &BB : Func)
// Print out the name of the basic block if it has one, and then the
// number of instructions that it contains
errs() << "Basic block (name=" << BB.getName() << ") has "
<< BB.size() << " instructions.\n";
FYR:http://llvm.org/docs/ProgrammersManual.html#iterating-over-the-basicblock-in-a-function