[rfa/symtab] Sign extend dwarf2 addresses (sometimes)

Andrew Cagney ac131313@cygnus.com
Wed Jul 12 02:01:00 GMT 2000


Hello,

 > Fri Jun 23 18:30:58 2000  Andrew Cagney  <cagney@b1.cygnus.com>
 > 
 >      * dwarf2read.c (address_signed_p): New variable.
 >      (dwarf2_build_psymtabs_hard): Set according to
 >      bfd_elf_get_sign_extend_vma.
 >      (read_address): Sign extend the address when necessary.

Attached is a revised / updated version of this patch.

In addition to needing to sign extend addresses (when specified by the
ISA) I found that dwarf2read.c wasn't keeping the global variable
``address_size'' up-to-date.  The code in psymtab_to_symtab_1, for
instance, forgets to update it.  On more obscure targets (some MIPS 64)
it changes between sections!

Rather than add more code that tries to keep the global ``address_size''
up-to-date, I've instead eliminated it.  It has been replaced by
cu_header parameter and initialization function.  Hopefully, this will
stop the problem re-occuring.

Of course the alternative to this jumbo patch is to just keep the two
globals up-to-date.

ok?

	Andrew
Sun Jun 25 10:27:30 2000  Andrew Cagney  <cagney@b1.cygnus.com>

	* dwarf2read.c (address_size): Delete file wide global.
	(struct comp_unit_head): Add signed_addr_p;
	(read_comp_unit_head): New function.
	(psymtab_to_symtab_1, dwarf2_build_psymtabs_hard): Use
 	read_comp_unit_head to parse the debug_info header.
	(read_address): Add parameters cu_header and bytes_read.  When
 	specified, sign extend the address.
	
	* dwarf2read.c (add_partial_symbol, decode_locdesc,
 	die_containing_type, die_type, dwarf_decode_lines,
 	dwarf2_add_field, dwarf2_add_member_fn,
 	dwarf2_build_psymtabs_hard, dwarf2_const_value, new_symbol,
 	process_die, psymtab_to_symtab_1, read_array_type,
 	read_enumeration, read_attribute, read_common_block,
 	read_comp_unit, read_file_scope, read_full_die, read_func_scope,
 	read_lexical_block_scope, read_partial_die, scan_partial_symbols,
 	read_structure_scope, read_subroutine_type, read_tag_const_type,
 	read_tag_pointer_type, read_tag_ptr_to_member_type,
 	read_tag_reference_type, read_type_die, read_typedef,
 	tag_type_to_type): Pass cu_header parameter.

Index: dwarf2read.c
===================================================================
RCS file: /cvs/cvsfiles/devo/gdb/dwarf2read.c,v
retrieving revision 2.46
diff -p -r2.46 dwarf2read.c
*** dwarf2read.c	2000/06/19 22:19:53	2.46
--- dwarf2read.c	2000/07/12 08:38:26
***************
*** 43,48 ****
--- 43,49 ----
  #include "gdb_string.h"
  #include <sys/types.h>
  
+ #if 0
  /* .debug_info header for a compilation unit
     Because of alignment constraints, this structure has padding and cannot
     be mapped directly onto the beginning of the .debug_info section.  */
*************** typedef struct comp_unit_header
*** 57,62 ****
--- 58,64 ----
    }
  _COMP_UNIT_HEADER;
  #define _ACTUAL_COMP_UNIT_HEADER_SIZE 11
+ #endif
  
  /* .debug_pubnames header
     Because of alignment constraints, this structure has padding and cannot
*************** static unsigned int dwarf_str_size;
*** 146,158 ****
  
  /* local data types */
  
! /* The data in a compilation unit header looks like this.  */
  struct comp_unit_head
    {
      unsigned int length;
      short version;
      unsigned int abbrev_offset;
      unsigned char addr_size;
    };
  
  /* The data in the .debug_line statement prologue looks like this.  */
--- 148,162 ----
  
  /* local data types */
  
! /* The data in a compilation unit header, after target2host
!    translation, looks like this.  */
  struct comp_unit_head
    {
      unsigned int length;
      short version;
      unsigned int abbrev_offset;
      unsigned char addr_size;
+     unsigned char signed_addr_p;
    };
  
  /* The data in the .debug_line statement prologue looks like this.  */
*************** static struct complaint dwarf2_unsupport
*** 545,556 ****
    "unsupported const value attribute form: '%s'", 0, 0
  };
  
- /* Remember the addr_size read from the dwarf.
-    If a target expects to link compilation units with differing address
-    sizes, gdb needs to be sure that the appropriate size is here for
-    whatever scope is currently getting read. */
- static int address_size;
- 
  /* Externals references.  */
  extern int info_verbose;	/* From main.c; nonzero => verbose */
  
