【发布时间】:2015-05-13 08:11:13
【问题描述】:
我想为我的每个基本块添加一条指令,一旦指定了一个块,我就可以使用 LLVMAppendBasicBlock。但是如何遍历函数中的所有基本块? LLVM API 中是否有迭代器?
【问题讨论】:
标签: llvm
我想为我的每个基本块添加一条指令,一旦指定了一个块,我就可以使用 LLVMAppendBasicBlock。但是如何遍历函数中的所有基本块? LLVM API 中是否有迭代器?
【问题讨论】:
标签: llvm
您可以简单地在函数上使用迭代器:
for (Function::iterator b = func->begin(), be = func->end(); b != be; ++b) {
BasicBlock* BB = b;
....
}
【讨论】:
BasicBlock &BB = *b; 已编译。
be 来自哪里?
cannot convert。
BasicBlock* BB = &*b;
有
LLVMBasicBlockRef LLVMGetFirstBasicBlock (LLVMValueRef Fn)
和
LLVMGetNextBasicBlock (LLVMBasicBlockRef BB)
LLVMGetFirstBasicBlock 的文档说:
获取函数中的第一个基本块。
返回的基本块可以用作迭代器。你可能最终会用它打电话给LLVMGetNextBasicBlock()。
所以每个函数调用一次LLVMGetFirstBasicBlock,然后重复调用LLVMGetNextBasicBlock,直到你完成了该函数的所有基本块(根据the source判断,当发生这种情况时,你会得到一个nullptr)。
【讨论】:
拥有一个你想以某种方式转换的 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
【讨论】: