------- Additional Comments From aoliva at gcc dot gnu dot org 2005-04-19 17:08 ------- Subject: [PR target/16888] clear reg names of unavailable regs
We used to crash at print_operand time, because the register asm variable named a REX register, not available in 32-bit mode. This patch arranges for us to clear the names of registers not available for the given command-line options or defaults, which gets us an error message at the point of the register var declaration. An alternative would be to introduce a new target hook to validate register names, but this didn't sound worth the effort. Bootstrapped and regtested on amd64-linux-gnu. Ok to install? Index: gcc/ChangeLog from Alexandre Oliva <[EMAIL PROTECTED]> PR target/16888 * config/i386/i386.h (CONDITIONAL_REGISTER_USAGE): Clear reg names for unavailable registers. Index: gcc/config/i386/i386.h =================================================================== RCS file: /cvs/gcc/gcc/gcc/config/i386/i386.h,v retrieving revision 1.428 diff -u -p -r1.428 i386.h --- gcc/config/i386/i386.h 14 Apr 2005 23:42:45 -0000 1.428 +++ gcc/config/i386/i386.h 19 Apr 2005 06:03:00 -0000 @@ -1042,14 +1042,14 @@ do { \ int i; \ for (i = 0; i < FIRST_PSEUDO_REGISTER; i++) \ if (TEST_HARD_REG_BIT (reg_class_contents[(int)MMX_REGS], i)) \ - fixed_regs[i] = call_used_regs[i] = 1; \ + fixed_regs[i] = call_used_regs[i] = 1, reg_names[i] = ""; \ } \ if (! TARGET_SSE) \ { \ int i; \ for (i = 0; i < FIRST_PSEUDO_REGISTER; i++) \ if (TEST_HARD_REG_BIT (reg_class_contents[(int)SSE_REGS], i)) \ - fixed_regs[i] = call_used_regs[i] = 1; \ + fixed_regs[i] = call_used_regs[i] = 1, reg_names[i] = ""; \ } \ if (! TARGET_80387 && ! TARGET_FLOAT_RETURNS_IN_80387) \ { \ @@ -1058,7 +1058,15 @@ do { \ COPY_HARD_REG_SET (x, reg_class_contents[(int)FLOAT_REGS]); \ for (i = 0; i < FIRST_PSEUDO_REGISTER; i++) \ if (TEST_HARD_REG_BIT (x, i)) \ - fixed_regs[i] = call_used_regs[i] = 1; \ + fixed_regs[i] = call_used_regs[i] = 1, reg_names[i] = ""; \ + } \ + if (! TARGET_64BIT) \ + { \ + int i; \ + for (i = FIRST_REX_INT_REG; i <= LAST_REX_INT_REG; i++) \ + reg_names[i] = ""; \ + for (i = FIRST_REX_SSE_REG; i <= LAST_REX_SSE_REG; i++) \ + reg_names[i] = ""; \ } \ } while (0) Index: gcc/testsuite/ChangeLog from Alexandre Oliva <[EMAIL PROTECTED]> PR target/16888 * gcc.target/i386/asm-1.c: New test. Index: gcc/testsuite/gcc.target/i386/asm-1.c =================================================================== RCS file: gcc/testsuite/gcc.target/i386/asm-1.c diff -N gcc/testsuite/gcc.target/i386/asm-1.c --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ gcc/testsuite/gcc.target/i386/asm-1.c 19 Apr 2005 06:03:15 -0000 @@ -0,0 +1,9 @@ +/* { dg-do compile } */ +/* { dg-options "-m32" } */ + +register unsigned int EAX asm ("r14"); /* { dg-error "register name" } */ + +void foo () +{ + EAX = 0; +} -- Alexandre Oliva http://www.ic.unicamp.br/~oliva/ Red Hat Compiler Engineer [EMAIL PROTECTED], gcc.gnu.org} Free Software Evangelist [EMAIL PROTECTED], gnu.org} -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=16888