2016-06-20 9 views
0

Ich habe ein Programm, das nur funktioniert, wenn mit einer bestimmten Version von gcc kompiliert, und mit einigen Optimierung (-O1 oder höher, aber nicht -O0).Finden Sie genaue gcc implizite Optionen

Dieses Programm ist im C-Sinn falsch, aber trotzdem muss ich verstehen, warum es nicht mit -O0 funktioniert. Es ist zu groß, um manuell durch Vergleich der generierten Assembler-Codes inspiziert zu werden, daher möchte ich, dass GCC mir die genauen Flags mitteilt, die der Ausführung von, sagen wir, -O1 entsprechen, aber ohne -O1 selbst zu verwenden. Die Idee ist, dass ich das Problem besser verstehen kann, wenn ich jede Optimierung einzeln beseitige.

Ich ging zu meinem specific gcc's optimization options page und versuchte alle -f Optionen hinzuzufügen, die, nach dem Dokument, durch -O1 aktiviert werden, aber das nicht genügte (das Programm verhält sich immer noch wie -O0).

Gibt es eine Möglichkeit, eine Art von normalisierten Befehlszeilen zu erhalten, basierend auf Optionen "unterer Ebene" -f*, die dem entsprechen, was GCC intern tut?

+0

Beachten Sie, dass dieses Problem klingt, als gäbe es ein undefiniertes Verhalten in Ihrem Code. Möchte mal versuchen -fsanitize = undefined und sehen, ob das irgendwas auftaucht. – rubenvb

+1

NEIN, es gibt keine Möglichkeit, das Äquivalent von -O1 mit einer Liste von -f Flags zu erhalten. https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html "Nicht alle Optimierungen werden direkt von einem Flag gesteuert." "Die meisten Optimierungen werden nur aktiviert, wenn in der Befehlszeile eine -O-Ebene festgelegt ist. Andernfalls sind sie deaktiviert, auch wenn einzelne Optimierungsflags angegeben sind." Sie können einige Optimierungen mit '-O1 -fno- *', vielleicht mit '-fdisable- * 'deaktivieren, aber ich glaube immer noch nicht, dass Ihnen das viel hilft. –

+0

@rubenvb Ich stimme völlig zu, es ist ein falsches Programm, aber es befasst sich sowieso mit allen Arten von unangenehmen Assembly und Hardware-Level-Interaktionen, so dass ich nicht erwarten kann, es zu beheben. Dennoch muss dieses "-O" -Verhalten irgendwie verstanden werden, also werde ich gcc wahrscheinlich selbst patchen müssen, um zusätzliche Informationen zu erhalten. – anol

Antwort

1

Sie können die Flags Q --help=target,optimizer in Kombination mit beliebigen Optimierungsflags (z. B. -O2 oder -O1) verwenden, um die angewandten Flags anzuzeigen. Dies ist dokumentiert here

Wenn Sie Bash verwenden, können Sie den folgenden Oneliner verwenden, um den Unterschied zwischen z. -O0 und -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] 
+0

Das ist in der Tat eine sehr nützliche Option! Leider existierte es noch nicht auf gcc 3.4.3, das ist das, das ich testen muss (ich meine, die 'Q'-Option existiert, aber nicht' --help = optimieren'), sondern nach dem, was ich gesucht habe und Marc Glisses Kommentar, es gibt sowieso keine bessere Option, also akzeptiere ich deins, da es sehr nützlich für neuere gcc-Versionen ist. – anol

Verwandte Themen