aboutsummaryrefslogtreecommitdiff
path: root/gcc/dwarf2cfi.c
diff options
context:
space:
mode:
authorEric Botcazou <ebotcazou@adacore.com>2018-12-08 11:07:53 +0000
committerEric Botcazou <ebotcazou@gcc.gnu.org>2018-12-08 11:07:53 +0000
commitdfe1fe91dbc7f068bb3efcee40237caacc0c53ae (patch)
treed9c0f861ed8e80b9ab7a6935fb0f36e8b0817472 /gcc/dwarf2cfi.c
parent0a6ac1b2894303138d74e82935cda17010e2763e (diff)
downloadgcc-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.c32
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