--- 549,554 ----
*************** static void dwarf2_build_psymtabs_easy (
*** 565,573 ****
  static void dwarf2_build_psymtabs_hard (struct objfile *, int);
  
  static char *scan_partial_symbols (char *, struct objfile *,
! 				   CORE_ADDR *, CORE_ADDR *);
  
! static void add_partial_symbol (struct partial_die_info *, struct objfile *);
  
  static void dwarf2_psymtab_to_symtab (struct partial_symtab *);
  
--- 563,573 ----
  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 void add_partial_symbol (struct partial_die_info *, struct objfile *,
! 				const struct comp_unit_head *);
  
  static void dwarf2_psymtab_to_symtab (struct partial_symtab *);
  
*************** static void dwarf2_empty_abbrev_table (P
*** 582,593 ****
  static struct abbrev_info *dwarf2_lookup_abbrev (unsigned int);
  
  static char *read_partial_die (struct partial_die_info *,
! 			       bfd *, char *, int *);
  
! static char *read_full_die (struct die_info **, bfd *, char *);
  
  static char *read_attribute (struct attribute *, struct attr_abbrev *,
! 			     bfd *, char *);
  
  static unsigned int read_1_byte (bfd *, char *);
  
--- 582,595 ----
  static struct abbrev_info *dwarf2_lookup_abbrev (unsigned int);
  
  static char *read_partial_die (struct partial_die_info *,
! 			       bfd *, char *, int *,
! 			       const struct comp_unit_head *);
  
! static char *read_full_die (struct die_info **, bfd *, char *,
! 			    const struct comp_unit_head *);
  
  static char *read_attribute (struct attribute *, struct attr_abbrev *,
! 			     bfd *, char *, const struct comp_unit_head *);
  
  static unsigned int read_1_byte (bfd *, char *);
  
*************** static unsigned int read_4_bytes (bfd *,
*** 599,605 ****
  
  static unsigned long read_8_bytes (bfd *, char *);
  
! static CORE_ADDR read_address (bfd *, char *);
  
  static char *read_n_bytes (bfd *, char *, unsigned int);
  
--- 601,608 ----
  
  static unsigned long read_8_bytes (bfd *, char *);
  
! static CORE_ADDR read_address (bfd *, char *ptr, const struct comp_unit_head *,
! 			       int *bytes_read);
  
  static char *read_n_bytes (bfd *, char *, unsigned int);
  
*************** static struct attribute *dwarf_attr (str
*** 615,705 ****
  
  static int die_is_declaration (struct die_info *);
  
! static void dwarf_decode_lines (unsigned int, char *, bfd *);
  
  static void dwarf2_start_subfile (char *, char *);
  
  static struct symbol *new_symbol (struct die_info *, struct type *,
! 				  struct objfile *);
  
  static void dwarf2_const_value (struct attribute *, struct symbol *,
! 				struct objfile *);
  
  static void dwarf2_const_value_data (struct attribute *attr,
  				     struct symbol *sym,
  				     int bits);
  
! static struct type *die_type (struct die_info *, struct objfile *);
  
! static struct type *die_containing_type (struct die_info *, struct objfile *);
  
  #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 *);
  
! static void read_type_die (struct die_info *, struct objfile *);
  
! static void read_typedef (struct die_info *, struct objfile *);
  
  static void read_base_type (struct die_info *, struct objfile *);
  
! static void read_file_scope (struct die_info *, struct objfile *);
  
! static void read_func_scope (struct die_info *, struct objfile *);
  
! static void read_lexical_block_scope (struct die_info *, struct objfile *);
  
  static int dwarf2_get_pc_bounds (struct die_info *,
  				 CORE_ADDR *, CORE_ADDR *, struct objfile *);
  
  static void dwarf2_add_field (struct field_info *, struct die_info *,
! 			      struct objfile *);
  
  static void dwarf2_attach_fields_to_type (struct field_info *,
  					  struct type *, struct objfile *);
  
  static void dwarf2_add_member_fn (struct field_info *,
  				  struct die_info *, struct type *,
! 				  struct objfile *objfile);
  
  static void dwarf2_attach_fn_fields_to_type (struct field_info *,
  					     struct type *, struct objfile *);
  
! static void read_structure_scope (struct die_info *, struct objfile *);
  
! static void read_common_block (struct die_info *, struct objfile *);
  
! static void read_enumeration (struct die_info *, struct objfile *);
  
  static struct type *dwarf_base_type (int, int, struct objfile *);
  
! static CORE_ADDR decode_locdesc (struct dwarf_block *, struct objfile *);
  
! static void read_array_type (struct die_info *, struct objfile *);
  
! static void read_tag_pointer_type (struct die_info *, struct objfile *);
  
! static void read_tag_ptr_to_member_type (struct die_info *, struct objfile *);
  
! static void read_tag_reference_type (struct die_info *, struct objfile *);
  
! static void read_tag_const_type (struct die_info *, struct objfile *);
  
! static void read_tag_volatile_type (struct die_info *, struct objfile *);
  
  static void read_tag_string_type (struct die_info *, struct objfile *);
  
! static void read_subroutine_type (struct die_info *, struct objfile *);
  
! struct die_info *read_comp_unit (char *, bfd *);
  
  static void free_die_list (struct die_info *);
  
  static struct cleanup *make_cleanup_free_die_list (struct die_info *);
  
! static void process_die (struct die_info *, struct objfile *);
  
  static char *dwarf2_linkage_name (struct die_info *);
  
--- 618,730 ----
  
  static int die_is_declaration (struct die_info *);
  
! static void dwarf_decode_lines (unsigned int, char *, bfd *,
! 				const struct comp_unit_head *);
  
  static void dwarf2_start_subfile (char *, char *);
  
  static struct symbol *new_symbol (struct die_info *, struct type *,
! 				  struct objfile *, const struct comp_unit_head *);
  
  static void dwarf2_const_value (struct attribute *, struct symbol *,
! 				struct objfile *, const struct comp_unit_head *);
  
  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_containing_type (struct die_info *, struct objfile *,
! 					 const struct comp_unit_head *);
  
  #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 void read_type_die (struct die_info *, struct objfile *,
! 			   const struct comp_unit_head *);
  
! static void read_typedef (struct die_info *, struct objfile *,
! 			  const struct comp_unit_head *);
  
  static void read_base_type (struct die_info *, struct objfile *);
  
! static void read_file_scope (struct die_info *, struct objfile *,
! 			     const struct comp_unit_head *);
  
! static void read_func_scope (struct die_info *, struct objfile *,
! 			     const struct comp_unit_head *);
  
! static void read_lexical_block_scope (struct die_info *, struct objfile *,
! 				      const struct comp_unit_head *);
  
  static int dwarf2_get_pc_bounds (struct die_info *,
  				 CORE_ADDR *, CORE_ADDR *, struct objfile *);
  
  static void dwarf2_add_field (struct field_info *, struct die_info *,
! 			      struct objfile *, const struct comp_unit_head *);
  
  static void dwarf2_attach_fields_to_type (struct field_info *,
  					  struct type *, struct objfile *);
  
  static void dwarf2_add_member_fn (struct field_info *,
  				  struct die_info *, struct type *,
! 				  struct objfile *objfile,
! 				  const struct comp_unit_head *);
  
  static void dwarf2_attach_fn_fields_to_type (struct field_info *,
  					     struct type *, struct objfile *);
  
! static void read_structure_scope (struct die_info *, struct objfile *,
! 				  const struct comp_unit_head *);
  
! static void read_common_block (struct die_info *, struct objfile *,
! 			       const struct comp_unit_head *);
  
! static void read_enumeration (struct die_info *, struct objfile *,
! 			      const struct comp_unit_head *);
  
  static struct type *dwarf_base_type (int, int, struct objfile *);
  
! static CORE_ADDR decode_locdesc (struct dwarf_block *, struct objfile *,
! 				 const struct comp_unit_head *);
  
! static void read_array_type (struct die_info *, struct objfile *,
! 			     const struct comp_unit_head *);
  
! static void read_tag_pointer_type (struct die_info *, struct objfile *,
! 				   const struct comp_unit_head *);
  
! static void read_tag_ptr_to_member_type (struct die_info *, struct objfile *,
! 					 const struct comp_unit_head *);
  
! static void read_tag_reference_type (struct die_info *, struct objfile *,
! 				     const struct comp_unit_head *);
  
! static void read_tag_const_type (struct die_info *, struct objfile *,
! 				 const struct comp_unit_head *);
  
! static void read_tag_volatile_type (struct die_info *, struct objfile *,
! 				    const struct comp_unit_head *);
  
  static void read_tag_string_type (struct die_info *, struct objfile *);
  
! static void read_subroutine_type (struct die_info *, struct objfile *,
! 				  const struct comp_unit_head *);
  
! struct die_info *read_comp_unit (char *, bfd *, const struct comp_unit_head *);
  
  static void free_die_list (struct die_info *);
  
  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 char *dwarf2_linkage_name (struct die_info *);
  
*************** dwarf2_build_psymtabs_easy (objfile, mai
*** 898,903 ****
--- 923,951 ----
  }
  #endif
  
+ /* Read in the comp unit header information from the debug_info at
+    info_ptr. */
+ 
+ static char *
+ read_comp_unit_head (struct comp_unit_head *cu_header,
+ 		     char *info_ptr, bfd *abfd)
+ {
+   int signed_addr;
+   cu_header->length = read_4_bytes (abfd, info_ptr);
+   info_ptr += 4;
+   cu_header->version = read_2_bytes (abfd, info_ptr);
+   info_ptr += 2;
+   cu_header->abbrev_offset = read_4_bytes (abfd, info_ptr);
+   info_ptr += 4;
+   cu_header->addr_size = read_1_byte (abfd, info_ptr);
+   info_ptr += 1;
+   signed_addr = bfd_elf_get_sign_extend_vma (abfd);
+   if (signed_addr < 0)
+     internal_error ("dwarf2_build_psymtabs_hard: dwarf from non elf file");
+   cu_header->signed_addr_p = signed_addr;
+   return info_ptr;
+ }
+ 
  /* Build the partial symbol table by doing a quick pass through the
     .debug_info and .debug_abbrev sections.  */
  
*************** dwarf2_build_psymtabs_hard (objfile, mai
*** 911,917 ****
    bfd *abfd = objfile->obfd;
    char *info_ptr, *abbrev_ptr;
    char *beg_of_comp_unit;
-   struct comp_unit_head cu_header;
    struct partial_die_info comp_unit_die;
    struct partial_symtab *pst;
    struct cleanup *back_to;
--- 959,964 ----
*************** dwarf2_build_psymtabs_hard (objfile, mai
*** 927,942 ****
    while ((unsigned int) (info_ptr - dwarf_info_buffer)
  	 + ((info_ptr - dwarf_info_buffer) % 4) < dwarf_info_size)
      {
        beg_of_comp_unit = info_ptr;
!       cu_header.length = read_4_bytes (abfd, info_ptr);
!       info_ptr += 4;
!       cu_header.version = read_2_bytes (abfd, info_ptr);
!       info_ptr += 2;
!       cu_header.abbrev_offset = read_4_bytes (abfd, info_ptr);
!       info_ptr += 4;
!       cu_header.addr_size = read_1_byte (abfd, info_ptr);
!       info_ptr += 1;
!       address_size = cu_header.addr_size;
  
        if (cu_header.version != 2)
  	{
--- 974,982 ----
    while ((unsigned int) (info_ptr - dwarf_info_buffer)
  	 + ((info_ptr - dwarf_info_buffer) % 4) < dwarf_info_size)
      {
+       struct comp_unit_head cu_header;
        beg_of_comp_unit = info_ptr;
!       info_ptr = read_comp_unit_head (&cu_header, info_ptr, abfd);
  
        if (cu_header.version != 2)
  	{
*************** dwarf2_build_psymtabs_hard (objfile, mai
*** 963,970 ****
        make_cleanup (dwarf2_empty_abbrev_table, NULL);
  
        /* Read the compilation unit die */
!       info_ptr = read_partial_die (&comp_unit_die, abfd,
! 				   info_ptr, &comp_unit_has_pc_info);
  
        /* Set the language we're debugging */
        set_cu_language (comp_unit_die.language);
--- 1003,1010 ----
        make_cleanup (dwarf2_empty_abbrev_table, NULL);
  
        /* Read the compilation unit die */
!       info_ptr = read_partial_die (&comp_unit_die, abfd, info_ptr,
! 				   &comp_unit_has_pc_info, &cu_header);
  
        /* Set the language we're debugging */
        set_cu_language (comp_unit_die.language);
*************** dwarf2_build_psymtabs_hard (objfile, mai
*** 994,1000 ****
           If not, there's no more debug_info for this comp unit. */
        if (comp_unit_die.has_children)
  	{
! 	  info_ptr = scan_partial_symbols (info_ptr, objfile, &lowpc, &highpc);
  
  	  /* If the compilation unit didn't have an explicit address range,
  	     then use the information extracted from its child dies.  */
--- 1034,1041 ----
           If not, there's no more debug_info for this comp unit. */
        if (comp_unit_die.has_children)
  	{
! 	  info_ptr = scan_partial_symbols (info_ptr, objfile, &lowpc, &highpc,
! 					   &cu_header);
  
  	  /* If the compilation unit didn't have an explicit address range,
  	     then use the information extracted from its child dies.  */
*************** dwarf2_build_psymtabs_hard (objfile, mai
*** 1026,1036 ****
  /* Read in all interesting dies to the end of the compilation unit.  */
  
  static char *
! scan_partial_symbols (info_ptr, objfile, lowpc, highpc)
!      char *info_ptr;
!      struct objfile *objfile;
!      CORE_ADDR *lowpc;
!      CORE_ADDR *highpc;
  {
    bfd *abfd = objfile->obfd;
    struct partial_die_info pdi;
--- 1067,1075 ----
  /* Read in all interesting dies to the end of the compilation unit.  */
  
  static char *
! scan_partial_symbols (char *info_ptr, struct objfile *objfile,
! 		      CORE_ADDR *lowpc, CORE_ADDR *highpc,
! 		      const struct comp_unit_head *cu_header)
  {
    bfd *abfd = objfile->obfd;
    struct partial_die_info pdi;
*************** scan_partial_symbols (info_ptr, objfile,
*** 1049,1055 ****
  
    while (nesting_level)
      {
!       info_ptr = read_partial_die (&pdi, abfd, info_ptr, &has_pc_info);
  
        if (pdi.name)
  	{
--- 1088,1095 ----
  
    while (nesting_level)
      {
!       info_ptr = read_partial_die (&pdi, abfd, info_ptr,
! 				   &has_pc_info, cu_header);
  
        if (pdi.name)
  	{
*************** scan_partial_symbols (info_ptr, objfile,
*** 1069,1075 ****
  		  if ((pdi.is_external || nesting_level == 1)
  		      && !pdi.is_declaration)
  		    {
! 		      add_partial_symbol (&pdi, objfile);
  		    }
  		}
  	      break;
--- 1109,1115 ----
  		  if ((pdi.is_external || nesting_level == 1)
  		      && !pdi.is_declaration)
  		    {
! 		      add_partial_symbol (&pdi, objfile, cu_header);
  		    }
  		}
  	      break;
*************** scan_partial_symbols (info_ptr, objfile,
*** 1082,1101 ****
  	      if ((pdi.is_external || nesting_level == 1)
  		  && !pdi.is_declaration)
  		{
! 		  add_partial_symbol (&pdi, objfile);
  		}
  	      break;
  	    case DW_TAG_enumerator:
  	      /* File scope enumerators are added to the partial symbol
  	         table.  */
  	      if (nesting_level == 2)
! 		add_partial_symbol (&pdi, objfile);
  	      break;
  	    case DW_TAG_base_type:
  	      /* File scope base type definitions are added to the partial
  	         symbol table.  */
  	      if (nesting_level == 1)
! 		add_partial_symbol (&pdi, objfile);
  	      break;
  	    default:
  	      break;
--- 1122,1141 ----
  	      if ((pdi.is_external || nesting_level == 1)
  		  && !pdi.is_declaration)
  		{
! 		  add_partial_symbol (&pdi, objfile, cu_header);
  		}
  	      break;
  	    case DW_TAG_enumerator:
  	      /* File scope enumerators are added to the partial symbol
  	         table.  */
  	      if (nesting_level == 2)
! 		add_partial_symbol (&pdi, objfile, cu_header);
  	      break;
  	    case DW_TAG_base_type:
  	      /* File scope base type definitions are added to the partial
  	         symbol table.  */
  	      if (nesting_level == 1)
! 		add_partial_symbol (&pdi, objfile, cu_header);
  	      break;
  	    default:
  	      break;
*************** scan_partial_symbols (info_ptr, objfile,
*** 1130,1138 ****
  }
  
  static void
! add_partial_symbol (pdi, objfile)
!      struct partial_die_info *pdi;
!      struct objfile *objfile;
  {
    CORE_ADDR addr = 0;
  
--- 1170,1177 ----
  }
  
  static void
! add_partial_symbol (struct partial_die_info *pdi, struct objfile *objfile,
! 		    const struct comp_unit_head *cu_header)
  {
    CORE_ADDR addr = 0;
  
*************** add_partial_symbol (pdi, objfile)
*** 1175,1181 ****
  	     table building.  */
  
  	  if (pdi->locdesc)
! 	    addr = decode_locdesc (pdi->locdesc, objfile);
  	  if (pdi->locdesc || pdi->has_type)
  	    add_psymbol_to_list (pdi->name, strlen (pdi->name),
  				 VAR_NAMESPACE, LOC_STATIC,
--- 1214,1220 ----
  	     table building.  */
  
  	  if (pdi->locdesc)
! 	    addr = decode_locdesc (pdi->locdesc, objfile, cu_header);
  	  if (pdi->locdesc || pdi->has_type)
  	    add_psymbol_to_list (pdi->name, strlen (pdi->name),
  				 VAR_NAMESPACE, LOC_STATIC,
*************** add_partial_symbol (pdi, objfile)
*** 1187,1193 ****
  	  /* Static Variable. Skip symbols without location descriptors.  */
  	  if (pdi->locdesc == NULL)
  	    return;
! 	  addr = decode_locdesc (pdi->locdesc, objfile);
  	  /*prim_record_minimal_symbol (pdi->name, addr + baseaddr,
  	     mst_file_data, objfile); */
  	  add_psymbol_to_list (pdi->name, strlen (pdi->name),
--- 1226,1232 ----
  	  /* Static Variable. Skip symbols without location descriptors.  */
  	  if (pdi->locdesc == NULL)
  	    return;
! 	  addr = decode_locdesc (pdi->locdesc, objfile, cu_header);
  	  /*prim_record_minimal_symbol (pdi->name, addr + baseaddr,
  	     mst_file_data, objfile); */
  	  add_psymbol_to_list (pdi->name, strlen (pdi->name),
*************** psymtab_to_symtab_1 (pst)
*** 1298,1322 ****
    make_cleanup (really_free_pendings, NULL);
  
    /* read in the comp_unit header  */
!   cu_header.length = read_4_bytes (abfd, info_ptr);
!   info_ptr += 4;
!   cu_header.version = read_2_bytes (abfd, info_ptr);
!   info_ptr += 2;
!   cu_header.abbrev_offset = read_4_bytes (abfd, info_ptr);
!   info_ptr += 4;
!   cu_header.addr_size = read_1_byte (abfd, info_ptr);
!   info_ptr += 1;
  
    /* Read the abbrevs for this compilation unit  */
    dwarf2_read_abbrevs (abfd, cu_header.abbrev_offset);
    make_cleanup (dwarf2_empty_abbrev_table, NULL);
  
!   dies = read_comp_unit (info_ptr, abfd);
  
    make_cleanup_free_die_list (dies);
  
    /* Do line number decoding in read_file_scope () */
!   process_die (dies, objfile);
  
    if (!dwarf2_get_pc_bounds (dies, &lowpc, &highpc, objfile))
      {
--- 1337,1354 ----
    make_cleanup (really_free_pendings, NULL);
  
    /* read in the comp_unit header  */
!   info_ptr = read_comp_unit_head (&cu_header, info_ptr, abfd);
  
    /* Read the abbrevs for this compilation unit  */
    dwarf2_read_abbrevs (abfd, cu_header.abbrev_offset);
    make_cleanup (dwarf2_empty_abbrev_table, NULL);
  
!   dies = read_comp_unit (info_ptr, abfd, &cu_header);
  
    make_cleanup_free_die_list (dies);
  
    /* Do line number decoding in read_file_scope () */
!   process_die (dies, objfile, &cu_header);
  
    if (!dwarf2_get_pc_bounds (dies, &lowpc, &highpc, objfile))
      {
*************** psymtab_to_symtab_1 (pst)
*** 1362,1381 ****
  /* Process a die and its children.  */
  
  static void
! process_die (die, objfile)
!      struct die_info *die;
!      struct objfile *objfile;
  {
    switch (die->tag)
      {
      case DW_TAG_padding:
        break;
      case DW_TAG_compile_unit:
!       read_file_scope (die, objfile);
        break;
      case DW_TAG_subprogram:
!       read_subroutine_type (die, objfile);
!       read_func_scope (die, objfile);
        break;
      case DW_TAG_inlined_subroutine:
        /* FIXME:  These are ignored for now.
--- 1394,1412 ----
  /* Process a die and its children.  */
  
  static void
! process_die (struct die_info *die, struct objfile *objfile,
! 	     const struct comp_unit_head *cu_header)
  {
    switch (die->tag)
      {
      case DW_TAG_padding:
        break;
      case DW_TAG_compile_unit:
!       read_file_scope (die, objfile, cu_header);
        break;
      case DW_TAG_subprogram:
!       read_subroutine_type (die, objfile, cu_header);
!       read_func_scope (die, objfile, cu_header);
        break;
      case DW_TAG_inlined_subroutine:
        /* FIXME:  These are ignored for now.
*************** process_die (die, objfile)
*** 1383,1412 ****
           of a function and make GDB `next' properly over inlined functions.  */
        break;
      case DW_TAG_lexical_block:
!       read_lexical_block_scope (die, objfile);
        break;
      case DW_TAG_class_type:
      case DW_TAG_structure_type:
      case DW_TAG_union_type:
!       read_structure_scope (die, objfile);
        break;
      case DW_TAG_enumeration_type:
!       read_enumeration (die, objfile);
        break;
      case DW_TAG_subroutine_type:
!       read_subroutine_type (die, objfile);
        break;
      case DW_TAG_array_type:
!       read_array_type (die, objfile);
        break;
      case DW_TAG_pointer_type:
!       read_tag_pointer_type (die, objfile);
        break;
      case DW_TAG_ptr_to_member_type:
!       read_tag_ptr_to_member_type (die, objfile);
        break;
      case DW_TAG_reference_type:
!       read_tag_reference_type (die, objfile);
        break;
      case DW_TAG_string_type:
        read_tag_string_type (die, objfile);
--- 1414,1443 ----
           of a function and make GDB `next' properly over inlined functions.  */
        break;
      case DW_TAG_lexical_block:
!       read_lexical_block_scope (die, objfile, cu_header);
        break;
      case DW_TAG_class_type:
      case DW_TAG_structure_type:
      case DW_TAG_union_type:
!       read_structure_scope (die, objfile, cu_header);
        break;
      case DW_TAG_enumeration_type:
!       read_enumeration (die, objfile, cu_header);
        break;
      case DW_TAG_subroutine_type:
!       read_subroutine_type (die, objfile, cu_header);
        break;
      case DW_TAG_array_type:
!       read_array_type (die, objfile, cu_header);
        break;
      case DW_TAG_pointer_type:
!       read_tag_pointer_type (die, objfile, cu_header);
        break;
      case DW_TAG_ptr_to_member_type:
!       read_tag_ptr_to_member_type (die, objfile, cu_header);
        break;
      case DW_TAG_reference_type:
!       read_tag_reference_type (die, objfile, cu_header);
        break;
      case DW_TAG_string_type:
        read_tag_string_type (die, objfile);
*************** process_die (die, objfile)
*** 1416,1439 ****
        if (dwarf_attr (die, DW_AT_name))
  	{
  	  /* Add a typedef symbol for the base type definition.  */
! 	  new_symbol (die, die->type, objfile);
  	}
        break;
      case DW_TAG_common_block:
!       read_common_block (die, objfile);
        break;
      case DW_TAG_common_inclusion:
        break;
      default:
!       new_symbol (die, NULL, objfile);
        break;
      }
  }
  
  static void
! read_file_scope (die, objfile)
!      struct die_info *die;
!      struct objfile *objfile;
  {
    unsigned int line_offset = 0;
    CORE_ADDR lowpc = ((CORE_ADDR) -1);
--- 1447,1469 ----
        if (dwarf_attr (die, DW_AT_name))
  	{
  	  /* Add a typedef symbol for the base type definition.  */
! 	  new_symbol (die, die->type, objfile, cu_header);
  	}
        break;
      case DW_TAG_common_block:
!       read_common_block (die, objfile, cu_header);
        break;
      case DW_TAG_common_inclusion:
        break;
      default:
!       new_symbol (die, NULL, objfile, cu_header);
        break;
      }
  }
  
  static void
! read_file_scope (struct die_info *die, struct objfile *objfile,
! 		 const struct comp_unit_head *cu_header)
  {
    unsigned int line_offset = 0;
    CORE_ADDR lowpc = ((CORE_ADDR) -1);
*************** read_file_scope (die, objfile)
*** 1528,1534 ****
    if (attr)
      {
        line_offset = DW_UNSND (attr);
!       dwarf_decode_lines (line_offset, comp_dir, abfd);
      }
  
    /* Process all dies in compilation unit.  */
--- 1558,1564 ----
    if (attr)
      {
        line_offset = DW_UNSND (attr);
!       dwarf_decode_lines (line_offset, comp_dir, abfd, cu_header);
      }
  
    /* Process all dies in compilation unit.  */
*************** read_file_scope (die, objfile)
*** 1537,1552 ****
        child_die = die->next;
        while (child_die && child_die->tag)
  	{
! 	  process_die (child_die, objfile);
  	  child_die = sibling_die (child_die);
  	}
      }
  }
  
  static void
! read_func_scope (die, objfile)
!      struct die_info *die;
!      struct objfile *objfile;
  {
    register struct context_stack *new;
    CORE_ADDR lowpc;
--- 1567,1581 ----
        child_die = die->next;
        while (child_die && child_die->tag)
  	{
! 	  process_die (child_die, objfile, cu_header);
  	  child_die = sibling_die (child_die);
  	}
      }
  }
  
  static void
! read_func_scope (struct die_info *die, struct objfile *objfile,
! 		 const struct comp_unit_head *cu_header)
  {
    register struct context_stack *new;
    CORE_ADDR lowpc;
*************** read_func_scope (die, objfile)
*** 1579,1585 ****
    attr = dwarf_attr (die, DW_AT_frame_base);
    if (attr)
      {
!       CORE_ADDR addr = decode_locdesc (DW_BLOCK (attr), objfile);
        if (isderef)
  	complain (&dwarf2_unsupported_at_frame_base, name);
        else if (isreg)
--- 1608,1614 ----
    attr = dwarf_attr (die, DW_AT_frame_base);
    if (attr)
      {
!       CORE_ADDR addr = decode_locdesc (DW_BLOCK (attr), objfile, cu_header);
        if (isderef)
  	complain (&dwarf2_unsupported_at_frame_base, name);
        else if (isreg)
*************** read_func_scope (die, objfile)
*** 1594,1600 ****
      }
  
    new = push_context (0, lowpc);
!   new->name = new_symbol (die, die->type, objfile);
    list_in_scope = &local_symbols;
  
    if (die->has_children)
--- 1623,1629 ----
      }
  
    new = push_context (0, lowpc);
!   new->name = new_symbol (die, die->type, objfile, cu_header);
    list_in_scope = &local_symbols;
  
    if (die->has_children)
*************** read_func_scope (die, objfile)
*** 1602,1608 ****
        child_die = die->next;
        while (child_die && child_die->tag)
  	{
! 	  process_die (child_die, objfile);
  	  child_die = sibling_die (child_die);
  	}
      }
--- 1631,1637 ----
        child_die = die->next;
        while (child_die && child_die->tag)
  	{
! 	  process_die (child_die, objfile, cu_header);
  	  child_die = sibling_die (child_die);
  	}
      }
*************** read_func_scope (die, objfile)
*** 1618,1626 ****
     a new scope, process the dies, and then close the scope.  */
  
  static void
! read_lexical_block_scope (die, objfile)
!      struct die_info *die;
!      struct objfile *objfile;
  {
    register struct context_stack *new;
    CORE_ADDR lowpc, highpc;
--- 1647,1654 ----
     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)
  {
    register struct context_stack *new;
    CORE_ADDR lowpc, highpc;
*************** read_lexical_block_scope (die, objfile)
*** 1638,1644 ****
        child_die = die->next;
        while (child_die && child_die->tag)
  	{
! 	  process_die (child_die, objfile);
  	  child_die = sibling_die (child_die);
  	}
      }
--- 1666,1672 ----
        child_die = die->next;
        while (child_die && child_die->tag)
  	{
! 	  process_die (child_die, objfile, cu_header);
  	  child_die = sibling_die (child_die);
  	}
      }
*************** dwarf2_get_pc_bounds (die, lowpc, highpc
*** 1699,1708 ****
  /* Add an aggregate field to the field list.  */
  
  static void
! dwarf2_add_field (fip, die, objfile)
!      struct field_info *fip;
!      struct die_info *die;
!      struct objfile *objfile;
  {
    struct nextfield *new_field;
    struct attribute *attr;
--- 1727,1735 ----
  /* Add an aggregate field to the field list.  */
  
  static void
! dwarf2_add_field (struct field_info *fip, struct die_info *die,
! 		  struct objfile *objfile,
! 		  const struct comp_unit_head *cu_header)
  {
    struct nextfield *new_field;
    struct attribute *attr;
*************** dwarf2_add_field (fip, die, objfile)
*** 1739,1745 ****
    if (die->tag == DW_TAG_member)
      {
        /* Get type of field.  */
!       fp->type = die_type (die, objfile);
  
        /* Get bit size of field (zero if none).  */
        attr = dwarf_attr (die, DW_AT_bit_size);
--- 1766,1772 ----
    if (die->tag == DW_TAG_member)
      {
        /* Get type of field.  */
!       fp->type = die_type (die, objfile, cu_header);
  
        /* Get bit size of field (zero if none).  */
        attr = dwarf_attr (die, DW_AT_bit_size);
*************** dwarf2_add_field (fip, die, objfile)
*** 1757,1763 ****
        if (attr)
  	{
  	  FIELD_BITPOS (*fp) =
! 	    decode_locdesc (DW_BLOCK (attr), objfile) * bits_per_byte;
  	}
        else
  	FIELD_BITPOS (*fp) = 0;
--- 1784,1790 ----
        if (attr)
  	{
  	  FIELD_BITPOS (*fp) =
! 	    decode_locdesc (DW_BLOCK (attr), objfile, cu_header) * bits_per_byte;
  	}
        else
  	FIELD_BITPOS (*fp) = 0;
*************** dwarf2_add_field (fip, die, objfile)
*** 1837,1843 ****
  
        SET_FIELD_PHYSNAME (*fp, obsavestring (physname, strlen (physname),
  					     &objfile->type_obstack));
!       FIELD_TYPE (*fp) = die_type (die, objfile);
        FIELD_NAME (*fp) = obsavestring (fieldname, strlen (fieldname),
  				       &objfile->type_obstack);
      }
--- 1864,1870 ----
  
        SET_FIELD_PHYSNAME (*fp, obsavestring (physname, strlen (physname),
  					     &objfile->type_obstack));
!       FIELD_TYPE (*fp) = die_type (die, objfile, cu_header);
        FIELD_NAME (*fp) = obsavestring (fieldname, strlen (fieldname),
  				       &objfile->type_obstack);
      }
*************** dwarf2_add_field (fip, die, objfile)
*** 1846,1854 ****
        /* C++ base class field.  */
        attr = dwarf_attr (die, DW_AT_data_member_location);
        if (attr)
! 	FIELD_BITPOS (*fp) = decode_locdesc (DW_BLOCK (attr), objfile) * bits_per_byte;
        FIELD_BITSIZE (*fp) = 0;
!       FIELD_TYPE (*fp) = die_type (die, objfile);
        FIELD_NAME (*fp) = type_name_no_tag (fp->type);
        fip->nbaseclasses++;
      }
--- 1873,1882 ----
        /* 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)
! 			      * bits_per_byte);
        FIELD_BITSIZE (*fp) = 0;
!       FIELD_TYPE (*fp) = die_type (die, objfile, cu_header);
        FIELD_NAME (*fp) = type_name_no_tag (fp->type);
        fip->nbaseclasses++;
      }
*************** dwarf2_attach_fields_to_type (fip, type,
*** 1946,1956 ****
  /* Add a member function to the proper fieldlist.  */
  
  static void
! dwarf2_add_member_fn (fip, die, type, objfile)
!      struct field_info *fip;
!      struct die_info *die;
!      struct type *type;
!      struct objfile *objfile;
  {
    struct attribute *attr;
    struct fnfieldlist *flp;
--- 1974,1982 ----
  /* Add a member function to the proper fieldlist.  */
  
  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 attribute *attr;
    struct fnfieldlist *flp;
*************** dwarf2_add_member_fn (fip, die, type, ob
*** 2047,2053 ****
  
    /* 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);
  
    /* 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.  */
--- 2073,2079 ----
  
    /* 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);
  
    /* 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.  */
*************** dwarf2_add_member_fn (fip, die, type, ob
*** 2070,2076 ****
    /* Get index in virtual function table if it is a virtual member function.  */
    attr = dwarf_attr (die, DW_AT_vtable_elem_location);
    if (attr)
!     fnp->voffset = decode_locdesc (DW_BLOCK (attr), objfile) + 2;
  }
  
  /* Create the vector of member function fields, and attach it to the type.  */
--- 2096,2102 ----
    /* Get index in virtual function table if it is a virtual member function.  */
    attr = dwarf_attr (die, DW_AT_vtable_elem_location);
    if (attr)
!     fnp->voffset = decode_locdesc (DW_BLOCK (attr), objfile, cu_header) + 2;
  }
  
  /* Create the vector of member function fields, and attach it to the type.  */
*************** dwarf2_attach_fn_fields_to_type (fip, ty
*** 2126,2134 ****
     suppresses creating a symbol table entry itself).  */
  
  static void
! read_structure_scope (die, objfile)
!      struct die_info *die;
!      struct objfile *objfile;
  {
    struct type *type;
    struct attribute *attr;
--- 2152,2159 ----
     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)
  {
    struct type *type;
    struct attribute *attr;
*************** read_structure_scope (die, objfile)
*** 2188,2214 ****
  	{
  	  if (child_die->tag == DW_TAG_member)
  	    {
! 	      dwarf2_add_field (&fi, child_die, objfile);
  	    }
  	  else if (child_die->tag == DW_TAG_variable)
  	    {
  	      /* C++ static member.  */
! 	      dwarf2_add_field (&fi, child_die, objfile);
  	    }
! 	  else if (child_die->tag == DW_TAG_subprogram)
  	    {
  	      /* C++ member function. */
! 	      process_die (child_die, objfile);
! 	      dwarf2_add_member_fn (&fi, child_die, type, objfile);
  	    }
  	  else if (child_die->tag == DW_TAG_inheritance)
  	    {
  	      /* C++ base class field.  */
! 	      dwarf2_add_field (&fi, child_die, objfile);
  	    }
  	  else
  	    {
! 	      process_die (child_die, objfile);
  	    }
  	  child_die = sibling_die (child_die);
  	}
--- 2213,2239 ----
  	{
  	  if (child_die->tag == DW_TAG_member)
  	    {
! 	      dwarf2_add_field (&fi, child_die, objfile, cu_header);
  	    }
  	  else if (child_die->tag == DW_TAG_variable)
  	    {
  	      /* C++ static member.  */
! 	      dwarf2_add_field (&fi, child_die, objfile, cu_header);
  	    }
! 	  else if (child_die->tag == DW_TAG_subprogram, cu_header)
  	    {
  	      /* C++ member function. */
! 	      process_die (child_die, objfile, cu_header);
! 	      dwarf2_add_member_fn (&fi, child_die, type, objfile, cu_header);
  	    }
  	  else if (child_die->tag == DW_TAG_inheritance)
  	    {
  	      /* C++ base class field.  */
! 	      dwarf2_add_field (&fi, child_die, objfile, cu_header);
  	    }
  	  else
  	    {
! 	      process_die (child_die, objfile, cu_header);
  	    }
  	  child_die = sibling_die (child_die);
  	}
*************** read_structure_scope (die, objfile)
*** 2226,2232 ****
  
  	  if (dwarf_attr (die, DW_AT_containing_type) != NULL)
  	    {
! 	      struct type *t = die_containing_type (die, objfile);
  
  	      TYPE_VPTR_BASETYPE (type) = t;
  	      if (type == t)
--- 2251,2257 ----
  
  	  if (dwarf_attr (die, DW_AT_containing_type) != NULL)
  	    {
! 	      struct type *t = die_containing_type (die, objfile, cu_header);
  
  	      TYPE_VPTR_BASETYPE (type) = t;
  	      if (type == t)
*************** read_structure_scope (die, objfile)
*** 2262,2268 ****
  	    }
  	}
  
!       new_symbol (die, type, objfile);
  
        do_cleanups (back_to);
      }
--- 2287,2293 ----
  	    }
  	}
  
!       new_symbol (die, type, objfile, cu_header);
  
        do_cleanups (back_to);
      }
*************** read_structure_scope (die, objfile)
*** 2285,2293 ****
     NOTE: We reverse the order of the element list.  */
  
  static void
! read_enumeration (die, objfile)
!      struct die_info *die;
!      struct objfile *objfile;
  {
    struct die_info *child_die;
    struct type *type;
--- 2310,2317 ----
     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)
  {
    struct die_info *child_die;
    struct type *type;
*************** read_enumeration (die, objfile)
*** 2327,2340 ****
  	{
  	  if (child_die->tag != DW_TAG_enumerator)
  	    {
! 	      process_die (child_die, objfile);
  	    }
  	  else
  	    {
  	      attr = dwarf_attr (child_die, DW_AT_name);
  	      if (attr)
  		{
! 		  sym = new_symbol (child_die, type, objfile);
  		  if (SYMBOL_VALUE (sym) < 0)
  		    unsigned_enum = 0;
  
--- 2351,2364 ----
  	{
  	  if (child_die->tag != DW_TAG_enumerator)
  	    {
! 	      process_die (child_die, objfile, cu_header);
  	    }
  	  else
  	    {
  	      attr = dwarf_attr (child_die, DW_AT_name);
  	      if (attr)
  		{
! 		  sym = new_symbol (child_die, type, objfile, cu_header);
  		  if (SYMBOL_VALUE (sym) < 0)
  		    unsigned_enum = 0;
  
*************** read_enumeration (die, objfile)
*** 2371,2377 ****
  	TYPE_FLAGS (type) |= TYPE_FLAG_UNSIGNED;
      }
    die->type = type;
!   new_symbol (die, type, objfile);
  }
  
  /* Extract all information from a DW_TAG_array_type DIE and put it in
--- 2395,2401 ----
  	TYPE_FLAGS (type) |= TYPE_FLAG_UNSIGNED;
      }
    die->type = type;
!   new_symbol (die, type, objfile, cu_header);
  }
  
  /* Extract all information from a DW_TAG_array_type DIE and put it in
*************** read_enumeration (die, objfile)
*** 2379,2387 ****
     arrays.  */
  
  static void
! read_array_type (die, objfile)
!      struct die_info *die;
!      struct objfile *objfile;
  {
    struct die_info *child_die;
    struct type *type = NULL;
--- 2403,2410 ----
     arrays.  */
  
  static void
! read_array_type (struct die_info *die, struct objfile *objfile,
! 		 const struct comp_unit_head *cu_header)
  {
    struct die_info *child_die;
    struct type *type = NULL;
*************** read_array_type (die, objfile)
*** 2397,2403 ****
        return;
      }
  
!   element_type = die_type (die, objfile);
  
    /* Irix 6.2 native cc creates array types without children for
       arrays with unspecified length.  */
--- 2420,2426 ----
        return;
      }
  
!   element_type = die_type (die, objfile, cu_header);
  
    /* Irix 6.2 native cc creates array types without children for
       arrays with unspecified length.  */
*************** read_array_type (die, objfile)
*** 2426,2432 ****
  	      low = 1;
  	    }
  
! 	  index_type = die_type (child_die, objfile);
  	  attr = dwarf_attr (child_die, DW_AT_lower_bound);
  	  if (attr)
  	    {
--- 2449,2455 ----
  	      low = 1;
  	    }
  
! 	  index_type = die_type (child_die, objfile, cu_header);
  	  attr = dwarf_attr (child_die, DW_AT_lower_bound);
  	  if (attr)
  	    {
*************** read_array_type (die, objfile)
*** 2518,2526 ****
  /* First cut: install each common block member as a global variable.  */
  
  static void
! read_common_block (die, objfile)
!      struct die_info *die;
!      struct objfile *objfile;
  {
    struct die_info *child_die;
    struct attribute *attr;
--- 2541,2548 ----
  /* 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)
  {
    struct die_info *child_die;
    struct attribute *attr;
*************** read_common_block (die, objfile)
*** 2530,2548 ****
    attr = dwarf_attr (die, DW_AT_location);
    if (attr)
      {
!       base = decode_locdesc (DW_BLOCK (attr), objfile);
      }
    if (die->has_children)
      {
        child_die = die->next;
        while (child_die && child_die->tag)
  	{
! 	  sym = new_symbol (child_die, NULL, objfile);
  	  attr = dwarf_attr (child_die, DW_AT_data_member_location);
  	  if (attr)
  	    {
  	      SYMBOL_VALUE_ADDRESS (sym) =
! 		base + decode_locdesc (DW_BLOCK (attr), objfile);
  	      add_symbol_to_list (sym, &global_symbols);
  	    }
  	  child_die = sibling_die (child_die);
--- 2552,2570 ----
    attr = dwarf_attr (die, DW_AT_location);
    if (attr)
      {
!       base = decode_locdesc (DW_BLOCK (attr), objfile, cu_header);
      }
    if (die->has_children)
      {
        child_die = die->next;
        while (child_die && child_die->tag)
  	{
! 	  sym = new_symbol (child_die, NULL, objfile, cu_header);
  	  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);
  	      add_symbol_to_list (sym, &global_symbols);
  	    }
  	  child_die = sibling_die (child_die);
*************** read_common_block (die, objfile)
*** 2554,2562 ****
     the user defined type vector.  */
  
  static void
! read_tag_pointer_type (die, objfile)
!      struct die_info *die;
!      struct objfile *objfile;
  {
    struct type *type;
    struct attribute *attr;
--- 2576,2583 ----
     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)
  {
    struct type *type;
    struct attribute *attr;
*************** read_tag_pointer_type (die, objfile)
*** 2566,2572 ****
        return;
      }
  
!   type = lookup_pointer_type (die_type (die, objfile));
    attr = dwarf_attr (die, DW_AT_byte_size);
    if (attr)
      {
--- 2587,2593 ----
        return;
      }
  
!   type = lookup_pointer_type (die_type (die, objfile, cu_header));
    attr = dwarf_attr (die, DW_AT_byte_size);
    if (attr)
      {
*************** read_tag_pointer_type (die, objfile)
*** 2574,2580 ****
      }
    else
      {
!       TYPE_LENGTH (type) = address_size;
      }
    die->type = type;
  }
--- 2595,2601 ----
      }
    else
      {
!       TYPE_LENGTH (type) = cu_header->addr_size;
      }
    die->type = type;
  }
*************** read_tag_pointer_type (die, objfile)
*** 2583,2591 ****
     the user defined type vector.  */
  
  static void
! read_tag_ptr_to_member_type (die, objfile)
!      struct die_info *die;
!      struct objfile *objfile;
  {
    struct type *type;
    struct type *to_type;
--- 2604,2611 ----
     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)
  {
    struct type *type;
    struct type *to_type;
*************** read_tag_ptr_to_member_type (die, objfil
*** 2597,2604 ****
      }
  
    type = alloc_type (objfile);
!   to_type = die_type (die, objfile);
!   domain = die_containing_type (die, objfile);
    smash_to_member_type (type, domain, to_type);
  
    die->type = type;
--- 2617,2624 ----
      }
  
    type = alloc_type (objfile);
!   to_type = die_type (die, objfile, cu_header);
!   domain = die_containing_type (die, objfile, cu_header);
    smash_to_member_type (type, domain, to_type);
  
    die->type = type;
*************** read_tag_ptr_to_member_type (die, objfil
*** 2608,2616 ****
     the user defined type vector.  */
  
  static void
! read_tag_reference_type (die, objfile)
!      struct die_info *die;
!      struct objfile *objfile;
  {
    struct type *type;
    struct attribute *attr;
--- 2628,2635 ----
     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)
  {
    struct type *type;
    struct attribute *attr;
*************** read_tag_reference_type (die, objfile)
*** 2620,2626 ****
        return;
      }
  
!   type = lookup_reference_type (die_type (die, objfile));
    attr = dwarf_attr (die, DW_AT_byte_size);
    if (attr)
      {
--- 2639,2645 ----
        return;
      }
  
!   type = lookup_reference_type (die_type (die, objfile, cu_header));
    attr = dwarf_attr (die, DW_AT_byte_size);
    if (attr)
      {
*************** read_tag_reference_type (die, objfile)
*** 2628,2642 ****
      }
    else
      {
!       TYPE_LENGTH (type) = address_size;
      }
    die->type = type;
  }
  
  static void
! read_tag_const_type (die, objfile)
!      struct die_info *die;
!      struct objfile *objfile;
  {
    if (die->type)
      {
--- 2647,2660 ----
      }
    else
      {
!       TYPE_LENGTH (type) = cu_header->addr_size;
      }
    die->type = type;
  }
  
  static void
! read_tag_const_type (struct die_info *die, struct objfile *objfile,
! 		     const struct comp_unit_head *cu_header)
  {
    if (die->type)
      {
*************** read_tag_const_type (die, objfile)
*** 2644,2656 ****
      }
  
    complain (&dwarf2_const_ignored);
!   die->type = die_type (die, objfile);
  }
  
  static void
! read_tag_volatile_type (die, objfile)
!      struct die_info *die;
!      struct objfile *objfile;
  {
    if (die->type)
      {
--- 2662,2673 ----
      }
  
    complain (&dwarf2_const_ignored);
!   die->type = die_type (die, objfile, cu_header);
  }
  
  static void
! read_tag_volatile_type (struct die_info *die, struct objfile *objfile,
! 			const struct comp_unit_head *cu_header)
  {
    if (die->type)
      {
*************** read_tag_volatile_type (die, objfile)
*** 2658,2664 ****
      }
  
    complain (&dwarf2_volatile_ignored);
!   die->type = die_type (die, objfile);
  }
  
  /* Extract all information from a DW_TAG_string_type DIE and add to
--- 2675,2681 ----
      }
  
    complain (&dwarf2_volatile_ignored);
!   die->type = die_type (die, objfile, cu_header);
  }
  
  /* Extract all information from a DW_TAG_string_type DIE and add to
*************** read_tag_string_type (die, objfile)
*** 2708,2716 ****
   */
  
  static void
! read_subroutine_type (die, objfile)
!      struct die_info *die;
!      struct objfile *objfile;
  {
    struct type *type;		/* Type that this function returns */
    struct type *ftype;		/* Function that returns above type */
--- 2725,2732 ----
   */
  
  static void
! read_subroutine_type (struct die_info *die, struct objfile *objfile,
! 		      const struct comp_unit_head *cu_header)
  {
    struct type *type;		/* Type that this function returns */
    struct type *ftype;		/* Function that returns above type */
*************** read_subroutine_type (die, objfile)
*** 2721,2727 ****
      {
        return;
      }
!   type = die_type (die, objfile);
    ftype = lookup_function_type (type);
  
    /* All functions in C++ have prototypes.  */
--- 2737,2743 ----
      {
        return;
      }
!   type = die_type (die, objfile, cu_header);
    ftype = lookup_function_type (type);
  
    /* All functions in C++ have prototypes.  */
*************** read_subroutine_type (die, objfile)
*** 2769,2775 ****
  		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);
  	      iparams++;
  	    }
  	  child_die = sibling_die (child_die);
--- 2785,2792 ----
  		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);
  	      iparams++;
  	    }
  	  child_die = sibling_die (child_die);
*************** read_subroutine_type (die, objfile)
*** 2780,2788 ****
  }
  
  static void
! read_typedef (die, objfile)
!      struct die_info *die;
!      struct objfile *objfile;
  {
    struct type *type;
  
--- 2797,2804 ----
  }
  
  static void
! read_typedef (struct die_info *die, struct objfile *objfile,
! 	      const struct comp_unit_head *cu_header)
  {
    struct type *type;
  
*************** read_typedef (die, objfile)
*** 2791,2797 ****
        struct attribute *attr;
        struct type *xtype;
  
!       xtype = die_type (die, objfile);
  
        type = alloc_type (objfile);
        TYPE_CODE (type) = TYPE_CODE_TYPEDEF;
--- 2807,2813 ----
        struct attribute *attr;
        struct type *xtype;
  
!       xtype = die_type (die, objfile, cu_header);
  
        type = alloc_type (objfile);
        TYPE_CODE (type) = TYPE_CODE_TYPEDEF;
*************** read_base_type (die, objfile)
*** 2884,2892 ****
  /* Read a whole compilation unit into a linked list of dies.  */
  
  struct die_info *
! read_comp_unit (info_ptr, abfd)
!      char *info_ptr;
!      bfd *abfd;
  {
    struct die_info *first_die, *last_die, *die;
    char *cur_ptr;
--- 2900,2907 ----
  /* Read a whole compilation unit into a linked list of dies.  */
  
  struct die_info *
! read_comp_unit (char *info_ptr, bfd *abfd,
! 		const struct comp_unit_head *cu_header)
  {
    struct die_info *first_die, *last_die, *die;
    char *cur_ptr;
*************** read_comp_unit (info_ptr, abfd)
*** 2900,2906 ****
    first_die = last_die = NULL;
    do
      {
!       cur_ptr = read_full_die (&die, abfd, cur_ptr);
        if (die->has_children)
  	{
  	  nesting_level++;
--- 2915,2921 ----
    first_die = last_die = NULL;
    do
      {
!       cur_ptr = read_full_die (&die, abfd, cur_ptr, cu_header);
        if (die->has_children)
  	{
  	  nesting_level++;
*************** dwarf2_lookup_abbrev (number)
*** 3113,3123 ****
  /* Read a minimal amount of information into the minimal die structure.  */
  
  static char *
! read_partial_die (part_die, abfd, info_ptr, has_pc_info)
!      struct partial_die_info *part_die;
!      bfd *abfd;
!      char *info_ptr;
!      int *has_pc_info;
  {
    unsigned int abbrev_number, bytes_read, i;
    struct abbrev_info *abbrev;
--- 3128,3136 ----
  /* Read a minimal amount of information into the minimal die structure.  */
  
  static char *
! read_partial_die (struct partial_die_info *part_die, bfd *abfd,
! 		  char *info_ptr, int *has_pc_info,
! 		  const struct comp_unit_head *cu_header)
  {
    unsigned int abbrev_number, bytes_read, i;
    struct abbrev_info *abbrev;
*************** read_partial_die (part_die, abfd, info_p
*** 3146,3152 ****
  
    for (i = 0; i < abbrev->num_attrs; ++i)
      {
!       info_ptr = read_attribute (&attr, &abbrev->attrs[i], abfd, info_ptr);
  
        /* Store the data if it is of an attribute we want to keep in a
           partial symbol table.  */
--- 3159,3166 ----
  
    for (i = 0; i < abbrev->num_attrs; ++i)
      {
!       info_ptr = read_attribute (&attr, &abbrev->attrs[i], abfd,
! 				 info_ptr, cu_header);
  
        /* Store the data if it is of an attribute we want to keep in a
           partial symbol table.  */
*************** read_partial_die (part_die, abfd, info_p
*** 3213,3219 ****
        int dummy;
  
        spec_ptr = dwarf_info_buffer + dwarf2_get_ref_die_offset (&spec_attr);
!       read_partial_die (&spec_die, abfd, spec_ptr, &dummy);
        if (spec_die.name)
  	{
  	  part_die->name = spec_die.name;
--- 3227,3233 ----
        int dummy;
  
        spec_ptr = dwarf_info_buffer + dwarf2_get_ref_die_offset (&spec_attr);
!       read_partial_die (&spec_die, abfd, spec_ptr, &dummy, cu_header);
        if (spec_die.name)
  	{
  	  part_die->name = spec_die.name;
*************** read_partial_die (part_die, abfd, info_p
*** 3244,3253 ****
     point to a newly allocated die with its information.  */
  
  static char *
! read_full_die (diep, abfd, info_ptr)
!      struct die_info **diep;
!      bfd *abfd;
!      char *info_ptr;
  {
    unsigned int abbrev_number, bytes_read, i, offset;
    struct abbrev_info *abbrev;
--- 3258,3265 ----
     point to a newly allocated die with its information.  */
  
  static char *
! read_full_die (struct die_info **diep, bfd *abfd, char *info_ptr,
! 	       const struct comp_unit_head *cu_header)
  {
    unsigned int abbrev_number, bytes_read, i, offset;
    struct abbrev_info *abbrev;
*************** read_full_die (diep, abfd, info_ptr)
*** 3285,3291 ****
    for (i = 0; i < abbrev->num_attrs; ++i)
      {
        info_ptr = read_attribute (&die->attrs[i], &abbrev->attrs[i],
! 				 abfd, info_ptr);
      }
  
    *diep = die;
--- 3297,3303 ----
    for (i = 0; i < abbrev->num_attrs; ++i)
      {
        info_ptr = read_attribute (&die->attrs[i], &abbrev->attrs[i],
! 				 abfd, info_ptr, cu_header);
      }
  
    *diep = die;
*************** read_full_die (diep, abfd, info_ptr)
*** 3295,3305 ****
  /* Read an attribute described by an abbreviated attribute.  */
  
  static char *
! read_attribute (attr, abbrev, abfd, info_ptr)
!      struct attribute *attr;
!      struct attr_abbrev *abbrev;
!      bfd *abfd;
!      char *info_ptr;
  {
    unsigned int bytes_read;
    struct dwarf_block *blk;
--- 3307,3315 ----
  /* Read an attribute described by an abbreviated attribute.  */
  
  static char *
! read_attribute (struct attribute *attr, struct attr_abbrev *abbrev,
! 		bfd *abfd, char *info_ptr,
! 		const struct comp_unit_head *cu_header)
  {
    unsigned int bytes_read;
    struct dwarf_block *blk;
*************** read_attribute (attr, abbrev, abfd, info
*** 3310,3317 ****
      {
      case DW_FORM_addr:
      case DW_FORM_ref_addr:
!       DW_ADDR (attr) = read_address (abfd, info_ptr);
!       info_ptr += address_size;
        break;
      case DW_FORM_block2:
        blk = dwarf_alloc_block ();
--- 3320,3327 ----
      {
      case DW_FORM_addr:
      case DW_FORM_ref_addr:
!       DW_ADDR (attr) = read_address (abfd, info_ptr, cu_header, &bytes_read);
!       info_ptr += bytes_read;
        break;
      case DW_FORM_block2:
        blk = dwarf_alloc_block ();
*************** read_8_bytes (abfd, buf)
*** 3461,3489 ****
  }
  
  static CORE_ADDR
! read_address (abfd, buf)
!      bfd *abfd;
!      char *buf;
  {
    CORE_ADDR retval = 0;
  
!   switch (address_size)
      {
!     case 2:
!       retval = bfd_get_16 (abfd, (bfd_byte *) buf);
!       break;
!     case 4:
!       retval = bfd_get_32 (abfd, (bfd_byte *) buf);
!       break;
!     case 8:
!       retval = bfd_get_64 (abfd, (bfd_byte *) buf);
!       break;
!     default:
!       /* *THE* alternative is 8, right? */
!       abort ();
      }
  
!  return retval;
  }
  
  static char *
--- 3471,3518 ----
  }
  
  static CORE_ADDR
! read_address (bfd *abfd, char *buf, const struct comp_unit_head *cu_header,
! 	      int *bytes_read)
  {
    CORE_ADDR retval = 0;
  
!   if (cu_header->signed_addr_p)
      {
!       switch (cu_header->addr_size)
! 	{
! 	case 2:
! 	  retval = bfd_get_signed_16 (abfd, (bfd_byte *) buf);
! 	  break;
! 	case 4:
! 	  retval = bfd_get_signed_32 (abfd, (bfd_byte *) buf);
! 	  break;
! 	case 8:
! 	  retval = bfd_get_signed_64 (abfd, (bfd_byte *) buf);
! 	  break;
! 	default:
! 	  internal_error ("read_address: bad switch, signed");
! 	}
!     }
!   else
!     {
!       switch (cu_header->addr_size)
! 	{
! 	case 2:
! 	  retval = bfd_get_16 (abfd, (bfd_byte *) buf);
! 	  break;
! 	case 4:
! 	  retval = bfd_get_32 (abfd, (bfd_byte *) buf);
! 	  break;
! 	case 8:
! 	  retval = bfd_get_64 (abfd, (bfd_byte *) buf);
! 	  break;
! 	default:
! 	  internal_error ("read_address: bad switch, unsigned");
! 	}
      }
  
!   *bytes_read = cu_header->addr_size;
!   return retval;
  }
  
  static char *
*************** struct directories
*** 3710,3719 ****
    };
  
  static void
! dwarf_decode_lines (offset, comp_dir, abfd)
!      unsigned int offset;
!      char *comp_dir;
!      bfd *abfd;
  {
    char *line_ptr;
    char *line_end;
--- 3739,3746 ----
    };
  
  static void
! dwarf_decode_lines (unsigned int offset, char *comp_dir, bfd *abfd,
! 		    const struct comp_unit_head *cu_header)
  {
    char *line_ptr;
    char *line_end;
*************** dwarf_decode_lines (offset, comp_dir, ab
*** 3861,3868 ****
  		     not the ends.  This is a weakness of GDB.  */
  		  break;
  		case DW_LNE_set_address:
! 		  address = read_address (abfd, line_ptr) + baseaddr;
! 		  line_ptr += address_size;
  		  break;
  		case DW_LNE_define_file:
  		  cur_file = read_string (abfd, line_ptr, &bytes_read);
--- 3888,3896 ----
  		     not the ends.  This is a weakness of GDB.  */
  		  break;
  		case DW_LNE_set_address:
! 		  address = read_address (abfd, line_ptr, cu_header, &bytes_read);
! 		  line_ptr += bytes_read;
! 		  address += baseaddr;
  		  break;
  		case DW_LNE_define_file:
  		  cur_file = read_string (abfd, line_ptr, &bytes_read);
*************** dwarf2_start_subfile (filename, dirname)
*** 4009,4018 ****
     used the passed type.  */
  
  static struct symbol *
! new_symbol (die, type, objfile)
!      struct die_info *die;
!      struct type *type;
!      struct objfile *objfile;
  {
    struct symbol *sym = NULL;
    char *name;
--- 4037,4044 ----
     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)
  {
    struct symbol *sym = NULL;
    char *name;
*************** new_symbol (die, type, objfile)
*** 4037,4043 ****
        if (type != NULL)
  	SYMBOL_TYPE (sym) = type;
        else
! 	SYMBOL_TYPE (sym) = die_type (die, objfile);
        attr = dwarf_attr (die, DW_AT_decl_line);
        if (attr)
  	{
--- 4063,4069 ----
        if (type != NULL)
  	SYMBOL_TYPE (sym) = type;
        else
! 	SYMBOL_TYPE (sym) = die_type (die, objfile, cu_header);
        attr = dwarf_attr (die, DW_AT_decl_line);
        if (attr)
  	{
*************** new_symbol (die, type, objfile)
*** 4088,4094 ****
  	  attr = dwarf_attr (die, DW_AT_const_value);
  	  if (attr)
  	    {
! 	      dwarf2_const_value (attr, sym, objfile);
  	      attr2 = dwarf_attr (die, DW_AT_external);
  	      if (attr2 && (DW_UNSND (attr2) != 0))
  		add_symbol_to_list (sym, &global_symbols);
--- 4114,4120 ----
  	  attr = dwarf_attr (die, DW_AT_const_value);
  	  if (attr)
  	    {
! 	      dwarf2_const_value (attr, sym, objfile, cu_header);
  	      attr2 = dwarf_attr (die, DW_AT_external);
  	      if (attr2 && (DW_UNSND (attr2) != 0))
  		add_symbol_to_list (sym, &global_symbols);
*************** new_symbol (die, type, objfile)
*** 4103,4109 ****
  	      if (attr2 && (DW_UNSND (attr2) != 0))
  		{
  		  SYMBOL_VALUE_ADDRESS (sym) =
! 		    decode_locdesc (DW_BLOCK (attr), objfile);
  		  add_symbol_to_list (sym, &global_symbols);
  
  		  /* In shared libraries the address of the variable
--- 4129,4135 ----
  	      if (attr2 && (DW_UNSND (attr2) != 0))
  		{
  		  SYMBOL_VALUE_ADDRESS (sym) =
! 		    decode_locdesc (DW_BLOCK (attr), objfile, cu_header);
  		  add_symbol_to_list (sym, &global_symbols);
  
  		  /* In shared libraries the address of the variable
*************** new_symbol (die, type, objfile)
*** 4124,4130 ****
  	      else
  		{
  		  SYMBOL_VALUE (sym) = addr =
! 		    decode_locdesc (DW_BLOCK (attr), objfile);
  		  add_symbol_to_list (sym, list_in_scope);
  		  if (optimized_out)
  		    {
--- 4150,4156 ----
  	      else
  		{
  		  SYMBOL_VALUE (sym) = addr =
! 		    decode_locdesc (DW_BLOCK (attr), objfile, cu_header);
  		  add_symbol_to_list (sym, list_in_scope);
  		  if (optimized_out)
  		    {
*************** new_symbol (die, type, objfile)
*** 4171,4177 ****
  	  attr = dwarf_attr (die, DW_AT_location);
  	  if (attr)
  	    {
! 	      SYMBOL_VALUE (sym) = decode_locdesc (DW_BLOCK (attr), objfile);
  	      if (isreg)
  		{
  		  SYMBOL_CLASS (sym) = LOC_REGPARM;
--- 4197,4204 ----
  	  attr = dwarf_attr (die, DW_AT_location);
  	  if (attr)
  	    {
! 	      SYMBOL_VALUE (sym) =
! 		decode_locdesc (DW_BLOCK (attr), objfile, cu_header);
  	      if (isreg)
  		{
  		  SYMBOL_CLASS (sym) = LOC_REGPARM;
*************** new_symbol (die, type, objfile)
*** 4198,4204 ****
  	  attr = dwarf_attr (die, DW_AT_const_value);
  	  if (attr)
  	    {
! 	      dwarf2_const_value (attr, sym, objfile);
  	    }
  	  add_symbol_to_list (sym, list_in_scope);
  	  break;
--- 4225,4231 ----
  	  attr = dwarf_attr (die, DW_AT_const_value);
  	  if (attr)
  	    {
! 	      dwarf2_const_value (attr, sym, objfile, cu_header);
  	    }
  	  add_symbol_to_list (sym, list_in_scope);
  	  break;
*************** new_symbol (die, type, objfile)
*** 4243,4249 ****
  	  attr = dwarf_attr (die, DW_AT_const_value);
  	  if (attr)
  	    {
! 	      dwarf2_const_value (attr, sym, objfile);
  	    }
  	  add_symbol_to_list (sym, list_in_scope);
  	  break;
--- 4270,4276 ----
  	  attr = dwarf_attr (die, DW_AT_const_value);
  	  if (attr)
  	    {
! 	      dwarf2_const_value (attr, sym, objfile, cu_header);
  	    }
  	  add_symbol_to_list (sym, list_in_scope);
  	  break;
*************** new_symbol (die, type, objfile)
*** 4262,4283 ****
  /* Copy constant value from an attribute to a symbol.  */
  
  static void
! dwarf2_const_value (attr, sym, objfile)
!      struct attribute *attr;
!      struct symbol *sym;
!      struct objfile *objfile;
  {
    struct dwarf_block *blk;
  
    switch (attr->form)
      {
      case DW_FORM_addr:
!       if (TYPE_LENGTH (SYMBOL_TYPE (sym)) != (unsigned int) address_size)
  	complain (&dwarf2_const_value_length_mismatch, SYMBOL_NAME (sym),
! 		  address_size, TYPE_LENGTH (SYMBOL_TYPE (sym)));
        SYMBOL_VALUE_BYTES (sym) = (char *)
! 	obstack_alloc (&objfile->symbol_obstack, address_size);
!       store_address (SYMBOL_VALUE_BYTES (sym), address_size, DW_ADDR (attr));
        SYMBOL_CLASS (sym) = LOC_CONST_BYTES;
        break;
      case DW_FORM_block1:
--- 4289,4310 ----
  /* Copy constant value from an attribute to a symbol.  */
  
  static void
! dwarf2_const_value (struct attribute *attr, struct symbol *sym,
! 		    struct objfile *objfile,
! 		    const struct comp_unit_head *cu_header)
  {
    struct dwarf_block *blk;
  
    switch (attr->form)
      {
      case DW_FORM_addr:
!       if (TYPE_LENGTH (SYMBOL_TYPE (sym)) != cu_header->addr_size)
  	complain (&dwarf2_const_value_length_mismatch, SYMBOL_NAME (sym),
! 		  cu_header->addr_size, TYPE_LENGTH (SYMBOL_TYPE (sym)));
        SYMBOL_VALUE_BYTES (sym) = (char *)
! 	obstack_alloc (&objfile->symbol_obstack, cu_header->addr_size);
!       store_address (SYMBOL_VALUE_BYTES (sym), cu_header->addr_size,
! 		     DW_ADDR (attr));
        SYMBOL_CLASS (sym) = LOC_CONST_BYTES;
        break;
      case DW_FORM_block1:
*************** dwarf2_const_value_data (struct attribut
*** 4357,4365 ****
  /* Return the type of the die in question using its DW_AT_type attribute.  */
  
  static struct type *
! die_type (die, objfile)
!      struct die_info *die;
!      struct objfile *objfile;
  {
    struct type *type;
    struct attribute *type_attr;
--- 4384,4391 ----
  /* 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)
  {
    struct type *type;
    struct attribute *type_attr;
*************** die_type (die, objfile)
*** 4382,4388 ****
  	  return NULL;
  	}
      }
!   type = tag_type_to_type (type_die, objfile);
    if (!type)
      {
        dump_die (type_die);
--- 4408,4414 ----
  	  return NULL;
  	}
      }
!   type = tag_type_to_type (type_die, objfile, cu_header);
    if (!type)
      {
        dump_die (type_die);
*************** die_type (die, objfile)
*** 4395,4403 ****
     DW_AT_containing_type attribute.  */
  
  static struct type *
! die_containing_type (die, objfile)
!      struct die_info *die;
!      struct objfile *objfile;
  {
    struct type *type = NULL;
    struct attribute *type_attr;
--- 4421,4428 ----
     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)
  {
    struct type *type = NULL;
    struct attribute *type_attr;
*************** die_containing_type (die, objfile)
*** 4414,4420 ****
  	  error ("Dwarf Error: Cannot find referent at offset %d.", ref);
  	  return NULL;
  	}
!       type = tag_type_to_type (type_die, objfile);
      }
    if (!type)
      {
--- 4439,4445 ----
  	  error ("Dwarf Error: Cannot find referent at offset %d.", ref);
  	  return NULL;
  	}
!       type = tag_type_to_type (type_die, objfile, cu_header);
      }
    if (!type)
      {
*************** type_at_offset (offset, objfile)
*** 4446,4454 ****
  #endif
  
  static struct type *
! tag_type_to_type (die, objfile)
!      struct die_info *die;
!      struct objfile *objfile;
  {
    if (die->type)
      {
--- 4471,4478 ----
  #endif
  
  static struct type *
! tag_type_to_type (struct die_info *die, struct objfile *objfile,
! 		  const struct comp_unit_head *cu_header)
  {
    if (die->type)
      {
*************** tag_type_to_type (die, objfile)
*** 4473,4491 ****
  		}
  	      else
  		{
! 		  read_type_die (die, objfile);
  		  dwarf2_cached_types[hashval] = die->type;
  		}
  	    }
  	  else
  	    {
! 	      read_type_die (die, objfile);
  	      dwarf2_cached_types[hashval] = die->type;
  	    }
  	}
        else
  	{
! 	  read_type_die (die, objfile);
  	}
  
        if (!die->type)
--- 4497,4515 ----
  		}
  	      else
  		{
! 		  read_type_die (die, objfile, cu_header);
  		  dwarf2_cached_types[hashval] = die->type;
  		}
  	    }
  	  else
  	    {
! 	      read_type_die (die, objfile, cu_header);
  	      dwarf2_cached_types[hashval] = die->type;
  	    }
  	}
        else
  	{
! 	  read_type_die (die, objfile, cu_header);
  	}
  
        if (!die->type)
*************** tag_type_to_type (die, objfile)
*** 4498,4544 ****
  }
  
  static void
! read_type_die (die, objfile)
!      struct die_info *die;
!      struct objfile *objfile;
  {
    switch (die->tag)
      {
      case DW_TAG_class_type:
      case DW_TAG_structure_type:
      case DW_TAG_union_type:
!       read_structure_scope (die, objfile);
        break;
      case DW_TAG_enumeration_type:
!       read_enumeration (die, objfile);
        break;
      case DW_TAG_subprogram:
      case DW_TAG_subroutine_type:
!       read_subroutine_type (die, objfile);
        break;
      case DW_TAG_array_type:
!       read_array_type (die, objfile);
        break;
      case DW_TAG_pointer_type:
!       read_tag_pointer_type (die, objfile);
        break;
      case DW_TAG_ptr_to_member_type:
!       read_tag_ptr_to_member_type (die, objfile);
        break;
      case DW_TAG_reference_type:
!       read_tag_reference_type (die, objfile);
        break;
      case DW_TAG_const_type:
!       read_tag_const_type (die, objfile);
        break;
      case DW_TAG_volatile_type:
!       read_tag_volatile_type (die, objfile);
        break;
      case DW_TAG_string_type:
        read_tag_string_type (die, objfile);
        break;
      case DW_TAG_typedef:
!       read_typedef (die, objfile);
        break;
      case DW_TAG_base_type:
        read_base_type (die, objfile);
--- 4522,4567 ----
  }
  
  static void
! read_type_die (struct die_info *die, struct objfile *objfile,
! 	       const struct comp_unit_head *cu_header)
  {
    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);
        break;
      case DW_TAG_enumeration_type:
!       read_enumeration (die, objfile, cu_header);
        break;
      case DW_TAG_subprogram:
      case DW_TAG_subroutine_type:
!       read_subroutine_type (die, objfile, cu_header);
        break;
      case DW_TAG_array_type:
!       read_array_type (die, objfile, cu_header);
        break;
      case DW_TAG_pointer_type:
!       read_tag_pointer_type (die, objfile, cu_header);
        break;
      case DW_TAG_ptr_to_member_type:
!       read_tag_ptr_to_member_type (die, objfile, cu_header);
        break;
      case DW_TAG_reference_type:
!       read_tag_reference_type (die, objfile, cu_header);
        break;
      case DW_TAG_const_type:
!       read_tag_const_type (die, objfile, cu_header);
        break;
      case DW_TAG_volatile_type:
!       read_tag_volatile_type (die, objfile, cu_header);
        break;
      case DW_TAG_string_type:
        read_tag_string_type (die, objfile);
        break;
      case DW_TAG_typedef:
!       read_typedef (die, objfile, cu_header);
        break;
      case DW_TAG_base_type:
        read_base_type (die, objfile);
*************** dwarf2_fundamental_type (objfile, typeid
*** 5649,5657 ****
     Note that stack overflow is not yet handled.  */
  
  static CORE_ADDR
! decode_locdesc (blk, objfile)
!      struct dwarf_block *blk;
!      struct objfile *objfile;
  {
    int i;
    int size = blk->size;
--- 5672,5679 ----
     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)
  {
    int i;
    int size = blk->size;
*************** decode_locdesc (blk, objfile)
*** 5788,5795 ****
  	  break;
  
  	case DW_OP_addr:
! 	  stack[++stacki] = read_address (objfile->obfd, &data[i]);
! 	  i += address_size;
  	  break;
  
  	case DW_OP_const1u:
--- 5810,5818 ----
  	  break;
  
  	case DW_OP_addr:
! 	  stack[++stacki] = read_address (objfile->obfd, &data[i],
! 					  cu_header, &bytes_read);
! 	  i += bytes_read;
  	  break;
  
  	case DW_OP_const1u:


More information about the Gdb-patches mailing list