From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 11366 invoked by alias); 14 Jul 2011 23:09:48 -0000 Received: (qmail 11331 invoked by uid 22791); 14 Jul 2011 23:09:46 -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,TW_DW,T_TO_NO_BRKTS_FREEMAIL X-Spam-Check-By: sourceware.org Received: from mail-vw0-f47.google.com (HELO mail-vw0-f47.google.com) (209.85.212.47) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Thu, 14 Jul 2011 23:09:14 +0000 Received: by vws2 with SMTP id 2so646160vws.20 for ; Thu, 14 Jul 2011 16:09:13 -0700 (PDT) Received: by 10.220.7.82 with SMTP id c18mr854312vcc.45.1310684953454; Thu, 14 Jul 2011 16:09:13 -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 a14sm173386vcp.47.2011.07.14.16.09.12 (version=TLSv1/SSLv3 cipher=OTHER); Thu, 14 Jul 2011 16:09:12 -0700 (PDT) From: Richard Henderson To: bernds@codesourcery.com Cc: gcc-patches@gcc.gnu.org Subject: [PATCH 3/9] dwarf2cfi: Populate CUR_ROW->REG_SAVE. Date: Thu, 14 Jul 2011 23:10:00 -0000 Message-Id: <1310684876-6244-4-git-send-email-rth@redhat.com> In-Reply-To: <1310684876-6244-1-git-send-email-rth@redhat.com> References: <1310684876-6244-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-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org X-SW-Source: 2011-07/txt/msg01204.txt.bz2 To be actually used by a subsequent patch. --- gcc/dwarf2cfi.c | 27 +++++++++++++++++++++++++-- 1 files changed, 25 insertions(+), 2 deletions(-) diff --git a/gcc/dwarf2cfi.c b/gcc/dwarf2cfi.c index eb59f28..36fa7f8 100644 --- a/gcc/dwarf2cfi.c +++ b/gcc/dwarf2cfi.c @@ -285,6 +285,17 @@ add_cfi (dw_cfi_ref cfi) VEC_safe_push (dw_cfi_ref, gc, *add_cfi_vec, cfi); } +/* Perform ROW->REG_SAVE[COLUMN] = CFI. CFI may be null, indicating + that the register column is no longer saved. */ + +static void +update_row_reg_save (dw_cfi_row_ref row, unsigned column, dw_cfi_ref cfi) +{ + if (VEC_length (dw_cfi_ref, row->reg_save) <= column) + VEC_safe_grow_cleared (dw_cfi_ref, gc, row->reg_save, column + 1); + VEC_replace (dw_cfi_ref, row->reg_save, column, cfi); +} + /* This function fills in aa dw_cfa_location structure from a dwarf location descriptor sequence. */ @@ -574,7 +585,13 @@ reg_save (unsigned int reg, unsigned int sreg, HOST_WIDE_INT offset) cfi->dw_cfi_oprnd2.dw_cfi_offset = offset; } else if (sreg == reg) - cfi->dw_cfi_opc = DW_CFA_same_value; + { + /* While we could emit something like DW_CFA_same_value or + DW_CFA_restore, we never expect to see something like that + in a prologue. This is more likely to be a bug. A backend + can always bypass this by using REG_CFA_RESTORE directly. */ + gcc_unreachable (); + } else { cfi->dw_cfi_opc = DW_CFA_register; @@ -582,6 +599,7 @@ reg_save (unsigned int reg, unsigned int sreg, HOST_WIDE_INT offset) } add_cfi (cfi); + update_row_reg_save (cur_row, reg, cfi); } /* Given a SET, calculate the amount of stack adjustment it @@ -1337,6 +1355,7 @@ dwarf2out_frame_debug_cfa_expression (rtx set) { rtx src, dest, span; dw_cfi_ref cfi = new_cfi (); + unsigned regno; dest = SET_DEST (set); src = SET_SRC (set); @@ -1347,8 +1366,10 @@ dwarf2out_frame_debug_cfa_expression (rtx set) span = targetm.dwarf_register_span (src); gcc_assert (!span); + regno = dwf_regno (src); + cfi->dw_cfi_opc = DW_CFA_expression; - cfi->dw_cfi_oprnd1.dw_cfi_reg_num = dwf_regno (src); + cfi->dw_cfi_oprnd1.dw_cfi_reg_num = regno; cfi->dw_cfi_oprnd2.dw_cfi_loc = mem_loc_descriptor (XEXP (dest, 0), get_address_mode (dest), GET_MODE (dest), VAR_INIT_STATUS_INITIALIZED); @@ -1356,6 +1377,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_cfi (cfi); + update_row_reg_save (cur_row, regno, cfi); } /* A subroutine of dwarf2out_frame_debug, process a REG_CFA_RESTORE note. */ @@ -1370,6 +1392,7 @@ dwarf2out_frame_debug_cfa_restore (rtx reg) cfi->dw_cfi_oprnd1.dw_cfi_reg_num = regno; add_cfi (cfi); + update_row_reg_save (cur_row, regno, NULL); } /* A subroutine of dwarf2out_frame_debug, process a REG_CFA_WINDOW_SAVE. -- 1.7.6