diff options
author | H.J. Lu <hongjiu.lu@intel.com> | 2008-07-08 13:35:36 +0000 |
---|---|---|
committer | H.J. Lu <hongjiu.lu@intel.com> | 2008-07-08 13:35:36 +0000 |
commit | 71c6e8f180e19056dbf0685e49fcc7b0b69337c7 (patch) | |
tree | ff33dba33ecee5493de273c2d6381c2596e2eb9c | |
parent | 1998007d52e3696c26ecf2b4bad4e4da51cbf4b6 (diff) |
2008-07-08 H.J. Lu <hongjiu.lu@intel.com>
Xuepeng Guo <xuepeng.guo@intel.com>
* dwarf2out.c (dw_fde_node): Add drap_reg_saved.
(dwarf2out_frame_debug_expr): Update rule 16 to set drap_reg,
update rules 19 and 20.
git-svn-id: https://gcc.gnu.org/svn/gcc/branches/stack@137621 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r-- | gcc/ChangeLog.stackalign | 7 | ||||
-rw-r--r-- | gcc/dwarf2out.c | 43 |
2 files changed, 26 insertions, 24 deletions
diff --git a/gcc/ChangeLog.stackalign b/gcc/ChangeLog.stackalign index 0a517e53b41..8a0a9112a1e 100644 --- a/gcc/ChangeLog.stackalign +++ b/gcc/ChangeLog.stackalign @@ -1,3 +1,10 @@ +2008-07-08 H.J. Lu <hongjiu.lu@intel.com> + Xuepeng Guo <xuepeng.guo@intel.com> + + * dwarf2out.c (dw_fde_node): Add drap_reg_saved. + (dwarf2out_frame_debug_expr): Update rule 16 to set drap_reg, + update rules 19 and 20. + 2008-07-07 H.J. Lu <hongjiu.lu@intel.com> * dwarf2out.c (add_cfi): Don't allow redefine CFA when CFA is diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c index 956f7acc6e7..78e2117aaa8 100644 --- a/gcc/dwarf2out.c +++ b/gcc/dwarf2out.c @@ -249,6 +249,8 @@ typedef struct dw_fde_struct GTY(()) unsigned uses_eh_lsda : 1; /* Whether we did stack realign in this call frame. */ unsigned stack_realign : 1; + /* Whether dynamic realign argument pointer register has been saved. */ + unsigned drap_reg_saved: 1; } dw_fde_node; @@ -1588,6 +1590,7 @@ static dw_cfa_location cfa_temp; constraints: cfa_store.reg == sp effects: current_fde.stack_realign = 1 cfa_store.offset = 0 + fde->drap_reg = cfa.reg if cfa.reg != sp and cfa.reg != fp Rule 17: (set (mem ({pre_inc, pre_dec} sp)) (mem (plus (cfa.reg) (const_int)))) @@ -1606,21 +1609,14 @@ static dw_cfa_location cfa_temp; && cfa.indirect == 0 && cfa.reg != HARD_FRAME_POINTER_REGNUM effects: Use DW_CFA_def_cfa_expression to define cfa - fde->drap_reg = cfa.reg + cfa.reg == fde->drap_reg Rule 20: - Special case for set (vdrap drap) - (set reg cfa.reg}) - constraints: fde->stack_realign == 1 - && cfa.offset == 0 - && cfa.indirect == 0 - && cfa.reg != HARD_FRAME_POINTER_REGNUM - effects: fde->vdrap_reg = reg - (set reg drap_reg) - constraints: fde->stack_realign == 1 + (set reg fde->drap_reg) + constraints: fde->vdrap_reg == INVALID_REGNUM effects: fde->vdrap_reg = reg. - (set mem drap_reg) - constraints: fde->stack_realign == 1 + (set mem fde->drap_reg) + constraints: fde->drap_reg_saved == 1 effects: none. */ static void @@ -1683,14 +1679,9 @@ dwarf2out_frame_debug_expr (rtx expr, const char *label) if (GET_CODE (src) == REG && fde - && fde->stack_realign - && ((fde->drap_reg != INVALID_REGNUM - && fde->drap_reg == REGNO (src)) - || (GET_CODE (dest) == REG - && cfa.offset == 0 - && cfa.indirect == 0 - && cfa.reg != HARD_FRAME_POINTER_REGNUM - && cfa.reg == (unsigned) REGNO (src)))) + && fde->drap_reg == REGNO (src) + && (fde->drap_reg_saved + || GET_CODE (dest) == REG)) { /* Rule 20 */ /* If we are saving dynamic realign argument pointer to a @@ -1741,9 +1732,7 @@ dwarf2out_frame_debug_expr (rtx expr, const char *label) && fde->stack_realign && REGNO (src) == STACK_POINTER_REGNUM) gcc_assert (REGNO (dest) == HARD_FRAME_POINTER_REGNUM - && (fde->drap_reg != INVALID_REGNUM - || (cfa.indirect == 0 - && cfa.reg != REGNO (dest))) + && fde->drap_reg != INVALID_REGNUM && cfa.reg != REGNO (src)); else queue_reg_save (label, src, dest, 0); @@ -1890,6 +1879,10 @@ dwarf2out_frame_debug_expr (rtx expr, const char *label) fde->stack_realign = 1; fde->stack_realignment = INTVAL (XEXP (src, 1)); cfa_store.offset = 0; + + if (cfa.reg != STACK_POINTER_REGNUM + && cfa.reg != HARD_FRAME_POINTER_REGNUM) + fde->drap_reg = cfa.reg; } return; @@ -2029,12 +2022,14 @@ dwarf2out_frame_debug_expr (rtx expr, const char *label) { dw_cfa_location cfa_exp; + gcc_assert (fde->drap_reg == cfa.reg); + cfa_exp.indirect = 1; cfa_exp.reg = HARD_FRAME_POINTER_REGNUM; cfa_exp.base_offset = offset; cfa_exp.offset = 0; - fde->drap_reg = cfa.reg; + fde->drap_reg_saved = 1; def_cfa_1 (label, &cfa_exp); break; |