aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2009-06-09 00:39:32 +0200
committerJakub Jelinek <jakub@gcc.gnu.org>2009-06-09 00:39:32 +0200
commit8845deabba0fa4aec0200e4ed310bf6b489ed1fc (patch)
tree7ac5e85a40154bc7de7adf18a3e5ce6751d8c9c9
parentd7f26adfaf11f7a0158a649980840e29c0e4d853 (diff)
downloadgcc-8845deabba0fa4aec0200e4ed310bf6b489ed1fc.zip
gcc-8845deabba0fa4aec0200e4ed310bf6b489ed1fc.tar.gz
gcc-8845deabba0fa4aec0200e4ed310bf6b489ed1fc.tar.bz2
dwarf2out.c (emit_cfa_remember): New variable.
* dwarf2out.c (emit_cfa_remember): New variable. (add_fde_cfi): If emit_cfa_remember, recurse to add DW_CFA_remember_state first. (dwarf2out_begin_epilogue): Don't add_fde_cfi DW_CFA_remember_state, instead just set emit_cfa_remember. From-SVN: r148298
-rw-r--r--gcc/ChangeLog8
-rw-r--r--gcc/dwarf2out.c24
2 files changed, 26 insertions, 6 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 940e757..8c3c6f3 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,11 @@
+2009-06-08 Jakub Jelinek <jakub@redhat.com>
+
+ * dwarf2out.c (emit_cfa_remember): New variable.
+ (add_fde_cfi): If emit_cfa_remember, recurse to add
+ DW_CFA_remember_state first.
+ (dwarf2out_begin_epilogue): Don't add_fde_cfi DW_CFA_remember_state,
+ instead just set emit_cfa_remember.
+
2009-06-08 Jan Hubicka <jh@suse.cz>
PR debug/40126
diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c
index dc82799..2483a7b 100644
--- a/gcc/dwarf2out.c
+++ b/gcc/dwarf2out.c
@@ -717,13 +717,29 @@ dwarf2out_cfi_label (bool force)
return label;
}
+/* True if remember_state should be emitted before following CFI directive. */
+static bool emit_cfa_remember;
+
/* Add CFI to the current fde at the PC value indicated by LABEL if specified,
or to the CIE if LABEL is NULL. */
static void
add_fde_cfi (const char *label, dw_cfi_ref cfi)
{
- dw_cfi_ref *list_head = &cie_cfi_head;
+ dw_cfi_ref *list_head;
+
+ if (emit_cfa_remember)
+ {
+ dw_cfi_ref cfi_remember;
+
+ /* Emit the state save. */
+ emit_cfa_remember = false;
+ cfi_remember = new_cfi ();
+ cfi_remember->dw_cfi_opc = DW_CFA_remember_state;
+ add_fde_cfi (label, cfi_remember);
+ }
+
+ list_head = &cie_cfi_head;
if (dwarf2out_do_cfi_asm ())
{
@@ -2709,7 +2725,6 @@ dwarf2out_begin_epilogue (rtx insn)
{
bool saw_frp = false;
rtx i;
- dw_cfi_ref cfi;
/* Scan forward to the return insn, noticing if there are possible
frame related insns. */
@@ -2755,10 +2770,7 @@ dwarf2out_begin_epilogue (rtx insn)
}
emit_note_before (NOTE_INSN_CFA_RESTORE_STATE, i);
- /* Emit the state save. */
- cfi = new_cfi ();
- cfi->dw_cfi_opc = DW_CFA_remember_state;
- add_fde_cfi (dwarf2out_cfi_label (false), cfi);
+ emit_cfa_remember = true;
/* And emulate the state save. */
gcc_assert (!cfa_remember.in_use);