diff options
author | ebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4> | 2013-12-18 10:34:00 +0000 |
---|---|---|
committer | ebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4> | 2013-12-18 10:34:00 +0000 |
commit | fad67b809178902d4297c954ee244fd43a50ef33 (patch) | |
tree | 7f3383d6e4eab7aaaa10969fbe0b55e3dbbc85f1 /gcc/dwarf2cfi.c | |
parent | c2b38fc8ca1cdd3cbbed478e02b49a7431df8612 (diff) | |
download | gcc-fad67b809178902d4297c954ee244fd43a50ef33.tar.gz |
PR debug/59418
* dwarf2cfi.c (dwarf2out_frame_debug_cfa_offset): Fix comment and tidy.
(dwarf2out_frame_debug_cfa_restore): Handle TARGET_DWARF_REGISTER_SPAN.
(dwarf2out_frame_debug_expr): Tidy.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@206084 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/dwarf2cfi.c')
-rw-r--r-- | gcc/dwarf2cfi.c | 46 |
1 files changed, 32 insertions, 14 deletions
diff --git a/gcc/dwarf2cfi.c b/gcc/dwarf2cfi.c index 330836b66e8..77152990ea5 100644 --- a/gcc/dwarf2cfi.c +++ b/gcc/dwarf2cfi.c @@ -1149,18 +1149,15 @@ dwarf2out_frame_debug_cfa_offset (rtx set) else { /* We have a PARALLEL describing where the contents of SRC live. - Queue register saves for each piece of the PARALLEL. */ - int par_index; - int limit; + Adjust the offset for each piece of the PARALLEL. */ HOST_WIDE_INT span_offset = offset; gcc_assert (GET_CODE (span) == PARALLEL); - limit = XVECLEN (span, 0); - for (par_index = 0; par_index < limit; par_index++) + const int par_len = XVECLEN (span, 0); + for (int par_index = 0; par_index < par_len; par_index++) { rtx elem = XVECEXP (span, 0, par_index); - sregno = dwf_regno (src); reg_save (sregno, INVALID_REGNUM, span_offset); span_offset += GET_MODE_SIZE (GET_MODE (elem)); @@ -1229,10 +1226,31 @@ dwarf2out_frame_debug_cfa_expression (rtx set) static void dwarf2out_frame_debug_cfa_restore (rtx reg) { - unsigned int regno = dwf_regno (reg); + gcc_assert (REG_P (reg)); + + rtx span = targetm.dwarf_register_span (reg); + if (!span) + { + unsigned int regno = dwf_regno (reg); + add_cfi_restore (regno); + update_row_reg_save (cur_row, regno, NULL); + } + else + { + /* We have a PARALLEL describing where the contents of REG live. + Restore the register for each piece of the PARALLEL. */ + gcc_assert (GET_CODE (span) == PARALLEL); - add_cfi_restore (regno); - update_row_reg_save (cur_row, regno, NULL); + const int par_len = XVECLEN (span, 0); + for (int par_index = 0; par_index < par_len; par_index++) + { + reg = XVECEXP (span, 0, par_index); + gcc_assert (REG_P (reg)); + unsigned int regno = dwf_regno (reg); + add_cfi_restore (regno); + update_row_reg_save (cur_row, regno, NULL); + } + } } /* A subroutine of dwarf2out_frame_debug, process a REG_CFA_WINDOW_SAVE. @@ -1884,23 +1902,23 @@ dwarf2out_frame_debug_expr (rtx expr) } } - span = NULL; if (REG_P (src)) span = targetm.dwarf_register_span (src); + else + span = NULL; + if (!span) queue_reg_save (src, NULL_RTX, offset); else { /* We have a PARALLEL describing where the contents of SRC live. Queue register saves for each piece of the PARALLEL. */ - int par_index; - int limit; HOST_WIDE_INT span_offset = offset; gcc_assert (GET_CODE (span) == PARALLEL); - limit = XVECLEN (span, 0); - for (par_index = 0; par_index < limit; par_index++) + const int par_len = XVECLEN (span, 0); + for (int par_index = 0; par_index < par_len; par_index++) { rtx elem = XVECEXP (span, 0, par_index); queue_reg_save (elem, NULL_RTX, span_offset); |