在LLVM中转换函数参数

时间:2017-12-27 01:47:36

标签: c llvm

我的LLVM IR看起来像

%7 = load i32** %ok, align 8
call void @free(i8* %7) #3

我想从%7的参数列表中提取free并检查先前的Instruction(%7)和参数指令是否相同。我的代码部分用于此目的看起来像

if(CallInst* call_inst = dyn_cast<CallInst>(&I)) {   // I is the Instruction
   Function* fn = call_inst->getCalledFunction();
   StringRef fn_name = fn->getName();
   if (fn_name == "free") {    // fn_name is the called function name
       for(auto args = fn->arg_begin(); args != fn->arg_end(); ++args) {
           Instruction* arg = dyn_cast<Instruction>(&(*args));
           if (arg != NULL)
               errs() << arg->getOperand(0)->getName() << "\n";  // to check
           if (arg == parent_free_bitcast_inst) {
               // do something
        }
    } 

代码不起作用。我尝试过投射,但仍arg->getOperand(0)->getName()导致错误,而不是ok。任何人都可以指导我如何做到这一点?

1 个答案:

答案 0 :(得分:0)

您还没有显示fn是什么,但我猜测它是Function而不是CallInst。如果是这样,您将迭代函数定义或声明中的参数,而不是调用的参数。您只需使用CallInst代替fn,相同的代码就可以使用。