计算数组的数量

如何在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(&*ii); for( int num = 0; num getNumOperands(); ++num) if(isa(n->getOperand(num)->getType())) { // doesn't work errs()<<"yayayayay Array\n"; } } } 

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(II)) if (AI->isArrayAllocation()) errs() << "Alloca of array is found!\n"; 

打开LLVM演示页面并编译以下代码

 int main(int argc, char **argv) { int a[10]; return 0; } 

到LLVM C ++ API调用。

这是如何创建的:

 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()

有关详细信息,请参阅LLVM文档 。