diff options
author | Eric Botcazou <ebotcazou@adacore.com> | 2018-12-08 11:07:53 +0000 |
---|---|---|
committer | Eric Botcazou <ebotcazou@gcc.gnu.org> | 2018-12-08 11:07:53 +0000 |
commit | dfe1fe91dbc7f068bb3efcee40237caacc0c53ae (patch) | |
tree | d9c0f861ed8e80b9ab7a6935fb0f36e8b0817472 /gcc/dwarf2cfi.c | |
parent | 0a6ac1b2894303138d74e82935cda17010e2763e (diff) | |
download | gcc-dfe1fe91dbc7f068bb3efcee40237caacc0c53ae.zip gcc-dfe1fe91dbc7f068bb3efcee40237caacc0c53ae.tar.gz gcc-dfe1fe91dbc7f068bb3efcee40237caacc0c53ae.tar.bz2 |
re PR rtl-optimization/88390 (g++.dg/tree-prof/pr57451.C FAILs)
PR rtl-optimization/88390
* dwarf2cfi.c (struct dw_cfi_row): Add window_save field.
(cfi_row_equal_p): Compare it.
(dwarf2out_frame_debug_cfa_window_save): Add FAKE parameter.
If FAKE is false, set window_save of the current row.
(dwarf2out_frame_debug) <REG_CFA_TOGGLE_RA_MANGLE>: Call above
function with FAKE parameter set to true.
<REG_CFA_WINDOW_SAVE>: Likewise but with FAKE parameter set to false.
(change_cfi_row): Emit a DW_CFA_GNU_window_save if necessary.
From-SVN: r266906
Diffstat (limited to 'gcc/dwarf2cfi.c')
-rw-r--r-- | gcc/dwarf2cfi.c | 32 |
1 files changed, 27 insertions, 5 deletions
diff --git a/gcc/dwarf2cfi.c b/gcc/dwarf2cfi.c index 162d9f6..44dd76d 100644 --- a/gcc/dwarf2cfi.c +++ b/gcc/dwarf2cfi.c @@ -68,6 +68,9 @@ struct GTY(()) dw_cfi_row /* The expressions for any register column that is saved. */ cfi_vec reg_save; + + /* True if the register window is saved. */ + bool window_save; }; /* The caller's ORIG_REG is saved in SAVED_IN_REG. */ @@ -766,6 +769,9 @@ cfi_row_equal_p (dw_cfi_row *a, dw_cfi_row *b) return false; } + if (a->window_save != b->window_save) + return false; + return true; } @@ -1364,16 +1370,20 @@ dwarf2out_frame_debug_cfa_restore (rtx reg) } /* A subroutine of dwarf2out_frame_debug, process a REG_CFA_WINDOW_SAVE. - ??? Perhaps we should note in the CIE where windows are saved (instead of - assuming 0(cfa)) and what registers are in the window. */ + FAKE is true if this is not really a window save but something else. + + ??? Perhaps we should note in the CIE where windows are saved (instead + of assuming 0(cfa)) and what registers are in the window. */ static void -dwarf2out_frame_debug_cfa_window_save (void) +dwarf2out_frame_debug_cfa_window_save (bool fake) { dw_cfi_ref cfi = new_cfi (); cfi->dw_cfi_opc = DW_CFA_GNU_window_save; add_cfi (cfi); + if (!fake) + cur_row->window_save = true; } /* Record call frame debugging information for an expression EXPR, @@ -2133,9 +2143,13 @@ dwarf2out_frame_debug (rtx_insn *insn) break; case REG_CFA_TOGGLE_RA_MANGLE: + /* This uses the same DWARF opcode as the next operation. */ + dwarf2out_frame_debug_cfa_window_save (true); + handled_one = true; + break; + case REG_CFA_WINDOW_SAVE: - /* We overload both of these operations onto the same DWARF opcode. */ - dwarf2out_frame_debug_cfa_window_save (); + dwarf2out_frame_debug_cfa_window_save (false); handled_one = true; break; @@ -2199,6 +2213,14 @@ change_cfi_row (dw_cfi_row *old_row, dw_cfi_row *new_row) else if (!cfi_equal_p (r_old, r_new)) add_cfi (r_new); } + + if (!old_row->window_save && new_row->window_save) + { + dw_cfi_ref cfi = new_cfi (); + + cfi->dw_cfi_opc = DW_CFA_GNU_window_save; + add_cfi (cfi); + } } /* Examine CFI and return true if a cfi label and set_loc is needed |