0

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";
        }
       }
   }
4

2 に答える 2

3

AllocaInstpublic メソッドがあり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";
于 2012-08-20T18:42:29.697 に答える
2

LLVMデモ ページを開き、次のコードをコンパイルします。

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 のドキュメントを参照してください。

于 2012-08-20T07:51:07.890 に答える