%pointer = alloca void (i32)*, align 8
如何检查%指针是否是函数指针?我可以获取函数指针的参数列表吗?
答案 0 :(得分:0)
设创一个检查Alloca Instruction Type
是否为函数指针的函数。
bool isFunctionPointerType(Type *type){
// Check the type here
if(PointerType *pointerType=dyn_cast<PointerType>(type)){
return isFunctionPointerType(pointerType->getElementType());
}
//Exit Condition
else if(type->isFunctionTy()){
return true;
}
return false;
}
在runOnModule
/ runOnFunction
通行证
if(AllocaInst *allocaInst=dyn_cast<AllocaInst>(inst)){
if(isFunctionPointerType(allocaInst->getType())){
errs()<<"Funtion Pointer Type\n";
}
}
以上source.c
代码
#include <stdio.h>
void fun(int a)
{
printf("Value of a is %d\n", a);
}
int main()
{
void (*fun_ptr)(int) = &fun;
(*fun_ptr)(10);
return 0;
}
没有任何优化的相应LLVM Bitcode
entry:
%retval = alloca i32, align 4
%fun_ptr = alloca void (i32)*, align 8
store i32 0, i32* %retval, align 4
call void @llvm.dbg.declare(metadata void (i32)** %fun_ptr, metadata !11,
... metadata !15), !dbg !16
store void (i32)* @_Z3funi, void (i32)** %fun_ptr, align 8, !dbg !16
%0 = load void (i32)*, void (i32)** %fun_ptr, align 8, !dbg !17
call void %0(i32 10), !dbg !18
ret i32 0, !dbg !19
成功检测func_ptr
作为函数指针。
请注意,代码使用recursion
来查找类型recursively
另一种方法是在LLVM中使用func_ptr
链跟踪def-use
的使用,即跟踪StoreInst
并检查源操作数是否是指向函数的指针:没有试试吧。
希望这会有所帮助...... 如果它有帮助请将其标记为正确的解决方案或upvote ..谢谢..