2017-08-29 3 views
2

J'essaie de compiler une bibliothèque C 64 bits en utilisant gcc-4.9.1. Lors de la compilation avec -O2, j'obtiens l'erreur suivante à différents endroits. -O0 la compilation fonctionne bien.Erreur GCC: les registres étendus n'ont pas de moitiés élevées

Error: 
error: extended registers have no high halves 

Toute idée de la raison pour laquelle ce message d'erreur arrive et comment le réparer. Le numéro de ligne auquel il pointe est la fin de la fonction.

Les options du compilateur sont:

-march=x86-64 -fno-omit-frame-pointer -m64 -Wno-pointer-sign 
-Wno-error=address -ggdb -gdwarf-2 -g2 -feliminate-unused-debug-types 
+0

ressemble à un bug gcc. googling: https://sourceforge.net/p/covered/bugs/171/ –

+0

Personne ne devrait utiliser '-fno-omit-frame-pointer', les directives CFI se déroulent mieux. – o11c

Répondre

0

Il semble que cette erreur a été ajoutée dans ce patch:

+ /* Irritantingly AMD extended registers use different naming convention 
+  from the normal registers. */ 
+ if (REX_INT_REG_P (x)) 
+ { 
+  switch (code) 
+  { 
+  case 5: 
+  error ("Extended registers have no high halves\n"); 
+  break; 
+  case 1: 
+  fprintf (file, "r%ib", REGNO (x) - FIRST_REX_INT_REG + 8); 
+  break; 
+  case 2: 
+  fprintf (file, "r%iw", REGNO (x) - FIRST_REX_INT_REG + 8); 
+  break; 
+  case 4: 
+  fprintf (file, "r%id", REGNO (x) - FIRST_REX_INT_REG + 8); 
+  break; 
+  case 8: 
+  fprintf (file, "r%i", REGNO (x) - FIRST_REX_INT_REG + 8); 
+  break; 
+  default: 
+  error ("Unsupported operand size for extended register.\n"); 
+  break; 
+  } 
+  return; 
+ } 

Essayez de recompiler sans l'option -march=x86-64.

+0

Cela ne signifie-t-il pas que vous devriez utiliser un mode de contrainte différent? – o11c

+0

Eh bien, ma première hypothèse est que l'architecture par défaut va corriger le problème par lui-même ... mais c'est juste une supposition. – perror