如何在 LLVM 中获取函数调用的参数?
How to get the arguments of a function call in LLVM?
我想编写一个 LLVM pass 来提取函数调用的参数。如果参数是一个常量,我的 objective 就是恢复那个常量是什么。
IR 看起来像
%2 = call noalias i8* @malloc(i64 512) #3
LLVM pass 看起来像
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
代表什么?而不是i64
和512
,为什么会产生i64
和%0
?
它是指向Value. Try cast<>
ing it to ConstantInt
and then calling 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";
}
我想编写一个 LLVM pass 来提取函数调用的参数。如果参数是一个常量,我的 objective 就是恢复那个常量是什么。
IR 看起来像
%2 = call noalias i8* @malloc(i64 512) #3
LLVM pass 看起来像
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
代表什么?而不是i64
和512
,为什么会产生i64
和%0
?
它是指向Value. Try cast<>
ing it to ConstantInt
and then calling 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";
}