Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
* [RFA/dwarf] Pass some global state around
@ 2003-11-10 15:51 Daniel Jacobowitz
  2003-11-10 16:55 ` David Carlton
  2003-11-11 21:41 ` Jim Blandy
  0 siblings, 2 replies; 4+ messages in thread
From: Daniel Jacobowitz @ 2003-11-10 15:51 UTC (permalink / raw)
  To: gdb-patches; +Cc: jimb

This is a cleanup that I've discussed with Jim before.  We create a new
structure, dwarf2_cu, and pass it to just about everything.  Primary goals:
  - Move some things that don't really belong in the comp_unit_head out of
    that and into the new type.
  - Move global state that shouldn't be global into the new type.
The eventual goal is to eliminate most/all global state for the reading of a
compilation unit, so that we can do more than one at a time.

I didn't get absolutely everything in the first pass; the patch was big
enough as it is.  I did get some things that won't need any of the new data
in dwarf2_cu (for instance, read_address), but I think that the consistency
is worthwhile.  For instance, you might think that we don't need to pass
around full compilation unit information for psymtab scanning - but that can
call decode_locdesc.

OK?

-- 
Daniel Jacobowitz
MontaVista Software                         Debian GNU/Linux Developer

2003-11-10  Daniel Jacobowitz <drow@mvista.com>

	* dwarf2read.c (struct dwarf2_cu): New type.

	(dwarf2_build_psymtabs_hard, scan_partial_symbols)
	(add_partial_symbol, add_partial_namespace, add_partial_enumeration)
	(locate_pdi_sibling, psymtab_to_symtab_1, process_die)
	(read_file_scope, read_func_scope)
	(read_lexical_block_scope, dwarf2_get_pc_bounds)
	(dwarf2_add_field, dwarf2_attach_fields_to_type)
	(dwarf2_add_member_fn, dwarf2_attach_fn_fields_to_type)
	(read_structure_scope, read_enumeration, read_array_type)
	(read_common_block, read_namespace, read_tag_pointer_type)
	(read_tag_ptr_to_member_type, read_tag_reference_type)
	(read_tag_const_type, read_tag_volatile_type, read_tag_string_type)
	(read_subroutine_type, read_typedef, read_base_type, read_comp_unit)
	(read_die_and_children, read_die_and_siblings, dwarf2_read_section)
	(dwarf2_read_abbrevs, dwarf2_lookup_abbrev, read_partial_die)
	(read_full_die. read_attribute_value, read_attribute)
	(read_address, dwarf_decode_line_header, dwarf_decode_lines)
	(var_decode_location, new_symbol, dwarf2_const_value, die_type)
	(die_containing_type, type_at_offset, tag_type_to_type)
	(read_type_die, dwarf_base_type, decode_locdesc, dwarf_decode_macros)
	(dwarf2_symbol_mark_computed): Use it.

Index: dwarf2read.c
===================================================================
RCS file: /big/fsf/rsync/src-cvs/src/gdb/dwarf2read.c,v
retrieving revision 1.111
diff -u -p -r1.111 dwarf2read.c
--- dwarf2read.c	8 Nov 2003 00:13:02 -0000	1.111
+++ dwarf2read.c	10 Nov 2003 15:28:30 -0000
@@ -230,6 +230,20 @@ struct comp_unit_head
     int base_known;
   };
 
+/* Internal state when decoding a particular compilation unit.  */
+struct dwarf2_cu
+{
+  /* The objfile containing this compilation unit.  */
+  struct objfile *objfile;
+
+  /* The header of the compilation unit.
+
+     FIXME drow/2003-11-10: Some of the things from the comp_unit_head
+     should be moved to the dwarf2_cu structure; for instance the abbrevs
+     hash table.  */
+  struct comp_unit_head header;
+};
+
 /* The line number information for a compilation unit (found in the
    .debug_line section) begins with a "statement program header",
    which contains the following information.  */
@@ -678,32 +692,28 @@ static void dwarf2_build_psymtabs_easy (
 
 static void dwarf2_build_psymtabs_hard (struct objfile *, int);
 
-static char *scan_partial_symbols (char *, struct objfile *,
-				   CORE_ADDR *, CORE_ADDR *,
-				   const struct comp_unit_head *,
+static char *scan_partial_symbols (char *, CORE_ADDR *, CORE_ADDR *,
+				   struct dwarf2_cu *,
 				   const char *namespace);
 
-static void add_partial_symbol (struct partial_die_info *, struct objfile *,
-				const struct comp_unit_head *,
+static void add_partial_symbol (struct partial_die_info *, struct dwarf2_cu *,
 				const char *namespace);
 
 static char *add_partial_namespace (struct partial_die_info *pdi,
 				    char *info_ptr,
-				    struct objfile *objfile,
 				    CORE_ADDR *lowpc, CORE_ADDR *highpc,
-				    const struct comp_unit_head *cu_header,
+				    struct dwarf2_cu *cu,
 				    const char *namespace);
 
 static char *add_partial_enumeration (struct partial_die_info *enum_pdi,
 				      char *info_ptr,
-				      struct objfile *objfile,
-				      const struct comp_unit_head *cu_header,
+				      struct dwarf2_cu *cu,
 				      const char *namespace);
 
 static char *locate_pdi_sibling (struct partial_die_info *orig_pdi,
 				 char *info_ptr,
 				 bfd *abfd,
-				 const struct comp_unit_head *cu_header);
+				 struct dwarf2_cu *cu);
 
 static void dwarf2_psymtab_to_symtab (struct partial_symtab *);
 
@@ -712,25 +722,24 @@ static void psymtab_to_symtab_1 (struct 
 char *dwarf2_read_section (struct objfile *, file_ptr, unsigned int,
 			   asection *);
 
-static void dwarf2_read_abbrevs (bfd *abfd, struct comp_unit_head *cu_header);
+static void dwarf2_read_abbrevs (bfd *abfd, struct dwarf2_cu *cu);
 
 static void dwarf2_empty_abbrev_table (void *);
 
 static struct abbrev_info *dwarf2_lookup_abbrev (unsigned int,
-                                         const struct comp_unit_head *cu_header);
+						 struct dwarf2_cu *);
 
 static char *read_partial_die (struct partial_die_info *,
-			       bfd *, char *,
-			       const struct comp_unit_head *);
+			       bfd *, char *, struct dwarf2_cu *);
 
 static char *read_full_die (struct die_info **, bfd *, char *,
-			    const struct comp_unit_head *, int *);
+			    struct dwarf2_cu *, int *);
 
 static char *read_attribute (struct attribute *, struct attr_abbrev *,
-			     bfd *, char *, const struct comp_unit_head *);
+			     bfd *, char *, struct dwarf2_cu *);
 
 static char *read_attribute_value (struct attribute *, unsigned,
-			     bfd *, char *, const struct comp_unit_head *);
+			     bfd *, char *, struct dwarf2_cu *);
 
 static unsigned int read_1_byte (bfd *, char *);
 
@@ -742,7 +751,7 @@ static unsigned int read_4_bytes (bfd *,
 
 static unsigned long read_8_bytes (bfd *, char *);
 
-static CORE_ADDR read_address (bfd *, char *ptr, const struct comp_unit_head *,
+static CORE_ADDR read_address (bfd *, char *ptr, struct dwarf2_cu *,
 			       int *bytes_read);
 
 static LONGEST read_initial_length (bfd *, char *,
@@ -772,122 +781,100 @@ static void free_line_header (struct lin
 
 static struct line_header *(dwarf_decode_line_header
                             (unsigned int offset,
-                             bfd *abfd,
-                             const struct comp_unit_head *cu_header));
+                             bfd *abfd, struct dwarf2_cu *cu));
 
 static void dwarf_decode_lines (struct line_header *, char *, bfd *,
-				const struct comp_unit_head *);
+				struct dwarf2_cu *);
 
 static void dwarf2_start_subfile (char *, char *);
 
 static struct symbol *new_symbol (struct die_info *, struct type *,
-				  struct objfile *, const struct comp_unit_head *);
+				  struct dwarf2_cu *);
 
 static void dwarf2_const_value (struct attribute *, struct symbol *,
-				struct objfile *, const struct comp_unit_head *);
+				struct dwarf2_cu *);
 
 static void dwarf2_const_value_data (struct attribute *attr,
 				     struct symbol *sym,
 				     int bits);
 
-static struct type *die_type (struct die_info *, struct objfile *,
-			      const struct comp_unit_head *);
+static struct type *die_type (struct die_info *, struct dwarf2_cu *);
 
-static struct type *die_containing_type (struct die_info *, struct objfile *,
-					 const struct comp_unit_head *);
+static struct type *die_containing_type (struct die_info *,
+					 struct dwarf2_cu *);
 
 #if 0
 static struct type *type_at_offset (unsigned int, struct objfile *);
 #endif
 
-static struct type *tag_type_to_type (struct die_info *, struct objfile *,
-				      const struct comp_unit_head *);
+static struct type *tag_type_to_type (struct die_info *, struct dwarf2_cu *);
 
-static void read_type_die (struct die_info *, struct objfile *,
-			   const struct comp_unit_head *);
+static void read_type_die (struct die_info *, struct dwarf2_cu *);
 
-static void read_typedef (struct die_info *, struct objfile *,
-			  const struct comp_unit_head *);
+static void read_typedef (struct die_info *, struct dwarf2_cu *);
 
-static void read_base_type (struct die_info *, struct objfile *);
+static void read_base_type (struct die_info *, struct dwarf2_cu *);
 
-static void read_file_scope (struct die_info *, struct objfile *,
-			     const struct comp_unit_head *);
+static void read_file_scope (struct die_info *, struct dwarf2_cu *);
 
-static void read_func_scope (struct die_info *, struct objfile *,
-			     const struct comp_unit_head *);
+static void read_func_scope (struct die_info *, struct dwarf2_cu *);
 
-static void read_lexical_block_scope (struct die_info *, struct objfile *,
-				      const struct comp_unit_head *);
+static void read_lexical_block_scope (struct die_info *, struct dwarf2_cu *);
 
 static int dwarf2_get_pc_bounds (struct die_info *,
-				 CORE_ADDR *, CORE_ADDR *, struct objfile *,
-				 const struct comp_unit_head *);
+				 CORE_ADDR *, CORE_ADDR *, struct dwarf2_cu *);
 
 static void dwarf2_add_field (struct field_info *, struct die_info *,
-			      struct objfile *, const struct comp_unit_head *);
+			      struct dwarf2_cu *);
 
 static void dwarf2_attach_fields_to_type (struct field_info *,
-					  struct type *, struct objfile *);
+					  struct type *, struct dwarf2_cu *);
 
 static void dwarf2_add_member_fn (struct field_info *,
 				  struct die_info *, struct type *,
-				  struct objfile *objfile,
-				  const struct comp_unit_head *);
+				  struct dwarf2_cu *);
 
 static void dwarf2_attach_fn_fields_to_type (struct field_info *,
-					     struct type *, struct objfile *);
+					     struct type *, struct dwarf2_cu *);
 
-static void read_structure_scope (struct die_info *, struct objfile *,
-				  const struct comp_unit_head *);
+static void read_structure_scope (struct die_info *, struct dwarf2_cu *);
 
-static void read_common_block (struct die_info *, struct objfile *,
-			       const struct comp_unit_head *);
+static void read_common_block (struct die_info *, struct dwarf2_cu *);
 
-static void read_namespace (struct die_info *die, struct objfile *objfile,
-			    const struct comp_unit_head *cu_header);
+static void read_namespace (struct die_info *die, struct dwarf2_cu *);
 
-static void read_enumeration (struct die_info *, struct objfile *,
-			      const struct comp_unit_head *);
+static void read_enumeration (struct die_info *, struct dwarf2_cu *);
 
-static struct type *dwarf_base_type (int, int, struct objfile *);
+static struct type *dwarf_base_type (int, int, struct dwarf2_cu *);
 
-static CORE_ADDR decode_locdesc (struct dwarf_block *, struct objfile *,
-				 const struct comp_unit_head *);
+static CORE_ADDR decode_locdesc (struct dwarf_block *, struct dwarf2_cu *);
 
-static void read_array_type (struct die_info *, struct objfile *,
-			     const struct comp_unit_head *);
+static void read_array_type (struct die_info *, struct dwarf2_cu *);
 
-static void read_tag_pointer_type (struct die_info *, struct objfile *,
-				   const struct comp_unit_head *);
+static void read_tag_pointer_type (struct die_info *, struct dwarf2_cu *);
 
-static void read_tag_ptr_to_member_type (struct die_info *, struct objfile *,
-					 const struct comp_unit_head *);
+static void read_tag_ptr_to_member_type (struct die_info *,
+					 struct dwarf2_cu *);
 
-static void read_tag_reference_type (struct die_info *, struct objfile *,
-				     const struct comp_unit_head *);
+static void read_tag_reference_type (struct die_info *, struct dwarf2_cu *);
 
-static void read_tag_const_type (struct die_info *, struct objfile *,
-				 const struct comp_unit_head *);
+static void read_tag_const_type (struct die_info *, struct dwarf2_cu *);
 
-static void read_tag_volatile_type (struct die_info *, struct objfile *,
-				    const struct comp_unit_head *);
+static void read_tag_volatile_type (struct die_info *, struct dwarf2_cu *);
 
-static void read_tag_string_type (struct die_info *, struct objfile *);
+static void read_tag_string_type (struct die_info *, struct dwarf2_cu *);
 
-static void read_subroutine_type (struct die_info *, struct objfile *,
-				  const struct comp_unit_head *);
+static void read_subroutine_type (struct die_info *, struct dwarf2_cu *);
 
-static struct die_info *read_comp_unit (char *, bfd *,
-                                        const struct comp_unit_head *);
+static struct die_info *read_comp_unit (char *, bfd *, struct dwarf2_cu *);
 
 static struct die_info *read_die_and_children (char *info_ptr, bfd *abfd,
-					       const struct comp_unit_head *,
+					       struct dwarf2_cu *,
 					       char **new_info_ptr,
 					       struct die_info *parent);
 
 static struct die_info *read_die_and_siblings (char *info_ptr, bfd *abfd,
-					       const struct comp_unit_head *,
+					       struct dwarf2_cu *,
 					       char **new_info_ptr,
 					       struct die_info *parent);
 
@@ -895,8 +882,7 @@ static void free_die_list (struct die_in
 
 static struct cleanup *make_cleanup_free_die_list (struct die_info *);
 
-static void process_die (struct die_info *, struct objfile *,
-			 const struct comp_unit_head *);
+static void process_die (struct die_info *, struct dwarf2_cu *);
 
 static char *dwarf2_linkage_name (struct die_info *);
 
@@ -953,15 +939,13 @@ static void initialize_cu_func_list (voi
 static void add_to_cu_func_list (const char *, CORE_ADDR, CORE_ADDR);
 
 static void dwarf_decode_macros (struct line_header *, unsigned int,
-                                 char *, bfd *, const struct comp_unit_head *,
-                                 struct objfile *);
+                                 char *, bfd *, struct dwarf2_cu *);
 
 static int attr_form_is_block (struct attribute *);
 
 static void
 dwarf2_symbol_mark_computed (struct attribute *attr, struct symbol *sym,
-			     const struct comp_unit_head *,
-			     struct objfile *objfile);
+			     struct dwarf2_cu *cu);
 
 /* Try to locate the sections we need for DWARF 2 debugging
    information and return true if we have enough to do something.  */
