Nous avons récemment mis à jour le code à gcc4.3.3
de gcc4.2.4
.Erreur de compilation d'assembly (gcc4.2.4 = win, gcc4.3.3 = fail)
void testAndSet( volatile int* s, int* val)
{
__asm__ __volatile__ ("btsl $0, %0\n "
"jc bitSet\n "
"movl $0, %1\n "
"jmp returnVector\n"
"bitSet:\n "
"movl $1, %1\n"
"returnVector: " : "=m"(*s), "=m"(*val));
}
Notre code échoue maintenant avec les erreurs suivantes,
lock.cxx: Assembler messages:
lock.cxx:59: Error: symbol `bitSet' is already defined
lock.cxx:61: Error: symbol `returnVector' is already defined
lock.cxx:59: Error: symbol `bitSet' is already defined
lock.cxx:61: Error: symbol `returnVector' is already defined
Ces symboles sont introuvables nulle part ailleurs. (Renommer les provoque la même erreur avec le nouveau nom).
Quoi de neuf? pourquoi ai-je deux fois les erreurs?
Très bien. C'était ça. Fait intéressant, échoue avec l'option gcc -02 mais pas avec -O – user48956
Plus la valeur du paramètre -O est élevée, plus il est probable que les choses soient en ligne; En gros, -O2 et -O3 vont utiliser des optimisations basées sur des incréments de plus en plus agressifs et des déroulements de boucles, etc. Il peut être intéressant d'essayer '-Os' (optimiser sans augmenter la taille du code) qui offre souvent une bonne optimisation intermédiaire. –