Gor*_*ams 15 c embedded gcc arm
在编译一些代码时,我注意到在-O0和-O1之间创建的汇编程序存在很大差异.我想要启动启用/禁用优化,直到我发现导致汇编程序发生某些变化的原因.
如果我使用-fverbose-asm来确切地找出O1与O0相比正在启用哪些标志,然后手动禁用它们,为什么生成的汇编程序仍然如此大不同?即使我用O0运行gcc并手动添加fverbose-asm所说的用O1启用的所有标志,我也没有得到与使用O1时相同的汇编程序.
除了'-f ...'和'-m ......'之外还有什么可以改变的吗?
或者就是'O1'与无法关闭的'O0'相比具有一定的魔力.
对于隐秘性感到抱歉 - 这与使用GCC + ARM减少递归期间的堆栈使用有关,但是提及它使问题有点难以理解.
如果您只想查看在O1上启用了哪些未在O0启用的传递,您可以执行以下操作:
gcc -O0 test.c -fdump-tree-all -da
ls > O0
rm -f test.c.*
gcc -O1 test.c -fdump-tree-all -da
ls > O1
diff O0 O1
Run Code Online (Sandbox Code Playgroud)
一个类似的过程,使用你发现的一组标志,可以让你看到GCC在O1进行的不受标志控制的额外魔法传递.
编辑:
一种不那么混乱的方法可能是比较-fdump-pass的输出,它将列出哪些传递为ON或OFF到stderr.
所以类似于:
gcc -O0 test.c -fdump-passes |& grep ON > O0
gcc -O1 test.c -fdump-passes |& grep ON > O1
diff O0 O1
Run Code Online (Sandbox Code Playgroud)
这并不是说有什么帮助,只是为你对-O1无法关闭的魔法的怀疑提供了一些证据:
来自http://gcc.gnu.org/ml/gcc-help/2007-11/msg00214.html:
\n\n\n注意,并非所有由 -O1 启用的优化都有命令行切换标志来禁用它们。
\n
来自哈根的“海湾合作委员会权威指南,第二版”:
\n\n\n注意:并非所有 GCC\xe2\x80\x99s 优化都可以使用标志进行控制。GCC 自动执行一些优化,并且在不修改源代码的情况下,当您使用 -O 请求优化时无法禁用这些优化
\n
不幸的是,我还没有找到任何关于这些硬编码优化可能是什么的明确声明。希望了解 GCC 内部结构的人可以发布包含一些相关信息的答案。
\n| 归档时间: |
|
| 查看次数: |
4051 次 |
| 最近记录: |