为什么LLVM要为同一个程序添加两条额外的指令?

发布于 2024-10-15 23:52:25 字数 753 浏览 4 评论 0原文

我正在编译这个 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< /code>):

_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 做什么?在堆栈上移动某些内容并随后直接弹出它对我来说似乎毫无用处。

I am compiling this C program and comparing the generated assembly code:

int main(){ return 0; }

GCC gives this main function (cc hello.c -S):

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

LLVM gives this main function (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:

What are movl $0, -4(%rbp) and popq %rbp needed for? Moving something on the stack and popping it directly afterwards seems useless to me.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

倒数 2024-10-22 23:52:25

movl $0, -4(%rbp) 指令已失效,因为这是未优化的代码。尝试将 -O 传递给两个编译器以查看发生了什么变化。

The movl $0, -4(%rbp) instruction is dead, because this is unoptimized code. Try passing in -O to both compilers to see what changes.

娇柔作态 2024-10-22 23:52:25

其实他们是有可比性的。 Leave 是一个高级指令:

来自 Intel 手册:

16-bit: C9 LEAVE A Valid Valid Set SP to BP, then pop BP.
32-bit: C9 LEAVE A N.E. Valid Set ESP to EBP, then pop EBP.
64-bit: C9 LEAVE A Valid N.E. Set RSP to RBP, then pop RBP.

基本上,leave 相当于

movq %rbp, %rsp
popq %rbp

Actually, they're comparable. Leave is a high level instruction:

From the Intel manual:

16-bit: C9 LEAVE A Valid Valid Set SP to BP, then pop BP.
32-bit: C9 LEAVE A N.E. Valid Set ESP to EBP, then pop EBP.
64-bit: C9 LEAVE A Valid N.E. Set RSP to RBP, then pop RBP.

basically, leave is equivalent to

movq %rbp, %rsp
popq %rbp
诠释孤独 2024-10-22 23:52:25

看起来 LLVM 使用的是传统的函数 prolog/epilog,而 GCC 则利用了入口点不需要清理的事实

It looks like LLVM is using a traditional function prolog/epilog, whereas GCC is taking advantage of the fact that the entry point doesn't need to clean up

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文