Почему LLVM добавляет две дополнительные инструкции для одной и той же программы?

Я компилирую эту программу на C и сравниваю сгенерированный ассемблерный код:

int main(){ return 0; }

GCC дает эту основную функцию ( cc hello.c -S ) :

_main:
LFB2:
    pushq   %rbp
LCFI0:
    movq    %rsp, %rbp
LCFI1:
    movl    $0, %eax
    leave
    ret

LLVM дает эту основную функцию ( 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:

Что такое movl $ 0, -4 (% rbp) и popq% rbp нужен для? Мне кажется бесполезным перемещать что-то в стеке и сразу же после этого выталкивать.

8
задан 4 February 2011 в 23:25
поделиться