如何遍历基本块?
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
我想向我的每个基本块添加一条指令,一旦指定了一个块,我就可以为此使用 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 intoLLVMGetNextBasicBlock()
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