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


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

[RFA/dwarf] Pass some global state around


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))
 	{


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