我的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
。任何人都可以指导我如何做到这一点?
答案 0 :(得分:0)
您还没有显示fn
是什么,但我猜测它是Function
而不是CallInst
。如果是这样,您将迭代函数定义或声明中的参数,而不是调用的参数。您只需使用CallInst
代替fn
,相同的代码就可以使用。