如何找到;";LLVM中值的定义点?

如何找到;";LLVM中值的定义点?,llvm,static-analysis,llvm-ir,Llvm,Static Analysis,Llvm Ir,LLVM对其IR使用静态单赋值(SSA)形式,这意味着每个值都有一个定义点。那么,找到值的“定义点”最简单(也是最通用)的方法是什么,而不必检查每次使用并确定我们的值的使用方式?在下面的代码中,我对用作函数参数的Values的定义点感兴趣 protected: void getValueDefs( Function * F ) { for (inst_iterator I = inst_begin(F), E = inst_end(F); I != E; ++I) { Imm

LLVM对其IR使用静态单赋值(SSA)形式,这意味着每个
值都有一个定义点。那么,找到
值的“定义点”最简单(也是最通用)的方法是什么,而不必检查每次使用并确定我们的
值的使用方式?在下面的代码中,我对用作函数参数的
Value
s的定义点感兴趣

protected: void getValueDefs( Function * F ) {
    for (inst_iterator I = inst_begin(F), E = inst_end(F); I != E; ++I) {
      ImmutableCallSite CS( cast<Value>(I) );
      if ( !CS || isa<IntrinsicInst>(I) ) continue;
      for ( User::const_op_iterator Ab = CS.arg_begin(), Ae = CS.arg_end(); Ab != Ae; ++Ab ) {
          for ( User *U : Ab->get()->users() ) {
              if (Instruction *Inst = dyn_cast<Instruction>(U)) {
                  /* How to do the check here?? */
              }
          }
      }
   }
}
protected:void getValueDefs(函数*F){
for(inst_迭代器I=inst_开始(F),E=inst_结束(F);I!=E;++I){
不可变的调用站点CS(cast(I));
如果(!CS | | isa(I))继续;
for(User::const_op_迭代器Ab=CS.arg_begin(),Ae=CS.arg_end();Ab!=Ae;++Ab){
对于(用户*U:Ab->get()->users()){
if(指令*Inst=dyn_铸件(U)){
/*在这里怎么结账*/
}
}
}
}
}

这样写有点奇怪。我可能会这样做:

void scanFunc(Function &F) {

  for (Function::iterator BB = F.begin(), E = F.end(); BB != E; ++BB) {
    for (BasicBlock::iterator BBI = BB->begin(), BBE = BB->end(); BBI != BBE;
         ++BBI) {
      if (CallInst *CI = dyn_cast<CallInst>(BBI)) {
        dbgs() << "Call: ";
        CI->dump();
        dbgs() << "\n";
        ImmutableCallSite CS(CI);
        for (ImmutableCallSite::arg_iterator I = CS.arg_begin(),
                                             E = CS.arg_end();
             I != E; ++I) {
          if (Instruction *Inst = dyn_cast<Instruction>(*I)) {
            // Do stuff                                                                                                                                                   
            dbgs() << "\tInst: ";
            Inst->dump();
            dbgs() << "\n";

          }
        }
      }
    }
  }
}
并将其编译为IR并在其上运行此代码,您将看到:

Call:   %call = call i32 @_Z1ai(i32 %0)

    Inst:   %0 = load i32* %c.addr, align 4

Call:   %call1 = call i32 @_Z1ai(i32 %sub)

    Inst:   %sub = sub nsw i32 %1, 1

Call:   %call = call i32 @_Z1ai(i32 4)

Call:   %call1 = call i32 @_Z1bi(i32 5)

Call:   %call2 = call i32 @_Z1bi(i32 6)
Call:   %call = call i32 @_Z1ai(i32 %0)

    Inst:   %0 = load i32* %c.addr, align 4

Call:   %call1 = call i32 @_Z1ai(i32 %sub)

    Inst:   %sub = sub nsw i32 %1, 1

Call:   %call = call i32 @_Z1ai(i32 4)

Call:   %call1 = call i32 @_Z1bi(i32 5)

Call:   %call2 = call i32 @_Z1bi(i32 6)