From patchwork Sat Jul 9 20:13:58 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Richard Henderson X-Patchwork-Id: 104020 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) by ozlabs.org (Postfix) with SMTP id D3FA41007D1 for ; Sun, 10 Jul 2011 06:14:58 +1000 (EST) Received: (qmail 919 invoked by alias); 9 Jul 2011 20:14:36 -0000 Received: (qmail 317 invoked by uid 22791); 9 Jul 2011 20:14:31 -0000 X-SWARE-Spam-Status: No, hits=-2.2 required=5.0 tests=AWL, BAYES_00, DKIM_SIGNED, DKIM_VALID, FREEMAIL_ENVFROM_END_DIGIT, FREEMAIL_FROM, RCVD_IN_DNSWL_LOW, T_TO_NO_BRKTS_FREEMAIL X-Spam-Check-By: sourceware.org Received: from mail-pv0-f175.google.com (HELO mail-pv0-f175.google.com) (74.125.83.175) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Sat, 09 Jul 2011 20:14:12 +0000 Received: by pvf24 with SMTP id 24so2011534pvf.20 for ; Sat, 09 Jul 2011 13:14:11 -0700 (PDT) Received: by 10.68.27.41 with SMTP id q9mr4418488pbg.337.1310242451306; Sat, 09 Jul 2011 13:14:11 -0700 (PDT) Received: from localhost.localdomain (c-71-227-161-214.hsd1.wa.comcast.net [71.227.161.214]) by mx.google.com with ESMTPS id c5sm2796524pbh.94.2011.07.09.13.14.10 (version=TLSv1/SSLv3 cipher=OTHER); Sat, 09 Jul 2011 13:14:10 -0700 (PDT) From: Richard Henderson To: gcc-patches@gcc.gnu.org Subject: [PATCH 2/6] dwarf2cfi: Unify add_fde_cfi and add_cie_cfi. Date: Sat, 9 Jul 2011 13:13:58 -0700 Message-Id: <1310242442-26123-3-git-send-email-rth@redhat.com> In-Reply-To: <1310242442-26123-1-git-send-email-rth@redhat.com> References: <1310242442-26123-1-git-send-email-rth@redhat.com> X-IsSubscribed: yes Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org --- gcc/dwarf2cfi.c | 82 ++++++++++++++++++++++++------------------------------- gcc/dwarf2out.c | 8 +++--- 2 files changed, 40 insertions(+), 50 deletions(-) diff --git a/gcc/dwarf2cfi.c b/gcc/dwarf2cfi.c index d96aa70..ca9b503 100644 --- a/gcc/dwarf2cfi.c +++ b/gcc/dwarf2cfi.c @@ -146,6 +146,9 @@ static GTY(()) unsigned long dwarf2out_cfi_label_num; /* The insn after which a new CFI note should be emitted. */ static rtx cfi_insn; +/* When non-null, add_cfi will add the CFI to this vector. */ +static cfi_vec *add_cfi_vec; + /* True if remember_state should be emitted before following CFI directive. */ static bool emit_cfa_remember; @@ -270,10 +273,10 @@ dwarf2out_cfi_label (void) return xstrdup (label); } -/* Add CFI to the current fde. */ +/* Add CFI either to the current insn stream or to a vector, or both. */ static void -add_fde_cfi (dw_cfi_ref cfi) +add_cfi (dw_cfi_ref cfi) { if (emit_cfa_remember) { @@ -283,7 +286,7 @@ add_fde_cfi (dw_cfi_ref cfi) emit_cfa_remember = false; cfi_remember = new_cfi (); cfi_remember->dw_cfi_opc = DW_CFA_remember_state; - add_fde_cfi (cfi_remember); + add_cfi (cfi_remember); } any_cfis_emitted = true; @@ -292,18 +295,8 @@ add_fde_cfi (dw_cfi_ref cfi) cfi_insn = emit_note_after (NOTE_INSN_CFI, cfi_insn); NOTE_CFI (cfi_insn) = cfi; } - else - { - dw_fde_ref fde = cfun->fde; - VEC_safe_push (dw_cfi_ref, gc, fde->dw_fde_cfi, cfi); - dwarf2out_emit_cfi (cfi); - } -} - -static void -add_cie_cfi (dw_cfi_ref cfi) -{ - VEC_safe_push (dw_cfi_ref, gc, cie_cfi_vec, cfi); + if (add_cfi_vec != NULL) + VEC_safe_push (dw_cfi_ref, gc, *add_cfi_vec, cfi); } /* This function fills in aa dw_cfa_location structure from a dwarf location @@ -512,7 +505,7 @@ cfa_equal_p (const dw_cfa_location *loc1, const dw_cfa_location *loc2) the dw_cfa_location structure. */ static void -def_cfa_1 (bool for_cie, dw_cfa_location *loc_p) +def_cfa_1 (dw_cfa_location *loc_p) { dw_cfi_ref cfi; dw_cfa_location loc; @@ -584,10 +577,7 @@ def_cfa_1 (bool for_cie, dw_cfa_location *loc_p) cfi->dw_cfi_oprnd1.dw_cfi_loc = loc_list; } - if (for_cie) - add_cie_cfi (cfi); - else - add_fde_cfi (cfi); + add_cfi (cfi); old_cfa = loc; } @@ -596,10 +586,9 @@ def_cfa_1 (bool for_cie, dw_cfa_location *loc_p) otherwise it is saved in SREG. */ static void -reg_save (bool for_cie, unsigned int reg, unsigned int sreg, - HOST_WIDE_INT offset) +reg_save (unsigned int reg, unsigned int sreg, HOST_WIDE_INT offset) { - dw_fde_ref fde = for_cie ? NULL : cfun->fde; + dw_fde_ref fde = cfun ? cfun->fde : NULL; dw_cfi_ref cfi = new_cfi (); cfi->dw_cfi_oprnd1.dw_cfi_reg_num = reg; @@ -632,10 +621,7 @@ reg_save (bool for_cie, unsigned int reg, unsigned int sreg, cfi->dw_cfi_oprnd2.dw_cfi_reg_num = sreg; } - if (for_cie) - add_cie_cfi (cfi); - else - add_fde_cfi (cfi); + add_cfi (cfi); } /* Record the initial position of the return address. RTL is @@ -693,7 +679,7 @@ initial_return_save (rtx rtl) } if (reg != DWARF_FRAME_RETURN_COLUMN) - reg_save (true, DWARF_FRAME_RETURN_COLUMN, reg, offset - cfa.offset); + reg_save (DWARF_FRAME_RETURN_COLUMN, reg, offset - cfa.offset); } /* Given a SET, calculate the amount of stack adjustment it @@ -975,7 +961,7 @@ dwarf2out_args_size (HOST_WIDE_INT size) cfi = new_cfi (); cfi->dw_cfi_opc = DW_CFA_GNU_args_size; cfi->dw_cfi_oprnd1.dw_cfi_offset = size; - add_fde_cfi (cfi); + add_cfi (cfi); } /* Record a stack adjustment of OFFSET bytes. */ @@ -1000,7 +986,7 @@ dwarf2out_stack_adjust (HOST_WIDE_INT offset) if (args_size < 0) args_size = 0; - def_cfa_1 (false, &cfa); + def_cfa_1 (&cfa); if (flag_asynchronous_unwind_tables) dwarf2out_args_size (args_size); } @@ -1205,7 +1191,7 @@ dwarf2out_flush_queued_reg_saves (void) sreg = DWARF_FRAME_REGNUM (REGNO (q->saved_reg)); else sreg = INVALID_REGNUM; - reg_save (false, reg, sreg, q->cfa_offset); + reg_save (reg, sreg, q->cfa_offset); } queued_reg_saves = NULL; @@ -1299,7 +1285,7 @@ dwarf2out_frame_debug_def_cfa (rtx pat) gcc_unreachable (); } - def_cfa_1 (false, &cfa); + def_cfa_1 (&cfa); } /* A subroutine of dwarf2out_frame_debug, process a REG_ADJUST_CFA note. */ @@ -1330,7 +1316,7 @@ dwarf2out_frame_debug_adjust_cfa (rtx pat) cfa.reg = REGNO (dest); gcc_assert (cfa.indirect == 0); - def_cfa_1 (false, &cfa); + def_cfa_1 (&cfa); } /* A subroutine of dwarf2out_frame_debug, process a REG_CFA_OFFSET note. */ @@ -1376,7 +1362,7 @@ dwarf2out_frame_debug_cfa_offset (rtx set) /* ??? 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 (false, sregno, INVALID_REGNUM, offset); + reg_save (sregno, INVALID_REGNUM, offset); else { /* We have a PARALLEL describing where the contents of SRC live. @@ -1393,7 +1379,7 @@ dwarf2out_frame_debug_cfa_offset (rtx set) rtx elem = XVECEXP (span, 0, par_index); sregno = DWARF_FRAME_REGNUM (REGNO (src)); - reg_save (false, sregno, INVALID_REGNUM, span_offset); + reg_save (sregno, INVALID_REGNUM, span_offset); span_offset += GET_MODE_SIZE (GET_MODE (elem)); } } @@ -1422,7 +1408,7 @@ dwarf2out_frame_debug_cfa_register (rtx set) /* ??? We'd like to use queue_reg_save, but we need to come up with a different flushing heuristic for epilogues. */ - reg_save (false, sregno, dregno, 0); + reg_save (sregno, dregno, 0); } /* A subroutine of dwarf2out_frame_debug, process a REG_CFA_EXPRESSION note. */ @@ -1450,7 +1436,7 @@ dwarf2out_frame_debug_cfa_expression (rtx set) /* ??? We'd like to use queue_reg_save, were the interface different, and, as above, we could manage flushing for epilogues. */ - add_fde_cfi (cfi); + add_cfi (cfi); } /* A subroutine of dwarf2out_frame_debug, process a REG_CFA_RESTORE note. */ @@ -1464,7 +1450,7 @@ dwarf2out_frame_debug_cfa_restore (rtx reg) cfi->dw_cfi_opc = (regno & ~0x3f ? DW_CFA_restore_extended : DW_CFA_restore); cfi->dw_cfi_oprnd1.dw_cfi_reg_num = regno; - add_fde_cfi (cfi); + add_cfi (cfi); } /* A subroutine of dwarf2out_frame_debug, process a REG_CFA_WINDOW_SAVE. @@ -1477,7 +1463,7 @@ dwarf2out_frame_debug_cfa_window_save (void) dw_cfi_ref cfi = new_cfi (); cfi->dw_cfi_opc = DW_CFA_GNU_window_save; - add_fde_cfi (cfi); + add_cfi (cfi); } /* Record call frame debugging information for an expression EXPR, @@ -1943,7 +1929,7 @@ dwarf2out_frame_debug_expr (rtx expr) gcc_unreachable (); } - def_cfa_1 (false, &cfa); + def_cfa_1 (&cfa); break; case MEM: @@ -2103,14 +2089,14 @@ dwarf2out_frame_debug_expr (rtx expr) fde->drap_reg_saved = 1; - def_cfa_1 (false, &cfa_exp); + def_cfa_1 (&cfa_exp); break; } /* If the source register is exactly the CFA, assume we're saving SP like any other register; this happens on the ARM. */ - def_cfa_1 (false, &cfa); + def_cfa_1 (&cfa); queue_reg_save (stack_pointer_rtx, NULL_RTX, offset); break; } @@ -2127,12 +2113,12 @@ dwarf2out_frame_debug_expr (rtx expr) cfa.reg = REGNO (x); cfa.base_offset = offset; cfa.indirect = 1; - def_cfa_1 (false, &cfa); + def_cfa_1 (&cfa); break; } } - def_cfa_1 (false, &cfa); + def_cfa_1 (&cfa); { span = targetm.dwarf_register_span (src); @@ -2570,7 +2556,7 @@ dwarf2out_frame_debug_restore_state (void) dw_cfi_ref cfi = new_cfi (); cfi->dw_cfi_opc = DW_CFA_restore_state; - add_fde_cfi (cfi); + add_cfi (cfi); gcc_assert (cfa_remember.in_use); cfa = cfa_remember; @@ -2591,6 +2577,8 @@ execute_dwarf2_frame (void) { dw_cfa_location loc; + add_cfi_vec = &cie_cfi_vec; + memset(&old_cfa, 0, sizeof (old_cfa)); old_cfa.reg = INVALID_REGNUM; @@ -2598,11 +2586,13 @@ execute_dwarf2_frame (void) memset(&loc, 0, sizeof (loc)); loc.reg = STACK_POINTER_REGNUM; loc.offset = INCOMING_FRAME_SP_OFFSET; - def_cfa_1 (true, &loc); + def_cfa_1 (&loc); if (targetm.debug_unwind_info () == UI_DWARF2 || targetm_common.except_unwind_info (&global_options) == UI_DWARF2) initial_return_save (INCOMING_RETURN_ADDR_RTX); + + add_cfi_vec = NULL; } /* Set up state for generating call frame debug info. */ diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c index 211f270..af7b58f 100644 --- a/gcc/dwarf2out.c +++ b/gcc/dwarf2out.c @@ -825,10 +825,10 @@ output_cfi_directive (FILE *f, dw_cfi_ref cfi) case DW_CFA_advance_loc4: case DW_CFA_MIPS_advance_loc8: case DW_CFA_set_loc: - /* Should only be created by add_fde_cfi in a code path not - followed when emitting via directives. The assembler is - going to take care of this for us. But this routines is - also used for debugging dumps, so print something. */ + /* Should only be created in a code path not followed when emitting + via directives. The assembler is going to take care of this for + us. But this routines is also used for debugging dumps, so + print something. */ gcc_assert (f != asm_out_file); fprintf (f, "\t.cfi_advance_loc\n"); break;