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.
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