找出确切的 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 隐式选项的主要内容,如果未能解决你的问题,请参考以下文章

Spark SQL - 隐式创建模式和以编程方式创建模式之间的确切区别

为啥 GCC 会警告这种隐式转换?

GCC允许隐式int到指针转换?

为啥 gcc 给出警告:函数 qsort_r 的隐式声明?

关于gcc内置函数和c隐式函数声明的认识以及一些推测

C++ 函数到指针的隐式转换:哪个编译器是正确的? Clang 和 GCC 不同意