计算数组的数量

时间:2012-08-20 07:44:27

标签: c llvm clang

如何在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";
        }
       }
   }

2 个答案:

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