2017-08-29 98 views
2

我想編譯一個64位C庫使用gcc-4.9.1.編譯時與-O2,我在不同的地方得到以下錯誤。 -O0彙編工作正常。GCC錯誤:擴展寄存器沒有高一半

Error: 
error: extended registers have no high halves 

任何想法爲什麼這個錯誤信息即將到來,以及如何解決它。它指向的行號是該函數的結尾。

的編譯器選項:

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

聽起來像一個海灣合作委員會的錯誤。谷歌搜索:https://sourceforge.net/p/covered/bugs/171/ –

+0

沒有人應該使用'-fno-omit-frame-pointer',CFI指令可以更好地展開。 – o11c

回答

0

看來,這個錯誤在這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; 
+ } 

儘量不選擇-march=x86-64重新編譯。

+0

這是不是說你應該使用不同的約束模式? – o11c

+0

那麼,我的第一個猜測是默認架構會自行糾正問題......但這只是一個猜測。 – perror