diff options
author | Richard Henderson <rth@redhat.com> | 2011-06-30 14:01:06 -0700 |
---|---|---|
committer | Richard Henderson <rth@gcc.gnu.org> | 2011-06-30 14:01:06 -0700 |
commit | c8412f9770056dff19e3470901193784c7764bcf (patch) | |
tree | e2d816caf52f423e1a89df03668b0ba0125a7f82 | |
parent | e3f903d88a6edd374d375575fa9c305868f61071 (diff) | |
download | gcc-c8412f9770056dff19e3470901193784c7764bcf.zip gcc-c8412f9770056dff19e3470901193784c7764bcf.tar.gz gcc-c8412f9770056dff19e3470901193784c7764bcf.tar.bz2 |
dwarf2out: Handle pc_rtx as return column in REG_CFA_OFFSET too.
* dwarf2out.c (dwarf2out_frame_debug_cfa_offset): Allow PC_RTX
as a source, and interpret that as DWARF_FRAME_RETURN_COLUMN.
From-SVN: r175728
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/dwarf2out.c | 18 |
2 files changed, 19 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 277fc9e..2358289 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,10 @@ 2011-06-30 Richard Henderson <rth@redhat.com> + * dwarf2out.c (dwarf2out_frame_debug_cfa_offset): Allow PC_RTX + as a source, and interpret that as DWARF_FRAME_RETURN_COLUMN. + +2011-06-30 Richard Henderson <rth@redhat.com> + * dwarf2out.c (struct reg_saved_in_data): Provide a typedef. Define a vector of this type. (regs_saved_in_regs): Use a VEC. diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c index 8aa2eb2..8e54391 100644 --- a/gcc/dwarf2out.c +++ b/gcc/dwarf2out.c @@ -1982,6 +1982,7 @@ dwarf2out_frame_debug_cfa_offset (rtx set, const char *label) { HOST_WIDE_INT offset; rtx src, addr, span; + unsigned int sregno; src = XEXP (set, 1); addr = XEXP (set, 0); @@ -2003,12 +2004,21 @@ dwarf2out_frame_debug_cfa_offset (rtx set, const char *label) gcc_unreachable (); } - span = targetm.dwarf_register_span (src); + if (src == pc_rtx) + { + span = NULL; + sregno = DWARF_FRAME_RETURN_COLUMN; + } + else + { + span = targetm.dwarf_register_span (src); + sregno = DWARF_FRAME_REGNUM (REGNO (src)); + } /* ??? We'd like to use queue_reg_save, but we need to come up with a different flushing heuristic for epilogues. */ if (!span) - reg_save (label, DWARF_FRAME_REGNUM (REGNO (src)), INVALID_REGNUM, offset); + reg_save (label, sregno, INVALID_REGNUM, offset); else { /* We have a PARALLEL describing where the contents of SRC live. @@ -2024,8 +2034,8 @@ dwarf2out_frame_debug_cfa_offset (rtx set, const char *label) { rtx elem = XVECEXP (span, 0, par_index); - reg_save (label, DWARF_FRAME_REGNUM (REGNO (elem)), - INVALID_REGNUM, span_offset); + sregno = DWARF_FRAME_REGNUM (REGNO (src)); + reg_save (label, sregno, INVALID_REGNUM, span_offset); span_offset += GET_MODE_SIZE (GET_MODE (elem)); } } |