From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 5214 invoked by alias); 16 Jul 2002 21:09:05 -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 5203 invoked from network); 16 Jul 2002 21:09:04 -0000 Received: from unknown (HELO potter.sfbay.redhat.com) (205.180.83.107) by sources.redhat.com with SMTP; 16 Jul 2002 21:09:04 -0000 Received: from romulus.sfbay.redhat.com (remus.sfbay.redhat.com [172.16.27.252]) by potter.sfbay.redhat.com (8.11.6/8.11.6) with ESMTP id g6GL9eQ22024; Tue, 16 Jul 2002 14:09:40 -0700 Received: (from kev@localhost) by romulus.sfbay.redhat.com (8.11.6/8.11.6) id g6GL92o11005; Tue, 16 Jul 2002 14:09:02 -0700 Date: Tue, 16 Jul 2002 16:30:00 -0000 From: Kevin Buettner Message-Id: <1020716210901.ZM11004@localhost.localdomain> In-Reply-To: Jim Blandy "Re: [PATCH RFA] dwarf2read.c: Accommodate older 64-bit DWARF2 format" (Jul 13, 5:43pm) References: <1020713000942.ZM10220@localhost.localdomain> To: Jim Blandy Subject: Re: [PATCH RFA] dwarf2read.c: Accommodate older 64-bit DWARF2 format Cc: gdb-patches@sources.redhat.com MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-SW-Source: 2002-07/txt/msg00357.txt.bz2 On Jul 13, 5:43pm, Jim Blandy wrote: > Approved, if you add discussion like the one included in your post to > the comment above read_initial_length. Committed. Since the patch that I ended up committing is quite different from what I posted last week, I've appended it below. The bits of actual C code are identical to the patch I posted last week, but the changes to the comment are new. In addition to the requested changes, I took the liberty of updating the comment to point at the current DWARF 3 draft standard. (The old link was broken due to reality.sgi.com being decommissioned.) * dwarf2read.c (read_initial_length): Handle older, non-standard, 64-bit DWARF2 format. Index: dwarf2read.c =================================================================== RCS file: /cvs/src/src/gdb/dwarf2read.c,v retrieving revision 1.62 diff -u -p -r1.62 dwarf2read.c --- dwarf2read.c 12 Jul 2002 19:55:10 -0000 1.62 +++ dwarf2read.c 16 Jul 2002 20:56:44 -0000 @@ -3863,12 +3863,25 @@ read_address (bfd *abfd, char *buf, cons return retval; } -/* Reads the initial length from a section. The (draft) DWARF 2.1 +/* Read the initial length from a section. The (draft) DWARF 3 specification allows the initial length to take up either 4 bytes or 12 bytes. If the first 4 bytes are 0xffffffff, then the next 8 bytes describe the length and all offsets will be 8 bytes in length instead of 4. + An older, non-standard 64-bit format is also handled by this + function. The older format in question stores the initial length + as an 8-byte quantity without an escape value. Lengths greater + than 2^32 aren't very common which means that the initial 4 bytes + is almost always zero. Since a length value of zero doesn't make + sense for the 32-bit format, this initial zero can be considered to + be an escape value which indicates the presence of the older 64-bit + format. As written, the code can't detect (old format) lengths + greater than 4GB. If it becomes necessary to handle lengths somewhat + larger than 4GB, we could allow other small values (such as the + non-sensical values of 1, 2, and 3) to also be used as escape values + indicating the presence of the old format. + The value returned via bytes_read should be used to increment the relevant pointer after calling read_initial_length(). @@ -3879,14 +3892,18 @@ read_address (bfd *abfd, char *buf, cons [ Note: read_initial_length() and read_offset() are based on the document entitled "DWARF Debugging Information Format", revision - 2.1, draft 4, dated July 20, 2000. This document was obtained + 3, draft 8, dated November 19, 2001. This document was obtained from: - http://reality.sgi.com/dehnert_engr/dwarf/dwarf2p1-draft4-000720.pdf + http://reality.sgiweb.org/davea/dwarf3-draft8-011125.pdf This document is only a draft and is subject to change. (So beware.) - - Kevin, Aug 4, 2000 + Details regarding the older, non-standard 64-bit format were + determined empirically by examining 64-bit ELF files produced + by the SGI toolchain on an IRIX 6.5 machine. + + - Kevin, July 16, 2002 ] */ static LONGEST @@ -3904,6 +3921,18 @@ read_initial_length (bfd *abfd, char *bu if (cu_header != NULL) { cu_header->initial_length_size = 12; + cu_header->offset_size = 8; + } + } + else if (retval == 0) + { + /* Handle (non-standard) 64-bit DWARF2 formats such as that used + by IRIX. */ + retval = bfd_get_64 (abfd, (bfd_byte *) buf); + *bytes_read = 8; + if (cu_header != NULL) + { + cu_header->initial_length_size = 8; cu_header->offset_size = 8; } }