2010-02-08 23 views
76

Al fine di rendere una pagina sporca (accendere il dirty bit nella voce della tabella delle pagine), mi tocco i primi byte della pagina come questa:Come impedire a gcc di ottimizzare alcune istruzioni in C?

pageptr[0] = pageptr[0]; 

Ma in pratica gcc ignorerà la dichiarazione di morti eliminazione negozio. Al fine di evitare gcc ottimizzandolo, ho ri-scrivere la dichiarazione come segue:

volatile int tmp; 
tmp = pageptr[0]; 
pageptr[0] = tmp; 

Sembra che il trucco funziona, ma un po 'brutto. Vorrei sapere se esistono direttive o sintassi che hanno lo stesso effetto? E non voglio usare il flag -O0, dato che porterà anche una grande penalizzazione delle prestazioni.

+2

Hai provato -O0? –

+4

@Mark -O0 interromperà l'ottimizzazione, ma rallenterà anche le prestazioni del programma. Voglio solo impedire l'ottimizzazione di questo snippet di codice: P – ZelluX

risposta

65

Lo spegnimento dell'ottimizzazione risolve il problema, ma non è necessario. Un'alternativa più sicura consiste nel rendere illegale il compilatore per ottimizzare lo store utilizzando il qualificatore di tipo volatile.

// Assuming pageptr is unsigned char * already... 
unsigned char *pageptr = ...; 
((unsigned char volatile *)pageptr)[0] = pageptr[0]; 

Il volatile tipo qualificatore indica al compilatore di essere rigorosi su esercizi di memoria e carichi. Uno scopo di volatile è di consentire al compilatore di sapere che l'accesso alla memoria ha effetti collaterali e, pertanto, deve essere conservato. In questo caso, l'archivio ha l'effetto collaterale di causare un errore di pagina e si desidera che il compilatore conservi l'errore di pagina.

In questo modo, il codice circostante può ancora essere ottimizzato e il codice è portatile per altri compilatori che non comprendono la sintassi di GCC #pragma o __attribute__.

+1

Direi che è preferibile disattivare le ottimizzazioni. Puoi comunque beneficiare di altre ottimizzazioni utilizzando questo metodo. –

+0

Hai davvero bisogno di fare un carico dalla pagina, però? Sicuramente solo il negozio farebbe: '* (volatile int *) pageptr = 0;' – caf

+0

È necessario modificare il programma che lo renderà umanamente illeggibile. – Phong

131

È possibile utilizzare

#pragma GCC push_options 
#pragma GCC optimize ("O0") 

your code 

#pragma GCC pop_options 

per disattivare le ottimizzazioni dal GCC 4.4.

Vedere la documentazione GCC se sono necessari ulteriori dettagli.

97

Invece di utilizzare il nuovo pragma, è possibile utilizzare anche __attribute__((optimize("O0"))) per le proprie esigenze. Questo ha il vantaggio di applicare semplicemente una singola funzione e non tutte le funzioni definite nello stesso file.

Esempio di utilizzo:

void __attribute__((optimize("O0"))) foo(unsigned char data) { 
    // unmodifiable compiler code 
} 
+3

Cosa succede se non sto usando l'opzione '? Olevel' ma ho usato le opzioni individuali che si attivano separatamente? * (Nel mio caso, non riesco a determinare quale sia l'opzione di ottimizzazione individuale che sta infrangendo il codice) *. – user2284570

Problemi correlati