LLVM BasicBlock传递

时间:2012-12-17 16:52:31

标签: llvm

我是LLVM的初学者。我试图在BasicBlock的指令之间移动而我不能。在这个特定的例子中,我尝试获取结束指令的前一条指令。我正在尝试两种方法:

  1. 我有以下代码序列:

    bool patternDC::runOnBasicBlock(BasicBlock &BB) {
    ...
    if (BB.getTerminator())
      {
                Instruction* current = BB.getTerminator();
                errs() << "\n LAST: "<<*current<<"\n";
    
            Instruction* prev = &BB.back();
            errs() << "\n PENULTIMATE: "<<*prev<<"\n";         
           ...
    
  2. 终端打印SAME指令。我不知道back()是如何工作的。 (定义在BasicBlock.h文件的第199行。)

    1. 我也尝试过:

      bool patternDC::runOnBasicBlock(BasicBlock &BB) {
      ...
      BasicBlock::const_iterator I = BB.begin();
      BasicBlock::const_iterator E = BB.end();
      BasicBlock::const_iterator prev_iter,last_iter;
      prev_iter = NULL; last_iter = NULL;
      for(;I!=E;I++){
          prev_iter = last_iter;
          last_iter = I;
      }
      if(prev_iter){
          errs() << "prev_iter: " << *(dyn_cast<Instruction>(prev_iter)) << "\n";
      }
      if(last_iter){
          errs() << "last_iter: " << *(dyn_cast<Instruction>(last_iter)) << "\n";
      }
       // not related to the main question: uncomment the next line for an unusual      
      //behavior: lastlast is DIFFERENT from last.lastlast=section(BasicBlock)
        // errs() << "lastlast: " << *(dyn_cast<Instruction>(I)) << "\n";
        ...
         Instruction* prev = *(dyn_cast<Instruction*>(prev_iter));
          errs() << "\n prev: "<<*prev<<"\n";
      
    2. 终端打印出来并且持续良好,但在尝试分配到指令* prev时出现编译错误 Clang错误是: ” ..... /home/alex/llvm/include/llvm/Support/Casting.h:51:28:错误:'classof'不是'llvm :: Instruction *'的成员“

      如果有人知道更好的方法来使用基本块中的任何元素或知道为什么这些元素不起作用,请告诉我:)

      谢谢你, 亚历

2 个答案:

答案 0 :(得分:1)

所有LLVM Instruction类也是ilist_node,这意味着您可以查询它们中包含它们的列表中的下一个/上一个指令(在本例中为基本块)。更具体地说,你的问题:

Instruction* last = BB.getTerminator();
Instruction* prev = last->getPrevNode();

请参阅LLVM源代码中ilist_node的定义以查看相关API。

答案 1 :(得分:-1)

我通过检查是否(BB-> size()&gt; 1)解决了仅包含元素的基本块