2013-08-14 11 views
8

Sto cercando di capire quali opzioni del compilatore sono abilitate per GCC (4.7.3, installazione Macports su Mac OS X 10.6.8). So dei seguenti metodi:Opzioni del compilatore GCC: quale serie di opzioni abilitate è corretta?

  1. Utilizzando l'opzione -Q con un semplice file di input, come suggerito dal GCC 4.3.3 compiler options enabled:

    gcc -Q -v -o hello hello.c 
    
  2. Utilizzando la -Q --help = x combinazione (per i valori di x, vedi GCC documentation) es:

    gcc -Q --help=target 
    
  3. Per vedere definisce abilitati:

    echo "" | gcc -E -dM - | sort 
    

Tuttavia, quando si esegue il metodo 1 e 2 con lo stesso insieme di opzioni di ottimizzazione ottengo due diversi insiemi di abilitati/opzioni disabili.

$ gcc -Q -v -O3 -march=native -o hello hello.c 

GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072 
options passed: -v -D__DYNAMIC__ hello.c -march=corei7-avx -mcx16 -msahf 
-mno-movbe -maes -mpclmul -mpopcnt -mno-abm -mno-lwp -mno-fma -mno-fma4 
-mno-xop -mno-bmi -mno-bmi2 -mno-tbm -mavx -mno-avx2 -msse4.2 -msse4.1 
-mno-lzcnt -mno-rdrnd -mno-f16c -mno-fsgsbase --param l1-cache-size=32 
--param l1-cache-line-size=64 --param l2-cache-size=6144 -mtune=corei7-avx 
-fPIC -mmacosx-version-min=10.6.8 -O3 
options enabled: -Wnonportable-cfstrings -fPIC -falign-labels 
-fasynchronous-unwind-tables -fauto-inc-dec -fbranch-count-reg 
-fcaller-saves -fcombine-stack-adjustments -fcommon -fcompare-elim 
-fcprop-registers -fcrossjumping -fcse-follow-jumps -fdebug-types-section 
-fdefer-pop -fdelete-null-pointer-checks -fdevirtualize -fearly-inlining 
... 

mentre

$ gcc -Q -O3 -march=native --help=optimizers 

-falign-functions     [enabled] 
-falign-jumps      [enabled] 
-falign-labels      [enabled] 
-falign-loops      [enabled] 
-fasynchronous-unwind-tables  [enabled] 
-fbranch-count-reg     [enabled] 
-fbranch-probabilities    [disabled] 
-fbranch-target-load-optimize  [disabled] 
-fbranch-target-load-optimize2  [disabled] 
-fbtr-bb-exclusive     [disabled] 
-fcaller-saves      [enabled] 
-fcombine-stack-adjustments   [enabled] 
-fcommon       [enabled] 
-fcompare-elim      [enabled] 
-fconserve-stack     [disabled] 
-fcprop-registers     [enabled] 
-fcrossjumping      [enabled] 
-fcse-follow-jumps     [enabled] 
-fcx-fortran-rules     [disabled] 
-fcx-limited-range     [disabled] 
-fdata-sections      [disabled] 
-fdce        [enabled] 
-fdefer-pop       [enabled] 
-fdelayed-branch     [disabled] 
-fdelete-null-pointer-checks  [enabled] 
-fdevirtualize      [enabled] 
-fdse        [enabled] 
-fearly-inlining     [enabled] 
... 

Guardando opzioni -falign-funzioni, -falign-salti, -falign-etichette e -falign-loop Metodo 2 reclami sono tutti abilitati, mentre Metodo 1 dice solo le etichette false sono abilitate. Anche le opzioni -fdce e -fdse sono abilitate secondo il Metodo 2 ma non secondo il Metodo 1.

Domanda: quale metodo devo fidarmi?

Nota laterale: l'elenco del metodo 2 è incompleto, poiché le opzioni sono raggruppate e sono elencati solo i gruppi richiesti con l'opzione --help =. Per vedere tutte le opzioni nel metodo 2 run:

$ gcc -Q -O3 -march=native --help=optimizers --help=target --help=c 
--help=common --help=warnings | sort 

risposta

1

dalla documentazione GCC:

help = {class | [^] di qualificazione} [, ...] Print (sulla output standard) una descrizione delle opzioni della riga di comando comprese dal compilatore che si adattano a tutte le classi e qualificatori specificati.

mentre

Se appare l'opzione -Q sulla riga di comando prima della --help = opzione , quindi il testo descrittivo visualizzato da help = è cambiato. Invece di descrivere le opzioni visualizzate, viene data un'indicazione come al fatto che l'opzione sia abilitata, disabilitata o impostata su un valore specifico (presupponendo che il compilatore lo sappia nel punto in cui viene utilizzata l'opzione --help = )

sembra che --help mostra semplicemente quali opzioni si possono consentire, mentre -Q permette di vedere se è effettivamente attivato.Inoltre:

L'uscita è sensibile agli effetti della precedente riga comandi mangiare

+0

Infatti, -Q modifica l'uscita per visualizzare le opzioni sono attivati ​​e viene utilizzato sia il metodo 1 e 2 La domanda è, tuttavia, perché i risultati differiscono quando si fornisce un semplice file sorgente C (metodo 1) o --help (metodo 2). Il metodo 1 è semplicemente incompleto? – zan

Problemi correlati