@@ -1283,44 +1267,46 @@ dwarf2_build_psymtabs_hard (struct objfi
      left at all should be sufficient.  */
   while (info_ptr < dwarf_info_buffer + dwarf_info_size)
     {
-      struct comp_unit_head cu_header;
+      struct dwarf2_cu cu;
       beg_of_comp_unit = info_ptr;
-      info_ptr = read_comp_unit_head (&cu_header, info_ptr, abfd);
 
-      if (cu_header.version != 2)
+      cu.objfile = objfile;
+      info_ptr = read_comp_unit_head (&cu.header, info_ptr, abfd);
+
+      if (cu.header.version != 2)
 	{
-	  error ("Dwarf Error: wrong version in compilation unit header (is %d, should be %d) [in module %s]", cu_header.version, 2, bfd_get_filename (abfd));
+	  error ("Dwarf Error: wrong version in compilation unit header (is %d, should be %d) [in module %s]", cu.header.version, 2, bfd_get_filename (abfd));
 	  return;
 	}
-      if (cu_header.abbrev_offset >= dwarf_abbrev_size)
+      if (cu.header.abbrev_offset >= dwarf_abbrev_size)
 	{
 	  error ("Dwarf Error: bad offset (0x%lx) in compilation unit header (offset 0x%lx + 6) [in module %s]",
-		 (long) cu_header.abbrev_offset,
+		 (long) cu.header.abbrev_offset,
 		 (long) (beg_of_comp_unit - dwarf_info_buffer),
 		 bfd_get_filename (abfd));
 	  return;
 	}
-      if (beg_of_comp_unit + cu_header.length + cu_header.initial_length_size
+      if (beg_of_comp_unit + cu.header.length + cu.header.initial_length_size
 	  > dwarf_info_buffer + dwarf_info_size)
 	{
 	  error ("Dwarf Error: bad length (0x%lx) in compilation unit header (offset 0x%lx + 0) [in module %s]",
-		 (long) cu_header.length,
+		 (long) cu.header.length,
 		 (long) (beg_of_comp_unit - dwarf_info_buffer),
 		 bfd_get_filename (abfd));
 	  return;
 	}
       /* Complete the cu_header */
-      cu_header.offset = beg_of_comp_unit - dwarf_info_buffer;
-      cu_header.first_die_ptr = info_ptr;
-      cu_header.cu_head_ptr = beg_of_comp_unit;
+      cu.header.offset = beg_of_comp_unit - dwarf_info_buffer;
+      cu.header.first_die_ptr = info_ptr;
+      cu.header.cu_head_ptr = beg_of_comp_unit;
 
       /* Read the abbrevs for this compilation unit into a table */
-      dwarf2_read_abbrevs (abfd, &cu_header);
-      make_cleanup (dwarf2_empty_abbrev_table, cu_header.dwarf2_abbrevs);
+      dwarf2_read_abbrevs (abfd, &cu);
+      make_cleanup (dwarf2_empty_abbrev_table, cu.header.dwarf2_abbrevs);
 
       /* Read the compilation unit die */
       info_ptr = read_partial_die (&comp_unit_die, abfd, info_ptr,
-				   &cu_header);
+				   &cu);
 
       /* Set the language we're debugging */
       set_cu_language (comp_unit_die.language);
@@ -1362,8 +1348,8 @@ dwarf2_build_psymtabs_hard (struct objfi
 	  lowpc = ((CORE_ADDR) -1);
 	  highpc = ((CORE_ADDR) 0);
 
-	  info_ptr = scan_partial_symbols (info_ptr, objfile, &lowpc, &highpc,
-					   &cu_header, NULL);
+	  info_ptr = scan_partial_symbols (info_ptr, &lowpc, &highpc,
+					   &cu, NULL);
 
 	  /* If we didn't find a lowpc, set it to highpc to avoid
 	     complaints from `maint check'.  */
@@ -1392,8 +1378,8 @@ dwarf2_build_psymtabs_hard (struct objfi
          also happen.) This happens in VxWorks.  */
       free_named_symtabs (pst->filename);
 
-      info_ptr = beg_of_comp_unit + cu_header.length 
-                                  + cu_header.initial_length_size;
+      info_ptr = beg_of_comp_unit + cu.header.length 
+                                  + cu.header.initial_length_size;
     }
   do_cleanups (back_to);
 }
@@ -1406,11 +1392,11 @@ dwarf2_build_psymtabs_hard (struct objfi
    previously encountered a DW_TAG_namespace.  */
 
 static char *
-scan_partial_symbols (char *info_ptr, struct objfile *objfile,
-		      CORE_ADDR *lowpc, CORE_ADDR *highpc,
-		      const struct comp_unit_head *cu_header,
+scan_partial_symbols (char *info_ptr, CORE_ADDR *lowpc,
+		      CORE_ADDR *highpc, struct dwarf2_cu *cu,
 		      const char *namespace)
 {
+  struct objfile *objfile = cu->objfile;
   bfd *abfd = objfile->obfd;
   struct partial_die_info pdi;
 
@@ -1424,7 +1410,7 @@ scan_partial_symbols (char *info_ptr, st
 	 inside the loop.  */
       int info_ptr_updated = 0;
 
-      info_ptr = read_partial_die (&pdi, abfd, info_ptr, cu_header);
+      info_ptr = read_partial_die (&pdi, abfd, info_ptr, cu);
 
       /* Anonymous namespaces have no name but have interesting
 	 children, so we need to look at them.  Ditto for anonymous
@@ -1448,7 +1434,7 @@ scan_partial_symbols (char *info_ptr, st
 		    }
 		  if (!pdi.is_declaration)
 		    {
-		      add_partial_symbol (&pdi, objfile, cu_header, namespace);
+		      add_partial_symbol (&pdi, cu, namespace);
 		    }
 		}
 	      break;
@@ -1459,14 +1445,13 @@ scan_partial_symbols (char *info_ptr, st
 	    case DW_TAG_structure_type:
 	      if (!pdi.is_declaration)
 		{
-		  add_partial_symbol (&pdi, objfile, cu_header, namespace);
+		  add_partial_symbol (&pdi, cu, namespace);
 		}
 	      break;
 	    case DW_TAG_enumeration_type:
 	      if (!pdi.is_declaration)
 		{
-		  info_ptr = add_partial_enumeration (&pdi, info_ptr,
-						      objfile, cu_header,
+		  info_ptr = add_partial_enumeration (&pdi, info_ptr, cu,
 						      namespace);
 		  info_ptr_updated = 1;
 		}
@@ -1474,7 +1459,7 @@ scan_partial_symbols (char *info_ptr, st
 	    case DW_TAG_base_type:
 	      /* File scope base type definitions are added to the partial
 	         symbol table.  */
-	      add_partial_symbol (&pdi, objfile, cu_header, namespace);
+	      add_partial_symbol (&pdi, cu, namespace);
 	      break;
 	    case DW_TAG_namespace:
 	      /* We've hit a DW_TAG_namespace entry, so we know this
@@ -1482,9 +1467,8 @@ scan_partial_symbols (char *info_ptr, st
 		 generates them; update NAMESPACE to reflect that.  */
 	      if (namespace == NULL)
 		namespace = "";
-	      info_ptr = add_partial_namespace (&pdi, info_ptr, objfile,
-						lowpc, highpc, cu_header,
-						namespace);
+	      info_ptr = add_partial_namespace (&pdi, info_ptr, lowpc, highpc,
+						cu, namespace);
 	      info_ptr_updated = 1;
 	      break;
 	    default:
@@ -1504,17 +1488,17 @@ scan_partial_symbols (char *info_ptr, st
 	 this seems like the easiest way to handle the issue.  */
 
       if (!info_ptr_updated)
-	  info_ptr = locate_pdi_sibling (&pdi, info_ptr, abfd, cu_header);
+	info_ptr = locate_pdi_sibling (&pdi, info_ptr, abfd, cu);
     }
 
   return info_ptr;
 }
 
 static void
-add_partial_symbol (struct partial_die_info *pdi, struct objfile *objfile,
-		    const struct comp_unit_head *cu_header,
-		    const char *namespace)
+add_partial_symbol (struct partial_die_info *pdi,
+		    struct dwarf2_cu *cu, const char *namespace)
 {
+  struct objfile *objfile = cu->objfile;
   CORE_ADDR addr = 0;
   const struct partial_symbol *psym = NULL;
 
@@ -1559,7 +1543,7 @@ add_partial_symbol (struct partial_die_i
 	     table building.  */
 
 	  if (pdi->locdesc)
-	    addr = decode_locdesc (pdi->locdesc, objfile, cu_header);
+	    addr = decode_locdesc (pdi->locdesc, cu);
 	  if (pdi->locdesc || pdi->has_type)
 	    psym = add_psymbol_to_list (pdi->name, strlen (pdi->name),
 					VAR_DOMAIN, LOC_STATIC,
@@ -1572,7 +1556,7 @@ add_partial_symbol (struct partial_die_i
 	  /* Static Variable. Skip symbols without location descriptors.  */
 	  if (pdi->locdesc == NULL)
 	    return;
-	  addr = decode_locdesc (pdi->locdesc, objfile, cu_header);
+	  addr = decode_locdesc (pdi->locdesc, cu);
 	  /*prim_record_minimal_symbol (pdi->name, addr + baseaddr,
 	     mst_file_data, objfile); */
 	  psym = add_psymbol_to_list (pdi->name, strlen (pdi->name),
@@ -1641,16 +1625,15 @@ add_partial_symbol (struct partial_die_i
 
 static char *
 add_partial_namespace (struct partial_die_info *pdi, char *info_ptr,
-		       struct objfile *objfile,
 		       CORE_ADDR *lowpc, CORE_ADDR *highpc,
-		       const struct comp_unit_head *cu_header,
-		       const char *namespace)
+		       struct dwarf2_cu *cu, const char *namespace)
 {
-  /* Calculate the full name of the namespace that we just entered.  */
-
+  struct objfile *objfile = cu->objfile;
   const char *new_name = pdi->name;
   char *full_name;
 
+  /* Calculate the full name of the namespace that we just entered.  */
+
   if (new_name == NULL)
     new_name = "(anonymous namespace)";
   full_name = alloca (strlen (namespace) + 2 + strlen (new_name) + 1);
@@ -1671,9 +1654,7 @@ add_partial_namespace (struct partial_di
   /* Now scan partial symbols in that namespace.  */
 
   if (pdi->has_children)
-    info_ptr = scan_partial_symbols (info_ptr, objfile,
-				     lowpc, highpc,
-				     cu_header, full_name);
+    info_ptr = scan_partial_symbols (info_ptr, lowpc, highpc, cu, full_name);
 
   return info_ptr;
 }
@@ -1682,25 +1663,24 @@ add_partial_namespace (struct partial_di
 
 static char *
 add_partial_enumeration (struct partial_die_info *enum_pdi, char *info_ptr,
-			 struct objfile *objfile,
-			 const struct comp_unit_head *cu_header,
-			 const char *namespace)
+			 struct dwarf2_cu *cu, const char *namespace)
 {
+  struct objfile *objfile = cu->objfile;
   bfd *abfd = objfile->obfd;
   struct partial_die_info pdi;
 
   if (enum_pdi->name != NULL)
-    add_partial_symbol (enum_pdi, objfile, cu_header, namespace);
+    add_partial_symbol (enum_pdi, cu, namespace);
   
   while (1)
     {
-      info_ptr = read_partial_die (&pdi, abfd, info_ptr, cu_header);
+      info_ptr = read_partial_die (&pdi, abfd, info_ptr, cu);
       if (pdi.tag == 0)
 	break;
       if (pdi.tag != DW_TAG_enumerator || pdi.name == NULL)
 	complaint (&symfile_complaints, "malformed enumerator DIE ignored");
       else
-	add_partial_symbol (&pdi, objfile, cu_header, namespace);
+	add_partial_symbol (&pdi, cu, namespace);
     }
 
   return info_ptr;
@@ -1711,7 +1691,7 @@ add_partial_enumeration (struct partial_
 
 static char *
 locate_pdi_sibling (struct partial_die_info *orig_pdi, char *info_ptr,
-		    bfd *abfd, const struct comp_unit_head *cu_header)
+		    bfd *abfd, struct dwarf2_cu *cu)
 {
   /* Do we know the sibling already?  */
   
@@ -1731,12 +1711,12 @@ locate_pdi_sibling (struct partial_die_i
     {
       struct partial_die_info pdi;
       
-      info_ptr = read_partial_die (&pdi, abfd, info_ptr, cu_header);
+      info_ptr = read_partial_die (&pdi, abfd, info_ptr, cu);
 
       if (pdi.tag == 0)
 	return info_ptr;
       else
-	info_ptr = locate_pdi_sibling (&pdi, info_ptr, abfd, cu_header);
+	info_ptr = locate_pdi_sibling (&pdi, info_ptr, abfd, cu);
     }
 }
 
@@ -1774,7 +1754,7 @@ psymtab_to_symtab_1 (struct partial_symt
 {
   struct objfile *objfile = pst->objfile;
   bfd *abfd = objfile->obfd;
-  struct comp_unit_head cu_header;
+  struct dwarf2_cu cu;
   struct die_info *dies;
   unsigned long offset;
   CORE_ADDR lowpc, highpc;
@@ -1809,14 +1789,16 @@ psymtab_to_symtab_1 (struct partial_symt
   buildsym_init ();
   make_cleanup (really_free_pendings, NULL);
 
+  cu.objfile = objfile;
+
   /* read in the comp_unit header  */
-  info_ptr = read_comp_unit_head (&cu_header, info_ptr, abfd);
+  info_ptr = read_comp_unit_head (&cu.header, info_ptr, abfd);
 
   /* Read the abbrevs for this compilation unit  */
-  dwarf2_read_abbrevs (abfd, &cu_header);
-  make_cleanup (dwarf2_empty_abbrev_table, cu_header.dwarf2_abbrevs);
+  dwarf2_read_abbrevs (abfd, &cu);
+  make_cleanup (dwarf2_empty_abbrev_table, cu.header.dwarf2_abbrevs);
 
-  dies = read_comp_unit (info_ptr, abfd, &cu_header);
+  dies = read_comp_unit (info_ptr, abfd, &cu);
 
   make_cleanup_free_die_list (dies);
 
@@ -1826,29 +1808,29 @@ psymtab_to_symtab_1 (struct partial_symt
      DW_AT_entry_pc.  It's been removed, but GCC still uses this for
      compilation units with discontinuous ranges.  */
 
-  cu_header.base_known = 0;
-  cu_header.base_address = 0;
+  cu.header.base_known = 0;
+  cu.header.base_address = 0;
 
   attr = dwarf_attr (dies, DW_AT_entry_pc);
   if (attr)
     {
-      cu_header.base_address = DW_ADDR (attr);
-      cu_header.base_known = 1;
+      cu.header.base_address = DW_ADDR (attr);
+      cu.header.base_known = 1;
     }
   else
     {
       attr = dwarf_attr (dies, DW_AT_low_pc);
       if (attr)
 	{
-	  cu_header.base_address = DW_ADDR (attr);
-	  cu_header.base_known = 1;
+	  cu.header.base_address = DW_ADDR (attr);
+	  cu.header.base_known = 1;
 	}
     }
 
   /* Do line number decoding in read_file_scope () */
-  process_die (dies, objfile, &cu_header);
+  process_die (dies, &cu);
 
-  if (!dwarf2_get_pc_bounds (dies, &lowpc, &highpc, objfile, &cu_header))
+  if (!dwarf2_get_pc_bounds (dies, &lowpc, &highpc, &cu))
     {
       /* Some compilers don't define a DW_AT_high_pc attribute for
          the compilation unit.   If the DW_AT_high_pc is missing,
@@ -1863,8 +1845,7 @@ psymtab_to_symtab_1 (struct partial_symt
 		{
 		  CORE_ADDR low, high;
 
-		  if (dwarf2_get_pc_bounds (child_die, &low, &high,
-					    objfile, &cu_header))
+		  if (dwarf2_get_pc_bounds (child_die, &low, &high, &cu))
 		    {
 		      highpc = max (highpc, high);
 		    }
@@ -1892,19 +1873,18 @@ psymtab_to_symtab_1 (struct partial_symt
 /* Process a die and its children.  */
 
 static void
-process_die (struct die_info *die, struct objfile *objfile,
-	     const struct comp_unit_head *cu_header)
+process_die (struct die_info *die, struct dwarf2_cu *cu)
 {
   switch (die->tag)
     {
     case DW_TAG_padding:
       break;
     case DW_TAG_compile_unit:
-      read_file_scope (die, objfile, cu_header);
+      read_file_scope (die, cu);
       break;
     case DW_TAG_subprogram:
-      read_subroutine_type (die, objfile, cu_header);
-      read_func_scope (die, objfile, cu_header);
+      read_subroutine_type (die, cu);
+      read_func_scope (die, cu);
       break;
     case DW_TAG_inlined_subroutine:
       /* FIXME:  These are ignored for now.
@@ -1914,44 +1894,44 @@ process_die (struct die_info *die, struc
     case DW_TAG_lexical_block:
     case DW_TAG_try_block:
     case DW_TAG_catch_block:
-      read_lexical_block_scope (die, objfile, cu_header);
+      read_lexical_block_scope (die, cu);
       break;
     case DW_TAG_class_type:
     case DW_TAG_structure_type:
     case DW_TAG_union_type:
-      read_structure_scope (die, objfile, cu_header);
+      read_structure_scope (die, cu);
       break;
     case DW_TAG_enumeration_type:
-      read_enumeration (die, objfile, cu_header);
+      read_enumeration (die, cu);
       break;
     case DW_TAG_subroutine_type:
-      read_subroutine_type (die, objfile, cu_header);
+      read_subroutine_type (die, cu);
       break;
     case DW_TAG_array_type:
-      read_array_type (die, objfile, cu_header);
+      read_array_type (die, cu);
       break;
     case DW_TAG_pointer_type:
-      read_tag_pointer_type (die, objfile, cu_header);
+      read_tag_pointer_type (die, cu);
       break;
     case DW_TAG_ptr_to_member_type:
-      read_tag_ptr_to_member_type (die, objfile, cu_header);
+      read_tag_ptr_to_member_type (die, cu);
       break;
     case DW_TAG_reference_type:
-      read_tag_reference_type (die, objfile, cu_header);
+      read_tag_reference_type (die, cu);
       break;
     case DW_TAG_string_type:
-      read_tag_string_type (die, objfile);
+      read_tag_string_type (die, cu);
       break;
     case DW_TAG_base_type:
-      read_base_type (die, objfile);
+      read_base_type (die, cu);
       if (dwarf_attr (die, DW_AT_name))
 	{
 	  /* Add a typedef symbol for the base type definition.  */
-	  new_symbol (die, die->type, objfile, cu_header);
+	  new_symbol (die, die->type, cu);
 	}
       break;
     case DW_TAG_common_block:
-      read_common_block (die, objfile, cu_header);
+      read_common_block (die, cu);
       break;
     case DW_TAG_common_inclusion:
       break;
@@ -1961,7 +1941,7 @@ process_die (struct die_info *die, struc
 	  processing_has_namespace_info = 1;
 	  processing_current_namespace = "";
 	}
-      read_namespace (die, objfile, cu_header);
+      read_namespace (die, cu);
       break;
     case DW_TAG_imported_declaration:
     case DW_TAG_imported_module:
@@ -1979,7 +1959,7 @@ process_die (struct die_info *die, struc
       gdb_assert (die->child == NULL);
       break;
     default:
-      new_symbol (die, NULL, objfile, cu_header);
+      new_symbol (die, NULL, cu);
       break;
     }
 }
@@ -1991,9 +1971,10 @@ initialize_cu_func_list (void)
 }
 
 static void
-read_file_scope (struct die_info *die, struct objfile *objfile,
-		 const struct comp_unit_head *cu_header)
+read_file_scope (struct die_info *die, struct dwarf2_cu *cu)
 {
+  struct objfile *objfile = cu->objfile;
+  struct comp_unit_head *cu_header = &cu->header;
   struct cleanup *back_to = make_cleanup (null_cleanup, 0);
   CORE_ADDR lowpc = ((CORE_ADDR) -1);
   CORE_ADDR highpc = ((CORE_ADDR) 0);
@@ -2004,7 +1985,7 @@ read_file_scope (struct die_info *die, s
   bfd *abfd = objfile->obfd;
   struct line_header *line_header = 0;
 
-  if (!dwarf2_get_pc_bounds (die, &lowpc, &highpc, objfile, cu_header))
+  if (!dwarf2_get_pc_bounds (die, &lowpc, &highpc, cu))
     {
       if (die->child != NULL)
 	{
@@ -2015,8 +1996,7 @@ read_file_scope (struct die_info *die, s
 		{
 		  CORE_ADDR low, high;
 
-		  if (dwarf2_get_pc_bounds (child_die, &low, &high,
-					    objfile, cu_header))
+		  if (dwarf2_get_pc_bounds (child_die, &low, &high, cu))
 		    {
 		      lowpc = min (lowpc, low);
 		      highpc = max (highpc, high);
@@ -2092,7 +2072,7 @@ read_file_scope (struct die_info *die, s
       child_die = die->child;
       while (child_die && child_die->tag)
 	{
-	  process_die (child_die, objfile, cu_header);
+	  process_die (child_die, cu);
 	  child_die = sibling_die (child_die);
 	}
     }
@@ -2102,13 +2082,12 @@ read_file_scope (struct die_info *die, s
   if (attr)
     {
       unsigned int line_offset = DW_UNSND (attr);
-      line_header = dwarf_decode_line_header (line_offset,
-                                              abfd, cu_header);
+      line_header = dwarf_decode_line_header (line_offset, abfd, cu);
       if (line_header)
         {
           make_cleanup ((make_cleanup_ftype *) free_line_header,
                         (void *) line_header);
-          dwarf_decode_lines (line_header, comp_dir, abfd, cu_header);
+          dwarf_decode_lines (line_header, comp_dir, abfd, cu);
         }
     }
 
@@ -2121,7 +2100,7 @@ read_file_scope (struct die_info *die, s
     {
       unsigned int macro_offset = DW_UNSND (attr);
       dwarf_decode_macros (line_header, macro_offset,
-                           comp_dir, abfd, cu_header, objfile);
+                           comp_dir, abfd, cu);
     }
   do_cleanups (back_to);
 }
@@ -2148,9 +2127,9 @@ add_to_cu_func_list (const char *name, C
 }
 
 static void
-read_func_scope (struct die_info *die, struct objfile *objfile,
-		 const struct comp_unit_head *cu_header)
+read_func_scope (struct die_info *die, struct dwarf2_cu *cu)
 {
+  struct objfile *objfile = cu->objfile;
   struct context_stack *new;
   CORE_ADDR lowpc;
   CORE_ADDR highpc;
@@ -2162,7 +2141,7 @@ read_func_scope (struct die_info *die, s
 
   /* Ignore functions with missing or empty names and functions with
      missing or invalid low and high pc attributes.  */
-  if (name == NULL || !dwarf2_get_pc_bounds (die, &lowpc, &highpc, objfile, cu_header))
+  if (name == NULL || !dwarf2_get_pc_bounds (die, &lowpc, &highpc, cu))
     return;
 
   lowpc += baseaddr;
@@ -2190,7 +2169,7 @@ read_func_scope (struct die_info *die, s
       /* Support the .debug_loc offsets */
       if (attr_form_is_block (attr))
         {
-          addr = decode_locdesc (DW_BLOCK (attr), objfile, cu_header);
+          addr = decode_locdesc (DW_BLOCK (attr), cu);
         }
       else if (attr->form == DW_FORM_data4 || attr->form == DW_FORM_data8)
         {
@@ -2217,13 +2196,13 @@ read_func_scope (struct die_info *die, s
     }
 
   new = push_context (0, lowpc);
-  new->name = new_symbol (die, die->type, objfile, cu_header);
+  new->name = new_symbol (die, die->type, cu);
 
   /* If there was a location expression for DW_AT_frame_base above,
      record it.  We still need to decode it above because not all
      symbols use location expressions exclusively.  */
   if (attr)
-    dwarf2_symbol_mark_computed (attr, new->name, cu_header, objfile);
+    dwarf2_symbol_mark_computed (attr, new->name, cu);
 
   list_in_scope = &local_symbols;
 
@@ -2232,7 +2211,7 @@ read_func_scope (struct die_info *die, s
       child_die = die->child;
       while (child_die && child_die->tag)
 	{
-	  process_die (child_die, objfile, cu_header);
+	  process_die (child_die, cu);
 	  child_die = sibling_die (child_die);
 	}
     }
@@ -2259,9 +2238,9 @@ read_func_scope (struct die_info *die, s
    a new scope, process the dies, and then close the scope.  */
 
 static void
-read_lexical_block_scope (struct die_info *die, struct objfile *objfile,
-			  const struct comp_unit_head *cu_header)
+read_lexical_block_scope (struct die_info *die, struct dwarf2_cu *cu)
 {
+  struct objfile *objfile = cu->objfile;
   struct context_stack *new;
   CORE_ADDR lowpc, highpc;
   struct die_info *child_die;
@@ -2271,7 +2250,7 @@ read_lexical_block_scope (struct die_inf
      as multiple lexical blocks?  Handling children in a sane way would
      be nasty.  Might be easier to properly extend generic blocks to 
      describe ranges.  */
-  if (!dwarf2_get_pc_bounds (die, &lowpc, &highpc, objfile, cu_header))
+  if (!dwarf2_get_pc_bounds (die, &lowpc, &highpc, cu))
     return;
   lowpc += baseaddr;
   highpc += baseaddr;
@@ -2282,7 +2261,7 @@ read_lexical_block_scope (struct die_inf
       child_die = die->child;
       while (child_die && child_die->tag)
 	{
-	  process_die (child_die, objfile, cu_header);
+	  process_die (child_die, cu);
 	  child_die = sibling_die (child_die);
 	}
     }
@@ -2301,9 +2280,10 @@ read_lexical_block_scope (struct die_inf
    discontinuous, i.e. derived from DW_AT_ranges information.  */
 static int
 dwarf2_get_pc_bounds (struct die_info *die, CORE_ADDR *lowpc,
-		      CORE_ADDR *highpc, struct objfile *objfile,
-		      const struct comp_unit_head *cu_header)
+		      CORE_ADDR *highpc, struct dwarf2_cu *cu)
 {
+  struct objfile *objfile = cu->objfile;
+  struct comp_unit_head *cu_header = &cu->header;
   struct attribute *attr;
   bfd *obfd = objfile->obfd;
   CORE_ADDR low = 0;
@@ -2338,7 +2318,6 @@ dwarf2_get_pc_bounds (struct die_info *d
 	  CORE_ADDR base;
 	  int found_base;
 	  int dummy;
-	  unsigned int i;
 	  char *buffer;
 	  CORE_ADDR marker;
 	  int low_set;
@@ -2356,13 +2335,12 @@ dwarf2_get_pc_bounds (struct die_info *d
 	  buffer = dwarf_ranges_buffer + offset;
 
 	  /* Read in the largest possible address.  */
-	  marker = read_address (obfd, buffer, cu_header, &dummy);
+	  marker = read_address (obfd, buffer, cu, &dummy);
 	  if ((marker & mask) == mask)
 	    {
 	      /* If we found the largest possible address, then
 		 read the base address.  */
-	      base = read_address (obfd, buffer + addr_size,
-				   cu_header, &dummy);
+	      base = read_address (obfd, buffer + addr_size, cu, &dummy);
 	      buffer += 2 * addr_size;
 	      offset += 2 * addr_size;
 	      found_base = 1;
@@ -2374,10 +2352,9 @@ dwarf2_get_pc_bounds (struct die_info *d
 	    {
 	      CORE_ADDR range_beginning, range_end;
 
-	      range_beginning = read_address (obfd, buffer,
-					      cu_header, &dummy);
+	      range_beginning = read_address (obfd, buffer, cu, &dummy);
 	      buffer += addr_size;
-	      range_end = read_address (obfd, buffer, cu_header, &dummy);
+	      range_end = read_address (obfd, buffer, cu, &dummy);
 	      buffer += addr_size;
 	      offset += 2 * addr_size;
 
@@ -2393,8 +2370,7 @@ dwarf2_get_pc_bounds (struct die_info *d
 		{
 		  /* If we found the largest possible address, then
 		     read the base address.  */
-		  base = read_address (obfd, buffer + addr_size,
-				       cu_header, &dummy);
+		  base = read_address (obfd, buffer + addr_size, cu, &dummy);
 		  found_base = 1;
 		  continue;
 		}
@@ -2462,9 +2438,9 @@ dwarf2_get_pc_bounds (struct die_info *d
 
 static void
 dwarf2_add_field (struct field_info *fip, struct die_info *die,
-		  struct objfile *objfile,
-		  const struct comp_unit_head *cu_header)
-{
+		  struct dwarf2_cu *cu)
+{ 
+  struct objfile *objfile = cu->objfile;
   struct nextfield *new_field;
   struct attribute *attr;
   struct field *fp;
@@ -2503,7 +2479,7 @@ dwarf2_add_field (struct field_info *fip
       /* Data member other than a C++ static data member.  */
       
       /* Get type of field.  */
-      fp->type = die_type (die, objfile, cu_header);
+      fp->type = die_type (die, cu);
 
       FIELD_STATIC_KIND (*fp) = 0;
 
@@ -2523,7 +2499,7 @@ dwarf2_add_field (struct field_info *fip
       if (attr)
 	{
 	  FIELD_BITPOS (*fp) =
-	    decode_locdesc (DW_BLOCK (attr), objfile, cu_header) * bits_per_byte;
+	    decode_locdesc (DW_BLOCK (attr), cu) * bits_per_byte;
 	}
       else
 	FIELD_BITPOS (*fp) = 0;
@@ -2609,7 +2585,7 @@ dwarf2_add_field (struct field_info *fip
 
       SET_FIELD_PHYSNAME (*fp, obsavestring (physname, strlen (physname),
 					     &objfile->type_obstack));
-      FIELD_TYPE (*fp) = die_type (die, objfile, cu_header);
+      FIELD_TYPE (*fp) = die_type (die, cu);
       FIELD_NAME (*fp) = obsavestring (fieldname, strlen (fieldname),
 				       &objfile->type_obstack);
     }
@@ -2618,11 +2594,11 @@ dwarf2_add_field (struct field_info *fip
       /* C++ base class field.  */
       attr = dwarf_attr (die, DW_AT_data_member_location);
       if (attr)
-	FIELD_BITPOS (*fp) = (decode_locdesc (DW_BLOCK (attr), objfile, cu_header)
+	FIELD_BITPOS (*fp) = (decode_locdesc (DW_BLOCK (attr), cu)
 			      * bits_per_byte);
       FIELD_BITSIZE (*fp) = 0;
       FIELD_STATIC_KIND (*fp) = 0;
-      FIELD_TYPE (*fp) = die_type (die, objfile, cu_header);
+      FIELD_TYPE (*fp) = die_type (die, cu);
       FIELD_NAME (*fp) = type_name_no_tag (fp->type);
       fip->nbaseclasses++;
     }
@@ -2632,7 +2608,7 @@ dwarf2_add_field (struct field_info *fip
 
 static void
 dwarf2_attach_fields_to_type (struct field_info *fip, struct type *type,
-			      struct objfile *objfile)
+			      struct dwarf2_cu *cu)
 {
   int nfields = fip->nfields;
 
@@ -2719,9 +2695,9 @@ dwarf2_attach_fields_to_type (struct fie
 
 static void
 dwarf2_add_member_fn (struct field_info *fip, struct die_info *die,
-		      struct type *type, struct objfile *objfile,
-		      const struct comp_unit_head *cu_header)
+		      struct type *type, struct dwarf2_cu *cu)
 {
+  struct objfile *objfile = cu->objfile;
   struct attribute *attr;
   struct fnfieldlist *flp;
   int i;
@@ -2784,7 +2760,6 @@ dwarf2_add_member_fn (struct field_info 
   fnp->type = alloc_type (objfile);
   if (die->type && TYPE_CODE (die->type) == TYPE_CODE_FUNC)
     {
-      struct type *return_type = TYPE_TARGET_TYPE (die->type);
       int nparams = TYPE_NFIELDS (die->type);
 
       /* TYPE is the domain of this method, and DIE->TYPE is the type
@@ -2810,7 +2785,7 @@ dwarf2_add_member_fn (struct field_info 
 
   /* Get fcontext from DW_AT_containing_type if present.  */
   if (dwarf_attr (die, DW_AT_containing_type) != NULL)
-    fnp->fcontext = die_containing_type (die, objfile, cu_header);
+    fnp->fcontext = die_containing_type (die, cu);
 
   /* dwarf2 doesn't have stubbed physical names, so the setting of is_const
      and is_volatile is irrelevant, as it is needed by gdb_mangle_name only.  */
@@ -2842,7 +2817,7 @@ dwarf2_add_member_fn (struct field_info 
       /* Support the .debug_loc offsets */
       if (attr_form_is_block (attr))
         {
-          fnp->voffset = decode_locdesc (DW_BLOCK (attr), objfile, cu_header) + 2;
+          fnp->voffset = decode_locdesc (DW_BLOCK (attr), cu) + 2;
         }
       else if (attr->form == DW_FORM_data4 || attr->form == DW_FORM_data8)
         {
@@ -2860,7 +2835,7 @@ dwarf2_add_member_fn (struct field_info 
 
 static void
 dwarf2_attach_fn_fields_to_type (struct field_info *fip, struct type *type,
-				 struct objfile *objfile)
+				 struct dwarf2_cu *cu)
 {
   struct fnfieldlist *flp;
   int total_length = 0;
@@ -2907,9 +2882,9 @@ dwarf2_attach_fn_fields_to_type (struct 
    suppresses creating a symbol table entry itself).  */
 
 static void
-read_structure_scope (struct die_info *die, struct objfile *objfile,
-		      const struct comp_unit_head *cu_header)
+read_structure_scope (struct die_info *die, struct dwarf2_cu *cu)
 {
+  struct objfile *objfile = cu->objfile;
   struct type *type;
   struct attribute *attr;
 
@@ -2974,32 +2949,32 @@ read_structure_scope (struct die_info *d
 		 all versions of G++ as of this writing (so through at
 		 least 3.2.1) incorrectly generate DW_TAG_variable
 		 tags for them instead.  */
-	      dwarf2_add_field (&fi, child_die, objfile, cu_header);
+	      dwarf2_add_field (&fi, child_die, cu);
 	    }
 	  else if (child_die->tag == DW_TAG_subprogram)
 	    {
 	      /* C++ member function. */
-	      process_die (child_die, objfile, cu_header);
-	      dwarf2_add_member_fn (&fi, child_die, type, objfile, cu_header);
+	      process_die (child_die, cu);
+	      dwarf2_add_member_fn (&fi, child_die, type, cu);
 	    }
 	  else if (child_die->tag == DW_TAG_inheritance)
 	    {
 	      /* C++ base class field.  */
-	      dwarf2_add_field (&fi, child_die, objfile, cu_header);
+	      dwarf2_add_field (&fi, child_die, cu);
 	    }
 	  else
 	    {
-	      process_die (child_die, objfile, cu_header);
+	      process_die (child_die, cu);
 	    }
 	  child_die = sibling_die (child_die);
 	}
 
       /* Attach fields and member functions to the type.  */
       if (fi.nfields)
-	dwarf2_attach_fields_to_type (&fi, type, objfile);
+	dwarf2_attach_fields_to_type (&fi, type, cu);
       if (fi.nfnfields)
 	{
-	  dwarf2_attach_fn_fields_to_type (&fi, type, objfile);
+	  dwarf2_attach_fn_fields_to_type (&fi, type, cu);
 
 	  /* Get the type which refers to the base class (possibly this
 	     class itself) which contains the vtable pointer for the current
@@ -3007,7 +2982,7 @@ read_structure_scope (struct die_info *d
 
 	  if (dwarf_attr (die, DW_AT_containing_type) != NULL)
 	    {
-	      struct type *t = die_containing_type (die, objfile, cu_header);
+	      struct type *t = die_containing_type (die, cu);
 
 	      TYPE_VPTR_BASETYPE (type) = t;
 	      if (type == t)
@@ -3045,7 +3020,7 @@ read_structure_scope (struct die_info *d
 	    }
 	}
 
-      new_symbol (die, type, objfile, cu_header);
+      new_symbol (die, type, cu);
 
       do_cleanups (back_to);
     }
@@ -3066,9 +3041,9 @@ read_structure_scope (struct die_info *d
    NOTE: We reverse the order of the element list.  */
 
 static void
-read_enumeration (struct die_info *die, struct objfile *objfile,
-		  const struct comp_unit_head *cu_header)
+read_enumeration (struct die_info *die, struct dwarf2_cu *cu)
 {
+  struct objfile *objfile = cu->objfile;
   struct die_info *child_die;
   struct type *type;
   struct field *fields;
@@ -3107,14 +3082,14 @@ read_enumeration (struct die_info *die, 
 	{
 	  if (child_die->tag != DW_TAG_enumerator)
 	    {
-	      process_die (child_die, objfile, cu_header);
+	      process_die (child_die, cu);
 	    }
 	  else
 	    {
 	      attr = dwarf_attr (child_die, DW_AT_name);
 	      if (attr)
 		{
-		  sym = new_symbol (child_die, type, objfile, cu_header);
+		  sym = new_symbol (child_die, type, cu);
 		  if (SYMBOL_VALUE (sym) < 0)
 		    unsigned_enum = 0;
 
@@ -3152,7 +3127,7 @@ read_enumeration (struct die_info *die, 
 	TYPE_FLAGS (type) |= TYPE_FLAG_UNSIGNED;
     }
   die->type = type;
-  new_symbol (die, type, objfile, cu_header);
+  new_symbol (die, type, cu);
 }
 
 /* Extract all information from a DW_TAG_array_type DIE and put it in
@@ -3160,9 +3135,9 @@ read_enumeration (struct die_info *die, 
    arrays.  */
 
 static void
-read_array_type (struct die_info *die, struct objfile *objfile,
-		 const struct comp_unit_head *cu_header)
+read_array_type (struct die_info *die, struct dwarf2_cu *cu)
 {
+  struct objfile *objfile = cu->objfile;
   struct die_info *child_die;
   struct type *type = NULL;
   struct type *element_type, *range_type, *index_type;
@@ -3177,7 +3152,7 @@ read_array_type (struct die_info *die, s
       return;
     }
 
-  element_type = die_type (die, objfile, cu_header);
+  element_type = die_type (die, cu);
 
   /* Irix 6.2 native cc creates array types without children for
      arrays with unspecified length.  */
@@ -3206,7 +3181,7 @@ read_array_type (struct die_info *die, s
 	      low = 1;
 	    }
 
-	  index_type = die_type (child_die, objfile, cu_header);
+	  index_type = die_type (child_die, cu);
 	  attr = dwarf_attr (child_die, DW_AT_lower_bound);
 	  if (attr)
 	    {
@@ -3316,8 +3291,7 @@ read_array_type (struct die_info *die, s
 /* First cut: install each common block member as a global variable.  */
 
 static void
-read_common_block (struct die_info *die, struct objfile *objfile,
-		   const struct comp_unit_head *cu_header)
+read_common_block (struct die_info *die, struct dwarf2_cu *cu)
 {
   struct die_info *child_die;
   struct attribute *attr;
@@ -3330,7 +3304,7 @@ read_common_block (struct die_info *die,
       /* Support the .debug_loc offsets */
       if (attr_form_is_block (attr))
         {
-          base = decode_locdesc (DW_BLOCK (attr), objfile, cu_header);
+          base = decode_locdesc (DW_BLOCK (attr), cu);
         }
       else if (attr->form == DW_FORM_data4 || attr->form == DW_FORM_data8)
         {
@@ -3347,12 +3321,12 @@ read_common_block (struct die_info *die,
       child_die = die->child;
       while (child_die && child_die->tag)
 	{
-	  sym = new_symbol (child_die, NULL, objfile, cu_header);
+	  sym = new_symbol (child_die, NULL, cu);
 	  attr = dwarf_attr (child_die, DW_AT_data_member_location);
 	  if (attr)
 	    {
 	      SYMBOL_VALUE_ADDRESS (sym) =
-		base + decode_locdesc (DW_BLOCK (attr), objfile, cu_header);
+		base + decode_locdesc (DW_BLOCK (attr), cu);
 	      add_symbol_to_list (sym, &global_symbols);
 	    }
 	  child_die = sibling_die (child_die);
@@ -3363,9 +3337,9 @@ read_common_block (struct die_info *die,
 /* Read a C++ namespace.  */
 
 static void
-read_namespace (struct die_info *die, struct objfile *objfile,
-		const struct comp_unit_head *cu_header)
+read_namespace (struct die_info *die, struct dwarf2_cu *cu)
 {
+  struct objfile *objfile = cu->objfile;
   const char *previous_namespace = processing_current_namespace;
   const char *name = NULL;
   int is_anonymous;
@@ -3422,7 +3396,7 @@ read_namespace (struct die_info *die, st
 			objfile);
       TYPE_TAG_NAME (type) = TYPE_NAME (type);
 
-      new_symbol (die, type, objfile, cu_header);
+      new_symbol (die, type, cu);
 
       if (is_anonymous)
 	cp_add_using_directive (processing_current_namespace,
@@ -3436,7 +3410,7 @@ read_namespace (struct die_info *die, st
       
       while (child_die && child_die->tag)
 	{
-	  process_die (child_die, objfile, cu_header);
+	  process_die (child_die, cu);
 	  child_die = sibling_die (child_die);
 	}
     }
@@ -3448,9 +3422,9 @@ read_namespace (struct die_info *die, st
    the user defined type vector.  */
 
 static void
-read_tag_pointer_type (struct die_info *die, struct objfile *objfile,
-		       const struct comp_unit_head *cu_header)
+read_tag_pointer_type (struct die_info *die, struct dwarf2_cu *cu)
 {
+  struct comp_unit_head *cu_header = &cu->header;
   struct type *type;
   struct attribute *attr_byte_size;
   struct attribute *attr_address_class;
@@ -3461,7 +3435,7 @@ read_tag_pointer_type (struct die_info *
       return;
     }
 
-  type = lookup_pointer_type (die_type (die, objfile, cu_header));
+  type = lookup_pointer_type (die_type (die, cu));
 
   attr_byte_size = dwarf_attr (die, DW_AT_byte_size);
   if (attr_byte_size)
@@ -3505,9 +3479,9 @@ read_tag_pointer_type (struct die_info *
    the user defined type vector.  */
 
 static void
-read_tag_ptr_to_member_type (struct die_info *die, struct objfile *objfile,
-			     const struct comp_unit_head *cu_header)
+read_tag_ptr_to_member_type (struct die_info *die, struct dwarf2_cu *cu)
 {
+  struct objfile *objfile = cu->objfile;
   struct type *type;
   struct type *to_type;
   struct type *domain;
@@ -3518,8 +3492,8 @@ read_tag_ptr_to_member_type (struct die_
     }
 
   type = alloc_type (objfile);
-  to_type = die_type (die, objfile, cu_header);
-  domain = die_containing_type (die, objfile, cu_header);
+  to_type = die_type (die, cu);
+  domain = die_containing_type (die, cu);
   smash_to_member_type (type, domain, to_type);
 
   die->type = type;
@@ -3529,9 +3503,9 @@ read_tag_ptr_to_member_type (struct die_
    the user defined type vector.  */
 
 static void
-read_tag_reference_type (struct die_info *die, struct objfile *objfile,
-			 const struct comp_unit_head *cu_header)
+read_tag_reference_type (struct die_info *die, struct dwarf2_cu *cu)
 {
+  struct comp_unit_head *cu_header = &cu->header;
   struct type *type;
   struct attribute *attr;
 
@@ -3540,7 +3514,7 @@ read_tag_reference_type (struct die_info
       return;
     }
 
-  type = lookup_reference_type (die_type (die, objfile, cu_header));
+  type = lookup_reference_type (die_type (die, cu));
   attr = dwarf_attr (die, DW_AT_byte_size);
   if (attr)
     {
@@ -3554,8 +3528,7 @@ read_tag_reference_type (struct die_info
 }
 
 static void
-read_tag_const_type (struct die_info *die, struct objfile *objfile,
-		     const struct comp_unit_head *cu_header)
+read_tag_const_type (struct die_info *die, struct dwarf2_cu *cu)
 {
   struct type *base_type;
 
@@ -3564,13 +3537,12 @@ read_tag_const_type (struct die_info *di
       return;
     }
 
-  base_type = die_type (die, objfile, cu_header);
+  base_type = die_type (die, cu);
   die->type = make_cv_type (1, TYPE_VOLATILE (base_type), base_type, 0);
 }
 
 static void
-read_tag_volatile_type (struct die_info *die, struct objfile *objfile,
-			const struct comp_unit_head *cu_header)
+read_tag_volatile_type (struct die_info *die, struct dwarf2_cu *cu)
 {
   struct type *base_type;
 
@@ -3579,7 +3551,7 @@ read_tag_volatile_type (struct die_info 
       return;
     }
 
-  base_type = die_type (die, objfile, cu_header);
+  base_type = die_type (die, cu);
   die->type = make_cv_type (TYPE_CONST (base_type), 1, base_type, 0);
 }
 
@@ -3589,8 +3561,9 @@ read_tag_volatile_type (struct die_info 
    attribute to reference it.  */
 
 static void
-read_tag_string_type (struct die_info *die, struct objfile *objfile)
+read_tag_string_type (struct die_info *die, struct dwarf2_cu *cu)
 {
+  struct objfile *objfile = cu->objfile;
   struct type *type, *range_type, *index_type, *char_type;
   struct attribute *attr;
   unsigned int length;
@@ -3646,8 +3619,7 @@ read_tag_string_type (struct die_info *d
  */
 
 static void
-read_subroutine_type (struct die_info *die, struct objfile *objfile,
-		      const struct comp_unit_head *cu_header)
+read_subroutine_type (struct die_info *die, struct dwarf2_cu *cu)
 {
   struct type *type;		/* Type that this function returns */
   struct type *ftype;		/* Function that returns above type */
@@ -3658,7 +3630,7 @@ read_subroutine_type (struct die_info *d
     {
       return;
     }
-  type = die_type (die, objfile, cu_header);
+  type = die_type (die, cu);
   ftype = lookup_function_type (type);
 
   /* All functions in C++ have prototypes.  */
@@ -3706,8 +3678,7 @@ read_subroutine_type (struct die_info *d
 		TYPE_FIELD_ARTIFICIAL (ftype, iparams) = DW_UNSND (attr);
 	      else
 		TYPE_FIELD_ARTIFICIAL (ftype, iparams) = 0;
-	      TYPE_FIELD_TYPE (ftype, iparams) = die_type (child_die, objfile,
-							   cu_header);
+	      TYPE_FIELD_TYPE (ftype, iparams) = die_type (child_die, cu);
 	      iparams++;
 	    }
 	  child_die = sibling_die (child_die);
@@ -3718,9 +3689,9 @@ read_subroutine_type (struct die_info *d
 }
 
 static void
-read_typedef (struct die_info *die, struct objfile *objfile,
-	      const struct comp_unit_head *cu_header)
+read_typedef (struct die_info *die, struct dwarf2_cu *cu)
 {
+  struct objfile *objfile = cu->objfile;
   struct attribute *attr;
   char *name = NULL;
 
@@ -3732,7 +3703,7 @@ read_typedef (struct die_info *die, stru
 	  name = DW_STRING (attr);
 	}
       die->type = init_type (TYPE_CODE_TYPEDEF, 0, TYPE_FLAG_TARGET_STUB, name, objfile);
-      TYPE_TARGET_TYPE (die->type) = die_type (die, objfile, cu_header);
+      TYPE_TARGET_TYPE (die->type) = die_type (die, cu);
     }
 }
 
@@ -3740,8 +3711,9 @@ read_typedef (struct die_info *die, stru
    it in the TYPE field of the die.  */
 
 static void
-read_base_type (struct die_info *die, struct objfile *objfile)
+read_base_type (struct die_info *die, struct dwarf2_cu *cu)
 {
+  struct objfile *objfile = cu->objfile;
   struct type *type;
   struct attribute *attr;
   int encoding = 0, size = 0;
@@ -3815,7 +3787,7 @@ read_base_type (struct die_info *die, st
     }
   else
     {
-      type = dwarf_base_type (encoding, size, objfile);
+      type = dwarf_base_type (encoding, size, cu);
     }
   die->type = type;
 }
@@ -3823,14 +3795,13 @@ read_base_type (struct die_info *die, st
 /* Read a whole compilation unit into a linked list of dies.  */
 
 static struct die_info *
-read_comp_unit (char *info_ptr, bfd *abfd,
-		const struct comp_unit_head *cu_header)
+read_comp_unit (char *info_ptr, bfd *abfd, struct dwarf2_cu *cu)
 {
   /* Reset die reference table; we are
      building new ones now.  */
   dwarf2_empty_hash_tables ();
 
-  return read_die_and_children (info_ptr, abfd, cu_header, &info_ptr, NULL);
+  return read_die_and_children (info_ptr, abfd, cu, &info_ptr, NULL);
 }
 
 /* Read a single die and all its descendents.  Set the die's sibling
@@ -3841,7 +3812,7 @@ read_comp_unit (char *info_ptr, bfd *abf
 
 static struct die_info *
 read_die_and_children (char *info_ptr, bfd *abfd,
-		       const struct comp_unit_head *cu_header,
+		       struct dwarf2_cu *cu,
 		       char **new_info_ptr,
 		       struct die_info *parent)
 {
@@ -3849,12 +3820,12 @@ read_die_and_children (char *info_ptr, b
   char *cur_ptr;
   int has_children;
 
-  cur_ptr = read_full_die (&die, abfd, info_ptr, cu_header, &has_children);
+  cur_ptr = read_full_die (&die, abfd, info_ptr, cu, &has_children);
   store_in_ref_table (die->offset, die);
 
   if (has_children)
     {
-      die->child = read_die_and_siblings (cur_ptr, abfd, cu_header,
+      die->child = read_die_and_siblings (cur_ptr, abfd, cu,
 					  new_info_ptr, die);
     }
   else
@@ -3874,7 +3845,7 @@ read_die_and_children (char *info_ptr, b
 
 static struct die_info *
 read_die_and_siblings (char *info_ptr, bfd *abfd,
-		       const struct comp_unit_head *cu_header,
+		       struct dwarf2_cu *cu,
 		       char **new_info_ptr,
 		       struct die_info *parent)
 {
@@ -3887,8 +3858,7 @@ read_die_and_siblings (char *info_ptr, b
   while (1)
     {
       struct die_info *die
-	= read_die_and_children (cur_ptr, abfd, cu_header,
-				 &cur_ptr, parent);
+	= read_die_and_children (cur_ptr, abfd, cu, &cur_ptr, parent);
 
       if (!first_die)
 	{
@@ -3978,8 +3948,9 @@ dwarf2_read_section (struct objfile *obj
    in a hash table.  */
 
 static void
-dwarf2_read_abbrevs (bfd *abfd, struct comp_unit_head *cu_header)
+dwarf2_read_abbrevs (bfd *abfd, struct dwarf2_cu *cu)
 {
+  struct comp_unit_head *cu_header = &cu->header;
   char *abbrev_ptr;
   struct abbrev_info *cur_abbrev;
   unsigned int abbrev_number, bytes_read, abbrev_name;
@@ -4043,7 +4014,7 @@ dwarf2_read_abbrevs (bfd *abfd, struct c
 	break;
       abbrev_number = read_unsigned_leb128 (abfd, abbrev_ptr, &bytes_read);
       abbrev_ptr += bytes_read;
-      if (dwarf2_lookup_abbrev (abbrev_number, cu_header) != NULL)
+      if (dwarf2_lookup_abbrev (abbrev_number, cu) != NULL)
 	break;
     }
 }
@@ -4077,8 +4048,9 @@ dwarf2_empty_abbrev_table (void *ptr_to_
 /* Lookup an abbrev_info structure in the abbrev hash table.  */
 
 static struct abbrev_info *
-dwarf2_lookup_abbrev (unsigned int number, const struct comp_unit_head *cu_header)
+dwarf2_lookup_abbrev (unsigned int number, struct dwarf2_cu *cu)
 {
+  struct comp_unit_head *cu_header = &cu->header;
   unsigned int hash_number;
   struct abbrev_info *abbrev;
 
@@ -4099,7 +4071,7 @@ dwarf2_lookup_abbrev (unsigned int numbe
 
 static char *
 read_partial_die (struct partial_die_info *part_die, bfd *abfd,
-		  char *info_ptr, const struct comp_unit_head *cu_header)
+		  char *info_ptr, struct dwarf2_cu *cu)
 {
   unsigned int abbrev_number, bytes_read, i;
   struct abbrev_info *abbrev;
@@ -4115,7 +4087,7 @@ read_partial_die (struct partial_die_inf
   if (!abbrev_number)
     return info_ptr;
 
-  abbrev = dwarf2_lookup_abbrev (abbrev_number, cu_header);
+  abbrev = dwarf2_lookup_abbrev (abbrev_number, cu);
   if (!abbrev)
     {
       error ("Dwarf Error: Could not find abbrev number %d [in module %s]", abbrev_number,
@@ -4128,8 +4100,7 @@ read_partial_die (struct partial_die_inf
 
   for (i = 0; i < abbrev->num_attrs; ++i)
     {
-      info_ptr = read_attribute (&attr, &abbrev->attrs[i], abfd,
-				 info_ptr, cu_header);
+      info_ptr = read_attribute (&attr, &abbrev->attrs[i], abfd, info_ptr, cu);
 
       /* Store the data if it is of an attribute we want to keep in a
          partial symbol table.  */
@@ -4206,10 +4177,9 @@ read_partial_die (struct partial_die_inf
     {
       struct partial_die_info spec_die;
       char *spec_ptr;
-      int dummy;
 
       spec_ptr = dwarf_info_buffer + dwarf2_get_ref_die_offset (&spec_attr);
-      read_partial_die (&spec_die, abfd, spec_ptr, cu_header);
+      read_partial_die (&spec_die, abfd, spec_ptr, cu);
       if (spec_die.name)
 	{
 	  part_die->name = spec_die.name;
@@ -4243,7 +4213,7 @@ read_partial_die (struct partial_die_inf
 
 static char *
 read_full_die (struct die_info **diep, bfd *abfd, char *info_ptr,
-	       const struct comp_unit_head *cu_header, int *has_children)
+	       struct dwarf2_cu *cu, int *has_children)
 {
   unsigned int abbrev_number, bytes_read, i, offset;
   struct abbrev_info *abbrev;
@@ -4263,7 +4233,7 @@ read_full_die (struct die_info **diep, b
       return info_ptr;
     }
 
-  abbrev = dwarf2_lookup_abbrev (abbrev_number, cu_header);
+  abbrev = dwarf2_lookup_abbrev (abbrev_number, cu);
   if (!abbrev)
     {
       error ("Dwarf Error: could not find abbrev number %d [in module %s]",
@@ -4283,7 +4253,7 @@ read_full_die (struct die_info **diep, b
   for (i = 0; i < abbrev->num_attrs; ++i)
     {
       info_ptr = read_attribute (&die->attrs[i], &abbrev->attrs[i],
-				 abfd, info_ptr, cu_header);
+				 abfd, info_ptr, cu);
     }
 
   *diep = die;
@@ -4295,9 +4265,10 @@ read_full_die (struct die_info **diep, b
 
 static char *
 read_attribute_value (struct attribute *attr, unsigned form,
-		bfd *abfd, char *info_ptr,
-		const struct comp_unit_head *cu_header)
+		      bfd *abfd, char *info_ptr,
+		      struct dwarf2_cu *cu)
 {
+  struct comp_unit_head *cu_header = &cu->header;
   unsigned int bytes_read;
   struct dwarf_block *blk;
 
@@ -4306,7 +4277,7 @@ read_attribute_value (struct attribute *
     {
     case DW_FORM_addr:
     case DW_FORM_ref_addr:
-      DW_ADDR (attr) = read_address (abfd, info_ptr, cu_header, &bytes_read);
+      DW_ADDR (attr) = read_address (abfd, info_ptr, cu, &bytes_read);
       info_ptr += bytes_read;
       break;
     case DW_FORM_block2:
@@ -4401,7 +4372,7 @@ read_attribute_value (struct attribute *
     case DW_FORM_indirect:
       form = read_unsigned_leb128 (abfd, info_ptr, &bytes_read);
       info_ptr += bytes_read;
-      info_ptr = read_attribute_value (attr, form, abfd, info_ptr, cu_header);
+      info_ptr = read_attribute_value (attr, form, abfd, info_ptr, cu);
       break;
     default:
       error ("Dwarf Error: Cannot handle %s in DWARF reader [in module %s]",
@@ -4415,11 +4386,10 @@ read_attribute_value (struct attribute *
 
 static char *
 read_attribute (struct attribute *attr, struct attr_abbrev *abbrev,
-		bfd *abfd, char *info_ptr,
-		const struct comp_unit_head *cu_header)
+		bfd *abfd, char *info_ptr, struct dwarf2_cu *cu)
 {
   attr->name = abbrev->name;
-  return read_attribute_value (attr, abbrev->form, abfd, info_ptr, cu_header);
+  return read_attribute_value (attr, abbrev->form, abfd, info_ptr, cu);
 }
 
 /* read dwarf information from a buffer */
@@ -4467,9 +4437,9 @@ read_8_bytes (bfd *abfd, char *buf)
 }
 
 static CORE_ADDR
-read_address (bfd *abfd, char *buf, const struct comp_unit_head *cu_header,
-	      int *bytes_read)
+read_address (bfd *abfd, char *buf, struct dwarf2_cu *cu, int *bytes_read)
 {
+  struct comp_unit_head *cu_header = &cu->header;
   CORE_ADDR retval = 0;
 
   if (cu_header->signed_addr_p)
@@ -4901,7 +4871,7 @@ add_file_name (struct line_header *lh,
    freed.  */
 static struct line_header *
 dwarf_decode_line_header (unsigned int offset, bfd *abfd,
-                          const struct comp_unit_head *cu_header)
+			  struct dwarf2_cu *cu)
 {
   struct cleanup *back_to;
   struct line_header *lh;
@@ -4942,7 +4912,7 @@ dwarf_decode_line_header (unsigned int o
   lh->statement_program_end = line_ptr + lh->total_length;
   lh->version = read_2_bytes (abfd, line_ptr);
   line_ptr += 2;
-  lh->header_length = read_offset (abfd, line_ptr, cu_header, &bytes_read);
+  lh->header_length = read_offset (abfd, line_ptr, &cu->header, &bytes_read);
   line_ptr += bytes_read;
   lh->minimum_instruction_length = read_1_byte (abfd, line_ptr);
   line_ptr += 1;
@@ -5050,12 +5020,11 @@ check_cu_functions (CORE_ADDR address)
 
 static void
 dwarf_decode_lines (struct line_header *lh, char *comp_dir, bfd *abfd,
-		    const struct comp_unit_head *cu_header)
+		    struct dwarf2_cu *cu)
 {
   char *line_ptr;
   char *line_end;
-  unsigned int i, bytes_read;
-  char *cur_dir;
+  unsigned int bytes_read;
   unsigned char op_code, extended_op, adj_opcode;
 
   line_ptr = lh->statement_program_start;
@@ -5118,7 +5087,7 @@ dwarf_decode_lines (struct line_header *
 		  record_line (current_subfile, 0, address);
 		  break;
 		case DW_LNE_set_address:
-		  address = read_address (abfd, line_ptr, cu_header, &bytes_read);
+		  address = read_address (abfd, line_ptr, cu, &bytes_read);
 		  line_ptr += bytes_read;
 		  address += baseaddr;
 		  break;
@@ -5262,9 +5231,11 @@ dwarf2_start_subfile (char *filename, ch
 
 static void
 var_decode_location (struct attribute *attr, struct symbol *sym,
-		     struct objfile *objfile,
-		     const struct comp_unit_head *cu_header)
+		     struct dwarf2_cu *cu)
 {
+  struct objfile *objfile = cu->objfile;
+  struct comp_unit_head *cu_header = &cu->header;
+
   /* NOTE drow/2003-01-30: There used to be a comment and some special
      code here to turn a symbol with DW_AT_external and a
      SYMBOL_VALUE_ADDRESS of 0 into a LOC_UNRESOLVED symbol.  This was
@@ -5295,8 +5266,7 @@ var_decode_location (struct attribute *a
       int dummy;
 
       SYMBOL_VALUE_ADDRESS (sym) =
-	read_address (objfile->obfd, DW_BLOCK (attr)->data + 1, cu_header,
-		      &dummy);
+	read_address (objfile->obfd, DW_BLOCK (attr)->data + 1, cu, &dummy);
       fixup_symbol_section (sym, objfile);
       SYMBOL_VALUE_ADDRESS (sym) += ANOFFSET (objfile->section_offsets,
 					      SYMBOL_SECTION (sym));
@@ -5311,7 +5281,7 @@ var_decode_location (struct attribute *a
      not be worthwhile.  I'm assuming that it isn't unless performance
      or memory numbers show me otherwise.  */
 
-  dwarf2_symbol_mark_computed (attr, sym, cu_header, objfile);
+  dwarf2_symbol_mark_computed (attr, sym, cu);
   SYMBOL_CLASS (sym) = LOC_COMPUTED;
 }
 
@@ -5322,14 +5292,13 @@ var_decode_location (struct attribute *a
    used the passed type.  */
 
 static struct symbol *
-new_symbol (struct die_info *die, struct type *type, struct objfile *objfile,
-	    const struct comp_unit_head *cu_header)
+new_symbol (struct die_info *die, struct type *type, struct dwarf2_cu *cu)
 {
+  struct objfile *objfile = cu->objfile;
   struct symbol *sym = NULL;
   char *name;
   struct attribute *attr = NULL;
   struct attribute *attr2 = NULL;
-  CORE_ADDR addr = 0;
 
   if (die->tag != DW_TAG_namespace)
     name = dwarf2_linkage_name (die);
@@ -5354,7 +5323,7 @@ new_symbol (struct die_info *die, struct
       if (type != NULL)
 	SYMBOL_TYPE (sym) = type;
       else
-	SYMBOL_TYPE (sym) = die_type (die, objfile, cu_header);
+	SYMBOL_TYPE (sym) = die_type (die, cu);
       attr = dwarf_attr (die, DW_AT_decl_line);
       if (attr)
 	{
@@ -5396,7 +5365,7 @@ new_symbol (struct die_info *die, struct
 	  attr = dwarf_attr (die, DW_AT_const_value);
 	  if (attr)
 	    {
-	      dwarf2_const_value (attr, sym, objfile, cu_header);
+	      dwarf2_const_value (attr, sym, cu);
 	      attr2 = dwarf_attr (die, DW_AT_external);
 	      if (attr2 && (DW_UNSND (attr2) != 0))
 		add_symbol_to_list (sym, &global_symbols);
@@ -5407,7 +5376,7 @@ new_symbol (struct die_info *die, struct
 	  attr = dwarf_attr (die, DW_AT_location);
 	  if (attr)
 	    {
-	      var_decode_location (attr, sym, objfile, cu_header);
+	      var_decode_location (attr, sym, cu);
 	      attr2 = dwarf_attr (die, DW_AT_external);
 	      if (attr2 && (DW_UNSND (attr2) != 0))
 		add_symbol_to_list (sym, &global_symbols);
@@ -5435,7 +5404,7 @@ new_symbol (struct die_info *die, struct
 	  attr = dwarf_attr (die, DW_AT_location);
 	  if (attr)
 	    {
-	      var_decode_location (attr, sym, objfile, cu_header);
+	      var_decode_location (attr, sym, cu);
 	      /* FIXME drow/2003-07-31: Is LOC_COMPUTED_ARG necessary?  */
 	      if (SYMBOL_CLASS (sym) == LOC_COMPUTED)
 		SYMBOL_CLASS (sym) = LOC_COMPUTED_ARG;
@@ -5443,7 +5412,7 @@ new_symbol (struct die_info *die, struct
 	  attr = dwarf_attr (die, DW_AT_const_value);
 	  if (attr)
 	    {
-	      dwarf2_const_value (attr, sym, objfile, cu_header);
+	      dwarf2_const_value (attr, sym, cu);
 	    }
 	  add_symbol_to_list (sym, list_in_scope);
 	  break;
@@ -5488,7 +5457,7 @@ new_symbol (struct die_info *die, struct
 	  attr = dwarf_attr (die, DW_AT_const_value);
 	  if (attr)
 	    {
-	      dwarf2_const_value (attr, sym, objfile, cu_header);
+	      dwarf2_const_value (attr, sym, cu);
 	    }
 	  add_symbol_to_list (sym, list_in_scope);
 	  break;
@@ -5513,9 +5482,10 @@ new_symbol (struct die_info *die, struct
 
 static void
 dwarf2_const_value (struct attribute *attr, struct symbol *sym,
-		    struct objfile *objfile,
-		    const struct comp_unit_head *cu_header)
+		    struct dwarf2_cu *cu)
 {
+  struct objfile *objfile = cu->objfile;
+  struct comp_unit_head *cu_header = &cu->header;
   struct dwarf_block *blk;
 
   switch (attr->form)
@@ -5614,8 +5584,7 @@ dwarf2_const_value_data (struct attribut
 /* Return the type of the die in question using its DW_AT_type attribute.  */
 
 static struct type *
-die_type (struct die_info *die, struct objfile *objfile,
-	  const struct comp_unit_head *cu_header)
+die_type (struct die_info *die, struct dwarf2_cu *cu)
 {
   struct type *type;
   struct attribute *type_attr;
@@ -5626,7 +5595,7 @@ die_type (struct die_info *die, struct o
   if (!type_attr)
     {
       /* A missing DW_AT_type represents a void type.  */
-      return dwarf2_fundamental_type (objfile, FT_VOID);
+      return dwarf2_fundamental_type (cu->objfile, FT_VOID);
     }
   else
     {
@@ -5635,16 +5604,16 @@ die_type (struct die_info *die, struct o
       if (!type_die)
 	{
 	  error ("Dwarf Error: Cannot find referent at offset %d [in module %s]", 
-			  ref, objfile->name);
+			  ref, cu->objfile->name);
 	  return NULL;
 	}
     }
-  type = tag_type_to_type (type_die, objfile, cu_header);
+  type = tag_type_to_type (type_die, cu);
   if (!type)
     {
       dump_die (type_die);
       error ("Dwarf Error: Problem turning type die at offset into gdb type [in module %s]",
-		      objfile->name);
+		      cu->objfile->name);
     }
   return type;
 }
@@ -5653,8 +5622,7 @@ die_type (struct die_info *die, struct o
    DW_AT_containing_type attribute.  */
 
 static struct type *
-die_containing_type (struct die_info *die, struct objfile *objfile,
-		     const struct comp_unit_head *cu_header)
+die_containing_type (struct die_info *die, struct dwarf2_cu *cu)
 {
   struct type *type = NULL;
   struct attribute *type_attr;
@@ -5669,24 +5637,24 @@ die_containing_type (struct die_info *di
       if (!type_die)
 	{
 	  error ("Dwarf Error: Cannot find referent at offset %d [in module %s]", ref, 
-			  objfile->name);
+			  cu->objfile->name);
 	  return NULL;
 	}
-      type = tag_type_to_type (type_die, objfile, cu_header);
+      type = tag_type_to_type (type_die, cu);
     }
   if (!type)
     {
       if (type_die)
 	dump_die (type_die);
       error ("Dwarf Error: Problem turning containing type into gdb type [in module %s]", 
-		      objfile->name);
+		      cu->objfile->name);
     }
   return type;
 }
 
 #if 0
 static struct type *
-type_at_offset (unsigned int offset, struct objfile *objfile)
+type_at_offset (unsigned int offset, struct dwarf2_cu *cu)
 {
   struct die_info *die;
   struct type *type;
@@ -5697,14 +5665,13 @@ type_at_offset (unsigned int offset, str
       error ("Dwarf Error: Cannot find type referent at offset %d.", offset);
       return NULL;
     }
-  type = tag_type_to_type (die, objfile);
+  type = tag_type_to_type (die, cu);
   return type;
 }
 #endif
 
 static struct type *
-tag_type_to_type (struct die_info *die, struct objfile *objfile,
-		  const struct comp_unit_head *cu_header)
+tag_type_to_type (struct die_info *die, struct dwarf2_cu *cu)
 {
   if (die->type)
     {
@@ -5712,61 +5679,60 @@ tag_type_to_type (struct die_info *die, 
     }
   else
     {
-      read_type_die (die, objfile, cu_header);
+      read_type_die (die, cu);
       if (!die->type)
 	{
 	  dump_die (die);
 	  error ("Dwarf Error: Cannot find type of die [in module %s]", 
-			  objfile->name);
+			  cu->objfile->name);
 	}
       return die->type;
     }
 }
 
 static void
-read_type_die (struct die_info *die, struct objfile *objfile,
-	       const struct comp_unit_head *cu_header)
+read_type_die (struct die_info *die, struct dwarf2_cu *cu)
 {
   switch (die->tag)
     {
     case DW_TAG_class_type:
     case DW_TAG_structure_type:
     case DW_TAG_union_type:
-      read_structure_scope (die, objfile, cu_header);
+      read_structure_scope (die, cu);
       break;
     case DW_TAG_enumeration_type:
-      read_enumeration (die, objfile, cu_header);
+      read_enumeration (die, cu);
       break;
     case DW_TAG_subprogram:
     case DW_TAG_subroutine_type:
-      read_subroutine_type (die, objfile, cu_header);
+      read_subroutine_type (die, cu);
       break;
     case DW_TAG_array_type:
-      read_array_type (die, objfile, cu_header);
+      read_array_type (die, cu);
       break;
     case DW_TAG_pointer_type:
-      read_tag_pointer_type (die, objfile, cu_header);
+      read_tag_pointer_type (die, cu);
       break;
     case DW_TAG_ptr_to_member_type:
-      read_tag_ptr_to_member_type (die, objfile, cu_header);
+      read_tag_ptr_to_member_type (die, cu);
       break;
     case DW_TAG_reference_type:
-      read_tag_reference_type (die, objfile, cu_header);
+      read_tag_reference_type (die, cu);
       break;
     case DW_TAG_const_type:
-      read_tag_const_type (die, objfile, cu_header);
+      read_tag_const_type (die, cu);
       break;
     case DW_TAG_volatile_type:
-      read_tag_volatile_type (die, objfile, cu_header);
+      read_tag_volatile_type (die, cu);
       break;
     case DW_TAG_string_type:
-      read_tag_string_type (die, objfile);
+      read_tag_string_type (die, cu);
       break;
     case DW_TAG_typedef:
-      read_typedef (die, objfile, cu_header);
+      read_typedef (die, cu);
       break;
     case DW_TAG_base_type:
-      read_base_type (die, objfile);
+      read_base_type (die, cu);
       break;
     default:
       complaint (&symfile_complaints, "unexepected tag in read_type_die: '%s'",
@@ -5776,8 +5742,10 @@ read_type_die (struct die_info *die, str
 }
 
 static struct type *
-dwarf_base_type (int encoding, int size, struct objfile *objfile)
+dwarf_base_type (int encoding, int size, struct dwarf2_cu *cu)
 {
+  struct objfile *objfile = cu->objfile;
+
   /* FIXME - this should not produce a new (struct type *)
      every time.  It should cache base types.  */
   struct type *type;
@@ -6941,9 +6909,10 @@ dwarf2_fundamental_type (struct objfile 
    Note that stack overflow is not yet handled.  */
 
 static CORE_ADDR
-decode_locdesc (struct dwarf_block *blk, struct objfile *objfile,
-		const struct comp_unit_head *cu_header)
+decode_locdesc (struct dwarf_block *blk, struct dwarf2_cu *cu)
 {
+  struct objfile *objfile = cu->objfile;
+  struct comp_unit_head *cu_header = &cu->header;
   int i;
   int size = blk->size;
   char *data = blk->data;
@@ -7110,7 +7079,7 @@ decode_locdesc (struct dwarf_block *blk,
 
 	case DW_OP_addr:
 	  stack[++stacki] = read_address (objfile->obfd, &data[i],
-					  cu_header, &bytes_read);
+					  cu, &bytes_read);
 	  i += bytes_read;
 	  break;
 
@@ -7482,8 +7451,7 @@ parse_macro_definition (struct macro_sou
 static void
 dwarf_decode_macros (struct line_header *lh, unsigned int offset,
                      char *comp_dir, bfd *abfd,
-                     const struct comp_unit_head *cu_header,
-                     struct objfile *objfile)
+                     struct dwarf2_cu *cu)
 {
   char *mac_ptr, *mac_end;
   struct macro_source_file *current_file = 0;
@@ -7559,7 +7527,7 @@ dwarf_decode_macros (struct line_header 
 
             current_file = macro_start_file (file, line,
                                              current_file, comp_dir,
-                                             lh, objfile);
+                                             lh, cu->objfile);
           }
           break;
 
@@ -7630,23 +7598,22 @@ attr_form_is_block (struct attribute *at
 
 static void
 dwarf2_symbol_mark_computed (struct attribute *attr, struct symbol *sym,
-			     const struct comp_unit_head *cu_header,
-			     struct objfile *objfile)
+			     struct dwarf2_cu *cu)
 {
   if (attr->form == DW_FORM_data4 || attr->form == DW_FORM_data8)
     {
       struct dwarf2_loclist_baton *baton;
 
-      baton = obstack_alloc (&objfile->symbol_obstack,
+      baton = obstack_alloc (&cu->objfile->symbol_obstack,
 			     sizeof (struct dwarf2_loclist_baton));
-      baton->objfile = objfile;
+      baton->objfile = cu->objfile;
 
       /* We don't know how long the location list is, but make sure we
 	 don't run off the edge of the section.  */
       baton->size = dwarf_loc_size - DW_UNSND (attr);
       baton->data = dwarf_loc_buffer + DW_UNSND (attr);
-      baton->base_address = cu_header->base_address;
-      if (cu_header->base_known == 0)
+      baton->base_address = cu->header.base_address;
+      if (cu->header.base_known == 0)
 	complaint (&symfile_complaints,
 		   "Location list used without specifying the CU base address.");
 
@@ -7657,9 +7624,9 @@ dwarf2_symbol_mark_computed (struct attr
     {
       struct dwarf2_locexpr_baton *baton;
 
-      baton = obstack_alloc (&objfile->symbol_obstack,
+      baton = obstack_alloc (&cu->objfile->symbol_obstack,
 			     sizeof (struct dwarf2_locexpr_baton));
-      baton->objfile = objfile;
+      baton->objfile = cu->objfile;
 
       if (attr_form_is_block (attr))
 	{


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

* Re: [RFA/dwarf] Pass some global state around
  2003-11-10 15:51 [RFA/dwarf] Pass some global state around Daniel Jacobowitz
@ 2003-11-10 16:55 ` David Carlton
  2003-11-11 21:41 ` Jim Blandy
  1 sibling, 0 replies; 4+ messages in thread
From: David Carlton @ 2003-11-10 16:55 UTC (permalink / raw)
  To: gdb-patches; +Cc: jimb

On Mon, 10 Nov 2003 10:50:49 -0500, Daniel Jacobowitz <drow@mvista.com> said:

> This is a cleanup that I've discussed with Jim before.  We create a new
> structure, dwarf2_cu, and pass it to just about everything.  Primary goals:
>   - Move some things that don't really belong in the comp_unit_head out of
>     that and into the new type.
>   - Move global state that shouldn't be global into the new type.
> The eventual goal is to eliminate most/all global state for the reading of a
> compilation unit, so that we can do more than one at a time.

Seems like a good idea to me - global state is bad, long argument
lists are bad, and arguments that frequently get passed around
together should be combined into a single data structure.

David Carlton
carlton@kealia.com


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

* Re: [RFA/dwarf] Pass some global state around
  2003-11-10 15:51 [RFA/dwarf] Pass some global state around Daniel Jacobowitz
  2003-11-10 16:55 ` David Carlton
@ 2003-11-11 21:41 ` Jim Blandy
  2003-11-12 17:12   ` Daniel Jacobowitz
  1 sibling, 1 reply; 4+ messages in thread
From: Jim Blandy @ 2003-11-11 21:41 UTC (permalink / raw)
  To: Daniel Jacobowitz; +Cc: gdb-patches


So, if I'm reading it right, this patch is almost entirely mechanical:

- Create a new dwarf2_cu type, which contains the CU header, and a
  pointer to the objfile.

- Create and initialize it at external entry points to dwarf2read.c.

- Replace all CU and objfile arguments with dwarf2_cu arguments;
  similarly for uses.

If that's correct, please go ahead and commit this.  However, it would
be nice if the ChangeLog entry were a little more like the description
I wrote above.


Daniel Jacobowitz <drow@mvista.com> writes:

> This is a cleanup that I've discussed with Jim before.  We create a new
> structure, dwarf2_cu, and pass it to just about everything.  Primary goals:
>   - Move some things that don't really belong in the comp_unit_head out of
>     that and into the new type.
>   - Move global state that shouldn't be global into the new type.
> The eventual goal is to eliminate most/all global state for the reading of a
> compilation unit, so that we can do more than one at a time.
> 
> I didn't get absolutely everything in the first pass; the patch was big
> enough as it is.  I did get some things that won't need any of the new data
> in dwarf2_cu (for instance, read_address), but I think that the consistency
> is worthwhile.  For instance, you might think that we don't need to pass
> around full compilation unit information for psymtab scanning - but that can
> call decode_locdesc.
> 
> OK?
> 
> -- 
> Daniel Jacobowitz
> MontaVista Software                         Debian GNU/Linux Developer
> 
> 2003-11-10  Daniel Jacobowitz <drow@mvista.com>
> 
> 	* dwarf2read.c (struct dwarf2_cu): New type.
> 
> 	(dwarf2_build_psymtabs_hard, scan_partial_symbols)
> 	(add_partial_symbol, add_partial_namespace, add_partial_enumeration)
> 	(locate_pdi_sibling, psymtab_to_symtab_1, process_die)
> 	(read_file_scope, read_func_scope)
> 	(read_lexical_block_scope, dwarf2_get_pc_bounds)
> 	(dwarf2_add_field, dwarf2_attach_fields_to_type)
> 	(dwarf2_add_member_fn, dwarf2_attach_fn_fields_to_type)
> 	(read_structure_scope, read_enumeration, read_array_type)
> 	(read_common_block, read_namespace, read_tag_pointer_type)
> 	(read_tag_ptr_to_member_type, read_tag_reference_type)
> 	(read_tag_const_type, read_tag_volatile_type, read_tag_string_type)
> 	(read_subroutine_type, read_typedef, read_base_type, read_comp_unit)
> 	(read_die_and_children, read_die_and_siblings, dwarf2_read_section)
> 	(dwarf2_read_abbrevs, dwarf2_lookup_abbrev, read_partial_die)
> 	(read_full_die. read_attribute_value, read_attribute)
> 	(read_address, dwarf_decode_line_header, dwarf_decode_lines)
> 	(var_decode_location, new_symbol, dwarf2_const_value, die_type)
> 	(die_containing_type, type_at_offset, tag_type_to_type)
> 	(read_type_die, dwarf_base_type, decode_locdesc, dwarf_decode_macros)
> 	(dwarf2_symbol_mark_computed): Use it.
> 
> Index: dwarf2read.c
> ===================================================================
> RCS file: /big/fsf/rsync/src-cvs/src/gdb/dwarf2read.c,v
> retrieving revision 1.111
> diff -u -p -r1.111 dwarf2read.c
> --- dwarf2read.c	8 Nov 2003 00:13:02 -0000	1.111
> +++ dwarf2read.c	10 Nov 2003 15:28:30 -0000
> @@ -230,6 +230,20 @@ struct comp_unit_head
>      int base_known;
>    };
>  
> +/* Internal state when decoding a particular compilation unit.  */
> +struct dwarf2_cu
> +{
> +  /* The objfile containing this compilation unit.  */
> +  struct objfile *objfile;
> +
> +  /* The header of the compilation unit.
> +
> +     FIXME drow/2003-11-10: Some of the things from the comp_unit_head
> +     should be moved to the dwarf2_cu structure; for instance the abbrevs
> +     hash table.  */
> +  struct comp_unit_head header;
> +};
> +
>  /* The line number information for a compilation unit (found in the
>     .debug_line section) begins with a "statement program header",
>     which contains the following information.  */
> @@ -678,32 +692,28 @@ static void dwarf2_build_psymtabs_easy (
>  
>  static void dwarf2_build_psymtabs_hard (struct objfile *, int);
>  
> -static char *scan_partial_symbols (char *, struct objfile *,
> -				   CORE_ADDR *, CORE_ADDR *,
> -				   const struct comp_unit_head *,
> +static char *scan_partial_symbols (char *, CORE_ADDR *, CORE_ADDR *,
> +				   struct dwarf2_cu *,
>  				   const char *namespace);
>  
> -static void add_partial_symbol (struct partial_die_info *, struct objfile *,
> -				const struct comp_unit_head *,
> +static void add_partial_symbol (struct partial_die_info *, struct dwarf2_cu *,
>  				const char *namespace);
>  
>  static char *add_partial_namespace (struct partial_die_info *pdi,
>  				    char *info_ptr,
> -				    struct objfile *objfile,
>  				    CORE_ADDR *lowpc, CORE_ADDR *highpc,
> -				    const struct comp_unit_head *cu_header,
> +				    struct dwarf2_cu *cu,
>  				    const char *namespace);
>  
>  static char *add_partial_enumeration (struct partial_die_info *enum_pdi,
>  				      char *info_ptr,
> -				      struct objfile *objfile,
> -				      const struct comp_unit_head *cu_header,
> +				      struct dwarf2_cu *cu,
>  				      const char *namespace);
>  
>  static char *locate_pdi_sibling (struct partial_die_info *orig_pdi,
>  				 char *info_ptr,
>  				 bfd *abfd,
> -				 const struct comp_unit_head *cu_header);
> +				 struct dwarf2_cu *cu);
>  
>  static void dwarf2_psymtab_to_symtab (struct partial_symtab *);
>  
> @@ -712,25 +722,24 @@ static void psymtab_to_symtab_1 (struct 
>  char *dwarf2_read_section (struct objfile *, file_ptr, unsigned int,
>  			   asection *);
>  
> -static void dwarf2_read_abbrevs (bfd *abfd, struct comp_unit_head *cu_header);
> +static void dwarf2_read_abbrevs (bfd *abfd, struct dwarf2_cu *cu);
>  
>  static void dwarf2_empty_abbrev_table (void *);
>  
>  static struct abbrev_info *dwarf2_lookup_abbrev (unsigned int,
> -                                         const struct comp_unit_head *cu_header);
> +						 struct dwarf2_cu *);
>  
>  static char *read_partial_die (struct partial_die_info *,
> -			       bfd *, char *,
> -			       const struct comp_unit_head *);
> +			       bfd *, char *, struct dwarf2_cu *);
>  
>  static char *read_full_die (struct die_info **, bfd *, char *,
> -			    const struct comp_unit_head *, int *);
> +			    struct dwarf2_cu *, int *);
>  
>  static char *read_attribute (struct attribute *, struct attr_abbrev *,
> -			     bfd *, char *, const struct comp_unit_head *);
> +			     bfd *, char *, struct dwarf2_cu *);
>  
>  static char *read_attribute_value (struct attribute *, unsigned,
> -			     bfd *, char *, const struct comp_unit_head *);
> +			     bfd *, char *, struct dwarf2_cu *);
>  
>  static unsigned int read_1_byte (bfd *, char *);
>  
> @@ -742,7 +751,7 @@ static unsigned int read_4_bytes (bfd *,
>  
>  static unsigned long read_8_bytes (bfd *, char *);
>  
> -static CORE_ADDR read_address (bfd *, char *ptr, const struct comp_unit_head *,
> +static CORE_ADDR read_address (bfd *, char *ptr, struct dwarf2_cu *,
>  			       int *bytes_read);
>  
>  static LONGEST read_initial_length (bfd *, char *,
> @@ -772,122 +781,100 @@ static void free_line_header (struct lin
>  
>  static struct line_header *(dwarf_decode_line_header
>                              (unsigned int offset,
> -                             bfd *abfd,
> -                             const struct comp_unit_head *cu_header));
> +                             bfd *abfd, struct dwarf2_cu *cu));
>  
>  static void dwarf_decode_lines (struct line_header *, char *, bfd *,
> -				const struct comp_unit_head *);
> +				struct dwarf2_cu *);
>  
>  static void dwarf2_start_subfile (char *, char *);
>  
>  static struct symbol *new_symbol (struct die_info *, struct type *,
> -				  struct objfile *, const struct comp_unit_head *);
> +				  struct dwarf2_cu *);
>  
>  static void dwarf2_const_value (struct attribute *, struct symbol *,
> -				struct objfile *, const struct comp_unit_head *);
> +				struct dwarf2_cu *);
>  
>  static void dwarf2_const_value_data (struct attribute *attr,
>  				     struct symbol *sym,
>  				     int bits);
>  
> -static struct type *die_type (struct die_info *, struct objfile *,
> -			      const struct comp_unit_head *);
> +static struct type *die_type (struct die_info *, struct dwarf2_cu *);
>  
> -static struct type *die_containing_type (struct die_info *, struct objfile *,
> -					 const struct comp_unit_head *);
> +static struct type *die_containing_type (struct die_info *,
> +					 struct dwarf2_cu *);
>  
>  #if 0
>  static struct type *type_at_offset (unsigned int, struct objfile *);
>  #endif
>  
> -static struct type *tag_type_to_type (struct die_info *, struct objfile *,
> -				      const struct comp_unit_head *);
> +static struct type *tag_type_to_type (struct die_info *, struct dwarf2_cu *);
>  
> -static void read_type_die (struct die_info *, struct objfile *,
> -			   const struct comp_unit_head *);
> +static void read_type_die (struct die_info *, struct dwarf2_cu *);
>  
> -static void read_typedef (struct die_info *, struct objfile *,
> -			  const struct comp_unit_head *);
> +static void read_typedef (struct die_info *, struct dwarf2_cu *);
>  
> -static void read_base_type (struct die_info *, struct objfile *);
> +static void read_base_type (struct die_info *, struct dwarf2_cu *);
>  
> -static void read_file_scope (struct die_info *, struct objfile *,
> -			     const struct comp_unit_head *);
> +static void read_file_scope (struct die_info *, struct dwarf2_cu *);
>  
> -static void read_func_scope (struct die_info *, struct objfile *,
> -			     const struct comp_unit_head *);
> +static void read_func_scope (struct die_info *, struct dwarf2_cu *);
>  
> -static void read_lexical_block_scope (struct die_info *, struct objfile *,
> -				      const struct comp_unit_head *);
> +static void read_lexical_block_scope (struct die_info *, struct dwarf2_cu *);
>  
>  static int dwarf2_get_pc_bounds (struct die_info *,
> -				 CORE_ADDR *, CORE_ADDR *, struct objfile *,
> -				 const struct comp_unit_head *);
> +				 CORE_ADDR *, CORE_ADDR *, struct dwarf2_cu *);
>  
>  static void dwarf2_add_field (struct field_info *, struct die_info *,
> -			      struct objfile *, const struct comp_unit_head *);
> +			      struct dwarf2_cu *);
>  
>  static void dwarf2_attach_fields_to_type (struct field_info *,
> -					  struct type *, struct objfile *);
> +					  struct type *, struct dwarf2_cu *);
>  
>  static void dwarf2_add_member_fn (struct field_info *,
>  				  struct die_info *, struct type *,
> -				  struct objfile *objfile,
> -				  const struct comp_unit_head *);
> +				  struct dwarf2_cu *);
>  
>  static void dwarf2_attach_fn_fields_to_type (struct field_info *,
> -					     struct type *, struct objfile *);
> +					     struct type *, struct dwarf2_cu *);
>  
> -static void read_structure_scope (struct die_info *, struct objfile *,
> -				  const struct comp_unit_head *);
> +static void read_structure_scope (struct die_info *, struct dwarf2_cu *);
>  
> -static void read_common_block (struct die_info *, struct objfile *,
> -			       const struct comp_unit_head *);
> +static void read_common_block (struct die_info *, struct dwarf2_cu *);
>  
> -static void read_namespace (struct die_info *die, struct objfile *objfile,
> -			    const struct comp_unit_head *cu_header);
> +static void read_namespace (struct die_info *die, struct dwarf2_cu *);
>  
> -static void read_enumeration (struct die_info *, struct objfile *,
> -			      const struct comp_unit_head *);
> +static void read_enumeration (struct die_info *, struct dwarf2_cu *);
>  
> -static struct type *dwarf_base_type (int, int, struct objfile *);
> +static struct type *dwarf_base_type (int, int, struct dwarf2_cu *);
>  
> -static CORE_ADDR decode_locdesc (struct dwarf_block *, struct objfile *,
> -				 const struct comp_unit_head *);
> +static CORE_ADDR decode_locdesc (struct dwarf_block *, struct dwarf2_cu *);
>  
> -static void read_array_type (struct die_info *, struct objfile *,
> -			     const struct comp_unit_head *);
> +static void read_array_type (struct die_info *, struct dwarf2_cu *);
>  
> -static void read_tag_pointer_type (struct die_info *, struct objfile *,
> -				   const struct comp_unit_head *);
> +static void read_tag_pointer_type (struct die_info *, struct dwarf2_cu *);
>  
> -static void read_tag_ptr_to_member_type (struct die_info *, struct objfile *,
> -					 const struct comp_unit_head *);
> +static void read_tag_ptr_to_member_type (struct die_info *,
> +					 struct dwarf2_cu *);
>  
> -static void read_tag_reference_type (struct die_info *, struct objfile *,
> -				     const struct comp_unit_head *);
> +static void read_tag_reference_type (struct die_info *, struct dwarf2_cu *);
>  
> -static void read_tag_const_type (struct die_info *, struct objfile *,
> -				 const struct comp_unit_head *);
> +static void read_tag_const_type (struct die_info *, struct dwarf2_cu *);
>  
> -static void read_tag_volatile_type (struct die_info *, struct objfile *,
> -				    const struct comp_unit_head *);
> +static void read_tag_volatile_type (struct die_info *, struct dwarf2_cu *);
>  
> -static void read_tag_string_type (struct die_info *, struct objfile *);
> +static void read_tag_string_type (struct die_info *, struct dwarf2_cu *);
>  
> -static void read_subroutine_type (struct die_info *, struct objfile *,
> -				  const struct comp_unit_head *);
> +static void read_subroutine_type (struct die_info *, struct dwarf2_cu *);
>  
> -static struct die_info *read_comp_unit (char *, bfd *,
> -                                        const struct comp_unit_head *);
> +static struct die_info *read_comp_unit (char *, bfd *, struct dwarf2_cu *);
>  
>  static struct die_info *read_die_and_children (char *info_ptr, bfd *abfd,
> -					       const struct comp_unit_head *,
> +					       struct dwarf2_cu *,
>  					       char **new_info_ptr,
>  					       struct die_info *parent);
>  
>  static struct die_info *read_die_and_siblings (char *info_ptr, bfd *abfd,
> -					       const struct comp_unit_head *,
> +					       struct dwarf2_cu *,
>  					       char **new_info_ptr,
>  					       struct die_info *parent);
>  
> @@ -895,8 +882,7 @@ static void free_die_list (struct die_in
>  
>  static struct cleanup *make_cleanup_free_die_list (struct die_info *);
>  
> -static void process_die (struct die_info *, struct objfile *,
> -			 const struct comp_unit_head *);
> +static void process_die (struct die_info *, struct dwarf2_cu *);
>  
>  static char *dwarf2_linkage_name (struct die_info *);
>  
> @@ -953,15 +939,13 @@ static void initialize_cu_func_list (voi
>  static void add_to_cu_func_list (const char *, CORE_ADDR, CORE_ADDR);
>  
>  static void dwarf_decode_macros (struct line_header *, unsigned int,
> -                                 char *, bfd *, const struct comp_unit_head *,
> -                                 struct objfile *);
> +                                 char *, bfd *, struct dwarf2_cu *);
>  
>  static int attr_form_is_block (struct attribute *);
>  
>  static void
>  dwarf2_symbol_mark_computed (struct attribute *attr, struct symbol *sym,
> -			     const struct comp_unit_head *,
> -			     struct objfile *objfile);
> +			     struct dwarf2_cu *cu);
>  
>  /* Try to locate the sections we need for DWARF 2 debugging
>     information and return true if we have enough to do something.  */
> @@ -1283,44 +1267,46 @@ dwarf2_build_psymtabs_hard (struct objfi
>       left at all should be sufficient.  */
>    while (info_ptr < dwarf_info_buffer + dwarf_info_size)
>      {
> -      struct comp_unit_head cu_header;
> +      struct dwarf2_cu cu;
>        beg_of_comp_unit = info_ptr;
> -      info_ptr = read_comp_unit_head (&cu_header, info_ptr, abfd);
>  
> -      if (cu_header.version != 2)
> +      cu.objfile = objfile;
> +      info_ptr = read_comp_unit_head (&cu.header, info_ptr, abfd);
> +
> +      if (cu.header.version != 2)
>  	{
> -	  error ("Dwarf Error: wrong version in compilation unit header (is %d, should be %d) [in module %s]", cu_header.version, 2, bfd_get_filename (abfd));
> +	  error ("Dwarf Error: wrong version in compilation unit header (is %d, should be %d) [in module %s]", cu.header.version, 2, bfd_get_filename (abfd));
>  	  return;
>  	}
> -      if (cu_header.abbrev_offset >= dwarf_abbrev_size)
> +      if (cu.header.abbrev_offset >= dwarf_abbrev_size)
>  	{
>  	  error ("Dwarf Error: bad offset (0x%lx) in compilation unit header (offset 0x%lx + 6) [in module %s]",
> -		 (long) cu_header.abbrev_offset,
> +		 (long) cu.header.abbrev_offset,
>  		 (long) (beg_of_comp_unit - dwarf_info_buffer),
>  		 bfd_get_filename (abfd));
>  	  return;
>  	}
> -      if (beg_of_comp_unit + cu_header.length + cu_header.initial_length_size
> +      if (beg_of_comp_unit + cu.header.length + cu.header.initial_length_size
>  	  > dwarf_info_buffer + dwarf_info_size)
>  	{
>  	  error ("Dwarf Error: bad length (0x%lx) in compilation unit header (offset 0x%lx + 0) [in module %s]",
> -		 (long) cu_header.length,
> +		 (long) cu.header.length,
>  		 (long) (beg_of_comp_unit - dwarf_info_buffer),
>  		 bfd_get_filename (abfd));
>  	  return;
>  	}
>        /* Complete the cu_header */
> -      cu_header.offset = beg_of_comp_unit - dwarf_info_buffer;
> -      cu_header.first_die_ptr = info_ptr;
> -      cu_header.cu_head_ptr = beg_of_comp_unit;
> +      cu.header.offset = beg_of_comp_unit - dwarf_info_buffer;
> +      cu.header.first_die_ptr = info_ptr;
> +      cu.header.cu_head_ptr = beg_of_comp_unit;
>  
>        /* Read the abbrevs for this compilation unit into a table */
> -      dwarf2_read_abbrevs (abfd, &cu_header);
> -      make_cleanup (dwarf2_empty_abbrev_table, cu_header.dwarf2_abbrevs);
> +      dwarf2_read_abbrevs (abfd, &cu);
> +      make_cleanup (dwarf2_empty_abbrev_table, cu.header.dwarf2_abbrevs);
>  
>        /* Read the compilation unit die */
>        info_ptr = read_partial_die (&comp_unit_die, abfd, info_ptr,
> -				   &cu_header);
> +				   &cu);
>  
>        /* Set the language we're debugging */
>        set_cu_language (comp_unit_die.language);
> @@ -1362,8 +1348,8 @@ dwarf2_build_psymtabs_hard (struct objfi
>  	  lowpc = ((CORE_ADDR) -1);
>  	  highpc = ((CORE_ADDR) 0);
>  
> -	  info_ptr = scan_partial_symbols (info_ptr, objfile, &lowpc, &highpc,
> -					   &cu_header, NULL);
> +	  info_ptr = scan_partial_symbols (info_ptr, &lowpc, &highpc,
> +					   &cu, NULL);
>  
>  	  /* If we didn't find a lowpc, set it to highpc to avoid
>  	     complaints from `maint check'.  */
> @@ -1392,8 +1378,8 @@ dwarf2_build_psymtabs_hard (struct objfi
>           also happen.) This happens in VxWorks.  */
>        free_named_symtabs (pst->filename);
>  
> -      info_ptr = beg_of_comp_unit + cu_header.length 
> -                                  + cu_header.initial_length_size;
> +      info_ptr = beg_of_comp_unit + cu.header.length 
> +                                  + cu.header.initial_length_size;
>      }
>    do_cleanups (back_to);
>  }
> @@ -1406,11 +1392,11 @@ dwarf2_build_psymtabs_hard (struct objfi
>     previously encountered a DW_TAG_namespace.  */
>  
>  static char *
> -scan_partial_symbols (char *info_ptr, struct objfile *objfile,
> -		      CORE_ADDR *lowpc, CORE_ADDR *highpc,
> -		      const struct comp_unit_head *cu_header,
> +scan_partial_symbols (char *info_ptr, CORE_ADDR *lowpc,
> +		      CORE_ADDR *highpc, struct dwarf2_cu *cu,
>  		      const char *namespace)
>  {
> +  struct objfile *objfile = cu->objfile;
>    bfd *abfd = objfile->obfd;
>    struct partial_die_info pdi;
>  
> @@ -1424,7 +1410,7 @@ scan_partial_symbols (char *info_ptr, st
>  	 inside the loop.  */
>        int info_ptr_updated = 0;
>  
> -      info_ptr = read_partial_die (&pdi, abfd, info_ptr, cu_header);
> +      info_ptr = read_partial_die (&pdi, abfd, info_ptr, cu);
>  
>        /* Anonymous namespaces have no name but have interesting
>  	 children, so we need to look at them.  Ditto for anonymous
> @@ -1448,7 +1434,7 @@ scan_partial_symbols (char *info_ptr, st
>  		    }
>  		  if (!pdi.is_declaration)
>  		    {
> -		      add_partial_symbol (&pdi, objfile, cu_header, namespace);
> +		      add_partial_symbol (&pdi, cu, namespace);
>  		    }
>  		}
>  	      break;
> @@ -1459,14 +1445,13 @@ scan_partial_symbols (char *info_ptr, st
>  	    case DW_TAG_structure_type:
>  	      if (!pdi.is_declaration)
>  		{
> -		  add_partial_symbol (&pdi, objfile, cu_header, namespace);
> +		  add_partial_symbol (&pdi, cu, namespace);
>  		}
>  	      break;
>  	    case DW_TAG_enumeration_type:
>  	      if (!pdi.is_declaration)
>  		{
> -		  info_ptr = add_partial_enumeration (&pdi, info_ptr,
> -						      objfile, cu_header,
> +		  info_ptr = add_partial_enumeration (&pdi, info_ptr, cu,
>  						      namespace);
>  		  info_ptr_updated = 1;
>  		}
> @@ -1474,7 +1459,7 @@ scan_partial_symbols (char *info_ptr, st
>  	    case DW_TAG_base_type:
>  	      /* File scope base type definitions are added to the partial
>  	         symbol table.  */
> -	      add_partial_symbol (&pdi, objfile, cu_header, namespace);
> +	      add_partial_symbol (&pdi, cu, namespace);
>  	      break;
>  	    case DW_TAG_namespace:
>  	      /* We've hit a DW_TAG_namespace entry, so we know this
> @@ -1482,9 +1467,8 @@ scan_partial_symbols (char *info_ptr, st
>  		 generates them; update NAMESPACE to reflect that.  */
>  	      if (namespace == NULL)
>  		namespace = "";
> -	      info_ptr = add_partial_namespace (&pdi, info_ptr, objfile,
> -						lowpc, highpc, cu_header,
> -						namespace);
> +	      info_ptr = add_partial_namespace (&pdi, info_ptr, lowpc, highpc,
> +						cu, namespace);
>  	      info_ptr_updated = 1;
>  	      break;
>  	    default:
> @@ -1504,17 +1488,17 @@ scan_partial_symbols (char *info_ptr, st
>  	 this seems like the easiest way to handle the issue.  */
>  
>        if (!info_ptr_updated)
> -	  info_ptr = locate_pdi_sibling (&pdi, info_ptr, abfd, cu_header);
> +	info_ptr = locate_pdi_sibling (&pdi, info_ptr, abfd, cu);
>      }
>  
>    return info_ptr;
>  }
>  
>  static void
> -add_partial_symbol (struct partial_die_info *pdi, struct objfile *objfile,
> -		    const struct comp_unit_head *cu_header,
> -		    const char *namespace)
> +add_partial_symbol (struct partial_die_info *pdi,
> +		    struct dwarf2_cu *cu, const char *namespace)
>  {
> +  struct objfile *objfile = cu->objfile;
>    CORE_ADDR addr = 0;
>    const struct partial_symbol *psym = NULL;
>  
> @@ -1559,7 +1543,7 @@ add_partial_symbol (struct partial_die_i
>  	     table building.  */
>  
>  	  if (pdi->locdesc)
> -	    addr = decode_locdesc (pdi->locdesc, objfile, cu_header);
> +	    addr = decode_locdesc (pdi->locdesc, cu);
>  	  if (pdi->locdesc || pdi->has_type)
>  	    psym = add_psymbol_to_list (pdi->name, strlen (pdi->name),
>  					VAR_DOMAIN, LOC_STATIC,
> @@ -1572,7 +1556,7 @@ add_partial_symbol (struct partial_die_i
>  	  /* Static Variable. Skip symbols without location descriptors.  */
>  	  if (pdi->locdesc == NULL)
>  	    return;
> -	  addr = decode_locdesc (pdi->locdesc, objfile, cu_header);
> +	  addr = decode_locdesc (pdi->locdesc, cu);
>  	  /*prim_record_minimal_symbol (pdi->name, addr + baseaddr,
>  	     mst_file_data, objfile); */
>  	  psym = add_psymbol_to_list (pdi->name, strlen (pdi->name),
> @@ -1641,16 +1625,15 @@ add_partial_symbol (struct partial_die_i
>  
>  static char *
>  add_partial_namespace (struct partial_die_info *pdi, char *info_ptr,
> -		       struct objfile *objfile,
>  		       CORE_ADDR *lowpc, CORE_ADDR *highpc,
> -		       const struct comp_unit_head *cu_header,
> -		       const char *namespace)
> +		       struct dwarf2_cu *cu, const char *namespace)
>  {
> -  /* Calculate the full name of the namespace that we just entered.  */
> -
> +  struct objfile *objfile = cu->objfile;
>    const char *new_name = pdi->name;
>    char *full_name;
>  
> +  /* Calculate the full name of the namespace that we just entered.  */
> +
>    if (new_name == NULL)
>      new_name = "(anonymous namespace)";
>    full_name = alloca (strlen (namespace) + 2 + strlen (new_name) + 1);
> @@ -1671,9 +1654,7 @@ add_partial_namespace (struct partial_di
>    /* Now scan partial symbols in that namespace.  */
>  
>    if (pdi->has_children)
> -    info_ptr = scan_partial_symbols (info_ptr, objfile,
> -				     lowpc, highpc,
> -				     cu_header, full_name);
> +    info_ptr = scan_partial_symbols (info_ptr, lowpc, highpc, cu, full_name);
>  
>    return info_ptr;
>  }
> @@ -1682,25 +1663,24 @@ add_partial_namespace (struct partial_di
>  
>  static char *
>  add_partial_enumeration (struct partial_die_info *enum_pdi, char *info_ptr,
> -			 struct objfile *objfile,
> -			 const struct comp_unit_head *cu_header,
> -			 const char *namespace)
> +			 struct dwarf2_cu *cu, const char *namespace)
>  {
> +  struct objfile *objfile = cu->objfile;
>    bfd *abfd = objfile->obfd;
>    struct partial_die_info pdi;
>  
>    if (enum_pdi->name != NULL)
> -    add_partial_symbol (enum_pdi, objfile, cu_header, namespace);
> +    add_partial_symbol (enum_pdi, cu, namespace);
>    
>    while (1)
>      {
> -      info_ptr = read_partial_die (&pdi, abfd, info_ptr, cu_header);
> +      info_ptr = read_partial_die (&pdi, abfd, info_ptr, cu);
>        if (pdi.tag == 0)
>  	break;
>        if (pdi.tag != DW_TAG_enumerator || pdi.name == NULL)
>  	complaint (&symfile_complaints, "malformed enumerator DIE ignored");
>        else
> -	add_partial_symbol (&pdi, objfile, cu_header, namespace);
> +	add_partial_symbol (&pdi, cu, namespace);
>      }
>  
>    return info_ptr;
> @@ -1711,7 +1691,7 @@ add_partial_enumeration (struct partial_
>  
>  static char *
>  locate_pdi_sibling (struct partial_die_info *orig_pdi, char *info_ptr,
> -		    bfd *abfd, const struct comp_unit_head *cu_header)
> +		    bfd *abfd, struct dwarf2_cu *cu)
>  {
>    /* Do we know the sibling already?  */
>    
> @@ -1731,12 +1711,12 @@ locate_pdi_sibling (struct partial_die_i
>      {
>        struct partial_die_info pdi;
>        
> -      info_ptr = read_partial_die (&pdi, abfd, info_ptr, cu_header);
> +      info_ptr = read_partial_die (&pdi, abfd, info_ptr, cu);
>  
>        if (pdi.tag == 0)
>  	return info_ptr;
>        else
> -	info_ptr = locate_pdi_sibling (&pdi, info_ptr, abfd, cu_header);
> +	info_ptr = locate_pdi_sibling (&pdi, info_ptr, abfd, cu);
>      }
>  }
>  
> @@ -1774,7 +1754,7 @@ psymtab_to_symtab_1 (struct partial_symt
>  {
>    struct objfile *objfile = pst->objfile;
>    bfd *abfd = objfile->obfd;
> -  struct comp_unit_head cu_header;
> +  struct dwarf2_cu cu;
>    struct die_info *dies;
>    unsigned long offset;
>    CORE_ADDR lowpc, highpc;
> @@ -1809,14 +1789,16 @@ psymtab_to_symtab_1 (struct partial_symt
>    buildsym_init ();
>    make_cleanup (really_free_pendings, NULL);
>  
> +  cu.objfile = objfile;
> +
>    /* read in the comp_unit header  */
> -  info_ptr = read_comp_unit_head (&cu_header, info_ptr, abfd);
> +  info_ptr = read_comp_unit_head (&cu.header, info_ptr, abfd);
>  
>    /* Read the abbrevs for this compilation unit  */
> -  dwarf2_read_abbrevs (abfd, &cu_header);
> -  make_cleanup (dwarf2_empty_abbrev_table, cu_header.dwarf2_abbrevs);
> +  dwarf2_read_abbrevs (abfd, &cu);
> +  make_cleanup (dwarf2_empty_abbrev_table, cu.header.dwarf2_abbrevs);
>  
> -  dies = read_comp_unit (info_ptr, abfd, &cu_header);
> +  dies = read_comp_unit (info_ptr, abfd, &cu);
>  
>    make_cleanup_free_die_list (dies);
>  
> @@ -1826,29 +1808,29 @@ psymtab_to_symtab_1 (struct partial_symt
>       DW_AT_entry_pc.  It's been removed, but GCC still uses this for
>       compilation units with discontinuous ranges.  */
>  
> -  cu_header.base_known = 0;
> -  cu_header.base_address = 0;
> +  cu.header.base_known = 0;
> +  cu.header.base_address = 0;
>  
>    attr = dwarf_attr (dies, DW_AT_entry_pc);
>    if (attr)
>      {
> -      cu_header.base_address = DW_ADDR (attr);
> -      cu_header.base_known = 1;
> +      cu.header.base_address = DW_ADDR (attr);
> +      cu.header.base_known = 1;
>      }
>    else
>      {
>        attr = dwarf_attr (dies, DW_AT_low_pc);
>        if (attr)
>  	{
> -	  cu_header.base_address = DW_ADDR (attr);
> -	  cu_header.base_known = 1;
> +	  cu.header.base_address = DW_ADDR (attr);
> +	  cu.header.base_known = 1;
>  	}
>      }
>  
>    /* Do line number decoding in read_file_scope () */
> -  process_die (dies, objfile, &cu_header);
> +  process_die (dies, &cu);
>  
> -  if (!dwarf2_get_pc_bounds (dies, &lowpc, &highpc, objfile, &cu_header))
> +  if (!dwarf2_get_pc_bounds (dies, &lowpc, &highpc, &cu))
>      {
>        /* Some compilers don't define a DW_AT_high_pc attribute for
>           the compilation unit.   If the DW_AT_high_pc is missing,
> @@ -1863,8 +1845,7 @@ psymtab_to_symtab_1 (struct partial_symt
>  		{
>  		  CORE_ADDR low, high;
>  
> -		  if (dwarf2_get_pc_bounds (child_die, &low, &high,
> -					    objfile, &cu_header))
> +		  if (dwarf2_get_pc_bounds (child_die, &low, &high, &cu))
>  		    {
>  		      highpc = max (highpc, high);
>  		    }
> @@ -1892,19 +1873,18 @@ psymtab_to_symtab_1 (struct partial_symt
>  /* Process a die and its children.  */
>  
>  static void
> -process_die (struct die_info *die, struct objfile *objfile,
> -	     const struct comp_unit_head *cu_header)
> +process_die (struct die_info *die, struct dwarf2_cu *cu)
>  {
>    switch (die->tag)
>      {
>      case DW_TAG_padding:
>        break;
>      case DW_TAG_compile_unit:
> -      read_file_scope (die, objfile, cu_header);
> +      read_file_scope (die, cu);
>        break;
>      case DW_TAG_subprogram:
> -      read_subroutine_type (die, objfile, cu_header);
> -      read_func_scope (die, objfile, cu_header);
> +      read_subroutine_type (die, cu);
> +      read_func_scope (die, cu);
>        break;
>      case DW_TAG_inlined_subroutine:
>        /* FIXME:  These are ignored for now.
> @@ -1914,44 +1894,44 @@ process_die (struct die_info *die, struc
>      case DW_TAG_lexical_block:
>      case DW_TAG_try_block:
>      case DW_TAG_catch_block:
> -      read_lexical_block_scope (die, objfile, cu_header);
> +      read_lexical_block_scope (die, cu);
>        break;
>      case DW_TAG_class_type:
>      case DW_TAG_structure_type:
>      case DW_TAG_union_type:
> -      read_structure_scope (die, objfile, cu_header);
> +      read_structure_scope (die, cu);
>        break;
>      case DW_TAG_enumeration_type:
> -      read_enumeration (die, objfile, cu_header);
> +      read_enumeration (die, cu);
>        break;
>      case DW_TAG_subroutine_type:
> -      read_subroutine_type (die, objfile, cu_header);
> +      read_subroutine_type (die, cu);
>        break;
>      case DW_TAG_array_type:
> -      read_array_type (die, objfile, cu_header);
> +      read_array_type (die, cu);
>        break;
>      case DW_TAG_pointer_type:
> -      read_tag_pointer_type (die, objfile, cu_header);
> +      read_tag_pointer_type (die, cu);
>        break;
>      case DW_TAG_ptr_to_member_type:
> -      read_tag_ptr_to_member_type (die, objfile, cu_header);
> +      read_tag_ptr_to_member_type (die, cu);
>        break;
>      case DW_TAG_reference_type:
> -      read_tag_reference_type (die, objfile, cu_header);
> +      read_tag_reference_type (die, cu);
>        break;
>      case DW_TAG_string_type:
> -      read_tag_string_type (die, objfile);
> +      read_tag_string_type (die, cu);
>        break;
>      case DW_TAG_base_type:
> -      read_base_type (die, objfile);
> +      read_base_type (die, cu);
>        if (dwarf_attr (die, DW_AT_name))
>  	{
>  	  /* Add a typedef symbol for the base type definition.  */
> -	  new_symbol (die, die->type, objfile, cu_header);
> +	  new_symbol (die, die->type, cu);
>  	}
>        break;
>      case DW_TAG_common_block:
> -      read_common_block (die, objfile, cu_header);
> +      read_common_block (die, cu);
>        break;
>      case DW_TAG_common_inclusion:
>        break;
> @@ -1961,7 +1941,7 @@ process_die (struct die_info *die, struc
>  	  processing_has_namespace_info = 1;
>  	  processing_current_namespace = "";
>  	}
> -      read_namespace (die, objfile, cu_header);
> +      read_namespace (die, cu);
>        break;
>      case DW_TAG_imported_declaration:
>      case DW_TAG_imported_module:
> @@ -1979,7 +1959,7 @@ process_die (struct die_info *die, struc
>        gdb_assert (die->child == NULL);
>        break;
>      default:
> -      new_symbol (die, NULL, objfile, cu_header);
> +      new_symbol (die, NULL, cu);
>        break;
>      }
>  }
> @@ -1991,9 +1971,10 @@ initialize_cu_func_list (void)
>  }
>  
>  static void
> -read_file_scope (struct die_info *die, struct objfile *objfile,
> -		 const struct comp_unit_head *cu_header)
> +read_file_scope (struct die_info *die, struct dwarf2_cu *cu)
>  {
> +  struct objfile *objfile = cu->objfile;
> +  struct comp_unit_head *cu_header = &cu->header;
>    struct cleanup *back_to = make_cleanup (null_cleanup, 0);
>    CORE_ADDR lowpc = ((CORE_ADDR) -1);
>    CORE_ADDR highpc = ((CORE_ADDR) 0);
> @@ -2004,7 +1985,7 @@ read_file_scope (struct die_info *die, s
>    bfd *abfd = objfile->obfd;
>    struct line_header *line_header = 0;
>  
> -  if (!dwarf2_get_pc_bounds (die, &lowpc, &highpc, objfile, cu_header))
> +  if (!dwarf2_get_pc_bounds (die, &lowpc, &highpc, cu))
>      {
>        if (die->child != NULL)
>  	{
> @@ -2015,8 +1996,7 @@ read_file_scope (struct die_info *die, s
>  		{
>  		  CORE_ADDR low, high;
>  
> -		  if (dwarf2_get_pc_bounds (child_die, &low, &high,
> -					    objfile, cu_header))
> +		  if (dwarf2_get_pc_bounds (child_die, &low, &high, cu))
>  		    {
>  		      lowpc = min (lowpc, low);
>  		      highpc = max (highpc, high);
> @@ -2092,7 +2072,7 @@ read_file_scope (struct die_info *die, s
>        child_die = die->child;
>        while (child_die && child_die->tag)
>  	{
> -	  process_die (child_die, objfile, cu_header);
> +	  process_die (child_die, cu);
>  	  child_die = sibling_die (child_die);
>  	}
>      }
> @@ -2102,13 +2082,12 @@ read_file_scope (struct die_info *die, s
>    if (attr)
>      {
>        unsigned int line_offset = DW_UNSND (attr);
> -      line_header = dwarf_decode_line_header (line_offset,
> -                                              abfd, cu_header);
> +      line_header = dwarf_decode_line_header (line_offset, abfd, cu);
>        if (line_header)
>          {
>            make_cleanup ((make_cleanup_ftype *) free_line_header,
>                          (void *) line_header);
> -          dwarf_decode_lines (line_header, comp_dir, abfd, cu_header);
> +          dwarf_decode_lines (line_header, comp_dir, abfd, cu);
>          }
>      }
>  
> @@ -2121,7 +2100,7 @@ read_file_scope (struct die_info *die, s
>      {
>        unsigned int macro_offset = DW_UNSND (attr);
>        dwarf_decode_macros (line_header, macro_offset,
> -                           comp_dir, abfd, cu_header, objfile);
> +                           comp_dir, abfd, cu);
>      }
>    do_cleanups (back_to);
>  }
> @@ -2148,9 +2127,9 @@ add_to_cu_func_list (const char *name, C
>  }
>  
>  static void
> -read_func_scope (struct die_info *die, struct objfile *objfile,
> -		 const struct comp_unit_head *cu_header)
> +read_func_scope (struct die_info *die, struct dwarf2_cu *cu)
>  {
> +  struct objfile *objfile = cu->objfile;
>    struct context_stack *new;
>    CORE_ADDR lowpc;
>    CORE_ADDR highpc;
> @@ -2162,7 +2141,7 @@ read_func_scope (struct die_info *die, s
>  
>    /* Ignore functions with missing or empty names and functions with
>       missing or invalid low and high pc attributes.  */
> -  if (name == NULL || !dwarf2_get_pc_bounds (die, &lowpc, &highpc, objfile, cu_header))
> +  if (name == NULL || !dwarf2_get_pc_bounds (die, &lowpc, &highpc, cu))
>      return;
>  
>    lowpc += baseaddr;
> @@ -2190,7 +2169,7 @@ read_func_scope (struct die_info *die, s
>        /* Support the .debug_loc offsets */
>        if (attr_form_is_block (attr))
>          {
> -          addr = decode_locdesc (DW_BLOCK (attr), objfile, cu_header);
> +          addr = decode_locdesc (DW_BLOCK (attr), cu);
>          }
>        else if (attr->form == DW_FORM_data4 || attr->form == DW_FORM_data8)
>          {
> @@ -2217,13 +2196,13 @@ read_func_scope (struct die_info *die, s
>      }
>  
>    new = push_context (0, lowpc);
> -  new->name = new_symbol (die, die->type, objfile, cu_header);
> +  new->name = new_symbol (die, die->type, cu);
>  
>    /* If there was a location expression for DW_AT_frame_base above,
>       record it.  We still need to decode it above because not all
>       symbols use location expressions exclusively.  */
>    if (attr)
> -    dwarf2_symbol_mark_computed (attr, new->name, cu_header, objfile);
> +    dwarf2_symbol_mark_computed (attr, new->name, cu);
>  
>    list_in_scope = &local_symbols;
>  
> @@ -2232,7 +2211,7 @@ read_func_scope (struct die_info *die, s
>        child_die = die->child;
>        while (child_die && child_die->tag)
>  	{
> -	  process_die (child_die, objfile, cu_header);
> +	  process_die (child_die, cu);
>  	  child_die = sibling_die (child_die);
>  	}
>      }
> @@ -2259,9 +2238,9 @@ read_func_scope (struct die_info *die, s
>     a new scope, process the dies, and then close the scope.  */
>  
>  static void
> -read_lexical_block_scope (struct die_info *die, struct objfile *objfile,
> -			  const struct comp_unit_head *cu_header)
> +read_lexical_block_scope (struct die_info *die, struct dwarf2_cu *cu)
>  {
> +  struct objfile *objfile = cu->objfile;
>    struct context_stack *new;
>    CORE_ADDR lowpc, highpc;
>    struct die_info *child_die;
> @@ -2271,7 +2250,7 @@ read_lexical_block_scope (struct die_inf
>       as multiple lexical blocks?  Handling children in a sane way would
>       be nasty.  Might be easier to properly extend generic blocks to 
>       describe ranges.  */
> -  if (!dwarf2_get_pc_bounds (die, &lowpc, &highpc, objfile, cu_header))
> +  if (!dwarf2_get_pc_bounds (die, &lowpc, &highpc, cu))
>      return;
>    lowpc += baseaddr;
>    highpc += baseaddr;
> @@ -2282,7 +2261,7 @@ read_lexical_block_scope (struct die_inf
>        child_die = die->child;
>        while (child_die && child_die->tag)
>  	{
> -	  process_die (child_die, objfile, cu_header);
> +	  process_die (child_die, cu);
>  	  child_die = sibling_die (child_die);
>  	}
>      }
> @@ -2301,9 +2280,10 @@ read_lexical_block_scope (struct die_inf
>     discontinuous, i.e. derived from DW_AT_ranges information.  */
>  static int
>  dwarf2_get_pc_bounds (struct die_info *die, CORE_ADDR *lowpc,
> -		      CORE_ADDR *highpc, struct objfile *objfile,
> -		      const struct comp_unit_head *cu_header)
> +		      CORE_ADDR *highpc, struct dwarf2_cu *cu)
>  {
> +  struct objfile *objfile = cu->objfile;
> +  struct comp_unit_head *cu_header = &cu->header;
>    struct attribute *attr;
>    bfd *obfd = objfile->obfd;
>    CORE_ADDR low = 0;
> @@ -2338,7 +2318,6 @@ dwarf2_get_pc_bounds (struct die_info *d
>  	  CORE_ADDR base;
>  	  int found_base;
>  	  int dummy;
> -	  unsigned int i;
>  	  char *buffer;
>  	  CORE_ADDR marker;
>  	  int low_set;
> @@ -2356,13 +2335,12 @@ dwarf2_get_pc_bounds (struct die_info *d
>  	  buffer = dwarf_ranges_buffer + offset;
>  
>  	  /* Read in the largest possible address.  */
> -	  marker = read_address (obfd, buffer, cu_header, &dummy);
> +	  marker = read_address (obfd, buffer, cu, &dummy);
>  	  if ((marker & mask) == mask)
>  	    {
>  	      /* If we found the largest possible address, then
>  		 read the base address.  */
> -	      base = read_address (obfd, buffer + addr_size,
> -				   cu_header, &dummy);
> +	      base = read_address (obfd, buffer + addr_size, cu, &dummy);
>  	      buffer += 2 * addr_size;
>  	      offset += 2 * addr_size;
>  	      found_base = 1;
> @@ -2374,10 +2352,9 @@ dwarf2_get_pc_bounds (struct die_info *d
>  	    {
>  	      CORE_ADDR range_beginning, range_end;
>  
> -	      range_beginning = read_address (obfd, buffer,
> -					      cu_header, &dummy);
> +	      range_beginning = read_address (obfd, buffer, cu, &dummy);
>  	      buffer += addr_size;
> -	      range_end = read_address (obfd, buffer, cu_header, &dummy);
> +	      range_end = read_address (obfd, buffer, cu, &dummy);
>  	      buffer += addr_size;
>  	      offset += 2 * addr_size;
>  
> @@ -2393,8 +2370,7 @@ dwarf2_get_pc_bounds (struct die_info *d
>  		{
>  		  /* If we found the largest possible address, then
>  		     read the base address.  */
> -		  base = read_address (obfd, buffer + addr_size,
> -				       cu_header, &dummy);
> +		  base = read_address (obfd, buffer + addr_size, cu, &dummy);
>  		  found_base = 1;
>  		  continue;
>  		}
> @@ -2462,9 +2438,9 @@ dwarf2_get_pc_bounds (struct die_info *d
>  
>  static void
>  dwarf2_add_field (struct field_info *fip, struct die_info *die,
> -		  struct objfile *objfile,
> -		  const struct comp_unit_head *cu_header)
> -{
> +		  struct dwarf2_cu *cu)
> +{ 
> +  struct objfile *objfile = cu->objfile;
>    struct nextfield *new_field;
>    struct attribute *attr;
>    struct field *fp;
> @@ -2503,7 +2479,7 @@ dwarf2_add_field (struct field_info *fip
>        /* Data member other than a C++ static data member.  */
>        
>        /* Get type of field.  */
> -      fp->type = die_type (die, objfile, cu_header);
> +      fp->type = die_type (die, cu);
>  
>        FIELD_STATIC_KIND (*fp) = 0;
>  
> @@ -2523,7 +2499,7 @@ dwarf2_add_field (struct field_info *fip
>        if (attr)
>  	{
>  	  FIELD_BITPOS (*fp) =
> -	    decode_locdesc (DW_BLOCK (attr), objfile, cu_header) * bits_per_byte;
> +	    decode_locdesc (DW_BLOCK (attr), cu) * bits_per_byte;
>  	}
>        else
>  	FIELD_BITPOS (*fp) = 0;
> @@ -2609,7 +2585,7 @@ dwarf2_add_field (struct field_info *fip
>  
>        SET_FIELD_PHYSNAME (*fp, obsavestring (physname, strlen (physname),
>  					     &objfile->type_obstack));
> -      FIELD_TYPE (*fp) = die_type (die, objfile, cu_header);
> +      FIELD_TYPE (*fp) = die_type (die, cu);
>        FIELD_NAME (*fp) = obsavestring (fieldname, strlen (fieldname),
>  				       &objfile->type_obstack);
>      }
> @@ -2618,11 +2594,11 @@ dwarf2_add_field (struct field_info *fip
>        /* C++ base class field.  */
>        attr = dwarf_attr (die, DW_AT_data_member_location);
>        if (attr)
> -	FIELD_BITPOS (*fp) = (decode_locdesc (DW_BLOCK (attr), objfile, cu_header)
> +	FIELD_BITPOS (*fp) = (decode_locdesc (DW_BLOCK (attr), cu)
>  			      * bits_per_byte);
>        FIELD_BITSIZE (*fp) = 0;
>        FIELD_STATIC_KIND (*fp) = 0;
> -      FIELD_TYPE (*fp) = die_type (die, objfile, cu_header);
> +      FIELD_TYPE (*fp) = die_type (die, cu);
>        FIELD_NAME (*fp) = type_name_no_tag (fp->type);
>        fip->nbaseclasses++;
>      }
> @@ -2632,7 +2608,7 @@ dwarf2_add_field (struct field_info *fip
>  
>  static void
>  dwarf2_attach_fields_to_type (struct field_info *fip, struct type *type,
> -			      struct objfile *objfile)
> +			      struct dwarf2_cu *cu)
>  {
>    int nfields = fip->nfields;
>  
> @@ -2719,9 +2695,9 @@ dwarf2_attach_fields_to_type (struct fie
>  
>  static void
>  dwarf2_add_member_fn (struct field_info *fip, struct die_info *die,
> -		      struct type *type, struct objfile *objfile,
> -		      const struct comp_unit_head *cu_header)
> +		      struct type *type, struct dwarf2_cu *cu)
>  {
> +  struct objfile *objfile = cu->objfile;
>    struct attribute *attr;
>    struct fnfieldlist *flp;
>    int i;
> @@ -2784,7 +2760,6 @@ dwarf2_add_member_fn (struct field_info 
>    fnp->type = alloc_type (objfile);
>    if (die->type && TYPE_CODE (die->type) == TYPE_CODE_FUNC)
>      {
> -      struct type *return_type = TYPE_TARGET_TYPE (die->type);
>        int nparams = TYPE_NFIELDS (die->type);
>  
>        /* TYPE is the domain of this method, and DIE->TYPE is the type
> @@ -2810,7 +2785,7 @@ dwarf2_add_member_fn (struct field_info 
>  
>    /* Get fcontext from DW_AT_containing_type if present.  */
>    if (dwarf_attr (die, DW_AT_containing_type) != NULL)
> -    fnp->fcontext = die_containing_type (die, objfile, cu_header);
> +    fnp->fcontext = die_containing_type (die, cu);
>  
>    /* dwarf2 doesn't have stubbed physical names, so the setting of is_const
>       and is_volatile is irrelevant, as it is needed by gdb_mangle_name only.  */
> @@ -2842,7 +2817,7 @@ dwarf2_add_member_fn (struct field_info 
>        /* Support the .debug_loc offsets */
>        if (attr_form_is_block (attr))
>          {
> -          fnp->voffset = decode_locdesc (DW_BLOCK (attr), objfile, cu_header) + 2;
> +          fnp->voffset = decode_locdesc (DW_BLOCK (attr), cu) + 2;
>          }
>        else if (attr->form == DW_FORM_data4 || attr->form == DW_FORM_data8)
>          {
> @@ -2860,7 +2835,7 @@ dwarf2_add_member_fn (struct field_info 
>  
>  static void
>  dwarf2_attach_fn_fields_to_type (struct field_info *fip, struct type *type,
> -				 struct objfile *objfile)
> +				 struct dwarf2_cu *cu)
>  {
>    struct fnfieldlist *flp;
>    int total_length = 0;
> @@ -2907,9 +2882,9 @@ dwarf2_attach_fn_fields_to_type (struct 
>     suppresses creating a symbol table entry itself).  */
>  
>  static void
> -read_structure_scope (struct die_info *die, struct objfile *objfile,
> -		      const struct comp_unit_head *cu_header)
> +read_structure_scope (struct die_info *die, struct dwarf2_cu *cu)
>  {
> +  struct objfile *objfile = cu->objfile;
>    struct type *type;
>    struct attribute *attr;
>  
> @@ -2974,32 +2949,32 @@ read_structure_scope (struct die_info *d
>  		 all versions of G++ as of this writing (so through at
>  		 least 3.2.1) incorrectly generate DW_TAG_variable
>  		 tags for them instead.  */
> -	      dwarf2_add_field (&fi, child_die, objfile, cu_header);
> +	      dwarf2_add_field (&fi, child_die, cu);
>  	    }
>  	  else if (child_die->tag == DW_TAG_subprogram)
>  	    {
>  	      /* C++ member function. */
> -	      process_die (child_die, objfile, cu_header);
> -	      dwarf2_add_member_fn (&fi, child_die, type, objfile, cu_header);
> +	      process_die (child_die, cu);
> +	      dwarf2_add_member_fn (&fi, child_die, type, cu);
>  	    }
>  	  else if (child_die->tag == DW_TAG_inheritance)
>  	    {
>  	      /* C++ base class field.  */
> -	      dwarf2_add_field (&fi, child_die, objfile, cu_header);
> +	      dwarf2_add_field (&fi, child_die, cu);
>  	    }
>  	  else
>  	    {
> -	      process_die (child_die, objfile, cu_header);
> +	      process_die (child_die, cu);
>  	    }
>  	  child_die = sibling_die (child_die);
>  	}
>  
>        /* Attach fields and member functions to the type.  */
>        if (fi.nfields)
> -	dwarf2_attach_fields_to_type (&fi, type, objfile);
> +	dwarf2_attach_fields_to_type (&fi, type, cu);
>        if (fi.nfnfields)
>  	{
> -	  dwarf2_attach_fn_fields_to_type (&fi, type, objfile);
> +	  dwarf2_attach_fn_fields_to_type (&fi, type, cu);
>  
>  	  /* Get the type which refers to the base class (possibly this
>  	     class itself) which contains the vtable pointer for the current
> @@ -3007,7 +2982,7 @@ read_structure_scope (struct die_info *d
>  
>  	  if (dwarf_attr (die, DW_AT_containing_type) != NULL)
>  	    {
> -	      struct type *t = die_containing_type (die, objfile, cu_header);
> +	      struct type *t = die_containing_type (die, cu);
>  
>  	      TYPE_VPTR_BASETYPE (type) = t;
>  	      if (type == t)
> @@ -3045,7 +3020,7 @@ read_structure_scope (struct die_info *d
>  	    }
>  	}
>  
> -      new_symbol (die, type, objfile, cu_header);
> +      new_symbol (die, type, cu);
>  
>        do_cleanups (back_to);
>      }
> @@ -3066,9 +3041,9 @@ read_structure_scope (struct die_info *d
>     NOTE: We reverse the order of the element list.  */
>  
>  static void
> -read_enumeration (struct die_info *die, struct objfile *objfile,
> -		  const struct comp_unit_head *cu_header)
> +read_enumeration (struct die_info *die, struct dwarf2_cu *cu)
>  {
> +  struct objfile *objfile = cu->objfile;
>    struct die_info *child_die;
>    struct type *type;
>    struct field *fields;
> @@ -3107,14 +3082,14 @@ read_enumeration (struct die_info *die, 
>  	{
>  	  if (child_die->tag != DW_TAG_enumerator)
>  	    {
> -	      process_die (child_die, objfile, cu_header);
> +	      process_die (child_die, cu);
>  	    }
>  	  else
>  	    {
>  	      attr = dwarf_attr (child_die, DW_AT_name);
>  	      if (attr)
>  		{
> -		  sym = new_symbol (child_die, type, objfile, cu_header);
> +		  sym = new_symbol (child_die, type, cu);
>  		  if (SYMBOL_VALUE (sym) < 0)
>  		    unsigned_enum = 0;
>  
> @@ -3152,7 +3127,7 @@ read_enumeration (struct die_info *die, 
>  	TYPE_FLAGS (type) |= TYPE_FLAG_UNSIGNED;
>      }
>    die->type = type;
> -  new_symbol (die, type, objfile, cu_header);
> +  new_symbol (die, type, cu);
>  }
>  
>  /* Extract all information from a DW_TAG_array_type DIE and put it in
> @@ -3160,9 +3135,9 @@ read_enumeration (struct die_info *die, 
>     arrays.  */
>  
>  static void
> -read_array_type (struct die_info *die, struct objfile *objfile,
> -		 const struct comp_unit_head *cu_header)
> +read_array_type (struct die_info *die, struct dwarf2_cu *cu)
>  {
> +  struct objfile *objfile = cu->objfile;
>    struct die_info *child_die;
>    struct type *type = NULL;
>    struct type *element_type, *range_type, *index_type;
> @@ -3177,7 +3152,7 @@ read_array_type (struct die_info *die, s
>        return;
>      }
>  
> -  element_type = die_type (die, objfile, cu_header);
> +  element_type = die_type (die, cu);
>  
>    /* Irix 6.2 native cc creates array types without children for
>       arrays with unspecified length.  */
> @@ -3206,7 +3181,7 @@ read_array_type (struct die_info *die, s
>  	      low = 1;
>  	    }
>  
> -	  index_type = die_type (child_die, objfile, cu_header);
> +	  index_type = die_type (child_die, cu);
>  	  attr = dwarf_attr (child_die, DW_AT_lower_bound);
>  	  if (attr)
>  	    {
> @@ -3316,8 +3291,7 @@ read_array_type (struct die_info *die, s
>  /* First cut: install each common block member as a global variable.  */
>  
>  static void
> -read_common_block (struct die_info *die, struct objfile *objfile,
> -		   const struct comp_unit_head *cu_header)
> +read_common_block (struct die_info *die, struct dwarf2_cu *cu)
>  {
>    struct die_info *child_die;
>    struct attribute *attr;
> @@ -3330,7 +3304,7 @@ read_common_block (struct die_info *die,
>        /* Support the .debug_loc offsets */
>        if (attr_form_is_block (attr))
>          {
> -          base = decode_locdesc (DW_BLOCK (attr), objfile, cu_header);
> +          base = decode_locdesc (DW_BLOCK (attr), cu);
>          }
>        else if (attr->form == DW_FORM_data4 || attr->form == DW_FORM_data8)
>          {
> @@ -3347,12 +3321,12 @@ read_common_block (struct die_info *die,
>        child_die = die->child;
>        while (child_die && child_die->tag)
>  	{
> -	  sym = new_symbol (child_die, NULL, objfile, cu_header);
> +	  sym = new_symbol (child_die, NULL, cu);
>  	  attr = dwarf_attr (child_die, DW_AT_data_member_location);
>  	  if (attr)
>  	    {
>  	      SYMBOL_VALUE_ADDRESS (sym) =
> -		base + decode_locdesc (DW_BLOCK (attr), objfile, cu_header);
> +		base + decode_locdesc (DW_BLOCK (attr), cu);
>  	      add_symbol_to_list (sym, &global_symbols);
>  	    }
>  	  child_die = sibling_die (child_die);
> @@ -3363,9 +3337,9 @@ read_common_block (struct die_info *die,
>  /* Read a C++ namespace.  */
>  
>  static void
> -read_namespace (struct die_info *die, struct objfile *objfile,
> -		const struct comp_unit_head *cu_header)
> +read_namespace (struct die_info *die, struct dwarf2_cu *cu)
>  {
> +  struct objfile *objfile = cu->objfile;
>    const char *previous_namespace = processing_current_namespace;
>    const char *name = NULL;
>    int is_anonymous;
> @@ -3422,7 +3396,7 @@ read_namespace (struct die_info *die, st
>  			objfile);
>        TYPE_TAG_NAME (type) = TYPE_NAME (type);
>  
> -      new_symbol (die, type, objfile, cu_header);
> +      new_symbol (die, type, cu);
>  
>        if (is_anonymous)
>  	cp_add_using_directive (processing_current_namespace,
> @@ -3436,7 +3410,7 @@ read_namespace (struct die_info *die, st
>        
>        while (child_die && child_die->tag)
>  	{
> -	  process_die (child_die, objfile, cu_header);
> +	  process_die (child_die, cu);
>  	  child_die = sibling_die (child_die);
>  	}
>      }
> @@ -3448,9 +3422,9 @@ read_namespace (struct die_info *die, st
>     the user defined type vector.  */
>  
>  static void
> -read_tag_pointer_type (struct die_info *die, struct objfile *objfile,
> -		       const struct comp_unit_head *cu_header)
> +read_tag_pointer_type (struct die_info *die, struct dwarf2_cu *cu)
>  {
> +  struct comp_unit_head *cu_header = &cu->header;
>    struct type *type;
>    struct attribute *attr_byte_size;
>    struct attribute *attr_address_class;
> @@ -3461,7 +3435,7 @@ read_tag_pointer_type (struct die_info *
>        return;
>      }
>  
> -  type = lookup_pointer_type (die_type (die, objfile, cu_header));
> +  type = lookup_pointer_type (die_type (die, cu));
>  
>    attr_byte_size = dwarf_attr (die, DW_AT_byte_size);
>    if (attr_byte_size)
> @@ -3505,9 +3479,9 @@ read_tag_pointer_type (struct die_info *
>     the user defined type vector.  */
>  
>  static void
> -read_tag_ptr_to_member_type (struct die_info *die, struct objfile *objfile,
> -			     const struct comp_unit_head *cu_header)
> +read_tag_ptr_to_member_type (struct die_info *die, struct dwarf2_cu *cu)
>  {
> +  struct objfile *objfile = cu->objfile;
>    struct type *type;
>    struct type *to_type;
>    struct type *domain;
> @@ -3518,8 +3492,8 @@ read_tag_ptr_to_member_type (struct die_
>      }
>  
>    type = alloc_type (objfile);
> -  to_type = die_type (die, objfile, cu_header);
> -  domain = die_containing_type (die, objfile, cu_header);
> +  to_type = die_type (die, cu);
> +  domain = die_containing_type (die, cu);
>    smash_to_member_type (type, domain, to_type);
>  
>    die->type = type;
> @@ -3529,9 +3503,9 @@ read_tag_ptr_to_member_type (struct die_
>     the user defined type vector.  */
>  
>  static void
> -read_tag_reference_type (struct die_info *die, struct objfile *objfile,
> -			 const struct comp_unit_head *cu_header)
> +read_tag_reference_type (struct die_info *die, struct dwarf2_cu *cu)
>  {
> +  struct comp_unit_head *cu_header = &cu->header;
>    struct type *type;
>    struct attribute *attr;
>  
> @@ -3540,7 +3514,7 @@ read_tag_reference_type (struct die_info
>        return;
>      }
>  
> -  type = lookup_reference_type (die_type (die, objfile, cu_header));
> +  type = lookup_reference_type (die_type (die, cu));
>    attr = dwarf_attr (die, DW_AT_byte_size);
>    if (attr)
>      {
> @@ -3554,8 +3528,7 @@ read_tag_reference_type (struct die_info
>  }
>  
>  static void
> -read_tag_const_type (struct die_info *die, struct objfile *objfile,
> -		     const struct comp_unit_head *cu_header)
> +read_tag_const_type (struct die_info *die, struct dwarf2_cu *cu)
>  {
>    struct type *base_type;
>  
> @@ -3564,13 +3537,12 @@ read_tag_const_type (struct die_info *di
>        return;
>      }
>  
> -  base_type = die_type (die, objfile, cu_header);
> +  base_type = die_type (die, cu);
>    die->type = make_cv_type (1, TYPE_VOLATILE (base_type), base_type, 0);
>  }
>  
>  static void
> -read_tag_volatile_type (struct die_info *die, struct objfile *objfile,
> -			const struct comp_unit_head *cu_header)
> +read_tag_volatile_type (struct die_info *die, struct dwarf2_cu *cu)
>  {
>    struct type *base_type;
>  
> @@ -3579,7 +3551,7 @@ read_tag_volatile_type (struct die_info 
>        return;
>      }
>  
> -  base_type = die_type (die, objfile, cu_header);
> +  base_type = die_type (die, cu);
>    die->type = make_cv_type (TYPE_CONST (base_type), 1, base_type, 0);
>  }
>  
> @@ -3589,8 +3561,9 @@ read_tag_volatile_type (struct die_info 
>     attribute to reference it.  */
>  
>  static void
> -read_tag_string_type (struct die_info *die, struct objfile *objfile)
> +read_tag_string_type (struct die_info *die, struct dwarf2_cu *cu)
>  {
> +  struct objfile *objfile = cu->objfile;
>    struct type *type, *range_type, *index_type, *char_type;
>    struct attribute *attr;
>    unsigned int length;
> @@ -3646,8 +3619,7 @@ read_tag_string_type (struct die_info *d
>   */
>  
>  static void
> -read_subroutine_type (struct die_info *die, struct objfile *objfile,
> -		      const struct comp_unit_head *cu_header)
> +read_subroutine_type (struct die_info *die, struct dwarf2_cu *cu)
>  {
>    struct type *type;		/* Type that this function returns */
>    struct type *ftype;		/* Function that returns above type */
> @@ -3658,7 +3630,7 @@ read_subroutine_type (struct die_info *d
>      {
>        return;
>      }
> -  type = die_type (die, objfile, cu_header);
> +  type = die_type (die, cu);
>    ftype = lookup_function_type (type);
>  
>    /* All functions in C++ have prototypes.  */
> @@ -3706,8 +3678,7 @@ read_subroutine_type (struct die_info *d
>  		TYPE_FIELD_ARTIFICIAL (ftype, iparams) = DW_UNSND (attr);
>  	      else
>  		TYPE_FIELD_ARTIFICIAL (ftype, iparams) = 0;
> -	      TYPE_FIELD_TYPE (ftype, iparams) = die_type (child_die, objfile,
> -							   cu_header);
> +	      TYPE_FIELD_TYPE (ftype, iparams) = die_type (child_die, cu);
>  	      iparams++;
>  	    }
>  	  child_die = sibling_die (child_die);
> @@ -3718,9 +3689,9 @@ read_subroutine_type (struct die_info *d
>  }
>  
>  static void
> -read_typedef (struct die_info *die, struct objfile *objfile,
> -	      const struct comp_unit_head *cu_header)
> +read_typedef (struct die_info *die, struct dwarf2_cu *cu)
>  {
> +  struct objfile *objfile = cu->objfile;
>    struct attribute *attr;
>    char *name = NULL;
>  
> @@ -3732,7 +3703,7 @@ read_typedef (struct die_info *die, stru
>  	  name = DW_STRING (attr);
>  	}
>        die->type = init_type (TYPE_CODE_TYPEDEF, 0, TYPE_FLAG_TARGET_STUB, name, objfile);
> -      TYPE_TARGET_TYPE (die->type) = die_type (die, objfile, cu_header);
> +      TYPE_TARGET_TYPE (die->type) = die_type (die, cu);
>      }
>  }
>  
> @@ -3740,8 +3711,9 @@ read_typedef (struct die_info *die, stru
>     it in the TYPE field of the die.  */
>  
>  static void
> -read_base_type (struct die_info *die, struct objfile *objfile)
> +read_base_type (struct die_info *die, struct dwarf2_cu *cu)
>  {
> +  struct objfile *objfile = cu->objfile;
>    struct type *type;
>    struct attribute *attr;
>    int encoding = 0, size = 0;
> @@ -3815,7 +3787,7 @@ read_base_type (struct die_info *die, st
>      }
>    else
>      {
> -      type = dwarf_base_type (encoding, size, objfile);
> +      type = dwarf_base_type (encoding, size, cu);
>      }
>    die->type = type;
>  }
> @@ -3823,14 +3795,13 @@ read_base_type (struct die_info *die, st
>  /* Read a whole compilation unit into a linked list of dies.  */
>  
>  static struct die_info *
> -read_comp_unit (char *info_ptr, bfd *abfd,
> -		const struct comp_unit_head *cu_header)
> +read_comp_unit (char *info_ptr, bfd *abfd, struct dwarf2_cu *cu)
>  {
>    /* Reset die reference table; we are
>       building new ones now.  */
>    dwarf2_empty_hash_tables ();
>  
> -  return read_die_and_children (info_ptr, abfd, cu_header, &info_ptr, NULL);
> +  return read_die_and_children (info_ptr, abfd, cu, &info_ptr, NULL);
>  }
>  
>  /* Read a single die and all its descendents.  Set the die's sibling
> @@ -3841,7 +3812,7 @@ read_comp_unit (char *info_ptr, bfd *abf
>  
>  static struct die_info *
>  read_die_and_children (char *info_ptr, bfd *abfd,
> -		       const struct comp_unit_head *cu_header,
> +		       struct dwarf2_cu *cu,
>  		       char **new_info_ptr,
>  		       struct die_info *parent)
>  {
> @@ -3849,12 +3820,12 @@ read_die_and_children (char *info_ptr, b
>    char *cur_ptr;
>    int has_children;
>  
> -  cur_ptr = read_full_die (&die, abfd, info_ptr, cu_header, &has_children);
> +  cur_ptr = read_full_die (&die, abfd, info_ptr, cu, &has_children);
>    store_in_ref_table (die->offset, die);
>  
>    if (has_children)
>      {
> -      die->child = read_die_and_siblings (cur_ptr, abfd, cu_header,
> +      die->child = read_die_and_siblings (cur_ptr, abfd, cu,
>  					  new_info_ptr, die);
>      }
>    else
> @@ -3874,7 +3845,7 @@ read_die_and_children (char *info_ptr, b
>  
>  static struct die_info *
>  read_die_and_siblings (char *info_ptr, bfd *abfd,
> -		       const struct comp_unit_head *cu_header,
> +		       struct dwarf2_cu *cu,
>  		       char **new_info_ptr,
>  		       struct die_info *parent)
>  {
> @@ -3887,8 +3858,7 @@ read_die_and_siblings (char *info_ptr, b
>    while (1)
>      {
>        struct die_info *die
> -	= read_die_and_children (cur_ptr, abfd, cu_header,
> -				 &cur_ptr, parent);
> +	= read_die_and_children (cur_ptr, abfd, cu, &cur_ptr, parent);
>  
>        if (!first_die)
>  	{
> @@ -3978,8 +3948,9 @@ dwarf2_read_section (struct objfile *obj
>     in a hash table.  */
>  
>  static void
> -dwarf2_read_abbrevs (bfd *abfd, struct comp_unit_head *cu_header)
> +dwarf2_read_abbrevs (bfd *abfd, struct dwarf2_cu *cu)
>  {
> +  struct comp_unit_head *cu_header = &cu->header;
>    char *abbrev_ptr;
>    struct abbrev_info *cur_abbrev;
>    unsigned int abbrev_number, bytes_read, abbrev_name;
> @@ -4043,7 +4014,7 @@ dwarf2_read_abbrevs (bfd *abfd, struct c
>  	break;
>        abbrev_number = read_unsigned_leb128 (abfd, abbrev_ptr, &bytes_read);
>        abbrev_ptr += bytes_read;
> -      if (dwarf2_lookup_abbrev (abbrev_number, cu_header) != NULL)
> +      if (dwarf2_lookup_abbrev (abbrev_number, cu) != NULL)
>  	break;
>      }
>  }
> @@ -4077,8 +4048,9 @@ dwarf2_empty_abbrev_table (void *ptr_to_
>  /* Lookup an abbrev_info structure in the abbrev hash table.  */
>  
>  static struct abbrev_info *
> -dwarf2_lookup_abbrev (unsigned int number, const struct comp_unit_head *cu_header)
> +dwarf2_lookup_abbrev (unsigned int number, struct dwarf2_cu *cu)
>  {
> +  struct comp_unit_head *cu_header = &cu->header;
>    unsigned int hash_number;
>    struct abbrev_info *abbrev;
>  
> @@ -4099,7 +4071,7 @@ dwarf2_lookup_abbrev (unsigned int numbe
>  
>  static char *
>  read_partial_die (struct partial_die_info *part_die, bfd *abfd,
> -		  char *info_ptr, const struct comp_unit_head *cu_header)
> +		  char *info_ptr, struct dwarf2_cu *cu)
>  {
>    unsigned int abbrev_number, bytes_read, i;
>    struct abbrev_info *abbrev;
> @@ -4115,7 +4087,7 @@ read_partial_die (struct partial_die_inf
>    if (!abbrev_number)
>      return info_ptr;
>  
> -  abbrev = dwarf2_lookup_abbrev (abbrev_number, cu_header);
> +  abbrev = dwarf2_lookup_abbrev (abbrev_number, cu);
>    if (!abbrev)
>      {
>        error ("Dwarf Error: Could not find abbrev number %d [in module %s]", abbrev_number,
> @@ -4128,8 +4100,7 @@ read_partial_die (struct partial_die_inf
>  
>    for (i = 0; i < abbrev->num_attrs; ++i)
>      {
> -      info_ptr = read_attribute (&attr, &abbrev->attrs[i], abfd,
> -				 info_ptr, cu_header);
> +      info_ptr = read_attribute (&attr, &abbrev->attrs[i], abfd, info_ptr, cu);
>  
>        /* Store the data if it is of an attribute we want to keep in a
>           partial symbol table.  */
> @@ -4206,10 +4177,9 @@ read_partial_die (struct partial_die_inf
>      {
>        struct partial_die_info spec_die;
>        char *spec_ptr;
> -      int dummy;
>  
>        spec_ptr = dwarf_info_buffer + dwarf2_get_ref_die_offset (&spec_attr);
> -      read_partial_die (&spec_die, abfd, spec_ptr, cu_header);
> +      read_partial_die (&spec_die, abfd, spec_ptr, cu);
>        if (spec_die.name)
>  	{
>  	  part_die->name = spec_die.name;
> @@ -4243,7 +4213,7 @@ read_partial_die (struct partial_die_inf
>  
>  static char *
>  read_full_die (struct die_info **diep, bfd *abfd, char *info_ptr,
> -	       const struct comp_unit_head *cu_header, int *has_children)
> +	       struct dwarf2_cu *cu, int *has_children)
>  {
>    unsigned int abbrev_number, bytes_read, i, offset;
>    struct abbrev_info *abbrev;
> @@ -4263,7 +4233,7 @@ read_full_die (struct die_info **diep, b
>        return info_ptr;
>      }
>  
> -  abbrev = dwarf2_lookup_abbrev (abbrev_number, cu_header);
> +  abbrev = dwarf2_lookup_abbrev (abbrev_number, cu);
>    if (!abbrev)
>      {
>        error ("Dwarf Error: could not find abbrev number %d [in module %s]",
> @@ -4283,7 +4253,7 @@ read_full_die (struct die_info **diep, b
>    for (i = 0; i < abbrev->num_attrs; ++i)
>      {
>        info_ptr = read_attribute (&die->attrs[i], &abbrev->attrs[i],
> -				 abfd, info_ptr, cu_header);
> +				 abfd, info_ptr, cu);
>      }
>  
>    *diep = die;
> @@ -4295,9 +4265,10 @@ read_full_die (struct die_info **diep, b
>  
>  static char *
>  read_attribute_value (struct attribute *attr, unsigned form,
> -		bfd *abfd, char *info_ptr,
> -		const struct comp_unit_head *cu_header)
> +		      bfd *abfd, char *info_ptr,
> +		      struct dwarf2_cu *cu)
>  {
> +  struct comp_unit_head *cu_header = &cu->header;
>    unsigned int bytes_read;
>    struct dwarf_block *blk;
>  
> @@ -4306,7 +4277,7 @@ read_attribute_value (struct attribute *
>      {
>      case DW_FORM_addr:
>      case DW_FORM_ref_addr:
> -      DW_ADDR (attr) = read_address (abfd, info_ptr, cu_header, &bytes_read);
> +      DW_ADDR (attr) = read_address (abfd, info_ptr, cu, &bytes_read);
>        info_ptr += bytes_read;
>        break;
>      case DW_FORM_block2:
> @@ -4401,7 +4372,7 @@ read_attribute_value (struct attribute *
>      case DW_FORM_indirect:
>        form = read_unsigned_leb128 (abfd, info_ptr, &bytes_read);
>        info_ptr += bytes_read;
> -      info_ptr = read_attribute_value (attr, form, abfd, info_ptr, cu_header);
> +      info_ptr = read_attribute_value (attr, form, abfd, info_ptr, cu);
>        break;
>      default:
>        error ("Dwarf Error: Cannot handle %s in DWARF reader [in module %s]",
> @@ -4415,11 +4386,10 @@ read_attribute_value (struct attribute *
>  
>  static char *
>  read_attribute (struct attribute *attr, struct attr_abbrev *abbrev,
> -		bfd *abfd, char *info_ptr,
> -		const struct comp_unit_head *cu_header)
> +		bfd *abfd, char *info_ptr, struct dwarf2_cu *cu)
>  {
>    attr->name = abbrev->name;
> -  return read_attribute_value (attr, abbrev->form, abfd, info_ptr, cu_header);
> +  return read_attribute_value (attr, abbrev->form, abfd, info_ptr, cu);
>  }
>  
>  /* read dwarf information from a buffer */
> @@ -4467,9 +4437,9 @@ read_8_bytes (bfd *abfd, char *buf)
>  }
>  
>  static CORE_ADDR
> -read_address (bfd *abfd, char *buf, const struct comp_unit_head *cu_header,
> -	      int *bytes_read)
> +read_address (bfd *abfd, char *buf, struct dwarf2_cu *cu, int *bytes_read)
>  {
> +  struct comp_unit_head *cu_header = &cu->header;
>    CORE_ADDR retval = 0;
>  
>    if (cu_header->signed_addr_p)
> @@ -4901,7 +4871,7 @@ add_file_name (struct line_header *lh,
>     freed.  */
>  static struct line_header *
>  dwarf_decode_line_header (unsigned int offset, bfd *abfd,
> -                          const struct comp_unit_head *cu_header)
> +			  struct dwarf2_cu *cu)
>  {
>    struct cleanup *back_to;
>    struct line_header *lh;
> @@ -4942,7 +4912,7 @@ dwarf_decode_line_header (unsigned int o
>    lh->statement_program_end = line_ptr + lh->total_length;
>    lh->version = read_2_bytes (abfd, line_ptr);
>    line_ptr += 2;
> -  lh->header_length = read_offset (abfd, line_ptr, cu_header, &bytes_read);
> +  lh->header_length = read_offset (abfd, line_ptr, &cu->header, &bytes_read);
>    line_ptr += bytes_read;
>    lh->minimum_instruction_length = read_1_byte (abfd, line_ptr);
>    line_ptr += 1;
> @@ -5050,12 +5020,11 @@ check_cu_functions (CORE_ADDR address)
>  
>  static void
>  dwarf_decode_lines (struct line_header *lh, char *comp_dir, bfd *abfd,
> -		    const struct comp_unit_head *cu_header)
> +		    struct dwarf2_cu *cu)
>  {
>    char *line_ptr;
>    char *line_end;
> -  unsigned int i, bytes_read;
> -  char *cur_dir;
> +  unsigned int bytes_read;
>    unsigned char op_code, extended_op, adj_opcode;
>  
>    line_ptr = lh->statement_program_start;
> @@ -5118,7 +5087,7 @@ dwarf_decode_lines (struct line_header *
>  		  record_line (current_subfile, 0, address);
>  		  break;
>  		case DW_LNE_set_address:
> -		  address = read_address (abfd, line_ptr, cu_header, &bytes_read);
> +		  address = read_address (abfd, line_ptr, cu, &bytes_read);
>  		  line_ptr += bytes_read;
>  		  address += baseaddr;
>  		  break;
> @@ -5262,9 +5231,11 @@ dwarf2_start_subfile (char *filename, ch
>  
>  static void
>  var_decode_location (struct attribute *attr, struct symbol *sym,
> -		     struct objfile *objfile,
> -		     const struct comp_unit_head *cu_header)
> +		     struct dwarf2_cu *cu)
>  {
> +  struct objfile *objfile = cu->objfile;
> +  struct comp_unit_head *cu_header = &cu->header;
> +
>    /* NOTE drow/2003-01-30: There used to be a comment and some special
>       code here to turn a symbol with DW_AT_external and a
>       SYMBOL_VALUE_ADDRESS of 0 into a LOC_UNRESOLVED symbol.  This was
> @@ -5295,8 +5266,7 @@ var_decode_location (struct attribute *a
>        int dummy;
>  
>        SYMBOL_VALUE_ADDRESS (sym) =
> -	read_address (objfile->obfd, DW_BLOCK (attr)->data + 1, cu_header,
> -		      &dummy);
> +	read_address (objfile->obfd, DW_BLOCK (attr)->data + 1, cu, &dummy);
>        fixup_symbol_section (sym, objfile);
>        SYMBOL_VALUE_ADDRESS (sym) += ANOFFSET (objfile->section_offsets,
>  					      SYMBOL_SECTION (sym));
> @@ -5311,7 +5281,7 @@ var_decode_location (struct attribute *a
>       not be worthwhile.  I'm assuming that it isn't unless performance
>       or memory numbers show me otherwise.  */
>  
> -  dwarf2_symbol_mark_computed (attr, sym, cu_header, objfile);
> +  dwarf2_symbol_mark_computed (attr, sym, cu);
>    SYMBOL_CLASS (sym) = LOC_COMPUTED;
>  }
>  
> @@ -5322,14 +5292,13 @@ var_decode_location (struct attribute *a
>     used the passed type.  */
>  
>  static struct symbol *
> -new_symbol (struct die_info *die, struct type *type, struct objfile *objfile,
> -	    const struct comp_unit_head *cu_header)
> +new_symbol (struct die_info *die, struct type *type, struct dwarf2_cu *cu)
>  {
> +  struct objfile *objfile = cu->objfile;
>    struct symbol *sym = NULL;
>    char *name;
>    struct attribute *attr = NULL;
>    struct attribute *attr2 = NULL;
> -  CORE_ADDR addr = 0;
>  
>    if (die->tag != DW_TAG_namespace)
>      name = dwarf2_linkage_name (die);
> @@ -5354,7 +5323,7 @@ new_symbol (struct die_info *die, struct
>        if (type != NULL)
>  	SYMBOL_TYPE (sym) = type;
>        else
> -	SYMBOL_TYPE (sym) = die_type (die, objfile, cu_header);
> +	SYMBOL_TYPE (sym) = die_type (die, cu);
>        attr = dwarf_attr (die, DW_AT_decl_line);
>        if (attr)
>  	{
> @@ -5396,7 +5365,7 @@ new_symbol (struct die_info *die, struct
>  	  attr = dwarf_attr (die, DW_AT_const_value);
>  	  if (attr)
>  	    {
> -	      dwarf2_const_value (attr, sym, objfile, cu_header);
> +	      dwarf2_const_value (attr, sym, cu);
>  	      attr2 = dwarf_attr (die, DW_AT_external);
>  	      if (attr2 && (DW_UNSND (attr2) != 0))
>  		add_symbol_to_list (sym, &global_symbols);
> @@ -5407,7 +5376,7 @@ new_symbol (struct die_info *die, struct
>  	  attr = dwarf_attr (die, DW_AT_location);
>  	  if (attr)
>  	    {
> -	      var_decode_location (attr, sym, objfile, cu_header);
> +	      var_decode_location (attr, sym, cu);
>  	      attr2 = dwarf_attr (die, DW_AT_external);
>  	      if (attr2 && (DW_UNSND (attr2) != 0))
>  		add_symbol_to_list (sym, &global_symbols);
> @@ -5435,7 +5404,7 @@ new_symbol (struct die_info *die, struct
>  	  attr = dwarf_attr (die, DW_AT_location);
>  	  if (attr)
>  	    {
> -	      var_decode_location (attr, sym, objfile, cu_header);
> +	      var_decode_location (attr, sym, cu);
>  	      /* FIXME drow/2003-07-31: Is LOC_COMPUTED_ARG necessary?  */
>  	      if (SYMBOL_CLASS (sym) == LOC_COMPUTED)
>  		SYMBOL_CLASS (sym) = LOC_COMPUTED_ARG;
> @@ -5443,7 +5412,7 @@ new_symbol (struct die_info *die, struct
>  	  attr = dwarf_attr (die, DW_AT_const_value);
>  	  if (attr)
>  	    {
> -	      dwarf2_const_value (attr, sym, objfile, cu_header);
> +	      dwarf2_const_value (attr, sym, cu);
>  	    }
>  	  add_symbol_to_list (sym, list_in_scope);
>  	  break;
> @@ -5488,7 +5457,7 @@ new_symbol (struct die_info *die, struct
>  	  attr = dwarf_attr (die, DW_AT_const_value);
>  	  if (attr)
>  	    {
> -	      dwarf2_const_value (attr, sym, objfile, cu_header);
> +	      dwarf2_const_value (attr, sym, cu);
>  	    }
>  	  add_symbol_to_list (sym, list_in_scope);
>  	  break;
> @@ -5513,9 +5482,10 @@ new_symbol (struct die_info *die, struct
>  
>  static void
>  dwarf2_const_value (struct attribute *attr, struct symbol *sym,
> -		    struct objfile *objfile,
> -		    const struct comp_unit_head *cu_header)
> +		    struct dwarf2_cu *cu)
>  {
> +  struct objfile *objfile = cu->objfile;
> +  struct comp_unit_head *cu_header = &cu->header;
>    struct dwarf_block *blk;
>  
>    switch (attr->form)
> @@ -5614,8 +5584,7 @@ dwarf2_const_value_data (struct attribut
>  /* Return the type of the die in question using its DW_AT_type attribute.  */
>  
>  static struct type *
> -die_type (struct die_info *die, struct objfile *objfile,
> -	  const struct comp_unit_head *cu_header)
> +die_type (struct die_info *die, struct dwarf2_cu *cu)
>  {
>    struct type *type;
>    struct attribute *type_attr;
> @@ -5626,7 +5595,7 @@ die_type (struct die_info *die, struct o
>    if (!type_attr)
>      {
>        /* A missing DW_AT_type represents a void type.  */
> -      return dwarf2_fundamental_type (objfile, FT_VOID);
> +      return dwarf2_fundamental_type (cu->objfile, FT_VOID);
>      }
>    else
>      {
> @@ -5635,16 +5604,16 @@ die_type (struct die_info *die, struct o
>        if (!type_die)
>  	{
>  	  error ("Dwarf Error: Cannot find referent at offset %d [in module %s]", 
> -			  ref, objfile->name);
> +			  ref, cu->objfile->name);
>  	  return NULL;
>  	}
>      }
> -  type = tag_type_to_type (type_die, objfile, cu_header);
> +  type = tag_type_to_type (type_die, cu);
>    if (!type)
>      {
>        dump_die (type_die);
>        error ("Dwarf Error: Problem turning type die at offset into gdb type [in module %s]",
> -		      objfile->name);
> +		      cu->objfile->name);
>      }
>    return type;
>  }
> @@ -5653,8 +5622,7 @@ die_type (struct die_info *die, struct o
>     DW_AT_containing_type attribute.  */
>  
>  static struct type *
> -die_containing_type (struct die_info *die, struct objfile *objfile,
> -		     const struct comp_unit_head *cu_header)
> +die_containing_type (struct die_info *die, struct dwarf2_cu *cu)
>  {
>    struct type *type = NULL;
>    struct attribute *type_attr;
> @@ -5669,24 +5637,24 @@ die_containing_type (struct die_info *di
>        if (!type_die)
>  	{
>  	  error ("Dwarf Error: Cannot find referent at offset %d [in module %s]", ref, 
> -			  objfile->name);
> +			  cu->objfile->name);
>  	  return NULL;
>  	}
> -      type = tag_type_to_type (type_die, objfile, cu_header);
> +      type = tag_type_to_type (type_die, cu);
>      }
>    if (!type)
>      {
>        if (type_die)
>  	dump_die (type_die);
>        error ("Dwarf Error: Problem turning containing type into gdb type [in module %s]", 
> -		      objfile->name);
> +		      cu->objfile->name);
>      }
>    return type;
>  }
>  
>  #if 0
>  static struct type *
> -type_at_offset (unsigned int offset, struct objfile *objfile)
> +type_at_offset (unsigned int offset, struct dwarf2_cu *cu)
>  {
>    struct die_info *die;
>    struct type *type;
> @@ -5697,14 +5665,13 @@ type_at_offset (unsigned int offset, str
>        error ("Dwarf Error: Cannot find type referent at offset %d.", offset);
>        return NULL;
>      }
> -  type = tag_type_to_type (die, objfile);
> +  type = tag_type_to_type (die, cu);
>    return type;
>  }
>  #endif
>  
>  static struct type *
> -tag_type_to_type (struct die_info *die, struct objfile *objfile,
> -		  const struct comp_unit_head *cu_header)
> +tag_type_to_type (struct die_info *die, struct dwarf2_cu *cu)
>  {
>    if (die->type)
>      {
> @@ -5712,61 +5679,60 @@ tag_type_to_type (struct die_info *die, 
>      }
>    else
>      {
> -      read_type_die (die, objfile, cu_header);
> +      read_type_die (die, cu);
>        if (!die->type)
>  	{
>  	  dump_die (die);
>  	  error ("Dwarf Error: Cannot find type of die [in module %s]", 
> -			  objfile->name);
> +			  cu->objfile->name);
>  	}
>        return die->type;
>      }
>  }
>  
>  static void
> -read_type_die (struct die_info *die, struct objfile *objfile,
> -	       const struct comp_unit_head *cu_header)
> +read_type_die (struct die_info *die, struct dwarf2_cu *cu)
>  {
>    switch (die->tag)
>      {
>      case DW_TAG_class_type:
>      case DW_TAG_structure_type:
>      case DW_TAG_union_type:
> -      read_structure_scope (die, objfile, cu_header);
> +      read_structure_scope (die, cu);
>        break;
>      case DW_TAG_enumeration_type:
> -      read_enumeration (die, objfile, cu_header);
> +      read_enumeration (die, cu);
>        break;
>      case DW_TAG_subprogram:
>      case DW_TAG_subroutine_type:
> -      read_subroutine_type (die, objfile, cu_header);
> +      read_subroutine_type (die, cu);
>        break;
>      case DW_TAG_array_type:
> -      read_array_type (die, objfile, cu_header);
> +      read_array_type (die, cu);
>        break;
>      case DW_TAG_pointer_type:
> -      read_tag_pointer_type (die, objfile, cu_header);
> +      read_tag_pointer_type (die, cu);
>        break;
>      case DW_TAG_ptr_to_member_type:
> -      read_tag_ptr_to_member_type (die, objfile, cu_header);
> +      read_tag_ptr_to_member_type (die, cu);
>        break;
>      case DW_TAG_reference_type:
> -      read_tag_reference_type (die, objfile, cu_header);
> +      read_tag_reference_type (die, cu);
>        break;
>      case DW_TAG_const_type:
> -      read_tag_const_type (die, objfile, cu_header);
> +      read_tag_const_type (die, cu);
>        break;
>      case DW_TAG_volatile_type:
> -      read_tag_volatile_type (die, objfile, cu_header);
> +      read_tag_volatile_type (die, cu);
>        break;
>      case DW_TAG_string_type:
> -      read_tag_string_type (die, objfile);
> +      read_tag_string_type (die, cu);
>        break;
>      case DW_TAG_typedef:
> -      read_typedef (die, objfile, cu_header);
> +      read_typedef (die, cu);
>        break;
>      case DW_TAG_base_type:
> -      read_base_type (die, objfile);
> +      read_base_type (die, cu);
>        break;
>      default:
>        complaint (&symfile_complaints, "unexepected tag in read_type_die: '%s'",
> @@ -5776,8 +5742,10 @@ read_type_die (struct die_info *die, str
>  }
>  
>  static struct type *
> -dwarf_base_type (int encoding, int size, struct objfile *objfile)
> +dwarf_base_type (int encoding, int size, struct dwarf2_cu *cu)
>  {
> +  struct objfile *objfile = cu->objfile;
> +
>    /* FIXME - this should not produce a new (struct type *)
>       every time.  It should cache base types.  */
>    struct type *type;
> @@ -6941,9 +6909,10 @@ dwarf2_fundamental_type (struct objfile 
>     Note that stack overflow is not yet handled.  */
>  
>  static CORE_ADDR
> -decode_locdesc (struct dwarf_block *blk, struct objfile *objfile,
> -		const struct comp_unit_head *cu_header)
> +decode_locdesc (struct dwarf_block *blk, struct dwarf2_cu *cu)
>  {
> +  struct objfile *objfile = cu->objfile;
> +  struct comp_unit_head *cu_header = &cu->header;
>    int i;
>    int size = blk->size;
>    char *data = blk->data;
> @@ -7110,7 +7079,7 @@ decode_locdesc (struct dwarf_block *blk,
>  
>  	case DW_OP_addr:
>  	  stack[++stacki] = read_address (objfile->obfd, &data[i],
> -					  cu_header, &bytes_read);
> +					  cu, &bytes_read);
>  	  i += bytes_read;
>  	  break;
>  
> @@ -7482,8 +7451,7 @@ parse_macro_definition (struct macro_sou
>  static void
>  dwarf_decode_macros (struct line_header *lh, unsigned int offset,
>                       char *comp_dir, bfd *abfd,
> -                     const struct comp_unit_head *cu_header,
> -                     struct objfile *objfile)
> +                     struct dwarf2_cu *cu)
>  {
>    char *mac_ptr, *mac_end;
>    struct macro_source_file *current_file = 0;
> @@ -7559,7 +7527,7 @@ dwarf_decode_macros (struct line_header 
>  
>              current_file = macro_start_file (file, line,
>                                               current_file, comp_dir,
> -                                             lh, objfile);
> +                                             lh, cu->objfile);
>            }
>            break;
>  
> @@ -7630,23 +7598,22 @@ attr_form_is_block (struct attribute *at
>  
>  static void
>  dwarf2_symbol_mark_computed (struct attribute *attr, struct symbol *sym,
> -			     const struct comp_unit_head *cu_header,
> -			     struct objfile *objfile)
> +			     struct dwarf2_cu *cu)
>  {
>    if (attr->form == DW_FORM_data4 || attr->form == DW_FORM_data8)
>      {
>        struct dwarf2_loclist_baton *baton;
>  
> -      baton = obstack_alloc (&objfile->symbol_obstack,
> +      baton = obstack_alloc (&cu->objfile->symbol_obstack,
>  			     sizeof (struct dwarf2_loclist_baton));
> -      baton->objfile = objfile;
> +      baton->objfile = cu->objfile;
>  
>        /* We don't know how long the location list is, but make sure we
>  	 don't run off the edge of the section.  */
>        baton->size = dwarf_loc_size - DW_UNSND (attr);
>        baton->data = dwarf_loc_buffer + DW_UNSND (attr);
> -      baton->base_address = cu_header->base_address;
> -      if (cu_header->base_known == 0)
> +      baton->base_address = cu->header.base_address;
> +      if (cu->header.base_known == 0)
>  	complaint (&symfile_complaints,
>  		   "Location list used without specifying the CU base address.");
>  
> @@ -7657,9 +7624,9 @@ dwarf2_symbol_mark_computed (struct attr
>      {
>        struct dwarf2_locexpr_baton *baton;
>  
> -      baton = obstack_alloc (&objfile->symbol_obstack,
> +      baton = obstack_alloc (&cu->objfile->symbol_obstack,
>  			     sizeof (struct dwarf2_locexpr_baton));
> -      baton->objfile = objfile;
> +      baton->objfile = cu->objfile;
>  
>        if (attr_form_is_block (attr))
>  	{


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

* Re: [RFA/dwarf] Pass some global state around
  2003-11-11 21:41 ` Jim Blandy
@ 2003-11-12 17:12   ` Daniel Jacobowitz
  0 siblings, 0 replies; 4+ messages in thread
From: Daniel Jacobowitz @ 2003-11-12 17:12 UTC (permalink / raw)
  To: gdb-patches

On Tue, Nov 11, 2003 at 04:39:31PM -0500, Jim Blandy wrote:
> 
> So, if I'm reading it right, this patch is almost entirely mechanical:
> 
> - Create a new dwarf2_cu type, which contains the CU header, and a
>   pointer to the objfile.
> 
> - Create and initialize it at external entry points to dwarf2read.c.
> 
> - Replace all CU and objfile arguments with dwarf2_cu arguments;
>   similarly for uses.
> 
> If that's correct, please go ahead and commit this.  However, it would
> be nice if the ChangeLog entry were a little more like the description
> I wrote above.

That's right.  I've fixed the ChangeLog and checked it in:

2003-11-12  Daniel Jacobowitz <drow@mvista.com>

	* dwarf2read.c (struct dwarf2_cu): New type.

	(dwarf2_build_psymtabs_hard, psymtab_to_symtab_1): Create a
	dwarf2_cu structure to pass down.

	(scan_partial_symbols, add_partial_symbol, add_partial_namespace)
	(add_partial_enumeration, locate_pdi_sibling, process_die)
	(read_file_scope, read_func_scope)
	(read_lexical_block_scope, dwarf2_get_pc_bounds)
	(dwarf2_add_field, dwarf2_attach_fields_to_type)
	(dwarf2_add_member_fn, dwarf2_attach_fn_fields_to_type)
	(read_structure_scope, read_enumeration, read_array_type)
	(read_common_block, read_namespace, read_tag_pointer_type)
	(read_tag_ptr_to_member_type, read_tag_reference_type)
	(read_tag_const_type, read_tag_volatile_type, read_tag_string_type)
	(read_subroutine_type, read_typedef, read_base_type, read_comp_unit)
	(read_die_and_children, read_die_and_siblings, dwarf2_read_section)
	(dwarf2_read_abbrevs, dwarf2_lookup_abbrev, read_partial_die)
	(read_full_die. read_attribute_value, read_attribute)
	(read_address, dwarf_decode_line_header, dwarf_decode_lines)
	(var_decode_location, new_symbol, dwarf2_const_value, die_type)
	(die_containing_type, type_at_offset, tag_type_to_type)
	(read_type_die, dwarf_base_type, decode_locdesc, dwarf_decode_macros)
	(dwarf2_symbol_mark_computed): Accept and use a dwarf2_cu object.

My apologies to David for what is sure to be a bit of a merge headache. 
Next, time permitting, will probably be moving more information into
the dwarf2_cu.

-- 
Daniel Jacobowitz
MontaVista Software                         Debian GNU/Linux Developer


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

end of thread, other threads:[~2003-11-12 17:12 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2003-11-10 15:51 [RFA/dwarf] Pass some global state around Daniel Jacobowitz
2003-11-10 16:55 ` David Carlton
2003-11-11 21:41 ` Jim Blandy
2003-11-12 17:12   ` Daniel Jacobowitz

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