From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 12144 invoked by alias); 24 Aug 2008 18:34:56 -0000 Received: (qmail 12123 invoked by uid 22791); 24 Aug 2008 18:34:55 -0000 X-Spam-Check-By: sourceware.org Received: from are.twiddle.net (HELO are.twiddle.net) (75.149.56.221) by sourceware.org (qpsmtpd/0.31) with ESMTP; Sun, 24 Aug 2008 18:34:19 +0000 Received: from stone.twiddle.home (stone.twiddle.home [172.31.0.4]) by are.twiddle.net (Postfix) with ESMTP id 9E9D55757A; Sun, 24 Aug 2008 11:34:17 -0700 (PDT) Message-ID: <48B1A9A9.6040801@twiddle.net> Date: Sun, 24 Aug 2008 20:09:00 -0000 From: Richard Henderson User-Agent: Thunderbird 2.0.0.16 (X11/20080723) MIME-Version: 1.0 To: John David Anglin CC: sje@cup.hp.com, gcc-patches@gcc.gnu.org, dave.anglin@nrc-cnrc.gc.ca, binutils-patches@gcc.gnu.org Subject: Re: update dwarf2 asm unwind info [hppa64-*-* failures] References: <20080823201219.5B05B431A@hiauly1.hia.nrc.ca> In-Reply-To: <20080823201219.5B05B431A@hiauly1.hia.nrc.ca> Content-Type: multipart/mixed; boundary="------------030103050801010405040102" 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: 2008-08/txt/msg01806.txt.bz2 This is a multi-part message in MIME format. --------------030103050801010405040102 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Content-length: 254 John David Anglin wrote: > As can be seen, gas is dividing DWARF2_CIE_DATA_ALIGNMENT when the > offset is negative. GCC is also dividing by the data alignment. > So, which is wrong? Gcc is wrong. Here's a patch to avoid doing the division twice. r~ --------------030103050801010405040102 Content-Type: text/plain; name="z.txt" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="z.txt" Content-length: 4595 --- dwarf2out.c (revision 139547) +++ dwarf2out.c (local) @@ -776,23 +776,16 @@ lookup_cfa_1 (dw_cfi_ref cfi, dw_cfa_loc switch (cfi->dw_cfi_opc) { case DW_CFA_def_cfa_offset: - loc->offset = cfi->dw_cfi_oprnd1.dw_cfi_offset; - break; case DW_CFA_def_cfa_offset_sf: - loc->offset - = cfi->dw_cfi_oprnd1.dw_cfi_offset * DWARF_CIE_DATA_ALIGNMENT; + loc->offset = cfi->dw_cfi_oprnd1.dw_cfi_offset; break; case DW_CFA_def_cfa_register: loc->reg = cfi->dw_cfi_oprnd1.dw_cfi_reg_num; break; case DW_CFA_def_cfa: - loc->reg = cfi->dw_cfi_oprnd1.dw_cfi_reg_num; - loc->offset = cfi->dw_cfi_oprnd2.dw_cfi_offset; - break; case DW_CFA_def_cfa_sf: loc->reg = cfi->dw_cfi_oprnd1.dw_cfi_reg_num; - loc->offset - = cfi->dw_cfi_oprnd2.dw_cfi_offset * DWARF_CIE_DATA_ALIGNMENT; + loc->offset = cfi->dw_cfi_oprnd2.dw_cfi_offset; break; case DW_CFA_def_cfa_expression: get_cfa_from_loc_descr (loc, cfi->dw_cfi_oprnd1.dw_cfi_loc); @@ -891,20 +884,14 @@ def_cfa_1 (const char *label, dw_cfa_loc if (loc.reg == old_cfa.reg && !loc.indirect) { /* Construct a "DW_CFA_def_cfa_offset " instruction, indicating - the CFA register did not change but the offset did. */ + the CFA register did not change but the offset did. The data + factoring for DW_CFA_def_cfa_offset_sf happens in output_cfi, or + in the assembler via the .cfi_def_cfa_offset directive. */ if (loc.offset < 0) - { - HOST_WIDE_INT f_offset = loc.offset / DWARF_CIE_DATA_ALIGNMENT; - gcc_assert (f_offset * DWARF_CIE_DATA_ALIGNMENT == loc.offset); - - cfi->dw_cfi_opc = DW_CFA_def_cfa_offset_sf; - cfi->dw_cfi_oprnd1.dw_cfi_offset = f_offset; - } + cfi->dw_cfi_opc = DW_CFA_def_cfa_offset_sf; else - { - cfi->dw_cfi_opc = DW_CFA_def_cfa_offset; - cfi->dw_cfi_oprnd1.dw_cfi_offset = loc.offset; - } + cfi->dw_cfi_opc = DW_CFA_def_cfa_offset; + cfi->dw_cfi_oprnd1.dw_cfi_offset = loc.offset; } #ifndef MIPS_DEBUGGING_INFO /* SGI dbx thinks this means no offset. */ @@ -924,22 +911,15 @@ def_cfa_1 (const char *label, dw_cfa_loc { /* Construct a "DW_CFA_def_cfa " instruction, indicating the CFA register has changed to with - the specified offset. */ + the specified offset. The data factoring for DW_CFA_def_cfa_sf + happens in output_cfi, or in the assembler via the .cfi_def_cfa + directive. */ if (loc.offset < 0) - { - HOST_WIDE_INT f_offset = loc.offset / DWARF_CIE_DATA_ALIGNMENT; - gcc_assert (f_offset * DWARF_CIE_DATA_ALIGNMENT == loc.offset); - - cfi->dw_cfi_opc = DW_CFA_def_cfa_sf; - cfi->dw_cfi_oprnd1.dw_cfi_reg_num = loc.reg; - cfi->dw_cfi_oprnd2.dw_cfi_offset = f_offset; - } + cfi->dw_cfi_opc = DW_CFA_def_cfa_sf; else - { - cfi->dw_cfi_opc = DW_CFA_def_cfa; - cfi->dw_cfi_oprnd1.dw_cfi_reg_num = loc.reg; - cfi->dw_cfi_oprnd2.dw_cfi_offset = loc.offset; - } + cfi->dw_cfi_opc = DW_CFA_def_cfa; + cfi->dw_cfi_oprnd1.dw_cfi_reg_num = loc.reg; + cfi->dw_cfi_oprnd2.dw_cfi_offset = loc.offset; } else { @@ -2552,6 +2532,8 @@ static void output_cfi (dw_cfi_ref cfi, dw_fde_ref fde, int for_eh) { unsigned long r; + HOST_WIDE_INT off; + if (cfi->dw_cfi_opc == DW_CFA_advance_loc) dw2_asm_output_data (1, (cfi->dw_cfi_opc | (cfi->dw_cfi_oprnd1.dw_cfi_offset & 0x3f)), @@ -2622,12 +2604,20 @@ output_cfi (dw_cfi_ref cfi, dw_fde_ref f break; case DW_CFA_offset_extended_sf: - case DW_CFA_def_cfa_sf: r = DWARF2_FRAME_REG_OUT (cfi->dw_cfi_oprnd1.dw_cfi_reg_num, for_eh); dw2_asm_output_data_uleb128 (r, NULL); dw2_asm_output_data_sleb128 (cfi->dw_cfi_oprnd2.dw_cfi_offset, NULL); break; + case DW_CFA_def_cfa_sf: + r = DWARF2_FRAME_REG_OUT (cfi->dw_cfi_oprnd1.dw_cfi_reg_num, for_eh); + dw2_asm_output_data_uleb128 (r, NULL); + + off = cfi->dw_cfi_oprnd2.dw_cfi_offset; + gcc_assert (off % DWARF_CIE_DATA_ALIGNMENT == 0); + dw2_asm_output_data_sleb128 (off / DWARF_CIE_DATA_ALIGNMENT, NULL); + break; + case DW_CFA_restore_extended: case DW_CFA_undefined: case DW_CFA_same_value: @@ -2649,7 +2639,9 @@ output_cfi (dw_cfi_ref cfi, dw_fde_ref f break; case DW_CFA_def_cfa_offset_sf: - dw2_asm_output_data_sleb128 (cfi->dw_cfi_oprnd1.dw_cfi_offset, NULL); + off = cfi->dw_cfi_oprnd1.dw_cfi_offset; + gcc_assert (off % DWARF_CIE_DATA_ALIGNMENT == 0); + dw2_asm_output_data_sleb128 (off / DWARF_CIE_DATA_ALIGNMENT, NULL); break; case DW_CFA_GNU_window_save: --------------030103050801010405040102--