From eaab88a4a2b64f5fa2d7f044fa5674a3e574a4b0 Mon Sep 17 00:00:00 2001 From: pbrook Date: Mon, 23 Nov 2009 13:03:28 +0000 Subject: [PATCH] 2009-11-23 Paul Brook 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 --- gcc/ChangeLog | 6 ++++++ gcc/config/arm/arm.c | 19 ++++++++++++++----- 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 + + * 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 * 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. -- 2.7.4