From d70e94ecbaa4ca9cc492babb0ee326cafe09e2bc Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Fri, 3 May 2002 16:20:04 +0200 Subject: [PATCH] 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 --- gcc/ChangeLog | 8 ++++++++ gcc/config/sparc/sparc.c | 2 +- gcc/config/sparc/sparc.h | 6 +++++- gcc/testsuite/ChangeLog | 4 ++++ gcc/testsuite/gcc.dg/20020503-1.c | 12 ++++++++++++ 5 files changed, 30 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/20020503-1.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index a3dd64ff780..132164c7adb 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2002-05-03 Jakub Jelinek + + 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 * config/h8300/crti.asm: Remove trailing spaces. diff --git a/gcc/config/sparc/sparc.c b/gcc/config/sparc/sparc.c index 0bac7c9afc9..30b6e8992da 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 d70f5428971..f582b6a45ed 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 3c7df3a8583..1a533f3753f 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2002-05-03 Jakub Jelinek + + * gcc.dg/20020503-1.c: New test. + 2002-05-02 Mark Mitchell * 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 00000000000..5f9168eb67d --- /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) +{ +} -- 2.30.2