如何在LLVM中获取函数调用的参数?

时间:2017-04-19 15:50:22

标签: llvm llvm-clang llvm-ir

我想写一个LLVM传递,它将提取函数调用的参数。如果参数是常数,我的目标是恢复常量。

IR看起来像

%2 = call noalias i8* @malloc(i64 512) #3

LLVM传递看起来像

bool runOnFunction(Function &F) override {
    for (auto& B : F) {
        for (auto& I : B) {
            if(CallInst* call_inst = dyn_cast<CallInst>(&I)) {
                Function* fn = call_inst->getCalledFunction();
                StringRef fn_name = fn->getName();
                errs() << fn_name << " : " << call_inst->getArgOperand(0) << "\n";
                for(auto arg = fn->arg_begin(); arg != fn->arg_end(); ++arg) {
                    errs() << *arg << "\n";
                }
            }
        }
    }

    return false;
} 

如果我执行opt传递,则会生成以下内容

malloc : 0x3df3f40
i64 %0

0x3df3f40代表什么?而不是i64512,为什么会产生i64%0

1 个答案:

答案 0 :(得分:5)

它是指向Value的指针。尝试将cast<>改为ConstantInt,然后拨打getValue()

for(auto arg = fn->arg_begin(); arg != fn->arg_end(); ++arg) {
  if(auto* ci = dyn_cast<ConstantInt>(arg))
    errs() << ci->getValue() << "\n";
  errs() << *arg << "\n";
}