Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
From: Cary Coutant <ccoutant@google.com>
To: gdb-patches@sourceware.org
Cc: Doug Evans <dje@google.com>
Subject: [patch] Allow dummy CUs created by incremental linker
Date: Wed, 19 Oct 2011 00:44:00 -0000	[thread overview]
Message-ID: <CAHACq4q74NiMgxg=J7b0HCotZfJtwdfxHhCnkfwwvWu=FMgJDg@mail.gmail.com> (raw)

[-- Attachment #1: Type: text/plain, Size: 922 bytes --]

With the new incremental linking support in gold, we leave patch space
in the file at link time, and use that patch space for incremental
updates. If the file has debug info, that means that the debug info
might have "holes" in it. Because the debugger can't deal with
arbitrary holes in the debug info, gold fills the holes with dummy
compilation units, where each dummy CU consists of a compilation unit
header whose length field cover the hole, and the rest of the space
filled with zeroes. This patch updated gdb to tolerate these dummy
CUs, by checking for an empty CU before attempting to read the DIEs.

Tested on x86_64 with the latest gold.

-cary


	* dwarf2read.c (peek_abbrev_code): New function.
	(dw2_get_file_names): Check for dummy compilation units.
	(create_debug_types_hash_table): Likewise.
	(process_psymtab_comp_unit): Likewise.
	(load_partial_comp_unit): Likewise.
	(load_full_comp_unit): Likewise.

[-- Attachment #2: gdb-empty-cu-patch-2.txt --]
[-- Type: text/plain, Size: 3879 bytes --]

2011-10-18  Cary Coutant  <ccoutant@google.com>

	* dwarf2read.c (peek_abbrev_code): New function.
	(dw2_get_file_names): Check for dummy compilation units.
	(create_debug_types_hash_table): Likewise.
	(process_psymtab_comp_unit): Likewise.
	(load_partial_comp_unit): Likewise.
	(load_full_comp_unit): Likewise.


Index: dwarf2read.c
===================================================================
RCS file: /cvs/src/src/gdb/dwarf2read.c,v
retrieving revision 1.574
diff -u -p -r1.574 dwarf2read.c
--- dwarf2read.c	17 Oct 2011 12:57:14 -0000	1.574
+++ dwarf2read.c	19 Oct 2011 00:00:04 -0000
@@ -936,6 +936,8 @@ static void dwarf2_read_abbrevs (bfd *ab
 
 static void dwarf2_free_abbrev_table (void *);
 
+static unsigned int peek_abbrev_code (bfd *, gdb_byte *);
+
 static struct abbrev_info *peek_die_abbrev (gdb_byte *, unsigned int *,
 					    struct dwarf2_cu *);
 
@@ -2307,6 +2309,14 @@ dw2_get_file_names (struct objfile *objf
 					  buffer, buffer_size,
 					  abfd);
 
+  /* Skip dummy compilation units.  */
+  if (info_ptr >= buffer + buffer_size
+      || peek_abbrev_code (abfd, info_ptr) == 0)
+    {
+      do_cleanups (cleanups);
+      return NULL;
+    }
+
   this_cu->cu = &cu;
   cu.per_cu = this_cu;
 
@@ -3204,6 +3214,14 @@ create_debug_types_hash_table (struct ob
 	  signature = bfd_get_64 (objfile->obfd, ptr);
 	  ptr += 8;
 	  type_offset = read_offset_1 (objfile->obfd, ptr, offset_size);
+	  ptr += 1;
+
+	  /* Skip dummy type units.  */
+	  if (ptr >= end_ptr || peek_abbrev_code (objfile->obfd, ptr) == 0)
+	    {
+	      info_ptr = info_ptr + initial_length_size + length;
+	      continue;
+	    }
 
 	  type_sig = obstack_alloc (&objfile->objfile_obstack, sizeof (*type_sig));
 	  memset (type_sig, 0, sizeof (*type_sig));
@@ -3356,6 +3374,16 @@ process_psymtab_comp_unit (struct objfil
 					  buffer, buffer_size,
 					  abfd);
 
+  /* Skip dummy compilation units.  */
+  if (info_ptr >= buffer + buffer_size
+      || peek_abbrev_code (abfd, info_ptr) == 0)
+    {
+      info_ptr = (beg_of_comp_unit + cu.header.length
+		  + cu.header.initial_length_size);
+      do_cleanups (back_to_inner);
+      return info_ptr;
+    }
+
   cu.list_in_scope = &file_symbols;
 
   /* If this compilation unit was already read in, free the
@@ -3644,6 +3672,15 @@ load_partial_comp_unit (struct dwarf2_pe
 					      dwarf2_per_objfile->info.size,
 					      abfd);
 
+      /* Skip dummy compilation units.  */
+      if (info_ptr >= (dwarf2_per_objfile->info.buffer
+		       + dwarf2_per_objfile->info.size)
+	  || peek_abbrev_code (abfd, info_ptr) == 0)
+	{
+	  do_cleanups (free_cu_cleanup);
+	  return;
+	}
+
       /* Link this compilation unit into the compilation unit tree.  */
       this_cu->cu = cu;
       cu->per_cu = this_cu;
@@ -4256,6 +4293,15 @@ add_partial_enumeration (struct partial_
     }
 }
 
+/* Return the initial uleb128 in the die at INFO_PTR.  */
+
+static unsigned int
+peek_abbrev_code (bfd *abfd, gdb_byte *info_ptr)
+{
+  unsigned int bytes_read;
+  return read_unsigned_leb128 (abfd, info_ptr, &bytes_read);
+}
+
 /* Read the initial uleb128 in the die at INFO_PTR in compilation unit CU.
    Return the corresponding abbrev, or NULL if the number is zero (indicating
    an empty DIE).  In either case *BYTES_READ will be set to the length of
@@ -4640,6 +4686,15 @@ load_full_comp_unit (struct dwarf2_per_c
       /* Read in the comp_unit header.  */
       info_ptr = read_comp_unit_head (&cu->header, info_ptr, abfd);
 
+      /* Skip dummy compilation units.  */
+      if (info_ptr >= (dwarf2_per_objfile->info.buffer
+		       + dwarf2_per_objfile->info.size)
+	  || peek_abbrev_code (abfd, info_ptr) == 0)
+	{
+	  do_cleanups (free_cu_cleanup);
+	  return;
+	}
+
       /* Complete the cu_header.  */
       cu->header.offset = offset;
       cu->header.first_die_offset = info_ptr - beg_of_comp_unit;

             reply	other threads:[~2011-10-19  0:30 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-10-19  0:44 Cary Coutant [this message]
2011-10-19 15:27 ` Tom Tromey
2011-10-19 15:52   ` Cary Coutant
2011-10-20 15:00     ` Regression for .debug_types [Re: [patch] Allow dummy CUs created by incremental linker] Jan Kratochvil
2011-10-20 19:16       ` Cary Coutant
2011-10-20 22:35         ` Cary Coutant
2011-10-21  0:00           ` Jan Kratochvil

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to='CAHACq4q74NiMgxg=J7b0HCotZfJtwdfxHhCnkfwwvWu=FMgJDg@mail.gmail.com' \
    --to=ccoutant@google.com \
    --cc=dje@google.com \
    --cc=gdb-patches@sourceware.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox