diff options
author | Richard Earnshaw <rearnsha@arm.com> | 2005-08-19 13:17:04 +0000 |
---|---|---|
committer | Richard Earnshaw <rearnsha@gcc.gnu.org> | 2005-08-19 13:17:04 +0000 |
commit | e55ef7f426bab0863601f5f0d3e7a98e87806c5d (patch) | |
tree | 6d93288ece79dc62ab28b5ac2c91b572a34ccea3 /gcc | |
parent | d102596bf803dd5da4c23aea81345dac84e8925a (diff) | |
download | gcc-e55ef7f426bab0863601f5f0d3e7a98e87806c5d.zip gcc-e55ef7f426bab0863601f5f0d3e7a98e87806c5d.tar.gz gcc-e55ef7f426bab0863601f5f0d3e7a98e87806c5d.tar.bz2 |
re PR target/23473 (ICE at config/arm/arm.c:3280)
PR target/23473
* arm.md (arm_load_pic_register): Change argument to the mask of
saved registers. Call thumb_find_work_register if we need a
scratch register on Thumb.
(arm_expand_prologue): Pass empty register set to
arm_load_pic_register.
(thumb_expand_prologue): Pass live_regs_mask directly to
arm_load_pic_register.
* arm-protos.h (arm_load_pic_register): Update prototype.
From-SVN: r103277
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 12 | ||||
-rw-r--r-- | gcc/config/arm/arm-protos.h | 2 | ||||
-rw-r--r-- | gcc/config/arm/arm.c | 11 |
3 files changed, 19 insertions, 6 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index bafacaf..d325007 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,15 @@ +2005-08-19 Richard Earnshaw <richard.earnshaw@arm.com> + + PR target/23473 + * arm.md (arm_load_pic_register): Change argument to the mask of + saved registers. Call thumb_find_work_register if we need a + scratch register on Thumb. + (arm_expand_prologue): Pass empty register set to + arm_load_pic_register. + (thumb_expand_prologue): Pass live_regs_mask directly to + arm_load_pic_register. + * arm-protos.h (arm_load_pic_register): Update prototype. + 2005-08-19 J"orn Rennecke <joern.rennecke@st.com> * sh.c (find_sole_member): New function. diff --git a/gcc/config/arm/arm-protos.h b/gcc/config/arm/arm-protos.h index cb34f3b..c7ec642 100644 --- a/gcc/config/arm/arm-protos.h +++ b/gcc/config/arm/arm-protos.h @@ -27,7 +27,7 @@ extern void arm_override_options (void); extern int use_return_insn (int, rtx); extern int arm_regno_class (int); -extern void arm_load_pic_register (unsigned int); +extern void arm_load_pic_register (unsigned long); extern int arm_volatile_func (void); extern const char *arm_output_epilogue (rtx); extern void arm_expand_prologue (void); diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c index 9534a91..0235c53 100644 --- a/gcc/config/arm/arm.c +++ b/gcc/config/arm/arm.c @@ -3285,7 +3285,7 @@ thumb_find_work_register (unsigned long pushed_regs_mask) low register. */ void -arm_load_pic_register (unsigned int scratch) +arm_load_pic_register (unsigned long saved_regs ATTRIBUTE_UNUSED) { #ifndef AOF_ASSEMBLER rtx l1, pic_tmp, pic_tmp2, pic_rtx; @@ -3319,9 +3319,10 @@ arm_load_pic_register (unsigned int scratch) { if (REGNO (pic_offset_table_rtx) > LAST_LO_REGNUM) { - /* We will have pushed the pic register, so should always be + /* We will have pushed the pic register, so we should always be able to find a work register. */ - pic_tmp = gen_rtx_REG (SImode, scratch); + pic_tmp = gen_rtx_REG (SImode, + thumb_find_work_register (saved_regs)); emit_insn (gen_pic_load_addr_thumb (pic_tmp, pic_rtx)); emit_insn (gen_movsi (pic_offset_table_rtx, pic_tmp)); } @@ -10509,7 +10510,7 @@ arm_expand_prologue (void) if (flag_pic) - arm_load_pic_register (INVALID_REGNUM); + arm_load_pic_register (0UL); /* If we are profiling, make sure no instructions are scheduled before the call to mcount. Similarly if the user has requested no @@ -13236,7 +13237,7 @@ thumb_expand_prologue (void) /* Load the pic register before setting the frame pointer, so we can use r7 as a temporary work register. */ if (flag_pic) - arm_load_pic_register (thumb_find_work_register (live_regs_mask)); + arm_load_pic_register (live_regs_mask); offsets = arm_get_frame_offsets (); |