From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 2848 invoked by alias); 20 Jul 2004 19:11:34 -0000 Mailing-List: contact gdb-patches-help@sources.redhat.com; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sources.redhat.com Received: (qmail 2793 invoked from network); 20 Jul 2004 19:11:31 -0000 Received: from unknown (HELO mx1.redhat.com) (66.187.233.31) by sourceware.org with SMTP; 20 Jul 2004 19:11:31 -0000 Received: from int-mx1.corp.redhat.com (int-mx1.corp.redhat.com [172.16.52.254]) by mx1.redhat.com (8.12.10/8.12.10) with ESMTP id i6KJBVe1007694 for ; Tue, 20 Jul 2004 15:11:31 -0400 Received: from pobox.corp.redhat.com (pobox.corp.redhat.com [172.16.52.156]) by int-mx1.corp.redhat.com (8.11.6/8.11.6) with ESMTP id i6KJBVa12848 for ; Tue, 20 Jul 2004 15:11:31 -0400 Received: from [172.16.50.84] (vpn50-84.rdu.redhat.com [172.16.50.84]) by pobox.corp.redhat.com (8.12.8/8.12.8) with ESMTP id i6KJBUM5006234 for ; Tue, 20 Jul 2004 15:11:30 -0400 Subject: [RFA] dwarf2-frame.c sign extension patch From: "Martin M. Hunt" To: gdb-patches@sources.redhat.com Content-Type: multipart/mixed; boundary="=-iEOpYH4RQJMCeAEmnS+I" Organization: Red Hat Inc. Message-Id: <1090350684.3030.10.camel@dragon> Mime-Version: 1.0 Date: Tue, 20 Jul 2004 19:11:00 -0000 X-SW-Source: 2004-07/txt/msg00255.txt.bz2 --=-iEOpYH4RQJMCeAEmnS+I Content-Type: text/plain Content-Transfer-Encoding: 7bit Content-length: 637 This patch fixes some dwarf2 problems with sign-extension. 2004-07-20 Kevin Buettner and Martin Hunt * dwarf2-frame.c (execute_cfa_program): Fix typo in which the alignment was being added to the offset instead of multiplied. (struct comp_unit): Add new field ``signed_addr_p''. (encoding_for_size): Add new parameter ``signed_addr_p''. Adjust all callers. Add code for handling signed encodings. (dwarf2_build_frame_info): Initialize ``unit.signed_addr_p''. (dwarf2_build_frame_info): Set unit.addr_size. -- Martin M. Hunt Red Hat Inc. --=-iEOpYH4RQJMCeAEmnS+I Content-Disposition: attachment; filename=cfi_patch Content-Type: text/x-patch; name=cfi_patch; charset=UTF-8 Content-Transfer-Encoding: 7bit Content-length: 2606 Index: dwarf2-frame.c =================================================================== RCS file: /cvs/src/src/gdb/dwarf2-frame.c,v retrieving revision 1.36 diff -w -u -r1.36 dwarf2-frame.c --- dwarf2-frame.c 15 Jun 2004 01:04:19 -0000 1.36 +++ dwarf2-frame.c 20 Jul 2004 18:54:54 -0000 @@ -426,7 +428,7 @@ case DW_CFA_offset_extended_sf: insn_ptr = read_uleb128 (insn_ptr, insn_end, ®); insn_ptr = read_sleb128 (insn_ptr, insn_end, &offset); - offset += fs->data_align; + offset *= fs->data_align; dwarf2_frame_state_alloc_regs (&fs->regs, reg + 1); fs->regs.reg[reg].how = DWARF2_FRAME_REG_SAVED_OFFSET; fs->regs.reg[reg].loc.offset = offset; @@ -893,6 +895,9 @@ /* Address size for this unit - from unit header. */ unsigned char addr_size; + /* Are addresses signed? */ + unsigned char signed_addr_p; + /* Pointer to the .debug_frame section loaded into memory. */ char *dwarf_frame_buffer; @@ -1021,15 +1026,24 @@ should be dereferenced. */ static unsigned char -encoding_for_size (unsigned int size) +encoding_for_size (unsigned int size, int signed_addr_p) { switch (size) { case 2: + if (signed_addr_p) + return DW_EH_PE_sdata2; + else return DW_EH_PE_udata2; case 4: + if (signed_addr_p) + return DW_EH_PE_sdata4; + else return DW_EH_PE_udata4; case 8: + if (signed_addr_p) + return DW_EH_PE_sdata8; + else return DW_EH_PE_udata8; default: internal_error (__FILE__, __LINE__, "Unsupported address size"); @@ -1110,7 +1124,7 @@ } if ((encoding & 0x0f) == 0x00) - encoding |= encoding_for_size (ptr_len); + encoding |= encoding_for_size (ptr_len, unit->signed_addr_p); switch (encoding & 0x0f) { @@ -1286,7 +1300,7 @@ /* The encoding for FDE's in a normal .debug_frame section depends on the target address size as specified in the Compilation Unit Header. */ - cie->encoding = encoding_for_size (unit->addr_size); + cie->encoding = encoding_for_size (unit->addr_size, unit->signed_addr_p); /* Check version number. */ cie_version = read_1_byte (unit->abfd, buf); @@ -1557,7 +1571,8 @@ /* Build a minimal decoding of the DWARF2 compilation unit. */ unit.abfd = objfile->obfd; unit.objfile = objfile; - unit.addr_size = objfile->obfd->arch_info->bits_per_address / 8; + unit.addr_size = TYPE_LENGTH (builtin_type_void_data_ptr); + unit.signed_addr_p = bfd_get_sign_extend_vma (unit.abfd); unit.dbase = 0; unit.tbase = 0; --=-iEOpYH4RQJMCeAEmnS+I--