This is the mail archive of the gdb-patches@sourceware.org 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]

[commit] Minimal DW_TAG_partial_unit support


This patch adds minimal support for DW_TAG_partial_unit.  We don't need to
create psymtabs for partial units, or full symtabs; right now the only thing
they'll be used for is any type DIEs referenced with DW_FORM_ref_addr.  In
the future we may want imported unit support, too.  This patch prevents GDB
from crashing when presented with a DW_TAG_partial_unit; previously we'd
call end_symtab without calling start_symtab, leading to double-freeing
"subfiles".

Tested on arm-none-eabi, as well as with an ARM compiler testcase that uses
DW_TAG_partial_unit, and checked in.

-- 
Daniel Jacobowitz
CodeSourcery

2006-11-02  Daniel Jacobowitz  <dan@codesourcery.com>

	* dwarf2read.c (struct dwarf2_per_cu_data): Update comment.
	(load_full_comp_unit): Take OBJFILE argument and use it.
	(dwarf2_build_psymtabs_hard): Skip partial units.
	(process_queue): Pass OBJFILE to load_full_comp_unit.  Check
	type_hash for read in CUs.  Test psymtab for NULL.

Index: gdb/dwarf2read.c
===================================================================
RCS file: /scratch/gcc/repos/src/src/gdb/dwarf2read.c,v
retrieving revision 1.205
diff -u -p -r1.205 dwarf2read.c
--- gdb/dwarf2read.c	11 Oct 2006 15:39:35 -0000	1.205
+++ gdb/dwarf2read.c	2 Nov 2006 20:29:08 -0000
@@ -389,7 +389,9 @@ struct dwarf2_per_cu_data
      it.  */
   htab_t type_hash;
 
-  /* The partial symbol table associated with this compilation unit.  */
+  /* The partial symbol table associated with this compilation unit,
+     or NULL for partial units (which do not have an associated
+     symtab).  */
   struct partial_symtab *psymtab;
 };
 
@@ -1066,7 +1068,8 @@ static void reset_die_and_siblings_types
 
 static void create_all_comp_units (struct objfile *);
 
-static struct dwarf2_cu *load_full_comp_unit (struct dwarf2_per_cu_data *);
+static struct dwarf2_cu *load_full_comp_unit (struct dwarf2_per_cu_data *,
+					      struct objfile *);
 
 static void process_full_comp_unit (struct dwarf2_per_cu_data *);
 
@@ -1470,6 +1473,14 @@ dwarf2_build_psymtabs_hard (struct objfi
       info_ptr = read_partial_die (&comp_unit_die, abbrev, bytes_read,
 				   abfd, info_ptr, &cu);
 
+      if (comp_unit_die.tag == DW_TAG_partial_unit)
+	{
+	  info_ptr = (beg_of_comp_unit + cu.header.length
+		      + cu.header.initial_length_size);
+	  do_cleanups (back_to_inner);
+	  continue;
+	}
+
       /* Set the language we're debugging */
       set_cu_language (comp_unit_die.language, &cu);
 
@@ -2386,14 +2397,14 @@ process_queue (struct objfile *objfile)
     {
       /* Read in this compilation unit.  This may add new items to
 	 the end of the queue.  */
-      load_full_comp_unit (item->per_cu);
+      load_full_comp_unit (item->per_cu, objfile);
 
       item->per_cu->cu->read_in_chain = dwarf2_per_objfile->read_in_chain;
       dwarf2_per_objfile->read_in_chain = item->per_cu;
 
       /* If this compilation unit has already had full symbols created,
 	 reset the TYPE fields in each DIE.  */
-      if (item->per_cu->psymtab->readin)
+      if (item->per_cu->type_hash)
 	reset_die_and_siblings_types (item->per_cu->cu->dies,
 				      item->per_cu->cu);
     }
@@ -2402,7 +2413,7 @@ process_queue (struct objfile *objfile)
      them, one at a time, removing from the queue as we finish.  */
   for (item = dwarf2_queue; item != NULL; dwarf2_queue = item = next_item)
     {
-      if (!item->per_cu->psymtab->readin)
+      if (item->per_cu->psymtab && !item->per_cu->psymtab->readin)
 	process_full_comp_unit (item->per_cu);
 
       item->per_cu->queued = 0;
@@ -2495,10 +2506,9 @@ psymtab_to_symtab_1 (struct partial_symt
 /* Load the DIEs associated with PST and PER_CU into memory.  */
 
 static struct dwarf2_cu *
-load_full_comp_unit (struct dwarf2_per_cu_data *per_cu)
+load_full_comp_unit (struct dwarf2_per_cu_data *per_cu, struct objfile *objfile)
 {
-  struct partial_symtab *pst = per_cu->psymtab;
-  bfd *abfd = pst->objfile->obfd;
+  bfd *abfd = objfile->obfd;
   struct dwarf2_cu *cu;
   unsigned long offset;
   gdb_byte *info_ptr;
@@ -2517,7 +2527,7 @@ load_full_comp_unit (struct dwarf2_per_c
   /* If an error occurs while loading, release our storage.  */
   free_cu_cleanup = make_cleanup (free_one_comp_unit, cu);
 
-  cu->objfile = pst->objfile;
+  cu->objfile = objfile;
 
   /* read in the comp_unit header  */
   info_ptr = read_comp_unit_head (&cu->header, info_ptr, abfd);


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