summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorpbrook <pbrook@138bc75d-0d04-0410-961f-82ee72b054a4>2009-11-23 13:03:28 +0000
committerpbrook <pbrook@138bc75d-0d04-0410-961f-82ee72b054a4>2009-11-23 13:03:28 +0000
commiteaab88a4a2b64f5fa2d7f044fa5674a3e574a4b0 (patch)
treeff0097e05572eca7d35fda88ff4b417535007168
parent664e30ce643a9fa5d9b88b6058246d02047ba41b (diff)
downloadgcc-eaab88a4a2b64f5fa2d7f044fa5674a3e574a4b0.tar.gz
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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@154441 138bc75d-0d04-0410-961f-82ee72b054a4
-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 a00e858faeb..0fffc2800b3 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 3a9474535ea..289f27a5226 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.