Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
* [patch] Allow dummy CUs created by incremental linker
@ 2011-10-19  0:44 Cary Coutant
  2011-10-19 15:27 ` Tom Tromey
  0 siblings, 1 reply; 7+ messages in thread
From: Cary Coutant @ 2011-10-19  0:44 UTC (permalink / raw)
  To: gdb-patches; +Cc: Doug Evans

[-- 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;

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2011-10-20 22:35 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-10-19  0:44 [patch] Allow dummy CUs created by incremental linker Cary Coutant
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

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox