The register numbers used in x86-64's .eh_frame entries neither matched the ABI nor the gcc implementation. Additionally, a significant amount of registers were missing in both 32- and 64-bit modes (even now there are, but only those for which there don't appear to be register numbers assigned in the respective ABI). Built and tested on i686-pc-linux-gnu (including a cross version targeting x86_64-unknown-linux-gnu). Jan gas/ 2004-11-25 Jan Beulich * config/tc-i386.c (tc_x86_regname_to_dw2regnum): Correct 64-bit mode names to match ABI. Add more registers for 32-bit and 64-bit modes. Make name array static and const. Adjust lookup to account for NULL entries (standing for unused register numbers). --- /home/jbeulich/src/binutils/mainline/2004-11-25.14.46/gas/config/tc-i386.c 2004-11-23 09:35:34.000000000 +0100 +++ 2004-11-25.14.46/gas/config/tc-i386.c 2004-11-25 15:16:34.709475200 +0100 @@ -6628,21 +6628,36 @@ tc_x86_regname_to_dw2regnum (const char { unsigned int regnum; unsigned int regnames_count; - char *regnames_32[] = + static const char *const regnames_32[] = { "eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi", - "eip" + "eip", "eflags", NULL, + "st0", "st1", "st2", "st3", + "st4", "st5", "st6", "st7", + NULL, NULL, + "xmm0", "xmm1", "xmm2", "xmm3", + "xmm4", "xmm5", "xmm6", "xmm7", + "mm0", "mm1", "mm2", "mm3", + "mm4", "mm5", "mm6", "mm7" }; - char *regnames_64[] = + static const char *const regnames_64[] = { - "rax", "rbx", "rcx", "rdx", - "rdi", "rsi", "rbp", "rsp", - "r8", "r9", "r10", "r11", + "rax", "rdx", "rcx", "rbx", + "rsi", "rdi", "rbp", "rsp", + "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15", - "rip" + "rip", + "xmm0", "xmm1", "xmm2", "xmm3", + "xmm4", "xmm5", "xmm6", "xmm7", + "xmm8", "xmm9", "xmm10", "xmm11", + "xmm12", "xmm13", "xmm14", "xmm15", + "st0", "st1", "st2", "st3", + "st4", "st5", "st6", "st7", + "mm0", "mm1", "mm2", "mm3", + "mm4", "mm5", "mm6", "mm7" }; - char **regnames; + const char *const *regnames; if (flag_code == CODE_64BIT) { @@ -6656,7 +6671,8 @@ tc_x86_regname_to_dw2regnum (const char } for (regnum = 0; regnum < regnames_count; regnum++) - if (strcmp (regname, regnames[regnum]) == 0) + if (regnames[regnum] != NULL + && strcmp (regname, regnames[regnum]) == 0) return regnum; return -1;