【问题标题】:Iterating over basic blocks in reverse in LLVM Function在 LLVM 函数中反向迭代基本块
【发布时间】:2017-10-31 16:09:39
【问题描述】:

有没有办法在 LLVM 函数上进行 reverse 迭代。我检查了文档 但似乎找不到任何成员 typedef 用于反向迭代基本块(在函数中)。

任何帮助将不胜感激。

谢谢, 马尔哈尔

【问题讨论】:

    标签: function llvm reverse-iterator


    【解决方案1】:
    for (BasicBlock::reverse_iterator i = BB->rbegin(), e = BB->rend(); i != e; ++i)
    { 
        // your code
    }
    

    【讨论】:

      【解决方案2】:

      我认为您可以致电Function::getBasicBlockList(),然后在该列表中使用.rbegin()rend()

      【讨论】:

      • 在这种情况下,如果有 2 个或更多的前置基本块会发生什么?
      • 嗯,BB也可以有多个后代,所以和begin()/end()没什么区别。我想这些会按某种顺序迭代。
      • 感谢您的回答,因为我是新来的,所以不能投票...另外,只是想知道是否有办法将基本块迭代器初始化为指令*?
      • LLVM doxygen 文档应该对您有所帮助:llvm.org/docs/doxygen/html。并按绿色空心标志接受我的回答。
      【解决方案3】:

      根据@arrowd 的建议分享工作代码sn-p:

          auto bbList = &(func_ptr->getBasicBlockList()); //fetch the pointer of the list
      
          errs()<<"reverse  \n";
      
          for(auto bb = bbList->rbegin(); bb != bbList->rend(); bb++) {
      
              b = &(*bb);
      
              errs() << b->getName()<<", ";
      
          }
      

      如果有多个前任和后继,打印基本块名称的顺序是什么?

      与反向后序相反,即后序(以反向方式迭代)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多