找出确切的 gcc 隐式选项
Posted
技术标签:
【中文标题】找出确切的 gcc 隐式选项【英文标题】:Find out exact gcc implicit options 【发布时间】:2016-06-20 06:11:16 【问题描述】:我有一个程序,它仅在使用特定版本的 gcc 编译并使用一些优化(-O1
或更高版本,但不是-O0
)时才有效。
这个程序在 C 意义上是不正确的,但是我需要理解为什么它不能与 -O0 一起工作。它太大而无法通过比较生成的汇编代码来手动检查,所以我希望 GCC 告诉我与 -O1 的执行相对应的确切标志,但不使用 -O1 本身。这个想法是,通过一次删除每个优化,我将能够更好地理解问题。
我去了我的specific gcc's optimization options page 并尝试添加所有-f
选项,根据文档,这些选项由-O1 启用,但这还不够(程序的行为仍然像-O0)。
有没有办法获得某种基于“低级”选项-f*
的规范化命令行,这些选项对应于 GCC 内部所做的操作?
【问题讨论】:
注意这个问题听起来好像你的代码中有一些未定义的行为。可能想尝试 -fsanitize=undefined 看看是否会弹出任何内容。 不,没有办法获得 -O1 与 -f 标志列表的等价物。 gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html “并非所有优化都直接由标志控制。” “大多数优化只有在命令行上设置了 -O 级别时才会启用。否则,即使指定了单独的优化标志,它们也会被禁用。”您可以使用-O1 -fno-*
禁用很多优化,也许还有一些 -fdisable-*
,但我仍然认为这对您没有太大帮助。
@rubenvb 我完全同意,这是一个不正确的程序,但无论如何它处理各种讨厌的组装和硬件级交互,所以我不能指望修复它。尽管如此,这种-O
相关的行为还是需要以某种方式理解,所以我想我必须修补 gcc 本身以获得一些额外的信息。
【参考方案1】:
您可以将标志 Q --help=target,optimizer
与任何优化器标志(例如 -O2 或 -O1)结合使用来查看应用的标志。
这是记录在here
如果你使用的是 bash,你可以使用下面的 oneliner 查看 e.g. -O0 和 -O1)
$ diff -u <(gcc -O0 -Q --help=optimizer ) <(gcc -Q --help=optimizer -O1)
--- /dev/fd/63 2016-06-20 08:20:36.957943807 +0200
+++ /dev/fd/62 2016-06-20 08:20:36.958943794 +0200
@@ -11,22 +11,22 @@
-fassociative-math [disabled]
-fasynchronous-unwind-tables [enabled]
-fauto-inc-dec [enabled]
- -fbranch-count-reg [disabled]
+ -fbranch-count-reg [enabled]
-fbranch-probabilities [disabled]
-fbranch-target-load-optimize [disabled]
-fbranch-target-load-optimize2 [disabled]
-fbtr-bb-exclusive [disabled]
-fcaller-saves [disabled]
- -fcombine-stack-adjustments [disabled]
- -fcompare-elim [disabled]
+ -fcombine-stack-adjustments [enabled]
+ -fcompare-elim [enabled]
-fconserve-stack [disabled]
- -fcprop-registers [disabled]
+ -fcprop-registers [enabled]
-fcrossjumping [disabled]
-fcse-follow-jumps [disabled]
-fcx-fortran-rules [disabled]
-fcx-limited-range [disabled]
-fdce [enabled]
- -fdefer-pop [disabled]
+ -fdefer-pop [enabled]
-fdelayed-branch [disabled]
-fdelete-dead-exceptions [disabled]
-fdelete-null-pointer-checks [enabled]
@@ -38,7 +38,7 @@
-fexpensive-optimizations [disabled]
-ffinite-math-only [disabled]
-ffloat-store [disabled]
- -fforward-propagate [disabled]
+ -fforward-propagate [enabled]
-ffp-contract= fast
-ffunction-cse [enabled]
-fgcse [disabled]
@@ -48,27 +48,27 @@
-fgcse-sm [disabled]
-fgraphite [disabled]
-fgraphite-identity [disabled]
- -fguess-branch-probability [disabled]
+ -fguess-branch-probability [enabled]
-fhandle-exceptions
-fhoist-adjacent-loads [disabled]
- -fif-conversion [disabled]
- -fif-conversion2 [disabled]
+ -fif-conversion [enabled]
+ -fif-conversion2 [enabled]
-findirect-inlining [disabled]
-finline [enabled]
-finline-atomics [enabled]
-finline-functions [disabled]
- -finline-functions-called-once [disabled]
+ -finline-functions-called-once [enabled]
-finline-small-functions [disabled]
-fipa-cp [disabled]
-fipa-cp-alignment [disabled]
-fipa-cp-clone [disabled]
-fipa-icf [disabled]
-fipa-icf-functions [disabled]
- -fipa-profile [disabled]
+ -fipa-profile [enabled]
-fipa-pta [disabled]
- -fipa-pure-const [disabled]
+ -fipa-pure-const [enabled]
-fipa-ra [disabled]
- -fipa-reference [disabled]
+ -fipa-reference [enabled]
-fipa-sra [disabled]
-fira-algorithm= CB
-fira-hoist-pressure [enabled]
@@ -92,7 +92,7 @@
-fmath-errno [enabled]
-fmodulo-sched [disabled]
-fmodulo-sched-allow-regmoves [disabled]
- -fmove-loop-invariants [disabled]
+ -fmove-loop-invariants [enabled]
-fnon-call-exceptions [disabled]
-fnothrow-opt [disabled]
-fomit-frame-pointer [disabled]
@@ -145,14 +145,14 @@
-fshort-double [disabled]
-fshort-enums [enabled]
-fshort-wchar [disabled]
- -fshrink-wrap [disabled]
+ -fshrink-wrap [enabled]
-fsignaling-nans [disabled]
-fsigned-zeros [enabled]
-fsimd-cost-model= unlimited
-fsingle-precision-constant [disabled]
-fsplit-ivs-in-unroller [enabled]
- -fsplit-wide-types [disabled]
- -fssa-phiopt [disabled]
+ -fsplit-wide-types [enabled]
+ -fssa-phiopt [enabled]
-fstack-reuse= all
-fstdarg-opt [enabled]
-fstrict-aliasing [disabled]
@@ -164,20 +164,20 @@
-ftracer [disabled]
-ftrapping-math [enabled]
-ftrapv [disabled]
- -ftree-bit-ccp [disabled]
+ -ftree-bit-ccp [enabled]
-ftree-builtin-call-dce [disabled]
- -ftree-ccp [disabled]
- -ftree-ch [disabled]
+ -ftree-ccp [enabled]
+ -ftree-ch [enabled]
-ftree-coalesce-inlined-vars [disabled]
-ftree-coalesce-vars [enabled]
- -ftree-copy-prop [disabled]
- -ftree-copyrename [disabled]
+ -ftree-copy-prop [enabled]
+ -ftree-copyrename [enabled]
-ftree-cselim [enabled]
- -ftree-dce [disabled]
- -ftree-dominator-opts [disabled]
- -ftree-dse [disabled]
+ -ftree-dce [enabled]
+ -ftree-dominator-opts [enabled]
+ -ftree-dse [enabled]
-ftree-forwprop [enabled]
- -ftree-fre [disabled]
+ -ftree-fre [enabled]
-ftree-loop-distribute-patterns [disabled]
-ftree-loop-distribution [disabled]
-ftree-loop-if-convert [enabled]
@@ -191,16 +191,16 @@
-ftree-partial-pre [disabled]
-ftree-phiprop [enabled]
-ftree-pre [disabled]
- -ftree-pta [disabled]
+ -ftree-pta [enabled]
-ftree-reassoc [enabled]
-ftree-scev-cprop [enabled]
- -ftree-sink [disabled]
+ -ftree-sink [enabled]
-ftree-slp-vectorize [disabled]
- -ftree-slsr [disabled]
- -ftree-sra [disabled]
+ -ftree-slsr [enabled]
+ -ftree-sra [enabled]
-ftree-switch-conversion [disabled]
-ftree-tail-merge [disabled]
- -ftree-ter [disabled]
+ -ftree-ter [enabled]
-ftree-vectorize [disabled]
-ftree-vrp [disabled]
-funroll-all-loops [disabled]
【讨论】:
这确实是一个非常有用的选项!不幸的是,它在 gcc 3.4.3 上尚不存在,这是我需要测试的(我的意思是,-Q
选项存在,但不存在--help=optimize
),但根据我搜索的内容和 Marc Glisse 的评论,反正没有更好的选择,所以我会接受你的,因为它对更新版本的 gcc 非常有用。
使用--help=target,optimizer
会出错。使用--help=optimizers
是您提供的链接中记录的内容。以上是关于找出确切的 gcc 隐式选项的主要内容,如果未能解决你的问题,请参考以下文章