如何检查LLVM AllocaInst的目标是否是函数指针

时间:2018-01-19 02:15:12

标签: llvm llvm-ir

%pointer = alloca void (i32)*, align 8 如何检查%指针是否是函数指针?我可以获取函数指针的参数列表吗?

1 个答案:

答案 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 ..谢谢..