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

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

【问题讨论】:

    标签: llvm


    【解决方案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

      【讨论】:

        猜你喜欢
        • 2016-02-01
        • 2017-10-31
        • 2017-11-15
        • 2018-11-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多