aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Earnshaw <rearnsha@arm.com>2005-08-19 13:17:04 +0000
committerRichard Earnshaw <rearnsha@gcc.gnu.org>2005-08-19 13:17:04 +0000
commite55ef7f426bab0863601f5f0d3e7a98e87806c5d (patch)
tree6d93288ece79dc62ab28b5ac2c91b572a34ccea3 /gcc
parentd102596bf803dd5da4c23aea81345dac84e8925a (diff)
downloadgcc-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/ChangeLog12
-rw-r--r--gcc/config/arm/arm-protos.h2
-rw-r--r--gcc/config/arm/arm.c11
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 ();