为什么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< /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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
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.其实他们是有可比性的。 Leave 是一个高级指令:
来自 Intel 手册:
基本上,leave 相当于
Actually, they're comparable. Leave is a high level instruction:
From the Intel manual:
basically, leave is equivalent to
看起来 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