如何迭代基本块?

Posted

技术标签:

【中文标题】如何迭代基本块?【英文标题】:How to iterate over basic blocks? 【发布时间】:2015-05-13 08:11:13 【问题描述】:

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

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

对我来说这返回了一个错误但 BasicBlock &BB = *b; 已编译。 be 来自哪里? 这给出了错误。说cannot convert 如果要使用指针,应该是BasicBlock* BB = &*b;【参考方案2】:

LLVMBasicBlockRef   LLVMGetFirstBasicBlock (LLVMValueRef Fn)

LLVMGetNextBasicBlock (LLVMBasicBlockRef BB)

LLVMGetFirstBasicBlock 的文档说:

获取函数中的第一个基本块。 返回的基本块可以用作迭代器。你可能最终会用它打电话给LLVMGetNextBasicBlock()

所以每个函数调用一次LLVMGetFirstBasicBlock,然后重复调用LLVMGetNextBasicBlock,直到你完成了该函数的所有基本块(根据the source判断,当发生这种情况时,你会得到一个nullptr)。

【讨论】:

【参考方案3】:

拥有一个你想以某种方式转换的 Function 实例是很常见的;特别是,您想操作它的 BasicBlocks。为了促进这一点,您需要遍历构成函数的所有基本块。以下是打印 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

【讨论】:

以上是关于如何迭代基本块?的主要内容,如果未能解决你的问题,请参考以下文章

如何找到出现在 LLVM IR 级别的两个特定基本块之间的所有基本块?

程序流程控制2 for循环

python循环

基于指针的基本随机访问迭代器的代码?

如何定义基本的通用代码块并将它们插入到 Django 的其他模板中?

如何将分配给Object的c#基本类型数组转换为可以迭代的东西?