Supponiamo di utilizzare una versione moderna di GCC
per compilare un programma C. Inoltre, considera che il mio programma contiene branch stantii, ma che mi piacerebbe molto che il codice morto in quei rami stantii fosse compilato e presente nel programma finale. Si consideri il seguente programma:Può GCC essere istruito a non eliminare il codice guasto?
int main(int argc, char** argv) {
int a = 0;
goto skip;
a = -1;
skip: ;
return a;
}
Chiaramente, se uso GCC
con impostazioni di ottimizzazione di default, la seconda assegnazione non potrà mai rendere al programma definitivo, come il compilatore può facilmente dire che non sarà mai essere eseguito. Supponiamo che io non voglia che ciò accada.
In GCC
, ci sono una serie di flag che si dilettano con il codice di morti (in particolare -fdce
), e posso scegliere di disattivare in modo esplicito questi quando invocare GCC di conseguenza:
-fno-dce
-fno-dse
-fno-tree-dce
-fno-tree-dse
Per quanto posso dire , questo dovrebbe indicare a GCC
di non confondere il secondo compito. Tuttavia, il codice in questione non sembra mai farlo nel mio programma.
Perché GCC
insistere sulla rimozione del codice morto, e c'è un modo di istruire GCC non per sbarazzarsi del secondo incarico?
stai usando ? – anatolyg
Sono a conoscenza di 'volatile', ma sono curioso di sapere se è possibile farlo con GCC. Per quanto riguarda GCC sto usando la versione 4.8.3, ma sarei interessato a sapere se c'è una soluzione qualsiasi versione specifica! – Caterpillar
Ignora il mio commento. Volatile non impedisce a GCC di saltare il compito. –