如何找到;";LLVM中值的定义点?
LLVM对其IR使用静态单赋值(SSA)形式,这意味着每个如何找到;";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
值都有一个定义点。那么,找到值的“定义点”最简单(也是最通用)的方法是什么,而不必检查每次使用并确定我们的值的使用方式?在下面的代码中,我对用作函数参数的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)