Sto compilando questo programma C e confrontando il codice assembly generato:Perché LLVM aggiunge due istruzioni aggiuntive per lo stesso programma?
int main(){ return 0; }
GCC dà questa funzione main (cc hello.c -S
):
_main:
LFB2:
pushq %rbp
LCFI0:
movq %rsp, %rbp
LCFI1:
movl $0, %eax
leave
ret
LLVM dà questa funzione main (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:
Cosa sono necessari per movl $0, -4(%rbp)
e popq %rbp
? Spostare qualcosa in pila e scoccarlo subito dopo sembra inutile per me.
Sembra un po 'ingiusto confrontare l'output dell'assieme dei compilatori senza utilizzare l'ottimizzatore. –