如何在C程序中计算数组的总数?
LLVM IR中的数组声明对应于 alloca 类型的操作。 所以
int a[10];
对应
%a = alloca [10 x i32], align 4
LLVM IR中的。
但我也注意到了
int j = 0;
也对应于alloca指令
%j = alloca i32, align 4
那么如何计算仅对应数组的alloca指令数?
编辑:
for (Function::iterator i = F.begin(), e = F.end(); i != e; ++i)
{
for (BasicBlock::iterator ii =(*i).begin(), ii_e = (*i).end(); ii != ii_e; ++ii)
{
Instruction *n = dyn_cast<Instruction>(&*ii);
for( int num = 0; num < n->getNumOperands(); ++num)
if(isa<ArrayType>(n->getOperand(num)->getType()))
{
// doesn't work
errs()<<"yayayayay Array\n";
}
}
}
答案 0 :(得分:3)
AllocaInst
有公开方法isArrayAllocation()
。您可以使用它来计算仅对应于数组的alloca指令的数量。
for (Function::iterator BB = F.begin(), BE = F.end(); BB != BE; ++BB)
for (BasicBlock::iterator II = BB->begin(), IE = BB->end(); II != IE; ++II)
if (AllocaInst *AI = dyn_cast<AllocaInst>(II))
if (AI->isArrayAllocation())
errs() << "Alloca of array is found!\n";
答案 1 :(得分:2)
打开the LLVM demo page并编译以下代码
int main(int argc, char **argv) {
int a[10];
return 0;
}
到LLVM C ++ API调用。
这就是a
创建的方式:
AllocaInst* ptr_a = new AllocaInst(ArrayTy_6, "a", label_9);
其中ArrayTy_6
是:
ArrayType* ArrayTy_6 = ArrayType::get(IntegerType::get(mod->getContext(), 32), 10);
因此,要查明您正在查看的alloca
指令是否正在定义数组,只需对它的第一个参数执行isa<ArrayType>()
。
有关详细信息,请参阅LLVM docs。