我有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
。任何人都可以指导我如何做到这一点?
你还没有展示fn
是什么,但我猜它是Function
而不是CallInst
。如果是这样,您将迭代函数定义或声明中的参数,而不是调用的参数。您可以使用CallInst
而不是fn
,相同的代码应该可以使用。