LLVM比较两个函数

时间:2015-12-08 23:16:42

标签: c++ llvm compiler-optimization llvm-ir llvm-c++-api

假设我有:

foo(int a, int b){
  bar(a)
}

我如何检查a中的参数bar是否与llvm IR(*。ll文件)中a中的参数foo相同我得到了这个:

test.ll

 18 ; Function Attrs: nounwind uwtable
 19 define i32 @foo(i32 %a, i32 %b) #0 {
 20 entry:
 21   %a.addr = alloca i32, align 4
 22   %b.addr = alloca i32, align 4
 23   %f = alloca i32, align 4
 24   store i32 %a, i32* %a.addr, align 4
 25   store i32 %b, i32* %b.addr, align 4
 26   %0 = load i32, i32* %a.addr, align 4
 27   %call = call i32 @baz(i32 %0)
 28   store i32 %call, i32* %f, align 4
 29   %1 = load i32, i32* %f, align 4
 30   ret i32 %1
 31 }
 32 

1 个答案:

答案 0 :(得分:0)

我假设您只询问是否将相同的变量传递给bar。

在功能

上运行时检查
 runOnFunction(Function &F)
 {
    Function::ArgumentListType &sArgs = F.getArgumentList();
    Function::ArgumentListType::iterator psArg = sArgs.begin();
    Function::ArgumentListType::iterator psEndArg = sArgs.end();

    /* this will iterate through function arguments */
    for ( ;psArg != psEndArg; ++psArg)
    {
        /* iterate argument uses */
        Argument::user_iterator psUSe = psArg->user_begin();
        Argument::user_iterator psUSeEnd = psArg->user_end();
        for (;psUSe != psUSeEnd ; ++psUSe)
        {
            /* check if it is call to bar or not */
            if (CallInst* psCall = dyn_cast<CallInst>(*psUSe))
            //if (const CallInst* psInst = dyn_cast<CallInst>(*psUSe))
            {
               if(psCall->getCalledFunction()->getName().startswith("bar") 
                { // hurray found it, do something
                }
            }    

         }
     }
  }

上面的代码将检查函数参数是否被传递给另一个函数调用。