也许标题有些混乱。但让我举个例子。
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是指针类型。
答案 0 :(得分:2)
答案 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*
}
}
}