Durante la compilazione del codice ho notato grandi differenze nell'assemblatore create tra -O0 e -O1. Volevo eseguire abilitando/disabilitando le ottimizzazioni fino a quando ho scoperto che cosa stava causando un certo cambiamento nell'assemblatore.Differenze tra -O0 e -O1 in GCC
Se uso -fverbose-asm per scoprire esattamente quali flag O1 è abilitato rispetto a O0, e quindi li disabilito manualmente, perché l'assemblatore è prodotto ancora così enormemente diverso? Anche se eseguo gcc con O0 e aggiungo manualmente tutti i flag che fverbose-asm ha detto che sono abilitati con O1, non ho lo stesso assemblatore che avrei avuto usando O1.
C'è qualcosa oltre a "-f ..." e "-m ..." che può essere modificato?
O è solo che 'O1' ha un po 'di magia rispetto a' O0 'che non può essere disattivato.
Ci scusiamo per l'crypticness - questo era legato a Reducing stack usage during recursion with GCC + ARM tuttavia la menzione di esso stava facendo la domanda un po 'difficile da capire.
Quindi il problema è che non si conosce il nome (o combinazione letale) della "ottimizzazione incriminata" che aumenta l'utilizzo dello stack, e * anche * non lo fai conosci i nomi delle ottimizzazioni da '-Os 'di cui hai bisogno? Dove "non so il nome" include la possibilità che non abbiano nomi, sono varie ottimizzazioni extra abilitate da 'O1' o' Os' che non possono essere controllati individualmente. –
Sì, in pratica conosco tutti i flag che GCC afferma di aver abilitato (tramite -fverbose-asm). Tuttavia disabilitarli manualmente non risolve il problema, quindi deve essere un po '"magico" che non riesco a controllare. TUTTAVIA ho appena scoperto (vedi domanda collegata) che il problema esisteva ancora con O0, solo in un modo diverso. Sarebbe comunque bello sapere se c'è una risposta a questa domanda - poiché è spaventoso non essere in grado di controllare le ottimizzazioni. –
Hai provato a utilizzare GCC's 'attribute (())' o riscrivere una funzione in un altro modo (ad esempio, rendere statiche le variabili o allocare il loro spazio manualmente)? Come soluzione dell'ultima possibilità, la funzione problematica può essere riscritta in assembly. – Vovanium