------- 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

Reply via email to