diff options
author | Jakub Jelinek <jakub@redhat.com> | 2002-05-03 16:20:04 +0200 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2002-05-03 16:20:04 +0200 |
commit | d70e94ecbaa4ca9cc492babb0ee326cafe09e2bc (patch) | |
tree | 17fa126e5a39a24f2426b0c2746069acbf6d7f70 | |
parent | b70d6d4b66a1236ec5a904741abb2a0d0ce3922d (diff) | |
download | gcc-d70e94ecbaa4ca9cc492babb0ee326cafe09e2bc.zip gcc-d70e94ecbaa4ca9cc492babb0ee326cafe09e2bc.tar.gz gcc-d70e94ecbaa4ca9cc492babb0ee326cafe09e2bc.tar.bz2 |
re PR target/6542 (Internal compiler error when building libgcc for sparc-elf)
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
-rw-r--r-- | gcc/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/config/sparc/sparc.c | 2 | ||||
-rw-r--r-- | gcc/config/sparc/sparc.h | 6 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/20020503-1.c | 12 |
5 files changed, 30 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index a3dd64f..132164c 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -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. diff --git a/gcc/config/sparc/sparc.c b/gcc/config/sparc/sparc.c index 0bac7c9..30b6e89 100644 --- a/gcc/config/sparc/sparc.c +++ b/gcc/config/sparc/sparc.c @@ -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, diff --git a/gcc/config/sparc/sparc.h b/gcc/config/sparc/sparc.h index d70f542..f582b6a 100644 --- a/gcc/config/sparc/sparc.h +++ b/gcc/config/sparc/sparc.h @@ -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. */ diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 3c7df3a..1a533f3 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -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 index 0000000..5f9168e --- /dev/null +++ b/gcc/testsuite/gcc.dg/20020503-1.c @@ -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) +{ +} |