re PR target/6542 (Internal compiler error when building libgcc for sparc-elf)
authorJakub Jelinek <jakub@redhat.com>
Fri, 3 May 2002 14:20:04 +0000 (16:20 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Fri, 3 May 2002 14:20:04 +0000 (16:20 +0200)
PR target/6542
* config/sparc/sparc.h (leaf_reg_remap): Remove const.
(CONDITIONAL_REGISTER_USAGE): For TARGET_FLAT make
fill leaf_reg_remap with identity.
* config/sparc/sparc.c (leaf_reg_remap): Remove const.

* gcc.dg/20020503-1.c: New test.

From-SVN: r53095

gcc/ChangeLog
gcc/config/sparc/sparc.c
gcc/config/sparc/sparc.h
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/20020503-1.c [new file with mode: 0644]

index a3dd64ff78026b7a072eed355c50cb0037c227dc..132164c7adb675604b740f5b279ea66fc4323c6e 100644 (file)
@@ -1,3 +1,11 @@
+2002-05-03  Jakub Jelinek  <jakub@redhat.com>
+
+       PR target/6542
+       * config/sparc/sparc.h (leaf_reg_remap): Remove const.
+       (CONDITIONAL_REGISTER_USAGE): For TARGET_FLAT make
+       fill leaf_reg_remap with identity.
+       * config/sparc/sparc.c (leaf_reg_remap): Remove const.
+
 2002-05-03  Kazu Hirata  <kazu@cs.umass.edu>
 
        * config/h8300/crti.asm: Remove trailing spaces.
index 0bac7c9afc96ef85e99eb62e1a3f75f18d3a1212..30b6e8992da13ba2687201dfefa8524589d8b973 100644 (file)
@@ -85,7 +85,7 @@ bool sparc_emitting_epilogue;
 /* Vector to say how input registers are mapped to output registers.
    HARD_FRAME_POINTER_REGNUM cannot be remapped by this function to
    eliminate it.  You must use -fomit-frame-pointer to get that.  */
-const char leaf_reg_remap[] =
+char leaf_reg_remap[] =
 { 0, 1, 2, 3, 4, 5, 6, 7,
   -1, -1, -1, -1, -1, -1, 14, -1,
   -1, -1, -1, -1, -1, -1, -1, -1,
index d70f5428971d9e8d9d19bfc60f818c860c95c172..f582b6a45ed3870205f788377c9fdf2223ee9e79 100644 (file)
@@ -1014,12 +1014,16 @@ do                                                              \
       fixed_regs[4] = 0;                                       \
     if (TARGET_FLAT)                                           \
       {                                                                \
+       int regno;                                              \
        /* Let the compiler believe the frame pointer is still  \
           %fp, but output it as %i7.  */                       \
        fixed_regs[31] = 1;                                     \
        reg_names[HARD_FRAME_POINTER_REGNUM] = "%i7";           \
        /* Disable leaf functions */                            \
        memset (sparc_leaf_regs, 0, FIRST_PSEUDO_REGISTER);     \
+       /* Make LEAF_REG_REMAP a noop.  */                      \
+       for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++) \
+         leaf_reg_remap [regno] = regno;                       \
       }                                                                \
   }                                                            \
 while (0)
@@ -1316,7 +1320,7 @@ extern enum reg_class sparc_regno_reg_class[FIRST_PSEUDO_REGISTER];
 extern char sparc_leaf_regs[];
 #define LEAF_REGISTERS sparc_leaf_regs
 
-extern const char leaf_reg_remap[];
+extern char leaf_reg_remap[];
 #define LEAF_REG_REMAP(REGNO) (leaf_reg_remap[REGNO])
 
 /* The class value for index registers, and the one for base regs.  */
index 3c7df3a8583d68cf0d1ffc819aaef3a3effd2e6a..1a533f3753f9f25fe59465580cfca7519ffb3c9a 100644 (file)
@@ -1,3 +1,7 @@
+2002-05-03  Jakub Jelinek  <jakub@redhat.com>
+
+       * gcc.dg/20020503-1.c: New test.
+
 2002-05-02  Mark Mitchell  <mark@codesourcery.com>
 
        * g++.dg/init/dtor1.C: Make it tougher.
diff --git a/gcc/testsuite/gcc.dg/20020503-1.c b/gcc/testsuite/gcc.dg/20020503-1.c
new file mode 100644 (file)
index 0000000..5f9168e
--- /dev/null
@@ -0,0 +1,12 @@
+/* PR target/6542
+   This testcase caused ICE on SPARC because the function uses no registers
+   after optimizing, so even if -mflat make all registers not permitted
+   for leaf functions, the function was still leaf, but LEAF_REG_REMAP
+   returned -1 for some registers (like %o0).  */
+/* { dg-do compile } */
+/* { do-options "-O2 -g" } */
+/* { do-options "-O2 -g -mflat" { target sparc*-*-* } } */
+
+void foo (char *a, char *b, char *c, char *d)
+{
+}