Estoy compilando este programa C y comparar el código de ensamblado generado:¿Por qué LLVM agrega dos instrucciones adicionales para el mismo programa?
int main(){ return 0; }
GCC da esta función principal (cc hello.c -S
):
_main:
LFB2:
pushq %rbp
LCFI0:
movq %rsp, %rbp
LCFI1:
movl $0, %eax
leave
ret
LLVM da esta función principal (clang hello.c -S
):
_main:
Leh_func_begin0:
pushq %rbp
Ltmp0:
movq %rsp, %rbp
Ltmp1:
movl $0, %eax
movl $0, -4(%rbp)
popq %rbp
ret
Leh_func_end0:
¿Para qué se necesitan movl $0, -4(%rbp)
y popq %rbp
? Mover algo en la pila y abrirlo directamente después me parece inútil.
Parece un poco injusto comparar la salida del conjunto de compiladores sin usar el optimizador. –