2009-08-21 5 views
10

He estado viendo algunos ensambles de LLVM producidos por llvm-gcc últimamente y he notado una declaración recurrente de la cual no estoy seguro de su propósito.¿Cuál es el propósito de la línea% "alloca point" que aparece en el código llvm?

Por ejemplo, el siguiente programa de C:

int main(void) 
{ 
    void (*f)(void) = (0x21332); 
    f(); 
} 

cuando se compila con "llvm-gcc -emit-llvm -S" producirá el siguiente código (partes irrelevantes eliminados):

define i32 @main() nounwind { 
entry: 
    %retval = alloca i32  ; <i32*> [#uses=1] 
    %f = alloca void()*  ; <void()**> [#uses=2] 
    %"alloca point" = bitcast i32 0 to i32  ; <i32> [#uses=0] 
    store void()* inttoptr (i64 135986 to void()*), void()** %f, align 4 
    %0 = load void()** %f, align 4  ; <void()*> [#uses=1] 
    call void %0() nounwind 
    br label %return 

estoy interesado en el propósito de la línea:

%"alloca point" = bitcast i32 0 to i32  ; <i32> [#uses=0] 

no parece hacer nada como la variable se asigna a nunca se usa de nuevo y el bitcast en sí no tiene sentido. Todo lo que puedo pensar es que se inserta realmente como un nop para fines posteriores de generación/análisis de código, lo que indica partes interesantes del código.

+0

También tengo curiosidad en esta línea; Acabo de encontrarlo esta noche mientras veo algo de generación de código. Parece ser el límite alloca, pero no sé por qué. – Albinofrenchy

Respuesta

8

De la fuente llvm-gcc: gcc/llvm-convert.cpp, se acaba de utilizar como valor auxiliar * y se eliminará mediante un pase de eliminación de instrucciones inactivas.

// Create a dummy instruction in the entry block as a marker to insert new 
// alloc instructions before. It doesn't matter what this instruction is, 
// it is dead. This allows us to insert allocas in order without having to 
// scan for an insertion point. Use BitCast for int -> int 
+0

Sí, esto es correcto. También se hizo esta pregunta en la lista de correo de LLVM y obtuve una respuesta similar, para ser precisos: "Está ahí como un marcador de posición para insertar temporalmente: las alloca van antes del bitcast y la generación real del código comienza después de eso. Es simplemente una conveniencia para el front-end; instcombine lo eliminará, y básicamente todo lo demás simplemente lo ignorará ". –

-1

Se encontró esto en las internets: Allocas cuyo tamaño se puede determinar en el momento de la compilación se le asignará espacio en la pila cuando se calcule el tamaño del marco de la pila. Para allocas de tamaño variable, el código específico del objetivo tendrá que cambiar el tamaño de la pila, ajustar el puntero del marco y el puntero de la pila según sea necesario, y ajustar las ubicaciones para los parámetros salientes a la parte superior de la pila.

suena como si estuviese ahí para hacer que el espacio de la pila funcione correctamente.

+0

La pregunta no es acerca de alloca en sí. El OP está preguntando sobre la instrucción llamada "alloca point", que parece ser un no-op. –

Cuestiones relacionadas