2012-03-22 12 views
7

Estoy tratando de detectar las declaraciones de matriz y crear una tabla de valores de símbolos para las matrices de tamaño estático. Contendrá un emparejamiento name-arraySize. Tengo varias preguntas:LLVM Nombres y parámetros de las variables de instrucción

1) Dada una instrucción como% a = alloca [200 x i8], alinee 16 cómo puedo extraer "a", el nombre de la matriz.

2) Estoy tratando de extraer el "200" como el tamaño de la matriz, pero este código:

if(AllocaInst *allocInst = dyn_cast<AllocaInst>(&*I)){ 
    PointerType *p = allocInst->getType(); 
    if(p->getElementType()->isArrayTy()){ 
      Value* v = allocInst->getOperand(0); 
      errs() << *v ; 
    } 
}      

me produce "i32 1" cuando imprimo v ¿Alguien sabe por qué esto es.? No pensé que hubiera nada de 32 bits sobre esto, excepto tal vez la dirección.

+0

Bien, así que descubrí cómo obtener el tamaño: ArrayType * a = cast (p-> getElementType()); a-> getNumElements() – Realn0whereman

+3

bien ... así que ... me di cuenta de cómo obtener el nombre también ... allocInst-> getName() ¿Por qué es que simplemente por publicar en StackOverflow me ayuda a encontrar respuestas más rápido ...: P – Realn0whereman

+6

Lo mejor es que solo publique una respuesta que contenga esta información, en lugar de comentarios. De esta manera, la pregunta se marcará correctamente como respondida. – Oak

Respuesta

2

Algunas de las respuestas están en los comentarios, pero aquí hay una explicación más completa.

Hay dos fuentes de tamaño en una alloca: el tamaño del tipo asignado y la cantidad de elementos de ese tipo que están asignados. Si no especifica un número explícitamente, obtiene el valor predeterminado implícito de asignar elemento único. Este es el valor i32 1 que obtiene del operando # 0. Si el tipo asignado es un tipo de matriz (use dyn_cast<...> para probar esto, como se afirmará en cast<...>), entonces también deberá contabilizar ese tamaño.

En LLVM, el optimizador canonicaliza las instrucciones alloca con un tamaño estático mayor que uno en una instrucción alloca de una única matriz con ese tamaño. Por lo tanto, a menudo ves el tamaño alloca como uno constante.

Hay APIs más amigables para esto también: http://llvm.org/docs/doxygen/html/classllvm_1_1AllocaInst.html

En particular, AllocaInst::getArraySize() le dará el número de elementos (por lo general 1) y AllocaInst::getAllocatedType() le dará el tipo de elemento asignado (a veces una matriz) .

Finalmente, una nota sobre el uso del nombre: LLVM no hace ninguna garantías sobre los nombres de las instrucciones. Varias partes del optimizador destruirán los nombres o los cambiarán. Solo tenga cuidado de usarlos para el código de producción ya que puede sorprenderse cuando se vayan.

Cuestiones relacionadas