Comment empêcher gcc d’optimiser certaines instructions en C?

Afin de rendre une page sale (activer le bit sale dans l’entrée de la table de pages), je touche les premiers octets de la page comme ceci:

pageptr[0] = pageptr[0]; 

Mais en pratique, gcc ignorera la déclaration en éliminant les magasins morts. Afin d’empêcher gcc de l’optimiser, je réécris la déclaration comme suit:

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

Il semble que le tour fonctionne, mais un peu moche. Je voudrais savoir s’il y a des directives ou une syntaxe qui ont le même effet? Et je ne veux pas utiliser de drapeau -O0 , car cela amènera également une excellente performance.

La désactivation de l’optimisation résout le problème, mais n’est pas nécessaire. Une alternative plus sûre consiste à rendre illégal pour le compilateur d’optimiser le magasin en utilisant le qualificatif de type volatile .

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

Le qualificatif de type volatile indique au compilateur d’être ssortingct sur les mémoires et les charges de mémoire. L’un des objectives de volatile est de faire savoir au compilateur que l’access à la mémoire a des effets secondaires et doit donc être préservé. Dans ce cas, le magasin a pour effet secondaire de provoquer une erreur de page et vous souhaitez que le compilateur conserve l’erreur de page.

De cette façon, le code environnant peut toujours être optimisé et votre code est portable pour les autres compilateurs qui ne comprennent pas la syntaxe #pragma ou __atsortingbute__ .

Vous pouvez utiliser

 #pragma GCC push_options #pragma GCC optimize ("O0") your code #pragma GCC pop_options 

désactiver les optimisations depuis GCC 4.4.

Consultez la documentation de GCC si vous avez besoin de plus de détails.

Au lieu d’utiliser les nouveaux pragmas, vous pouvez également utiliser __atsortingbute__((optimize("O0"))) pour vos besoins. Cela a l’avantage de ne s’appliquer qu’à une seule fonction et non à toutes les fonctions définies dans le même fichier.

Exemple d’utilisation:

 void __atsortingbute__((optimize("O0"))) foo(unsigned char data) { // unmodifiable comstackr code }