1

假设我有:

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

我将如何检查参数ainbar是否与llvm IR(*.ll 文件) 中的参数相同我得到以下信息afoo

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 
4

1 回答 1

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
                }
            }    

         }
     }
  }

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

于 2016-02-29T12:12:20.797 回答