我可以从'中提取条件吗? LLVM IR的陈述?

时间:2016-05-15 08:25:19

标签: llvm

有一种方法可以提取有关调用指令的信息(使用LLVM的CallInst类)。有没有什么方法可以提取一个' if'的元数据?指导呢?像变量名,运算符或文字?

1 个答案:

答案 0 :(得分:0)

可以通过编写LLVM Pass来执行此类操作。基本上,您应该实现一个runOnFunction(),可以在此过程中拦截指令。以下过程从分支指令读取比较谓词。

namespace {
  struct PredicateNamePass: public FunctionPass {
    static char ID; // Pass identification, replacement for typeid
    PredicateNamePass() : FunctionPass(ID) {}
    bool runOnFunction(Function &F) override {
      for (Instruction& I : inst_range(F) ) {
        if (I.isTerminator()) {
          if ( strcmp(I.getOperand(0)->getName().str().c_str(), "cmp") == 0 )
              if ( CmpInst *cp = dyn_cast<CmpInst>(I.getPrevNode()) )
                  errs() << cp->getPredicate() << '\n';
        }
      }
      return false;
    }
  };
}

示例程序:

int main(int argc, char* argv[]) {
  int a = 10;
  if( argc == 3)
      a = 11;
  else
      a++;
  return 0;
}

命令:

> opt -load ../build.llvm/lib/LLVMPredicateNamePass.so \ 
  -PredicateNamePass < example.bc > /dev/null

输出:

> 32