如何迭代基本块?

时间:2015-05-13 08:11:13

标签: llvm

我想为每个基本块添加一条指令,一旦指定了一个块,我就可以使用LLVMAppendBasicBlock。但是如何迭代函数中的所有基本块? LLVM API中是否有迭代器?

3 个答案:

答案 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