Узнайте точные неявные параметры gcc

У меня есть программа, которая работает только при компиляции с определенной версией gcc и с использованием некоторой оптимизации (-O1 или выше, но не -O0).

Эта программа некорректна в смысле C, но тем не менее мне нужно понять, почему она не работает с -O0. Он слишком велик, чтобы его можно было проверить вручную путем сравнения сгенерированных ассемблерных кодов, поэтому я бы хотел, чтобы GCC сообщил мне точные флаги, соответствующие выполнению, скажем, -O1, но без использования самого -O1. Идея в том, что, удаляя каждую оптимизацию по одной, я смогу лучше понять проблему.

Я перешел на свою страницу параметров оптимизации gcc. и попытался добавить все параметры -f, которые, согласно документу, включаются -O1, но этого недостаточно (программа по-прежнему ведет себя как -O0).

Есть ли способ получить какую-то нормализованную командную строку на основе опций «нижнего уровня» -f*, которые соответствуют тому, что GCC делает внутри?


person anol    schedule 20.06.2016    source источник
comment
Обратите внимание, что эта проблема звучит так, будто в вашем коде есть какое-то неопределенное поведение. Возможно, вы захотите попробовать -fsanitize=undefined и посмотреть, не появится ли что-нибудь.   -  person rubenvb    schedule 20.06.2016
comment
НЕТ, невозможно получить эквивалент -O1 со списком флагов -f. gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html Не все оптимизации контролируются напрямую флагом. Большинство оптимизаций доступны только в том случае, если в командной строке установлен уровень -O. В противном случае они отключены, даже если указаны отдельные флаги оптимизации. Вы можете отключить довольно много оптимизаций с помощью -O1 -fno-*, возможно, некоторых -fdisable-*, но я все еще не верю, что это вам сильно поможет.   -  person Marc Glisse    schedule 20.06.2016
comment
@rubenvb Я полностью согласен, это неправильная программа, но в любом случае она имеет дело со всеми видами неприятных сборок и взаимодействий на аппаратном уровне, поэтому я не могу рассчитывать на ее исправление. Тем не менее, это поведение, связанное с -O, нужно как-то понять, поэтому, думаю, мне придется исправить сам gcc, чтобы получить дополнительную информацию.   -  person anol    schedule 21.06.2016


Ответы (1)


Вы можете использовать флаги Q --help=target,optimizer в сочетании с любыми флагами оптимизатора (например, -O2 или -O1) для просмотра примененных флагов. Это задокументировано здесь

Если вы используете bash, вы можете использовать приведенный ниже oneliner, чтобы увидеть разницу между, например. -О0 и -О1)

$ 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]
person nos    schedule 20.06.2016
comment
Это действительно очень полезная опция! К сожалению, его еще не существовало в gcc 3.4.3, который мне нужно протестировать (я имею в виду, что вариант -Q существует, но не --help=optimize), но из того, что я искал, и комментария Марка Глиссе, нет лучшего в любом случае, так что я приму ваш, так как он очень полезен для более поздних версий gcc. - person anol; 21.06.2016
comment
Использование --help=target,optimizer дает ошибку. Использование --help=optimizers - это то, что задокументировано в предоставленной вами ссылке. - person Paul Brannan; 15.04.2020