Número de recuento de matrices

¿Cómo puede contarse el número total de arreglos en un progtwig en C?

Las declaraciones de matriz en LLVM IR corresponden al tipo de operación de alloca . Asi que

int a[10]; 

corresponde a

 %a = alloca [10 x i32], align 4 

en LLVM IR.

Pero también me di cuenta de que

  int j = 0; 

También corresponde a una instrucción alloca.

  %j = alloca i32, align 4 

Entonces, ¿cómo contar el número de instrucciones de asignación que corresponden solo a matrices?

EDITAR:

  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 tiene un método público isArrayAllocation() . Puede usarlo para contar el número de instrucciones de asignación que corresponden solo a los arreglos.

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

Abra la página de demostración de LLVM y compile el siguiente código

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

a las llamadas API de LLVM C ++.

Así es como se crea a :

 AllocaInst* ptr_a = new AllocaInst(ArrayTy_6, "a", label_9); 

donde ArrayTy_6 es:

 ArrayType* ArrayTy_6 = ArrayType::get(IntegerType::get(mod->getContext(), 32), 10); 

Por lo tanto, para averiguar si la instrucción alloca que está mirando está definiendo una matriz, simplemente haga un isa() en su primer argumento.

Ver documentos LLVM para más información.