This is the mail archive of the gdb-patches@sources.redhat.com mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH RFA] dwarf2read.c: Accommodate older 64-bit DWARF2 format


The patch below corresponds to a similar patch which was committed to
bfd/dwarf2.c a few weeks back.  See

    http://sources.redhat.com/ml/binutils/2002-06/msg00702.html

(and the rest of the thread).

The older, non-standard 64-bit format in question stores the initial
length as an 8-byte quantity without an escape value.  (Recall that
the current draft standard uses the value 0xffffffff in the first 4
bytes to indicate a 64-bit DWARF2 format.  The subsequent eight bytes
contain the length.)  For the older format, however, 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.

It's true that we can't detect lengths greater than 4GB (for the old
format), but I don't think this matters much in practice.  If it
becomes necessary to handle values 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 which also indicate the presence
of the old format.  I don't think this will become necessary though
since the current DWARF 2/3 draft standard will likely be used for files
requiring larger lengths.

Okay to commit?

	* 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	12 Jul 2002 23:26:27 -0000
@@ -3907,6 +3907,18 @@ read_initial_length (bfd *abfd, char *bu
 	  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;
+	}
+    }
   else
     {
       *bytes_read = 4;


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]