如何遍历基本块?

How to iterate over basic blocks?

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

LLVMBasicBlockRef   LLVMGetFirstBasicBlock (LLVMValueRef Fn)

LLVMGetNextBasicBlock (LLVMBasicBlockRef BB)

LLVMGetFirstBasicBlock 的文档说:

Obtain the first basic block in a function.

The returned basic block can be used as an iterator. You will likely eventually call into LLVMGetNextBasicBlock() with it.

因此,每个函数调用一次 LLVMGetFirstBasicBlock,然后重复调用 LLVMGetNextBasicBlock,直到您完成该函数的所有基本块(根据 the source,您将得到nullptr 发生这种情况时)。

您可以简单地在函数上使用迭代器,例如:

 for (Function::iterator b = func->begin(), be = func->end(); b != be; ++b) {
BasicBlock* BB = b;
....
}

有一个您想以某种方式转换的 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";

财政年度:http://llvm.org/docs/ProgrammersManual.html#iterating-over-the-basicblock-in-a-function