【问题标题】:LLVM Comparing arguments of two functionsLLVM比较两个函数的参数
【发布时间】:2015-12-08 23:16:41
【问题描述】:

假设我有:

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

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

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 

【问题讨论】:

  • “相同”是什么意思?
  • 本质上,我想知道bar(a)中的afoo的一个参数。我试图破译bar的参数是否直接从父函数调用传入,即foo
  • 'a' 参数还是 '有效 const' 参数或只是 '尚未重新分配'参数?
  • 我不太清楚你的意思,但a 只是一个参数
  • foo(int a) { a=2; b(a); } - 应该报告什么?

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


【解决方案1】:

我假设您只是询问是否将相同的变量传递给 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
                }
            }    

         }
     }
  }

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

【讨论】:

    猜你喜欢
    • 2013-03-25
    • 1970-01-01
    • 2013-05-07
    • 1970-01-01
    • 2018-03-26
    • 1970-01-01
    • 2017-12-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多