如何迭代基本块?
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 级别的两个特定基本块之间的所有基本块?