有没有办法获得llvm dereference指针值的原始类型(即指针类型)

时间:2015-03-23 13:49:22

标签: c++ c llvm clang++ llvm-clang

也许标题有些混乱。但让我举个例子。

void foo(int val)
{
    // do something
}

int i = 27;
int* pi = &i;

foo(*pi);

这里,如果我们使用clang编译它,* pi的类型将是i32,但我们知道pi是指针类型。

我的问题是我们使用Function :: getgetFunctionParamType方法,结果将是i32。但是如何使用某种方式来获得'pi'类型,而不是'* pi'类型?这个问题让我困惑了好几天。

更新

我看到有些人混淆了这个问题。好吧,我已经将这个源代码编译成LLVM中间格式flie(即.ll文件),所以我已经达到了中间代码生成的步骤,我可以处理的是与LLVM IR相关的,我只能看到i32,i32 *和等等(现在没有int,int *)。而且我不想构造一个指针类型,我只是想要'反向'* pi到pi,以便我可以检查'pi'是指针类型。情况是这样的:我有.pi,在.ll文件中,也许pi是

%pi = alloca i32*, align 32 
%1 = load i32** %pi, align 32  
%2 = load volatile i32* %1, align 1
%3 = call foo(i32 %2)  

所以,如果我检查函数的参数类型,我只能得到i32,因为它现在是 pi。但如果我能得到pi,即%pi = alloca i32 对齐32,我就知道pi是指针类型。

2 个答案:

答案 0 :(得分:2)

我认为您正在寻找PointerType* PointerType::get(Type*)

答案 1 :(得分:0)

如果我正确理解你的问题你需要的是CallInst调用函数的操作数,而不是函数声明。

假设您Function* F指向foo(i32)

(如果它不能编译,我会记得这么抱歉)

for(auto U : F->users())
{
    if (CallInst* CI = dyn_cast<CallInst>(U))
    {
        Value* O0 = CI->getOperand(0) // we simply know foo needs one operand
        if (Constant* C = dyn_cast<Constant>(O0))
        {
            // parameter is a constant you can get the type as usual from every value
        }
        else if (LoadInst* LI = dyn_cast<LoadInst>(O0))
        {
            // since the argument is not a constant it must be a value loaded by
            // a LoadInst and LoadInst has the function getPointerOperand()
            Value* PO = LI->getPointerOperand();
            // since we know it's a pointer Operand we can cast safely here
            PointerType* PT = cast<PointerType>(PO->getType());
            PT->dump(); // will print i32* 
        }
    }
}