2014-12-20 12 views
6

al momento sto facendo alcuni esperimenti con GNU C++ - Compiler e l'opzione di ottimizzazione -Os per dimensioni minime del codice. Ho controllato le flag di compilazione abilitati al -Os con il seguente comando:g ++ abilita i flag errati a -Os

g++ -c -Q -Os --help=optimizers | grep "enabled" 


ho ottenuto questo elenco di opzioni attivate:

-faggressive-loop-optimizations [enabled] 
-falign-functions    [enabled] 
-falign-jumps     [enabled] 
-falign-labels     [enabled] 
-falign-loops     [enabled] 
-fasynchronous-unwind-tables [enabled] 
       ... 


questo sembra un po 'strano, perché ho anche guardato in alto, quali flag devono essere abilitati a -Os, here e sotto la sezione -Os è scritto che tutte le opzioni falign- devono essere disabilitate per la minimizzazione del codice.


D: Quindi questo è un bug o sto facendo qualcosa di sbagliato qui? Perché dopo aver letto ciò che i flag falign- penso davvero dovrebbero essere disabilitati in -Os!



La mia versione gcc è la 4.9.2 e sto lavorando su Arch-Linux.

Già grazie per l'aiuto :)

+0

Posso riprodurre con lo stesso compilatore, e anche con il precedente 4.4.7, eccetto 'falign-loops' manca qui. – amaurea

+2

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43861 –

+0

Ahh grazie, quindi questo sembra essere un bug noto. Proverò la patch da bugzilla o disabiliterò le opzioni in modo esplicito. – TrezzJo

risposta

2

Q: Quindi questo è un bug o sto facendo qualcosa di sbagliato qui? Perché dopo aver letto ciò che le bandiere falso credo davvero dovrebbero essere disabilitate in -Os

Penso che Hans abbia fatto un buon lavoro nel trovare parte del problema. È sicuramente un bug di documentazione. Ma nessuno dal GCC ha commentato il motivo per cui lo -Os li ha abilitati, quindi potresti non avere tutte le informazioni.

I dispositivi ARM precedenti erano molto intolleranti agli accessi non allineati. I dispositivi con bracci meno recenti includevano ARMv4 e io penso che ARMv5. Se hai eseguito un accesso non allineato, otterresti un SIGBUS (stato lì, fatto, preso la maglietta).

I moderni dispositivi ARM risolvono gli accessi non allineati come i processori x86, quindi non si ottiene più un SIGBUS. Invece, prendi semplicemente la penalità per le prestazioni.

Si dovrebbe provare a specificare un'architettura nel caso in cui tali opzioni siano un artefatto dal supporto del dispositivo ARM precedente. Ad esempio, -march=armv7. Se lo trovi su ARMv6 e ARMv7, potrebbe ancora essere un bug. Dipende se il team GCC ha deciso che il compromesso era sufficiente per ARM (dimensione del codice rispetto alla penalità delle prestazioni).

Problemi correlati