aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorPaul Brook <paul@codesourcery.com>2009-11-23 13:03:28 +0000
committerPaul Brook <pbrook@gcc.gnu.org>2009-11-23 13:03:28 +0000
commit1586899ee9f8a3e2f82f35f847f2802593c71838 (patch)
treeff0097e05572eca7d35fda88ff4b417535007168 /gcc
parent0230277c253fc21548b8f50caa1d09f70e67e4ca (diff)
downloadgcc-1586899ee9f8a3e2f82f35f847f2802593c71838.zip
gcc-1586899ee9f8a3e2f82f35f847f2802593c71838.tar.gz
gcc-1586899ee9f8a3e2f82f35f847f2802593c71838.tar.bz2
arm.c (arm_compute_save_reg0_reg12_mask): Add special case for noreturn functions.
2009-11-23 Paul Brook <paul@codesourcery.com> gcc/ * config/arm/arm.c (arm_compute_save_reg0_reg12_mask): Add special case for noreturn functions. (arm_compute_save_reg_mask): Remove special noreturn handling. From-SVN: r154441
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/config/arm/arm.c19
2 files changed, 20 insertions, 5 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index a00e858..0fffc28 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2009-11-23 Paul Brook <paul@codesourcery.com>
+
+ * config/arm/arm.c (arm_compute_save_reg0_reg12_mask): Add special
+ case for noreturn functions.
+ (arm_compute_save_reg_mask): Remove special noreturn handling.
+
2009-11-23 Richard Guenther <rguenther@suse.de>
* tree-dfa.c (get_ref_base_and_extent): Adjust maximum access
diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c
index 3a94745..289f27a 100644
--- a/gcc/config/arm/arm.c
+++ b/gcc/config/arm/arm.c
@@ -12831,6 +12831,20 @@ arm_compute_save_reg0_reg12_mask (void)
&& crtl->uses_pic_offset_table)
save_reg_mask |= 1 << PIC_OFFSET_TABLE_REGNUM;
}
+ else if (IS_VOLATILE(func_type))
+ {
+ /* For noreturn functions we historically omitted register saves
+ altogether. However this really messes up debugging. As a
+ compromise save just the fame pointers. Combined with the link
+ register saved elsewhere this should be sufficient to get
+ a backtrace. */
+ if (frame_pointer_needed)
+ save_reg_mask |= 1 << HARD_FRAME_POINTER_REGNUM;
+ if (df_regs_ever_live_p (ARM_HARD_FRAME_POINTER_REGNUM))
+ save_reg_mask |= 1 << ARM_HARD_FRAME_POINTER_REGNUM;
+ if (df_regs_ever_live_p (THUMB_HARD_FRAME_POINTER_REGNUM))
+ save_reg_mask |= 1 << THUMB_HARD_FRAME_POINTER_REGNUM;
+ }
else
{
/* In the normal case we only need to save those registers
@@ -12917,11 +12931,6 @@ arm_compute_save_reg_mask (void)
| (1 << LR_REGNUM)
| (1 << PC_REGNUM);
- /* Volatile functions do not return, so there
- is no need to save any other registers. */
- if (IS_VOLATILE (func_type))
- return save_reg_mask;
-
save_reg_mask |= arm_compute_save_reg0_reg12_mask ();
/* Decide if we need to save the link register.