Non-stop mode support.
[deliverable/binutils-gdb.git] / gdb / dwarf2read.c
index 1721ee1a748042cd4717edffd490740c8dfe4262..9fd2f0c44a6721e96cc639c6b7d7b9eef7a11859 100644 (file)
@@ -1,7 +1,8 @@
 /* DWARF 2 debugging format support for GDB.
 
    Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
-                 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
+                 2004, 2005, 2006, 2007, 2008, 2009
+                 Free Software Foundation, Inc.
 
    Adapted by Gary Funck (gary@intrepid.com), Intrepid Technology,
    Inc.  with support from Florida State University (under contract
@@ -141,29 +142,15 @@ typedef struct statement_prologue
   }
 _STATEMENT_PROLOGUE;
 
+/* When non-zero, dump DIEs after they are read in.  */
+static int dwarf2_die_debug = 0;
+
 /* When set, the file that we're processing is known to have debugging
    info for C++ namespaces.  GCC 3.3.x did not produce this information,
    but later versions do.  */
 
 static int processing_has_namespace_info;
 
-/* This contains our best guess as to the name of the current
-   enclosing namespace(s)/class(es), if any.  For example, if we're
-   within the method foo() in the following code:
-
-    namespace N {
-      class C {
-       void foo () {
-       }
-      };
-    }
-
-   then processing_current_prefix should be set to "N::C".  If
-   processing_has_namespace_info is false, then this variable might
-   not be reliable.  */
-
-static const char *processing_current_prefix;
-
 static const struct objfile_data *dwarf2_objfile_data_key;
 
 struct dwarf2_per_objfile
@@ -248,11 +235,11 @@ asection *dwarf_eh_frame_section;
    translation, looks like this.  */
 struct comp_unit_head
 {
-  unsigned long length;
+  unsigned int length;
   short version;
-  unsigned int abbrev_offset;
   unsigned char addr_size;
   unsigned char signed_addr_p;
+  unsigned int abbrev_offset;
 
   /* Size of file offsets; either 4 or 8.  */
   unsigned int offset_size;
@@ -264,22 +251,9 @@ struct comp_unit_head
      .debug_info section, for resolving relative reference dies.  */
   unsigned int offset;
 
-  /* Pointer to this compilation unit header in the .debug_info
-     section.  */
-  gdb_byte *cu_head_ptr;
-
-  /* Pointer to the first die of this compilation unit.  This will be
-     the first byte following the compilation unit header.  */
-  gdb_byte *first_die_ptr;
-
-  /* Pointer to the next compilation unit header in the program.  */
-  struct comp_unit_head *next;
-
-  /* Base address of this compilation unit.  */
-  CORE_ADDR base_address;
-
-  /* Non-zero if base_address has been set.  */
-  int base_known;
+  /* Offset to first die in this cu from the start of the cu.
+     This will be the first byte following the compilation unit header.  */
+  unsigned int first_die_offset;
 };
 
 /* Internal state when decoding a particular compilation unit.  */
@@ -288,12 +262,15 @@ 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 logically be moved to the dwarf2_cu structure.  */
+  /* The header of the compilation unit.  */
   struct comp_unit_head header;
 
+  /* Base address of this compilation unit.  */
+  CORE_ADDR base_address;
+
+  /* Non-zero if base_address has been set.  */
+  int base_known;
+
   struct function_range *first_fn, *last_fn, *cached_fn;
 
   /* The language we are debugging.  */
@@ -323,7 +300,7 @@ struct dwarf2_cu
   htab_t partial_dies;
 
   /* `.debug_ranges' offset for this `DW_TAG_compile_unit' DIE.  */
-  unsigned long ranges_offset;
+  unsigned int ranges_offset;
 
   /* Storage for things with the same lifetime as this read-in compilation
      unit, including partial DIEs.  */
@@ -387,13 +364,15 @@ struct dwarf2_per_cu_data
 {
   /* The start offset and length of this compilation unit.  2**30-1
      bytes should suffice to store the length of any compilation unit
-     - if it doesn't, GDB will fall over anyway.  */
-  unsigned long offset;
-  unsigned long length : 30;
+     - if it doesn't, GDB will fall over anyway.
+     NOTE: Unlike comp_unit_head.length, this length includes
+     initial_length_size.  */
+  unsigned int offset;
+  unsigned int length : 30;
 
   /* Flag indicating this compilation unit will be read in before
      any of the current compilation units are processed.  */
-  unsigned long queued : 1;
+  unsigned int queued : 1;
 
   /* This flag will be set if we need to load absolutely all DIEs
      for this compilation unit, instead of just the ones we think
@@ -540,15 +519,24 @@ struct abbrev_info
 
 struct attr_abbrev
   {
-    enum dwarf_attribute name;
-    enum dwarf_form form;
+    ENUM_BITFIELD(dwarf_attribute) name : 16;
+    ENUM_BITFIELD(dwarf_form) form : 16;
+  };
+
+/* Additional GDB-specific attribute forms.  */
+enum
+  {
+    /* A string which has been updated to GDB's internal
+       representation (e.g. converted to canonical form) and does not
+       need to be updated again.  */
+    GDB_FORM_cached_string = 0xff
   };
 
 /* Attributes have a name and a value */
 struct attribute
   {
-    enum dwarf_attribute name;
-    enum dwarf_form form;
+    ENUM_BITFIELD(dwarf_attribute) name : 16;
+    ENUM_BITFIELD(dwarf_form) form : 16;
     union
       {
        char *str;
@@ -563,10 +551,17 @@ struct attribute
 /* This data structure holds a complete die structure. */
 struct die_info
   {
-    enum dwarf_tag tag;                /* Tag indicating type of die */
-    unsigned int abbrev;       /* Abbrev number */
-    unsigned int offset;       /* Offset in .debug_info section */
-    unsigned int num_attrs;    /* Number of attributes */
+    /* DWARF-2 tag for this DIE.  */
+    ENUM_BITFIELD(dwarf_tag) tag : 16;
+
+    /* Number of attributes */
+    unsigned short num_attrs;
+
+    /* Abbrev number */
+    unsigned int abbrev;
+
+    /* Offset in .debug_info section */
+    unsigned int offset;
 
     /* The dies in a compilation unit form an n-ary tree.  PARENT
        points to this die's parent; CHILD points to the first child of
@@ -714,6 +709,13 @@ dwarf2_debug_line_missing_file_complaint (void)
             _(".debug_line section has line data without a file"));
 }
 
+static void
+dwarf2_debug_line_missing_end_sequence_complaint (void)
+{
+  complaint (&symfile_complaints,
+            _(".debug_line section has line program sequence without an end"));
+}
+
 static void
 dwarf2_complex_location_expr_complaint (void)
 {
@@ -770,7 +772,7 @@ static void dwarf2_build_psymtabs_hard (struct objfile *, int);
 
 static void scan_partial_symbols (struct partial_die_info *,
                                  CORE_ADDR *, CORE_ADDR *,
-                                 struct dwarf2_cu *);
+                                 int, struct dwarf2_cu *);
 
 static void add_partial_symbol (struct partial_die_info *,
                                struct dwarf2_cu *);
@@ -779,11 +781,19 @@ static int pdi_needs_namespace (enum dwarf_tag tag);
 
 static void add_partial_namespace (struct partial_die_info *pdi,
                                   CORE_ADDR *lowpc, CORE_ADDR *highpc,
-                                  struct dwarf2_cu *cu);
+                                  int need_pc, struct dwarf2_cu *cu);
+
+static void add_partial_module (struct partial_die_info *pdi, CORE_ADDR *lowpc,
+                               CORE_ADDR *highpc, int need_pc,
+                               struct dwarf2_cu *cu);
 
 static void add_partial_enumeration (struct partial_die_info *enum_pdi,
                                     struct dwarf2_cu *cu);
 
+static void add_partial_subprogram (struct partial_die_info *pdi,
+                                   CORE_ADDR *lowpc, CORE_ADDR *highpc,
+                                   int need_pc, struct dwarf2_cu *cu);
+
 static gdb_byte *locate_pdi_sibling (struct partial_die_info *orig_pdi,
                                      gdb_byte *info_ptr,
                                      bfd *abfd,
@@ -812,7 +822,7 @@ static gdb_byte *read_partial_die (struct partial_die_info *,
                                    struct abbrev_info *abbrev, unsigned int,
                                    bfd *, gdb_byte *, struct dwarf2_cu *);
 
-static struct partial_die_info *find_partial_die (unsigned long,
+static struct partial_die_info *find_partial_die (unsigned int,
                                                  struct dwarf2_cu *);
 
 static void fixup_partial_die (struct partial_die_info *,
@@ -840,11 +850,16 @@ static unsigned long read_8_bytes (bfd *, gdb_byte *);
 static CORE_ADDR read_address (bfd *, gdb_byte *ptr, struct dwarf2_cu *,
                               unsigned int *);
 
-static LONGEST read_initial_length (bfd *, gdb_byte *,
-                                    struct comp_unit_head *, unsigned int *);
+static LONGEST read_initial_length (bfd *, gdb_byte *, unsigned int *);
+
+static LONGEST read_checked_initial_length_and_offset
+  (bfd *, gdb_byte *, const struct comp_unit_head *,
+   unsigned int *, unsigned int *);
 
 static LONGEST read_offset (bfd *, gdb_byte *, const struct comp_unit_head *,
-                            unsigned int *);
+                           unsigned int *);
+
+static LONGEST read_offset_1 (bfd *, gdb_byte *, unsigned int);
 
 static gdb_byte *read_n_bytes (bfd *, gdb_byte *, unsigned int);
 
@@ -947,12 +962,15 @@ static void dwarf2_attach_fn_fields_to_type (struct field_info *,
 
 static void process_structure_scope (struct die_info *, struct dwarf2_cu *);
 
-static char *determine_class_name (struct die_info *die, struct dwarf2_cu *cu);
+static const char *determine_class_name (struct die_info *die,
+                                        struct dwarf2_cu *cu);
 
 static void read_common_block (struct die_info *, struct dwarf2_cu *);
 
 static void read_namespace (struct die_info *die, struct dwarf2_cu *);
 
+static void read_module (struct die_info *die, struct dwarf2_cu *cu);
+
 static const char *namespace_name (struct die_info *die,
                                   int *is_anonymous, struct dwarf2_cu *);
 
@@ -965,6 +983,11 @@ static enum dwarf_array_dim_ordering read_array_order (struct die_info *,
 
 static struct die_info *read_comp_unit (gdb_byte *, bfd *, struct dwarf2_cu *);
 
+static struct die_info *read_die_and_children_1 (gdb_byte *info_ptr, bfd *abfd,
+                                                struct dwarf2_cu *,
+                                                gdb_byte **new_info_ptr,
+                                                struct die_info *parent);
+
 static struct die_info *read_die_and_children (gdb_byte *info_ptr, bfd *abfd,
                                               struct dwarf2_cu *,
                                               gdb_byte **new_info_ptr,
@@ -979,6 +1002,9 @@ static void process_die (struct die_info *, struct dwarf2_cu *);
 
 static char *dwarf2_linkage_name (struct die_info *, struct dwarf2_cu *);
 
+static char *dwarf2_canonicalize_name (char *, struct dwarf2_cu *,
+                                      struct obstack *);
+
 static char *dwarf2_name (struct die_info *die, struct dwarf2_cu *);
 
 static struct die_info *dwarf2_extension (struct die_info *die,
@@ -1002,15 +1028,19 @@ static char *dwarf_cfi_name (unsigned int);
 
 static struct die_info *sibling_die (struct die_info *);
 
-static void dump_die (struct die_info *);
+static void dump_die_shallow (struct ui_file *, int indent, struct die_info *);
+
+static void dump_die_for_error (struct die_info *);
+
+static void dump_die_1 (struct ui_file *, int level, int max_level,
+                       struct die_info *);
 
-static void dump_die_list (struct die_info *);
+/*static*/ void dump_die (struct die_info *, int max_level);
 
 static void store_in_ref_table (struct die_info *,
                                struct dwarf2_cu *);
 
-static unsigned int dwarf2_get_ref_die_offset (struct attribute *,
-                                              struct dwarf2_cu *);
+static unsigned int dwarf2_get_ref_die_offset (struct attribute *);
 
 static int dwarf2_get_attr_constant_value (struct attribute *, int);
 
@@ -1054,10 +1084,10 @@ static hashval_t partial_die_hash (const void *item);
 static int partial_die_eq (const void *item_lhs, const void *item_rhs);
 
 static struct dwarf2_per_cu_data *dwarf2_find_containing_comp_unit
-  (unsigned long offset, struct objfile *objfile);
+  (unsigned int offset, struct objfile *objfile);
 
 static struct dwarf2_per_cu_data *dwarf2_find_comp_unit
-  (unsigned long offset, struct objfile *objfile);
+  (unsigned int offset, struct objfile *objfile);
 
 static void free_one_comp_unit (void *);
 
@@ -1309,11 +1339,9 @@ dwarf2_build_psymtabs_easy (struct objfile *objfile, int mainline)
   pubnames_ptr = pubnames_buffer;
   while ((pubnames_ptr - pubnames_buffer) < dwarf2_per_objfile->pubnames_size)
     {
-      struct comp_unit_head cu_header;
       unsigned int bytes_read;
 
-      entry_length = read_initial_length (abfd, pubnames_ptr, &cu_header,
-                                          &bytes_read);
+      entry_length = read_initial_length (abfd, pubnames_ptr, &bytes_read);
       pubnames_ptr += bytes_read;
       version = read_1_byte (abfd, pubnames_ptr);
       pubnames_ptr += 1;
@@ -1329,6 +1357,18 @@ dwarf2_build_psymtabs_easy (struct objfile *objfile, int mainline)
 }
 #endif
 
+/* Return TRUE if OFFSET is within CU_HEADER.  */
+
+static inline int
+offset_in_cu_p (const struct comp_unit_head *cu_header, unsigned int offset)
+{
+  unsigned int bottom = cu_header->offset;
+  unsigned int top = (cu_header->offset
+                     + cu_header->length
+                     + cu_header->initial_length_size);
+  return (offset >= bottom && offset < top);
+}
+
 /* Read in the comp unit header information from the debug_info at
    info_ptr.  */
 
@@ -1338,13 +1378,15 @@ read_comp_unit_head (struct comp_unit_head *cu_header,
 {
   int signed_addr;
   unsigned int bytes_read;
-  cu_header->length = read_initial_length (abfd, info_ptr, cu_header,
-                                           &bytes_read);
+
+  cu_header->length = read_initial_length (abfd, info_ptr, &bytes_read);
+  cu_header->initial_length_size = bytes_read;
+  cu_header->offset_size = (bytes_read == 4) ? 4 : 8;
   info_ptr += bytes_read;
   cu_header->version = read_2_bytes (abfd, info_ptr);
   info_ptr += 2;
   cu_header->abbrev_offset = read_offset (abfd, info_ptr, cu_header,
-                                          &bytes_read);
+                                         &bytes_read);
   info_ptr += bytes_read;
   cu_header->addr_size = read_1_byte (abfd, info_ptr);
   info_ptr += 1;
@@ -1353,6 +1395,7 @@ read_comp_unit_head (struct comp_unit_head *cu_header,
     internal_error (__FILE__, __LINE__,
                    _("read_comp_unit_head: dwarf from non elf file"));
   cu_header->signed_addr_p = signed_addr;
+
   return info_ptr;
 }
 
@@ -1461,7 +1504,7 @@ dwarf2_build_psymtabs_hard (struct objfile *objfile, int mainline)
   struct partial_die_info comp_unit_die;
   struct partial_symtab *pst;
   struct cleanup *back_to;
-  CORE_ADDR lowpc, highpc, baseaddr;
+  CORE_ADDR baseaddr;
 
   info_ptr = dwarf2_per_objfile->info_buffer;
 
@@ -1509,8 +1552,7 @@ dwarf2_build_psymtabs_hard (struct objfile *objfile, int mainline)
 
       /* Complete the cu_header */
       cu.header.offset = beg_of_comp_unit - dwarf2_per_objfile->info_buffer;
-      cu.header.first_die_ptr = info_ptr;
-      cu.header.cu_head_ptr = beg_of_comp_unit;
+      cu.header.first_die_offset = info_ptr - beg_of_comp_unit;
 
       cu.list_in_scope = &file_symbols;
 
@@ -1545,7 +1587,9 @@ dwarf2_build_psymtabs_hard (struct objfile *objfile, int mainline)
                                  objfile->static_psymbols.next);
 
       if (comp_unit_die.dirname)
-       pst->dirname = xstrdup (comp_unit_die.dirname);
+       pst->dirname = obsavestring (comp_unit_die.dirname,
+                                    strlen (comp_unit_die.dirname),
+                                    &objfile->objfile_obstack);
 
       pst->read_symtab_private = (char *) this_cu;
 
@@ -1581,6 +1625,13 @@ dwarf2_build_psymtabs_hard (struct objfile *objfile, int mainline)
                                  &comp_unit_die.highpc, &cu, pst))
            comp_unit_die.has_pc_info = 1;
        }
+      else if (comp_unit_die.has_pc_info
+              && comp_unit_die.lowpc < comp_unit_die.highpc)
+       /* Store the contiguous range if it is not empty; it can be empty for
+          CUs with no code.  */
+       addrmap_set_empty (objfile->psymtabs_addrmap,
+                          comp_unit_die.lowpc + baseaddr,
+                          comp_unit_die.highpc + baseaddr - 1, pst);
 
       /* Check if comp unit has_children.
          If so, read the rest of the partial symbols from this comp unit.
@@ -1588,13 +1639,15 @@ dwarf2_build_psymtabs_hard (struct objfile *objfile, int mainline)
       if (comp_unit_die.has_children)
        {
          struct partial_die_info *first_die;
+         CORE_ADDR lowpc, highpc;
 
          lowpc = ((CORE_ADDR) -1);
          highpc = ((CORE_ADDR) 0);
 
          first_die = load_partial_dies (abfd, info_ptr, 1, &cu);
 
-         scan_partial_symbols (first_die, &lowpc, &highpc, &cu);
+         scan_partial_symbols (first_die, &lowpc, &highpc,
+                               ! comp_unit_die.has_pc_info, &cu);
 
          /* If we didn't find a lowpc, set it to highpc to avoid
             complaints from `maint check'.  */
@@ -1612,12 +1665,6 @@ dwarf2_build_psymtabs_hard (struct objfile *objfile, int mainline)
       pst->textlow = comp_unit_die.lowpc + baseaddr;
       pst->texthigh = comp_unit_die.highpc + baseaddr;
 
-      /* Store the contiguous range; `DW_AT_ranges' range is stored above.  The
-         range can be also empty for CUs with no code.  */
-      if (!cu.has_ranges_offset && pst->textlow < pst->texthigh)
-       addrmap_set_empty (objfile->psymtabs_addrmap, pst->textlow,
-                          pst->texthigh - 1, pst);
-
       pst->n_global_syms = objfile->global_psymbols.next -
        (objfile->global_psymbols.list + pst->globals_offset);
       pst->n_static_syms = objfile->static_psymbols.next -
@@ -1674,8 +1721,7 @@ load_comp_unit (struct dwarf2_per_cu_data *this_cu, struct objfile *objfile)
 
   /* Complete the cu_header.  */
   cu->header.offset = beg_of_comp_unit - dwarf2_per_objfile->info_buffer;
-  cu->header.first_die_ptr = info_ptr;
-  cu->header.cu_head_ptr = beg_of_comp_unit;
+  cu->header.first_die_offset = info_ptr - beg_of_comp_unit;
 
   /* Read the abbrevs for this compilation unit into a table.  */
   dwarf2_read_abbrevs (abfd, cu);
@@ -1723,26 +1769,24 @@ create_all_comp_units (struct objfile *objfile)
   
   while (info_ptr < dwarf2_per_objfile->info_buffer + dwarf2_per_objfile->info_size)
     {
-      struct comp_unit_head cu_header;
+      unsigned int length, initial_length_size;
       gdb_byte *beg_of_comp_unit;
       struct dwarf2_per_cu_data *this_cu;
-      unsigned long offset;
-      unsigned int bytes_read;
+      unsigned int offset;
 
       offset = info_ptr - dwarf2_per_objfile->info_buffer;
 
       /* Read just enough information to find out where the next
         compilation unit is.  */
-      cu_header.initial_length_size = 0;
-      cu_header.length = read_initial_length (objfile->obfd, info_ptr,
-                                             &cu_header, &bytes_read);
+      length = read_initial_length (objfile->obfd, info_ptr,
+                                   &initial_length_size);
 
       /* Save the compilation unit for later lookup.  */
       this_cu = obstack_alloc (&objfile->objfile_obstack,
                               sizeof (struct dwarf2_per_cu_data));
       memset (this_cu, 0, sizeof (*this_cu));
       this_cu->offset = offset;
-      this_cu->length = cu_header.length + cu_header.initial_length_size;
+      this_cu->length = length + initial_length_size;
 
       if (n_comp_units == n_allocated)
        {
@@ -1765,13 +1809,16 @@ create_all_comp_units (struct objfile *objfile)
   dwarf2_per_objfile->n_comp_units = n_comp_units;
 }
 
-/* Process all loaded DIEs for compilation unit CU, starting at FIRST_DIE.
-   Also set *LOWPC and *HIGHPC to the lowest and highest PC values found
-   in CU.  */
+/* Process all loaded DIEs for compilation unit CU, starting at
+   FIRST_DIE.  The caller should pass NEED_PC == 1 if the compilation
+   unit DIE did not have PC info (DW_AT_low_pc and DW_AT_high_pc, or
+   DW_AT_ranges).  If NEED_PC is set, then this function will set
+   *LOWPC and *HIGHPC to the lowest and highest PC values found in CU
+   and record the covered ranges in the addrmap.  */
 
 static void
 scan_partial_symbols (struct partial_die_info *first_die, CORE_ADDR *lowpc,
-                     CORE_ADDR *highpc, struct dwarf2_cu *cu)
+                     CORE_ADDR *highpc, int need_pc, struct dwarf2_cu *cu)
 {
   struct objfile *objfile = cu->objfile;
   bfd *abfd = objfile->obfd;
@@ -1797,21 +1844,7 @@ scan_partial_symbols (struct partial_die_info *first_die, CORE_ADDR *lowpc,
          switch (pdi->tag)
            {
            case DW_TAG_subprogram:
-             if (pdi->has_pc_info)
-               {
-                 if (pdi->lowpc < *lowpc)
-                   {
-                     *lowpc = pdi->lowpc;
-                   }
-                 if (pdi->highpc > *highpc)
-                   {
-                     *highpc = pdi->highpc;
-                   }
-                 if (!pdi->is_declaration)
-                   {
-                     add_partial_symbol (pdi, cu);
-                   }
-               }
+             add_partial_subprogram (pdi, lowpc, highpc, need_pc, cu);
              break;
            case DW_TAG_variable:
            case DW_TAG_typedef:
@@ -1840,7 +1873,10 @@ scan_partial_symbols (struct partial_die_info *first_die, CORE_ADDR *lowpc,
              add_partial_symbol (pdi, cu);
              break;
            case DW_TAG_namespace:
-             add_partial_namespace (pdi, lowpc, highpc, cu);
+             add_partial_namespace (pdi, lowpc, highpc, need_pc, cu);
+             break;
+           case DW_TAG_module:
+             add_partial_module (pdi, lowpc, highpc, need_pc, cu);
              break;
            default:
              break;
@@ -2147,7 +2183,7 @@ pdi_needs_namespace (enum dwarf_tag tag)
 static void
 add_partial_namespace (struct partial_die_info *pdi,
                       CORE_ADDR *lowpc, CORE_ADDR *highpc,
-                      struct dwarf2_cu *cu)
+                      int need_pc, struct dwarf2_cu *cu)
 {
   struct objfile *objfile = cu->objfile;
 
@@ -2158,7 +2194,77 @@ add_partial_namespace (struct partial_die_info *pdi,
   /* Now scan partial symbols in that namespace.  */
 
   if (pdi->has_children)
-    scan_partial_symbols (pdi->die_child, lowpc, highpc, cu);
+    scan_partial_symbols (pdi->die_child, lowpc, highpc, need_pc, cu);
+}
+
+/* Read a partial die corresponding to a Fortran module.  */
+
+static void
+add_partial_module (struct partial_die_info *pdi, CORE_ADDR *lowpc,
+                   CORE_ADDR *highpc, int need_pc, struct dwarf2_cu *cu)
+{
+  /* Now scan partial symbols in that module.
+
+     FIXME: Support the separate Fortran module namespaces.  */
+
+  if (pdi->has_children)
+    scan_partial_symbols (pdi->die_child, lowpc, highpc, need_pc, cu);
+}
+
+/* Read a partial die corresponding to a subprogram and create a partial
+   symbol for that subprogram.  When the CU language allows it, this
+   routine also defines a partial symbol for each nested subprogram
+   that this subprogram contains.
+   
+   DIE my also be a lexical block, in which case we simply search
+   recursively for suprograms defined inside that lexical block.
+   Again, this is only performed when the CU language allows this
+   type of definitions.  */
+
+static void
+add_partial_subprogram (struct partial_die_info *pdi,
+                       CORE_ADDR *lowpc, CORE_ADDR *highpc,
+                       int need_pc, struct dwarf2_cu *cu)
+{
+  if (pdi->tag == DW_TAG_subprogram)
+    {
+      if (pdi->has_pc_info)
+        {
+          if (pdi->lowpc < *lowpc)
+            *lowpc = pdi->lowpc;
+          if (pdi->highpc > *highpc)
+            *highpc = pdi->highpc;
+         if (need_pc)
+           {
+             CORE_ADDR baseaddr;
+             struct objfile *objfile = cu->objfile;
+
+             baseaddr = ANOFFSET (objfile->section_offsets,
+                                  SECT_OFF_TEXT (objfile));
+             addrmap_set_empty (objfile->psymtabs_addrmap,
+                                pdi->lowpc, pdi->highpc - 1,
+                                cu->per_cu->psymtab);
+           }
+          if (!pdi->is_declaration)
+            add_partial_symbol (pdi, cu);
+        }
+    }
+  
+  if (! pdi->has_children)
+    return;
+
+  if (cu->language == language_ada)
+    {
+      pdi = pdi->die_child;
+      while (pdi != NULL)
+       {
+         fixup_partial_die (pdi, cu);
+         if (pdi->tag == DW_TAG_subprogram
+             || pdi->tag == DW_TAG_lexical_block)
+           add_partial_subprogram (pdi, lowpc, highpc, need_pc, cu);
+         pdi = pdi->die_sibling;
+       }
+    }
 }
 
 /* See if we can figure out if the class lives in a namespace.  We do
@@ -2315,7 +2421,7 @@ skip_one_die (gdb_byte *info_ptr, struct abbrev_info *abbrev,
            complaint (&symfile_complaints, _("ignoring absolute DW_AT_sibling"));
          else
            return dwarf2_per_objfile->info_buffer
-             + dwarf2_get_ref_die_offset (&attr, cu);
+             + dwarf2_get_ref_die_offset (&attr);
        }
 
       /* If it isn't DW_AT_sibling, skip this attribute.  */
@@ -2578,7 +2684,7 @@ load_full_comp_unit (struct dwarf2_per_cu_data *per_cu, struct objfile *objfile)
 {
   bfd *abfd = objfile->obfd;
   struct dwarf2_cu *cu;
-  unsigned long offset;
+  unsigned int offset;
   gdb_byte *info_ptr;
   struct cleanup *back_to, *free_cu_cleanup;
   struct attribute *attr;
@@ -2652,9 +2758,6 @@ process_full_comp_unit (struct dwarf2_per_cu_data *per_cu)
 
   baseaddr = ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
 
-  /* We're in the global namespace.  */
-  processing_current_prefix = "";
-
   buildsym_init ();
   back_to = make_cleanup (really_free_pendings, NULL);
 
@@ -2666,22 +2769,22 @@ process_full_comp_unit (struct dwarf2_per_cu_data *per_cu)
      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->base_known = 0;
+  cu->base_address = 0;
 
   attr = dwarf2_attr (cu->dies, DW_AT_entry_pc, cu);
   if (attr)
     {
-      cu->header.base_address = DW_ADDR (attr);
-      cu->header.base_known = 1;
+      cu->base_address = DW_ADDR (attr);
+      cu->base_known = 1;
     }
   else
     {
       attr = dwarf2_attr (cu->dies, DW_AT_low_pc, cu);
       if (attr)
        {
-         cu->header.base_address = DW_ADDR (attr);
-         cu->header.base_known = 1;
+         cu->base_address = DW_ADDR (attr);
+         cu->base_known = 1;
        }
     }
 
@@ -2758,6 +2861,7 @@ process_die (struct die_info *die, struct dwarf2_cu *cu)
 
     case DW_TAG_base_type:
     case DW_TAG_subrange_type:
+    case DW_TAG_typedef:
       /* Add a typedef symbol for the type definition, if it has a
          DW_AT_name.  */
       new_symbol (die, read_type_die (die, cu), cu);
@@ -2771,16 +2875,19 @@ process_die (struct die_info *die, struct dwarf2_cu *cu)
       processing_has_namespace_info = 1;
       read_namespace (die, cu);
       break;
+    case DW_TAG_module:
+      read_module (die, cu);
+      break;
     case DW_TAG_imported_declaration:
     case DW_TAG_imported_module:
       /* FIXME: carlton/2002-10-16: Eventually, we should use the
         information contained in these.  DW_TAG_imported_declaration
         dies shouldn't have children; DW_TAG_imported_module dies
         shouldn't in the C++ case, but conceivably could in the
-        Fortran case, so we'll have to replace this gdb_assert if
-        Fortran compilers start generating that info.  */
+        Fortran case.  */
       processing_has_namespace_info = 1;
-      gdb_assert (die->child == NULL);
+      complaint (&symfile_complaints, _("unsupported tag: '%s'"),
+                dwarf_tag_name (die->tag));
       break;
     default:
       new_symbol (die, NULL, cu);
@@ -2788,6 +2895,44 @@ process_die (struct die_info *die, struct dwarf2_cu *cu)
     }
 }
 
+/* Return the fully qualified name of DIE, based on its DW_AT_name.
+   If scope qualifiers are appropriate they will be added.  The result
+   will be allocated on the objfile_obstack, or NULL if the DIE does
+   not have a name.  */
+
+static const char *
+dwarf2_full_name (struct die_info *die, struct dwarf2_cu *cu)
+{
+  struct attribute *attr;
+  char *prefix, *name;
+  struct ui_file *buf = NULL;
+
+  name = dwarf2_name (die, cu);
+  if (!name)
+    return NULL;
+
+  /* These are the only languages we know how to qualify names in.  */
+  if (cu->language != language_cplus
+      && cu->language != language_java)
+    return name;
+
+  /* If no prefix is necessary for this type of DIE, return the
+     unqualified name.  The other three tags listed could be handled
+     in pdi_needs_namespace, but that requires broader changes.  */
+  if (!pdi_needs_namespace (die->tag)
+      && die->tag != DW_TAG_subprogram
+      && die->tag != DW_TAG_variable
+      && die->tag != DW_TAG_member)
+    return name;
+
+  prefix = determine_prefix (die, cu);
+  if (*prefix != '\0')
+    name = typename_concat (&cu->objfile->objfile_obstack, prefix,
+                           name, cu);
+
+  return name;
+}
+
 static void
 initialize_cu_func_list (struct dwarf2_cu *cu)
 {
@@ -2954,8 +3099,6 @@ read_func_scope (struct die_info *die, struct dwarf2_cu *cu)
   struct die_info *child_die;
   struct attribute *attr;
   char *name;
-  const char *previous_prefix = processing_current_prefix;
-  struct cleanup *back_to = NULL;
   CORE_ADDR baseaddr;
   struct block *block;
 
@@ -2968,42 +3111,6 @@ read_func_scope (struct die_info *die, struct dwarf2_cu *cu)
   if (name == NULL || !dwarf2_get_pc_bounds (die, &lowpc, &highpc, cu))
     return;
 
-  if (cu->language == language_cplus
-      || cu->language == language_java)
-    {
-      struct dwarf2_cu *spec_cu = cu;
-      struct die_info *spec_die = die_specification (die, &spec_cu);
-
-      /* NOTE: carlton/2004-01-23: We have to be careful in the
-         presence of DW_AT_specification.  For example, with GCC 3.4,
-         given the code
-
-           namespace N {
-             void foo() {
-               // Definition of N::foo.
-             }
-           }
-
-         then we'll have a tree of DIEs like this:
-
-         1: DW_TAG_compile_unit
-           2: DW_TAG_namespace        // N
-             3: DW_TAG_subprogram     // declaration of N::foo
-           4: DW_TAG_subprogram       // definition of N::foo
-                DW_AT_specification   // refers to die #3
-
-         Thus, when processing die #4, we have to pretend that we're
-         in the context of its DW_AT_specification, namely the contex
-         of die #3.  */
-       
-      if (spec_die != NULL)
-       {
-         char *specification_prefix = determine_prefix (spec_die, spec_cu);
-         processing_current_prefix = specification_prefix;
-         back_to = make_cleanup (xfree, specification_prefix);
-       }
-    }
-
   lowpc += baseaddr;
   highpc += baseaddr;
 
@@ -3048,7 +3155,7 @@ read_func_scope (struct die_info *die, struct dwarf2_cu *cu)
   /* For C++, set the block's scope.  */
   if (cu->language == language_cplus)
     cp_set_block_scope (new->name, block, &objfile->objfile_obstack,
-                       processing_current_prefix,
+                       determine_prefix (die, cu),
                        processing_has_namespace_info);
 
   /* If we have address ranges, record them.  */
@@ -3065,10 +3172,6 @@ read_func_scope (struct die_info *die, struct dwarf2_cu *cu)
      symbols go in the file symbol list.  */
   if (outermost_context_p ())
     cu->list_in_scope = &file_symbols;
-
-  processing_current_prefix = previous_prefix;
-  if (back_to != NULL)
-    do_cleanups (back_to);
 }
 
 /* Process all the DIES contained within a lexical block scope.  Start
@@ -3153,8 +3256,8 @@ dwarf2_ranges_read (unsigned offset, CORE_ADDR *low_return,
   CORE_ADDR high = 0;
   CORE_ADDR baseaddr;
 
-  found_base = cu_header->base_known;
-  base = cu_header->base_address;
+  found_base = cu->base_known;
+  base = cu->base_address;
 
   if (offset >= dwarf2_per_objfile->ranges_size)
     {
@@ -3315,6 +3418,43 @@ dwarf2_get_pc_bounds (struct die_info *die, CORE_ADDR *lowpc,
   return ret;
 }
 
+/* Assuming that DIE represents a subprogram DIE or a lexical block, get
+   its low and high PC addresses.  Do nothing if these addresses could not
+   be determined.  Otherwise, set LOWPC to the low address if it is smaller,
+   and HIGHPC to the high address if greater than HIGHPC.  */
+
+static void
+dwarf2_get_subprogram_pc_bounds (struct die_info *die,
+                                 CORE_ADDR *lowpc, CORE_ADDR *highpc,
+                                 struct dwarf2_cu *cu)
+{
+  CORE_ADDR low, high;
+  struct die_info *child = die->child;
+
+  if (dwarf2_get_pc_bounds (die, &low, &high, cu))
+    {
+      *lowpc = min (*lowpc, low);
+      *highpc = max (*highpc, high);
+    }
+
+  /* If the language does not allow nested subprograms (either inside
+     subprograms or lexical blocks), we're done.  */
+  if (cu->language != language_ada)
+    return;
+     
+  /* Check all the children of the given DIE.  If it contains nested
+     subprograms, then check their pc bounds.  Likewise, we need to
+     check lexical blocks as well, as they may also contain subprogram
+     definitions.  */
+  while (child && child->tag)
+    {
+      if (child->tag == DW_TAG_subprogram
+          || child->tag == DW_TAG_lexical_block)
+        dwarf2_get_subprogram_pc_bounds (child, lowpc, highpc, cu);
+      child = sibling_die (child);
+    }
+}
+
 /* Get the low and high pc's represented by the scope DIE, and store
    them in *LOWPC and *HIGHPC.  If the correct values can't be
    determined, set *LOWPC to -1 and *HIGHPC to 0.  */
@@ -3341,11 +3481,7 @@ get_scope_pc_bounds (struct die_info *die,
        {
          switch (child->tag) {
          case DW_TAG_subprogram:
-           if (dwarf2_get_pc_bounds (child, &current_low, &current_high, cu))
-             {
-               best_low = min (best_low, current_low);
-               best_high = max (best_high, current_high);
-             }
+            dwarf2_get_subprogram_pc_bounds (child, &best_low, &best_high, cu);
            break;
          case DW_TAG_namespace:
            /* FIXME: carlton/2004-01-16: Should we do this for
@@ -3421,8 +3557,8 @@ dwarf2_record_block_ranges (struct die_info *die, struct block *block,
          'baseaddr' argument, which GDB uses to relocate debugging
          information from a shared library based on the address at
          which the library was loaded.  */
-      CORE_ADDR base = cu->header.base_address;
-      int base_known = cu->header.base_known;
+      CORE_ADDR base = cu->base_address;
+      int base_known = cu->base_known;
 
       if (offset >= dwarf2_per_objfile->ranges_size)
         {
@@ -3519,7 +3655,7 @@ dwarf2_add_field (struct field_info *fip, struct die_info *die,
       /* Get type of field.  */
       fp->type = die_type (die, cu);
 
-      FIELD_STATIC_KIND (*fp) = 0;
+      SET_FIELD_BITPOS (*fp, 0);
 
       /* Get bit size of field (zero if none).  */
       attr = dwarf2_attr (die, DW_AT_bit_size, cu);
@@ -3548,10 +3684,8 @@ dwarf2_add_field (struct field_info *fip, struct die_info *die,
           else
             byte_offset = decode_locdesc (DW_BLOCK (attr), cu);
 
-          FIELD_BITPOS (*fp) = byte_offset * bits_per_byte;
+          SET_FIELD_BITPOS (*fp, byte_offset * bits_per_byte);
        }
-      else
-       FIELD_BITPOS (*fp) = 0;
       attr = dwarf2_attr (die, DW_AT_bit_offset, cu);
       if (attr)
        {
@@ -3643,10 +3777,9 @@ dwarf2_add_field (struct field_info *fip, struct die_info *die,
       /* C++ base class field.  */
       attr = dwarf2_attr (die, DW_AT_data_member_location, cu);
       if (attr)
-       FIELD_BITPOS (*fp) = (decode_locdesc (DW_BLOCK (attr), cu)
-                             * bits_per_byte);
+       SET_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, cu);
       FIELD_NAME (*fp) = type_name_no_tag (fp->type);
       fip->nbaseclasses++;
@@ -4020,9 +4153,8 @@ read_structure_type (struct die_info *die, struct dwarf2_cu *cu)
   struct objfile *objfile = cu->objfile;
   struct type *type;
   struct attribute *attr;
-  const char *previous_prefix = processing_current_prefix;
-  struct cleanup *back_to = NULL;
   char *name;
+  struct cleanup *back_to = make_cleanup (null_cleanup, 0);
 
   type = quirk_gcc_member_function_pointer (die, cu);
   if (type)
@@ -4036,12 +4168,8 @@ read_structure_type (struct die_info *die, struct dwarf2_cu *cu)
       if (cu->language == language_cplus
          || cu->language == language_java)
        {
-         char *new_prefix = determine_class_name (die, cu);
-         TYPE_TAG_NAME (type) = obsavestring (new_prefix,
-                                              strlen (new_prefix),
-                                              &objfile->objfile_obstack);
-         back_to = make_cleanup (xfree, new_prefix);
-         processing_current_prefix = new_prefix;
+         const char *new_prefix = determine_class_name (die, cu);
+         TYPE_TAG_NAME (type) = (char *) new_prefix;
        }
       else
        {
@@ -4076,9 +4204,9 @@ read_structure_type (struct die_info *die, struct dwarf2_cu *cu)
       TYPE_LENGTH (type) = 0;
     }
 
-  TYPE_FLAGS (type) |= TYPE_FLAG_STUB_SUPPORTED;
+  TYPE_STUB_SUPPORTED (type) = 1;
   if (die_is_declaration (die, cu))
-    TYPE_FLAGS (type) |= TYPE_FLAG_STUB;
+    TYPE_STUB (type) = 1;
 
   /* We need to add the type field to the die immediately so we don't
      infinitely recurse when dealing with pointers to the structure
@@ -4089,7 +4217,6 @@ read_structure_type (struct die_info *die, struct dwarf2_cu *cu)
     {
       struct field_info fi;
       struct die_info *child_die;
-      struct cleanup *back_to = make_cleanup (null_cleanup, NULL);
 
       memset (&fi, 0, sizeof (struct field_info));
 
@@ -4189,14 +4316,9 @@ read_structure_type (struct die_info *die, struct dwarf2_cu *cu)
                }
            }
        }
-
-      do_cleanups (back_to);
     }
 
-  processing_current_prefix = previous_prefix;
-  if (back_to != NULL)
-    do_cleanups (back_to);
-
+  do_cleanups (back_to);
   return type;
 }
 
@@ -4204,15 +4326,12 @@ static void
 process_structure_scope (struct die_info *die, struct dwarf2_cu *cu)
 {
   struct objfile *objfile = cu->objfile;
-  const char *previous_prefix = processing_current_prefix;
   struct die_info *child_die = die->child;
   struct type *this_type;
 
   this_type = get_die_type (die, cu);
   if (this_type == NULL)
     this_type = read_structure_type (die, cu);
-  if (TYPE_TAG_NAME (this_type) != NULL)
-    processing_current_prefix = TYPE_TAG_NAME (this_type);
 
   /* NOTE: carlton/2004-03-16: GCC 3.4 (or at least one of its
      snapshots) has been known to create a die giving a declaration
@@ -4241,8 +4360,6 @@ process_structure_scope (struct die_info *die, struct dwarf2_cu *cu)
   if (dwarf2_attr (die, DW_AT_byte_size, cu) != NULL
       || !die_is_declaration (die, cu))
     new_symbol (die, this_type, cu);
-
-  processing_current_prefix = previous_prefix;
 }
 
 /* Given a DW_AT_enumeration_type die, set its type.  We do not
@@ -4254,27 +4371,14 @@ read_enumeration_type (struct die_info *die, struct dwarf2_cu *cu)
   struct objfile *objfile = cu->objfile;
   struct type *type;
   struct attribute *attr;
-  char *name;
+  const char *name;
 
   type = alloc_type (objfile);
 
   TYPE_CODE (type) = TYPE_CODE_ENUM;
-  name = dwarf2_name (die, cu);
+  name = dwarf2_full_name (die, cu);
   if (name != NULL)
-    {
-      if (processing_has_namespace_info)
-       {
-         TYPE_TAG_NAME (type) = typename_concat (&objfile->objfile_obstack,
-                                                 processing_current_prefix,
-                                                 name, cu);
-       }
-      else
-       {
-         /* The name is already allocated along with this objfile, so
-            we don't need to duplicate it for the type.  */
-         TYPE_TAG_NAME (type) = name;
-       }
-    }
+    TYPE_TAG_NAME (type) = (char *) name;
 
   attr = dwarf2_attr (die, DW_AT_byte_size, cu);
   if (attr)
@@ -4292,32 +4396,19 @@ read_enumeration_type (struct die_info *die, struct dwarf2_cu *cu)
      Types.  When another package uses such a type, an incomplete DIE
      may be generated by the compiler.  */
   if (die_is_declaration (die, cu))
-    TYPE_FLAGS (type) |= TYPE_FLAG_STUB;
+    TYPE_STUB (type) = 1;
 
   return set_die_type (die, type, cu);
 }
 
 /* Determine the name of the type represented by DIE, which should be
-   a named C++ or Java compound type.  Return the name in question; the caller
-   is responsible for xfree()'ing it.  */
+   a named C++ or Java compound type.  Return the name in question,
+   allocated on the objfile obstack.  */
 
-static char *
+static const char *
 determine_class_name (struct die_info *die, struct dwarf2_cu *cu)
 {
-  struct cleanup *back_to = NULL;
-  struct dwarf2_cu *spec_cu = cu;
-  struct die_info *spec_die = die_specification (die, &spec_cu);
-  char *new_prefix = NULL;
-
-  /* If this is the definition of a class that is declared by another
-     die, then processing_current_prefix may not be accurate; see
-     read_func_scope for a similar example.  */
-  if (spec_die != NULL)
-    {
-      char *specification_prefix = determine_prefix (spec_die, spec_cu);
-      processing_current_prefix = specification_prefix;
-      back_to = make_cleanup (xfree, specification_prefix);
-    }
+  const char *new_prefix = NULL;
 
   /* If we don't have namespace debug info, guess the name by trying
      to demangle the names of members, just like we did in
@@ -4332,27 +4423,25 @@ determine_class_name (struct die_info *die, struct dwarf2_cu *cu)
        {
          if (child->tag == DW_TAG_subprogram)
            {
-             new_prefix 
+             char *phys_prefix
                = language_class_name_from_physname (cu->language_defn,
                                                     dwarf2_linkage_name
                                                     (child, cu));
 
-             if (new_prefix != NULL)
-               break;
+             if (phys_prefix != NULL)
+               {
+                 new_prefix
+                   = obsavestring (phys_prefix, strlen (phys_prefix),
+                                   &cu->objfile->objfile_obstack);
+                 xfree (phys_prefix);
+                 break;
+               }
            }
        }
     }
 
   if (new_prefix == NULL)
-    {
-      const char *name = dwarf2_name (die, cu);
-      new_prefix = typename_concat (NULL, processing_current_prefix,
-                                   name ? name : "<<anonymous>>", 
-                                   cu);
-    }
-
-  if (back_to != NULL)
-    do_cleanups (back_to);
+    new_prefix = dwarf2_full_name (die, cu);
 
   return new_prefix;
 }
@@ -4408,9 +4497,8 @@ process_enumeration_scope (struct die_info *die, struct dwarf2_cu *cu)
 
                  FIELD_NAME (fields[num_fields]) = SYMBOL_LINKAGE_NAME (sym);
                  FIELD_TYPE (fields[num_fields]) = NULL;
-                 FIELD_BITPOS (fields[num_fields]) = SYMBOL_VALUE (sym);
+                 SET_FIELD_BITPOS (fields[num_fields], SYMBOL_VALUE (sym));
                  FIELD_BITSIZE (fields[num_fields]) = 0;
-                 FIELD_STATIC_KIND (fields[num_fields]) = 0;
 
                  num_fields++;
                }
@@ -4429,7 +4517,7 @@ process_enumeration_scope (struct die_info *die, struct dwarf2_cu *cu)
          xfree (fields);
        }
       if (unsigned_enum)
-       TYPE_FLAGS (this_type) |= TYPE_FLAG_UNSIGNED;
+       TYPE_UNSIGNED (this_type) = 1;
     }
 
   new_symbol (die, this_type, cu);
@@ -4617,32 +4705,54 @@ read_common_block (struct die_info *die, struct dwarf2_cu *cu)
     }
 }
 
-/* Read a C++ namespace.  */
+/* Create a type for a C++ namespace.  */
 
-static void
-read_namespace (struct die_info *die, struct dwarf2_cu *cu)
+static struct type *
+read_namespace_type (struct die_info *die, struct dwarf2_cu *cu)
 {
   struct objfile *objfile = cu->objfile;
-  const char *previous_prefix = processing_current_prefix;
-  const char *name;
+  const char *previous_prefix, *name;
   int is_anonymous;
-  struct die_info *current_die;
-  struct cleanup *back_to = make_cleanup (null_cleanup, 0);
+  struct type *type;
+
+  /* For extensions, reuse the type of the original namespace.  */
+  if (dwarf2_attr (die, DW_AT_extension, cu) != NULL)
+    {
+      struct die_info *ext_die;
+      struct dwarf2_cu *ext_cu = cu;
+      ext_die = dwarf2_extension (die, &ext_cu);
+      type = read_type_die (ext_die, ext_cu);
+      return set_die_type (die, type, cu);
+    }
 
   name = namespace_name (die, &is_anonymous, cu);
 
   /* Now build the name of the current namespace.  */
 
-  if (previous_prefix[0] == '\0')
-    {
-      processing_current_prefix = name;
-    }
-  else
-    {
-      char *temp_name = typename_concat (NULL, previous_prefix, name, cu);
-      make_cleanup (xfree, temp_name);
-      processing_current_prefix = temp_name;
-    }
+  previous_prefix = determine_prefix (die, cu);
+  if (previous_prefix[0] != '\0')
+    name = typename_concat (&objfile->objfile_obstack,
+                           previous_prefix, name, cu);
+
+  /* Create the type.  */
+  type = init_type (TYPE_CODE_NAMESPACE, 0, 0, NULL,
+                   objfile);
+  TYPE_NAME (type) = (char *) name;
+  TYPE_TAG_NAME (type) = TYPE_NAME (type);
+
+  set_die_type (die, type, cu);
+
+  return type;
+}
+
+/* Read a C++ namespace.  */
+
+static void
+read_namespace (struct die_info *die, struct dwarf2_cu *cu)
+{
+  struct objfile *objfile = cu->objfile;
+  const char *name;
+  int is_anonymous;
 
   /* Add a symbol associated to this if we haven't seen the namespace
      before.  Also, add a using directive if it's an anonymous
@@ -4652,20 +4762,17 @@ read_namespace (struct die_info *die, struct dwarf2_cu *cu)
     {
       struct type *type;
 
-      /* FIXME: carlton/2003-06-27: Once GDB is more const-correct,
-        this cast will hopefully become unnecessary.  */
-      type = init_type (TYPE_CODE_NAMESPACE, 0, 0,
-                       (char *) processing_current_prefix,
-                       objfile);
-      TYPE_TAG_NAME (type) = TYPE_NAME (type);
-
+      type = read_type_die (die, cu);
       new_symbol (die, type, cu);
-      set_die_type (die, type, cu);
 
+      name = namespace_name (die, &is_anonymous, cu);
       if (is_anonymous)
-       cp_add_using_directive (processing_current_prefix,
-                               strlen (previous_prefix),
-                               strlen (processing_current_prefix));
+       {
+         const char *previous_prefix = determine_prefix (die, cu);
+         cp_add_using_directive (TYPE_NAME (type),
+                                 strlen (previous_prefix),
+                                 strlen (TYPE_NAME (type)));
+       }
     }
 
   if (die->child != NULL)
@@ -4678,9 +4785,22 @@ read_namespace (struct die_info *die, struct dwarf2_cu *cu)
          child_die = sibling_die (child_die);
        }
     }
+}
 
-  processing_current_prefix = previous_prefix;
-  do_cleanups (back_to);
+/* Read a Fortran module.  */
+
+static void
+read_module (struct die_info *die, struct dwarf2_cu *cu)
+{
+  struct die_info *child_die = die->child;
+
+  /* FIXME: Support the separate Fortran module namespaces.  */
+
+  while (child_die && child_die->tag)
+    {
+      process_die (child_die, cu);
+      child_die = sibling_die (child_die);
+    }
 }
 
 /* Return the name of the namespace represented by DIE.  Set
@@ -4751,7 +4871,8 @@ read_tag_pointer_type (struct die_info *die, struct dwarf2_cu *cu)
 
          type_flags = gdbarch_address_class_type_flags
                         (gdbarch, byte_size, addr_class);
-         gdb_assert ((type_flags & ~TYPE_FLAG_ADDRESS_CLASS_ALL) == 0);
+         gdb_assert ((type_flags & ~TYPE_INSTANCE_FLAG_ADDRESS_CLASS_ALL)
+                     == 0);
          type = make_type_with_address_space (type, type_flags);
        }
       else if (TYPE_LENGTH (type) != byte_size)
@@ -4898,7 +5019,7 @@ read_subroutine_type (struct die_info *die, struct dwarf2_cu *cu)
       || cu->language == language_cplus
       || cu->language == language_java
       || cu->language == language_pascal)
-    TYPE_FLAGS (ftype) |= TYPE_FLAG_PROTOTYPED;
+    TYPE_PROTOTYPED (ftype) = 1;
 
   /* Store the calling convention in the type if it's available in
      the subroutine die.  Otherwise set the calling convention to
@@ -4921,7 +5042,7 @@ read_subroutine_type (struct die_info *die, struct dwarf2_cu *cu)
          if (child_die->tag == DW_TAG_formal_parameter)
            nparams++;
          else if (child_die->tag == DW_TAG_unspecified_parameters)
-           TYPE_FLAGS (ftype) |= TYPE_FLAG_VARARGS;
+           TYPE_VARARGS (ftype) = 1;
          child_die = sibling_die (child_die);
        }
 
@@ -4960,12 +5081,13 @@ read_typedef (struct die_info *die, struct dwarf2_cu *cu)
 {
   struct objfile *objfile = cu->objfile;
   struct attribute *attr;
-  char *name = NULL;
+  const char *name = NULL;
   struct type *this_type;
 
-  name = dwarf2_name (die, cu);
+  name = dwarf2_full_name (die, cu);
   this_type = init_type (TYPE_CODE_TYPEDEF, 0,
-                        TYPE_FLAG_TARGET_STUB, name, objfile);
+                        TYPE_FLAG_TARGET_STUB, NULL, objfile);
+  TYPE_NAME (this_type) = (char *) name;
   set_die_type (die, this_type, cu);
   TYPE_TARGET_TYPE (this_type) = die_type (die, cu);
   return this_type;
@@ -5031,11 +5153,13 @@ read_base_type (struct die_info *die, struct dwarf2_cu *cu)
        type_flags |= TYPE_FLAG_UNSIGNED;
        break;
       case DW_ATE_signed_char:
-       if (cu->language == language_ada || cu->language == language_m2)
+       if (cu->language == language_ada || cu->language == language_m2 
+           || cu->language == language_pascal)
          code = TYPE_CODE_CHAR;
        break;
       case DW_ATE_unsigned_char:
-       if (cu->language == language_ada || cu->language == language_m2)
+       if (cu->language == language_ada || cu->language == language_m2
+           || cu->language == language_pascal)
          code = TYPE_CODE_CHAR;
        type_flags |= TYPE_FLAG_UNSIGNED;
        break;
@@ -5045,9 +5169,13 @@ read_base_type (struct die_info *die, struct dwarf2_cu *cu)
        break;
     }
 
-  type = init_type (code, size, type_flags, name, objfile);
+  type = init_type (code, size, type_flags, NULL, objfile);
+  TYPE_NAME (type) = name;
   TYPE_TARGET_TYPE (type) = target_type;
 
+  if (name && strcmp (name, "char") == 0)
+    TYPE_NOSIGN (type) = 1;
+
   return set_die_type (die, type, cu);
 }
 
@@ -5129,8 +5257,8 @@ read_unspecified_type (struct die_info *die, struct dwarf2_cu *cu)
 
   /* For now, we only support the C meaning of an unspecified type: void.  */
 
-  type = init_type (TYPE_CODE_VOID, 0, 0, dwarf2_name (die, cu),
-                   cu->objfile);
+  type = init_type (TYPE_CODE_VOID, 0, 0, NULL, cu->objfile);
+  TYPE_NAME (type) = dwarf2_name (die, cu);
 
   return set_die_type (die, type, cu);
 }
@@ -5173,6 +5301,27 @@ read_comp_unit (gdb_byte *info_ptr, bfd *abfd, struct dwarf2_cu *cu)
   return read_die_and_children (info_ptr, abfd, cu, &info_ptr, NULL);
 }
 
+/* Main entry point for reading a DIE and all children.
+   Read the DIE and dump it if requested.  */
+
+static struct die_info *
+read_die_and_children (gdb_byte *info_ptr, bfd *abfd,
+                      struct dwarf2_cu *cu,
+                      gdb_byte **new_info_ptr,
+                      struct die_info *parent)
+{
+  struct die_info *result = read_die_and_children_1 (info_ptr, abfd, cu,
+                                                    new_info_ptr, parent);
+
+  if (dwarf2_die_debug)
+    {
+      fprintf_unfiltered (gdb_stdlog, "Read die from .debug_info:\n");
+      dump_die (result, dwarf2_die_debug);
+    }
+
+  return result;
+}
+
 /* Read a single die and all its descendents.  Set the die's sibling
    field to NULL; set other fields in the die correctly, and set all
    of the descendents' fields correctly.  Set *NEW_INFO_PTR to the
@@ -5180,10 +5329,10 @@ read_comp_unit (gdb_byte *info_ptr, bfd *abfd, struct dwarf2_cu *cu)
    is the parent of the die in question.  */
 
 static struct die_info *
-read_die_and_children (gdb_byte *info_ptr, bfd *abfd,
-                      struct dwarf2_cu *cu,
-                      gdb_byte **new_info_ptr,
-                      struct die_info *parent)
+read_die_and_children_1 (gdb_byte *info_ptr, bfd *abfd,
+                        struct dwarf2_cu *cu,
+                        gdb_byte **new_info_ptr,
+                        struct die_info *parent)
 {
   struct die_info *die;
   gdb_byte *cur_ptr;
@@ -5232,7 +5381,7 @@ read_die_and_siblings (gdb_byte *info_ptr, bfd *abfd,
   while (1)
     {
       struct die_info *die
-       = read_die_and_children (cur_ptr, abfd, cu, &cur_ptr, parent);
+       = read_die_and_children_1 (cur_ptr, abfd, cu, &cur_ptr, parent);
 
       if (die == NULL)
        {
@@ -5610,6 +5759,7 @@ load_partial_dies (bfd *abfd, gdb_byte *info_ptr, int building_psymtab,
          && !is_type_tag_for_partial (abbrev->tag)
          && abbrev->tag != DW_TAG_enumerator
          && abbrev->tag != DW_TAG_subprogram
+         && abbrev->tag != DW_TAG_lexical_block
          && abbrev->tag != DW_TAG_variable
          && abbrev->tag != DW_TAG_namespace
          && abbrev->tag != DW_TAG_member)
@@ -5732,9 +5882,14 @@ load_partial_dies (bfd *abfd, gdb_byte *info_ptr, int building_psymtab,
                                sizeof (struct partial_die_info));
 
       /* For some DIEs we want to follow their children (if any).  For C
-         we have no reason to follow the children of structures; for other
+        we have no reason to follow the children of structures; for other
         languages we have to, both so that we can get at method physnames
-        to infer fully qualified class names, and for DW_AT_specification.  */
+        to infer fully qualified class names, and for DW_AT_specification.
+
+        For Ada, we need to scan the children of subprograms and lexical
+        blocks as well because Ada allows the definition of nested
+        entities that could be interesting for the debugger, such as
+        nested subprograms for instance.  */
       if (last_die->has_children
          && (load_all
              || last_die->tag == DW_TAG_namespace
@@ -5743,7 +5898,10 @@ load_partial_dies (bfd *abfd, gdb_byte *info_ptr, int building_psymtab,
                  && (last_die->tag == DW_TAG_class_type
                      || last_die->tag == DW_TAG_interface_type
                      || last_die->tag == DW_TAG_structure_type
-                     || last_die->tag == DW_TAG_union_type))))
+                     || last_die->tag == DW_TAG_union_type))
+             || (cu->language == language_ada
+                 && (last_die->tag == DW_TAG_subprogram
+                     || last_die->tag == DW_TAG_lexical_block))))
        {
          nesting_level++;
          parent_die = last_die;
@@ -5800,10 +5958,23 @@ read_partial_die (struct partial_die_info *part_die,
       switch (attr.name)
        {
        case DW_AT_name:
-
-         /* Prefer DW_AT_MIPS_linkage_name over DW_AT_name.  */
-         if (part_die->name == NULL)
-           part_die->name = DW_STRING (&attr);
+         switch (part_die->tag)
+           {
+           case DW_TAG_compile_unit:
+             /* Compilation units have a DW_AT_name that is a filename, not
+                a source language identifier.  */
+           case DW_TAG_enumeration_type:
+           case DW_TAG_enumerator:
+             /* These tags always have simple identifiers already; no need
+                to canonicalize them.  */
+             part_die->name = DW_STRING (&attr);
+             break;
+           default:
+             part_die->name
+               = dwarf2_canonicalize_name (DW_STRING (&attr), cu,
+                                           &cu->comp_unit_obstack);
+             break;
+           }
          break;
        case DW_AT_comp_dir:
          if (part_die->dirname == NULL)
@@ -5873,7 +6044,7 @@ read_partial_die (struct partial_die_info *part_die,
        case DW_AT_specification:
        case DW_AT_extension:
          part_die->has_specification = 1;
-         part_die->spec_offset = dwarf2_get_ref_die_offset (&attr, cu);
+         part_die->spec_offset = dwarf2_get_ref_die_offset (&attr);
          break;
        case DW_AT_sibling:
          /* Ignore absolute siblings, they might point outside of
@@ -5882,7 +6053,7 @@ read_partial_die (struct partial_die_info *part_die,
            complaint (&symfile_complaints, _("ignoring absolute DW_AT_sibling"));
          else
            part_die->sibling = dwarf2_per_objfile->info_buffer
-             + dwarf2_get_ref_die_offset (&attr, cu);
+             + dwarf2_get_ref_die_offset (&attr);
          break;
         case DW_AT_stmt_list:
           part_die->has_stmt_list = 1;
@@ -5929,11 +6100,11 @@ read_partial_die (struct partial_die_info *part_die,
          || dwarf2_per_objfile->has_section_at_zero))
     part_die->has_pc_info = 1;
 
-  if (base_address_type != base_address_none && !cu->header.base_known)
+  if (base_address_type != base_address_none && !cu->base_known)
     {
       gdb_assert (part_die->tag == DW_TAG_compile_unit);
-      cu->header.base_known = 1;
-      cu->header.base_address = base_address;
+      cu->base_known = 1;
+      cu->base_address = base_address;
     }
 
   return info_ptr;
@@ -5942,7 +6113,7 @@ read_partial_die (struct partial_die_info *part_die,
 /* Find a cached partial DIE at OFFSET in CU.  */
 
 static struct partial_die_info *
-find_partial_die_in_comp_unit (unsigned long offset, struct dwarf2_cu *cu)
+find_partial_die_in_comp_unit (unsigned int offset, struct dwarf2_cu *cu)
 {
   struct partial_die_info *lookup_die = NULL;
   struct partial_die_info part_die;
@@ -5956,13 +6127,12 @@ find_partial_die_in_comp_unit (unsigned long offset, struct dwarf2_cu *cu)
 /* Find a partial DIE at OFFSET, which may or may not be in CU.  */
 
 static struct partial_die_info *
-find_partial_die (unsigned long offset, struct dwarf2_cu *cu)
+find_partial_die (unsigned int offset, struct dwarf2_cu *cu)
 {
   struct dwarf2_per_cu_data *per_cu = NULL;
   struct partial_die_info *pd = NULL;
 
-  if (offset >= cu->header.offset
-      && offset < cu->header.offset + cu->header.length)
+  if (offset_in_cu_p (&cu->header, offset))
     {
       pd = find_partial_die_in_comp_unit (offset, cu);
       if (pd != NULL)
@@ -5998,7 +6168,9 @@ find_partial_die (unsigned long offset, struct dwarf2_cu *cu)
          dwarf2_read_abbrevs (per_cu->cu->objfile->obfd, per_cu->cu);
          back_to = make_cleanup (dwarf2_free_abbrev_table, per_cu->cu);
        }
-      info_ptr = per_cu->cu->header.first_die_ptr;
+      info_ptr = (dwarf2_per_objfile->info_buffer
+                 + per_cu->cu->header.offset
+                 + per_cu->cu->header.first_die_offset);
       abbrev = peek_die_abbrev (info_ptr, &bytes_read, per_cu->cu);
       info_ptr = read_partial_die (&comp_unit_die, abbrev, bytes_read,
                                   per_cu->cu->objfile->obfd, info_ptr,
@@ -6012,7 +6184,7 @@ find_partial_die (unsigned long offset, struct dwarf2_cu *cu)
 
   if (pd == NULL)
     internal_error (__FILE__, __LINE__,
-                   _("could not find partial DIE 0x%lx in cache [from module %s]\n"),
+                   _("could not find partial DIE 0x%x in cache [from module %s]\n"),
                    offset, bfd_get_filename (cu->objfile->obfd));
   return pd;
 }
@@ -6370,12 +6542,7 @@ read_address (bfd *abfd, gdb_byte *buf, struct dwarf2_cu *cu,
 
    The value returned via bytes_read should be used to increment the
    relevant pointer after calling read_initial_length().
-   
-   As a side effect, this function sets the fields initial_length_size
-   and offset_size in cu_header to the values appropriate for the
-   length field.  (The format of the initial length field determines
-   the width of file offsets to be fetched later with read_offset().)
-   
+
    [ Note:  read_initial_length() and read_offset() are based on the
      document entitled "DWARF Debugging Information Format", revision
      3, draft 8, dated November 19, 2001.  This document was obtained
@@ -6393,8 +6560,7 @@ read_address (bfd *abfd, gdb_byte *buf, struct dwarf2_cu *cu,
    ] */
 
 static LONGEST
-read_initial_length (bfd *abfd, gdb_byte *buf, struct comp_unit_head *cu_header,
-                     unsigned int *bytes_read)
+read_initial_length (bfd *abfd, gdb_byte *buf, unsigned int *bytes_read)
 {
   LONGEST length = bfd_get_32 (abfd, buf);
 
@@ -6414,22 +6580,34 @@ read_initial_length (bfd *abfd, gdb_byte *buf, struct comp_unit_head *cu_header,
       *bytes_read = 4;
     }
 
-  if (cu_header)
-    {
-      gdb_assert (cu_header->initial_length_size == 0
-                 || cu_header->initial_length_size == 4
-                 || cu_header->initial_length_size == 8
-                 || cu_header->initial_length_size == 12);
+  return length;
+}
 
-      if (cu_header->initial_length_size != 0
-         && cu_header->initial_length_size != *bytes_read)
-       complaint (&symfile_complaints,
-                  _("intermixed 32-bit and 64-bit DWARF sections"));
+/* Cover function for read_initial_length.
+   Returns the length of the object at BUF, and stores the size of the
+   initial length in *BYTES_READ and stores the size that offsets will be in
+   *OFFSET_SIZE.
+   If the initial length size is not equivalent to that specified in
+   CU_HEADER then issue a complaint.
+   This is useful when reading non-comp-unit headers.  */
 
-      cu_header->initial_length_size = *bytes_read;
-      cu_header->offset_size = (*bytes_read == 4) ? 4 : 8;
-    }
+static LONGEST
+read_checked_initial_length_and_offset (bfd *abfd, gdb_byte *buf,
+                                       const struct comp_unit_head *cu_header,
+                                       unsigned int *bytes_read,
+                                       unsigned int *offset_size)
+{
+  LONGEST length = read_initial_length (abfd, buf, bytes_read);
+
+  gdb_assert (cu_header->initial_length_size == 4
+             || cu_header->initial_length_size == 8
+             || cu_header->initial_length_size == 12);
 
+  if (cu_header->initial_length_size != *bytes_read)
+    complaint (&symfile_complaints,
+              _("intermixed 32-bit and 64-bit DWARF sections"));
+
+  *offset_size = (*bytes_read == 4) ? 4 : 8;
   return length;
 }
 
@@ -6439,22 +6617,30 @@ read_initial_length (bfd *abfd, gdb_byte *buf, struct comp_unit_head *cu_header,
 static LONGEST
 read_offset (bfd *abfd, gdb_byte *buf, const struct comp_unit_head *cu_header,
              unsigned int *bytes_read)
+{
+  LONGEST offset = read_offset_1 (abfd, buf, cu_header->offset_size);
+  *bytes_read = cu_header->offset_size;
+  return offset;
+}
+
+/* Read an offset from the data stream.  */
+
+static LONGEST
+read_offset_1 (bfd *abfd, gdb_byte *buf, unsigned int offset_size)
 {
   LONGEST retval = 0;
 
-  switch (cu_header->offset_size)
+  switch (offset_size)
     {
     case 4:
       retval = bfd_get_32 (abfd, buf);
-      *bytes_read = 4;
       break;
     case 8:
       retval = bfd_get_64 (abfd, buf);
-      *bytes_read = 8;
       break;
     default:
       internal_error (__FILE__, __LINE__,
-                     _("read_offset: bad switch [in module %s]"),
+                     _("read_offset_1: bad switch [in module %s]"),
                      bfd_get_filename (abfd));
     }
 
@@ -6492,8 +6678,7 @@ read_indirect_string (bfd *abfd, gdb_byte *buf,
                      const struct comp_unit_head *cu_header,
                      unsigned int *bytes_read_ptr)
 {
-  LONGEST str_offset = read_offset (abfd, buf, cu_header,
-                                   bytes_read_ptr);
+  LONGEST str_offset = read_offset (abfd, buf, cu_header, bytes_read_ptr);
 
   if (dwarf2_per_objfile->str_buffer == NULL)
     {
@@ -6792,7 +6977,7 @@ dwarf_decode_line_header (unsigned int offset, bfd *abfd,
   struct cleanup *back_to;
   struct line_header *lh;
   gdb_byte *line_ptr;
-  unsigned int bytes_read;
+  unsigned int bytes_read, offset_size;
   int i;
   char *cur_dir, *cur_file;
 
@@ -6819,7 +7004,8 @@ dwarf_decode_line_header (unsigned int offset, bfd *abfd,
 
   /* Read in the header.  */
   lh->total_length = 
-    read_initial_length (abfd, line_ptr, &cu->header, &bytes_read);
+    read_checked_initial_length_and_offset (abfd, line_ptr, &cu->header,
+                                           &bytes_read, &offset_size);
   line_ptr += bytes_read;
   if (line_ptr + lh->total_length > (dwarf2_per_objfile->line_buffer
                                     + dwarf2_per_objfile->line_size))
@@ -6830,8 +7016,8 @@ dwarf_decode_line_header (unsigned int offset, bfd *abfd,
   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);
-  line_ptr += bytes_read;
+  lh->header_length = read_offset_1 (abfd, line_ptr, offset_size);
+  line_ptr += offset_size;
   lh->minimum_instruction_length = read_1_byte (abfd, line_ptr);
   line_ptr += 1;
   lh->default_is_stmt = read_1_byte (abfd, line_ptr);
@@ -7001,6 +7187,11 @@ dwarf_decode_lines (struct line_header *lh, char *comp_dir, bfd *abfd,
        {
          op_code = read_1_byte (abfd, line_ptr);
          line_ptr += 1;
+          if (line_ptr > line_end)
+            {
+              dwarf2_debug_line_missing_end_sequence_complaint ();
+              break;
+            }
 
          if (op_code >= lh->opcode_base)
            {           
@@ -7009,7 +7200,7 @@ dwarf_decode_lines (struct line_header *lh, char *comp_dir, bfd *abfd,
              address += (adj_opcode / lh->line_range)
                * lh->minimum_instruction_length;
              line += lh->line_base + (adj_opcode % lh->line_range);
-             if (lh->num_file_names < file)
+             if (lh->num_file_names < file || file == 0)
                dwarf2_debug_line_missing_file_complaint ();
              else
                {
@@ -7041,15 +7232,6 @@ dwarf_decode_lines (struct line_header *lh, char *comp_dir, bfd *abfd,
                {
                case DW_LNE_end_sequence:
                  end_sequence = 1;
-
-                 if (lh->num_file_names < file)
-                   dwarf2_debug_line_missing_file_complaint ();
-                 else
-                   {
-                     lh->file_names[file - 1].included_p = 1;
-                     if (!decode_for_pst_p)
-                       record_line (current_subfile, 0, address);
-                   }
                  break;
                case DW_LNE_set_address:
                  address = read_address (abfd, line_ptr, cu, &bytes_read);
@@ -7091,7 +7273,7 @@ dwarf_decode_lines (struct line_header *lh, char *comp_dir, bfd *abfd,
                }
              break;
            case DW_LNS_copy:
-             if (lh->num_file_names < file)
+             if (lh->num_file_names < file || file == 0)
                dwarf2_debug_line_missing_file_complaint ();
              else
                {
@@ -7129,7 +7311,7 @@ dwarf_decode_lines (struct line_header *lh, char *comp_dir, bfd *abfd,
 
                 file = read_unsigned_leb128 (abfd, line_ptr, &bytes_read);
                 line_ptr += bytes_read;
-                if (lh->num_file_names < file)
+                if (lh->num_file_names < file || file == 0)
                   dwarf2_debug_line_missing_file_complaint ();
                 else
                   {
@@ -7180,6 +7362,14 @@ dwarf_decode_lines (struct line_header *lh, char *comp_dir, bfd *abfd,
              }
            }
        }
+      if (lh->num_file_names < file || file == 0)
+        dwarf2_debug_line_missing_file_complaint ();
+      else
+        {
+          lh->file_names[file - 1].included_p = 1;
+          if (!decode_for_pst_p)
+            record_line (current_subfile, 0, address);
+        }
     }
 
   if (decode_for_pst_p)
@@ -7494,6 +7684,12 @@ new_symbol (struct die_info *die, struct type *type, struct dwarf2_cu *cu)
                  SYMBOL_CLASS (sym) = LOC_UNRESOLVED;
                  add_symbol_to_list (sym, &global_symbols);
                }
+             else if (!die_is_declaration (die, cu))
+               {
+                 /* Use the default LOC_OPTIMIZED_OUT class.  */
+                 gdb_assert (SYMBOL_CLASS (sym) == LOC_OPTIMIZED_OUT);
+                 add_symbol_to_list (sym, cu->list_in_scope);
+               }
            }
          break;
        case DW_TAG_formal_parameter:
@@ -7580,13 +7776,7 @@ new_symbol (struct die_info *die, struct type *type, struct dwarf2_cu *cu)
          }
          break;
        case DW_TAG_typedef:
-         if (processing_has_namespace_info
-             && processing_current_prefix[0] != '\0')
-           {
-             SYMBOL_LINKAGE_NAME (sym) = typename_concat (&objfile->objfile_obstack,
-                                                          processing_current_prefix,
-                                                          name, cu);
-           }
+         SYMBOL_LINKAGE_NAME (sym) = (char *) dwarf2_full_name (die, cu);
          SYMBOL_CLASS (sym) = LOC_TYPEDEF;
          SYMBOL_DOMAIN (sym) = VAR_DOMAIN;
          add_symbol_to_list (sym, cu->list_in_scope);
@@ -7598,13 +7788,7 @@ new_symbol (struct die_info *die, struct type *type, struct dwarf2_cu *cu)
          add_symbol_to_list (sym, cu->list_in_scope);
          break;
        case DW_TAG_enumerator:
-         if (processing_has_namespace_info
-             && processing_current_prefix[0] != '\0')
-           {
-             SYMBOL_LINKAGE_NAME (sym) = typename_concat (&objfile->objfile_obstack,
-                                                          processing_current_prefix,
-                                                          name, cu);
-           }
+         SYMBOL_LINKAGE_NAME (sym) = (char *) dwarf2_full_name (die, cu);
          attr = dwarf2_attr (die, DW_AT_const_value, cu);
          if (attr)
            {
@@ -7779,7 +7963,7 @@ die_type (struct die_info *die, struct dwarf2_cu *cu)
   type = tag_type_to_type (type_die, cu);
   if (!type)
     {
-      dump_die (type_die);
+      dump_die_for_error (type_die);
       error (_("Dwarf Error: Problem turning type die at offset into gdb type [in module %s]"),
                      cu->objfile->name);
     }
@@ -7805,7 +7989,7 @@ die_containing_type (struct die_info *die, struct dwarf2_cu *cu)
   if (!type)
     {
       if (type_die)
-       dump_die (type_die);
+       dump_die_for_error (type_die);
       error (_("Dwarf Error: Problem turning containing type into gdb type [in module %s]"), 
                      cu->objfile->name);
     }
@@ -7820,7 +8004,7 @@ tag_type_to_type (struct die_info *die, struct dwarf2_cu *cu)
   this_type = read_type_die (die, cu);
   if (!this_type)
     {
-      dump_die (die);
+      dump_die_for_error (die);
       error (_("Dwarf Error: Cannot find type of die [in module %s]"), 
             cu->objfile->name);
     }
@@ -7830,20 +8014,12 @@ tag_type_to_type (struct die_info *die, struct dwarf2_cu *cu)
 static struct type *
 read_type_die (struct die_info *die, struct dwarf2_cu *cu)
 {
-  char *prefix;
-  const char *old_prefix;
-  struct cleanup *back_to;
   struct type *this_type;
 
   this_type = get_die_type (die, cu);
   if (this_type)
     return this_type;
 
-  prefix = determine_prefix (die, cu);
-  old_prefix = processing_current_prefix;
-  back_to = make_cleanup (xfree, prefix);
-  processing_current_prefix = prefix;
-
   switch (die->tag)
     {
     case DW_TAG_class_type:
@@ -7895,91 +8071,98 @@ read_type_die (struct die_info *die, struct dwarf2_cu *cu)
     case DW_TAG_unspecified_type:
       this_type = read_unspecified_type (die, cu);
       break;
+    case DW_TAG_namespace:
+      this_type = read_namespace_type (die, cu);
+      break;
     default:
       complaint (&symfile_complaints, _("unexpected tag in read_type_die: '%s'"),
                 dwarf_tag_name (die->tag));
       break;
     }
 
-  processing_current_prefix = old_prefix;
-  do_cleanups (back_to);
   return this_type;
 }
 
 /* Return the name of the namespace/class that DIE is defined within,
-   or "" if we can't tell.  The caller should xfree the result.  */
+   or "" if we can't tell.  The caller should not xfree the result.
 
-/* NOTE: carlton/2004-01-23: See read_func_scope (and the comment
-   therein) for an example of how to use this function to deal with
-   DW_AT_specification.  */
+   For example, if we're within the method foo() in the following
+   code:
+
+   namespace N {
+     class C {
+       void foo () {
+       }
+     };
+   }
+
+   then determine_prefix on foo's die will return "N::C".  */
 
 static char *
 determine_prefix (struct die_info *die, struct dwarf2_cu *cu)
 {
-  struct die_info *parent;
+  struct die_info *parent, *spec_die;
+  struct dwarf2_cu *spec_cu;
+  struct type *parent_type;
 
   if (cu->language != language_cplus
       && cu->language != language_java)
-    return NULL;
-
-  parent = die->parent;
-
-  if (parent == NULL)
+    return "";
+
+  /* We have to be careful in the presence of DW_AT_specification.
+     For example, with GCC 3.4, given the code
+
+     namespace N {
+       void foo() {
+        // Definition of N::foo.
+       }
+     }
+
+     then we'll have a tree of DIEs like this:
+
+     1: DW_TAG_compile_unit
+       2: DW_TAG_namespace        // N
+        3: DW_TAG_subprogram     // declaration of N::foo
+       4: DW_TAG_subprogram       // definition of N::foo
+           DW_AT_specification   // refers to die #3
+
+     Thus, when processing die #4, we have to pretend that we're in
+     the context of its DW_AT_specification, namely the contex of die
+     #3.  */
+  spec_cu = cu;
+  spec_die = die_specification (die, &spec_cu);
+  if (spec_die == NULL)
+    parent = die->parent;
+  else
     {
-      return xstrdup ("");
+      parent = spec_die->parent;
+      cu = spec_cu;
     }
+
+  if (parent == NULL)
+    return "";
   else
-    {
-      switch (parent->tag) {
+    switch (parent->tag)
+      {
       case DW_TAG_namespace:
-       {
-         /* FIXME: carlton/2004-03-05: Should I follow extension dies
-            before doing this check?  */
-         struct type *parent_type = get_die_type (parent, cu);
-         if (parent_type != NULL && TYPE_TAG_NAME (parent_type) != NULL)
-           {
-             return xstrdup (TYPE_TAG_NAME (parent_type));
-           }
-         else
-           {
-             int dummy;
-             char *parent_prefix = determine_prefix (parent, cu);
-             char *retval = typename_concat (NULL, parent_prefix,
-                                             namespace_name (parent, &dummy,
-                                                             cu),
-                                             cu);
-             xfree (parent_prefix);
-             return retval;
-           }
-       }
-       break;
+       parent_type = read_type_die (parent, cu);
+       /* We give a name to even anonymous namespaces.  */
+       return TYPE_TAG_NAME (parent_type);
       case DW_TAG_class_type:
       case DW_TAG_interface_type:
       case DW_TAG_structure_type:
-       {
-         struct type *parent_type = get_die_type (parent, cu);
-         if (parent_type != NULL && TYPE_TAG_NAME (parent_type) != NULL)
-           {
-             return xstrdup (TYPE_TAG_NAME (parent_type));
-           }
-         else
-           {
-             const char *old_prefix = processing_current_prefix;
-             char *new_prefix = determine_prefix (parent, cu);
-             char *retval;
-
-             processing_current_prefix = new_prefix;
-             retval = determine_class_name (parent, cu);
-             processing_current_prefix = old_prefix;
-
-             xfree (new_prefix);
-             return retval;
-           }
-       }
+      case DW_TAG_union_type:
+       parent_type = read_type_die (parent, cu);
+       if (TYPE_TAG_NAME (parent_type) != NULL)
+         return TYPE_TAG_NAME (parent_type);
+       else
+         /* An anonymous structure is only allowed non-static data
+            members; no typedefs, no member functions, et cetera.
+            So it does not need a prefix.  */
+         return "";
       default:
        return determine_prefix (parent, cu);
       }
-    }
 }
 
 /* Return a newly-allocated string formed by concatenating PREFIX and
@@ -8003,19 +8186,17 @@ typename_concat (struct obstack *obs, const char *prefix, const char *suffix,
   else
     sep = "::";
 
+  if (prefix == NULL)
+    prefix = "";
+  if (suffix == NULL)
+    suffix = "";
+
   if (obs == NULL)
     {
       char *retval = xmalloc (strlen (prefix) + MAX_SEP_LEN + strlen (suffix) + 1);
-      retval[0] = '\0';
-      
-      if (prefix)
-       {
-         strcpy (retval, prefix);
-         strcat (retval, sep);
-       }
-      if (suffix)
-       strcat (retval, suffix);
-      
+      strcpy (retval, prefix);
+      strcat (retval, sep);
+      strcat (retval, suffix);
       return retval;
     }
   else
@@ -8043,10 +8224,29 @@ dwarf2_linkage_name (struct die_info *die, struct dwarf2_cu *cu)
   attr = dwarf2_attr (die, DW_AT_MIPS_linkage_name, cu);
   if (attr && DW_STRING (attr))
     return DW_STRING (attr);
-  attr = dwarf2_attr (die, DW_AT_name, cu);
-  if (attr && DW_STRING (attr))
-    return DW_STRING (attr);
-  return NULL;
+  return dwarf2_name (die, cu);
+}
+
+/* Get name of a die, return NULL if not found.  */
+
+static char *
+dwarf2_canonicalize_name (char *name, struct dwarf2_cu *cu,
+                         struct obstack *obstack)
+{
+  if (name && cu->language == language_cplus)
+    {
+      char *canon_name = cp_canonicalize_string (name);
+
+      if (canon_name != NULL)
+       {
+         if (strcmp (canon_name, name) != 0)
+           name = obsavestring (canon_name, strlen (canon_name),
+                                obstack);
+         xfree (canon_name);
+       }
+    }
+
+  return name;
 }
 
 /* Get name of a die, return NULL if not found.  */
@@ -8057,9 +8257,29 @@ dwarf2_name (struct die_info *die, struct dwarf2_cu *cu)
   struct attribute *attr;
 
   attr = dwarf2_attr (die, DW_AT_name, cu);
-  if (attr && DW_STRING (attr))
-    return DW_STRING (attr);
-  return NULL;
+  if (!attr || !DW_STRING (attr))
+    return NULL;
+
+  switch (die->tag)
+    {
+    case DW_TAG_compile_unit:
+      /* Compilation units have a DW_AT_name that is a filename, not
+        a source language identifier.  */
+    case DW_TAG_enumeration_type:
+    case DW_TAG_enumerator:
+      /* These tags always have simple identifiers already; no need
+        to canonicalize them.  */
+      return DW_STRING (attr);
+    default:
+      if (attr->form != GDB_FORM_cached_string)
+       {
+         DW_STRING (attr)
+           = dwarf2_canonicalize_name (DW_STRING (attr), cu,
+                                       &cu->objfile->objfile_obstack);
+         attr->form = GDB_FORM_cached_string;
+       }
+      return DW_STRING (attr);
+    }
 }
 
 /* Return the die that this die in an extension of, or NULL if there
@@ -8416,10 +8636,11 @@ dwarf_attr_name (unsigned attr)
       return "DW_AT_pure";
     case DW_AT_recursive:
       return "DW_AT_recursive";
-#ifdef MIPS
     /* SGI/MIPS extensions.  */
+#ifdef MIPS /* collides with DW_AT_HP_block_index */
     case DW_AT_MIPS_fde:
       return "DW_AT_MIPS_fde";
+#endif
     case DW_AT_MIPS_loop_begin:
       return "DW_AT_MIPS_loop_begin";
     case DW_AT_MIPS_tail_loop_begin:
@@ -8440,10 +8661,11 @@ dwarf_attr_name (unsigned attr)
       return "DW_AT_MIPS_clone_origin";
     case DW_AT_MIPS_has_inlines:
       return "DW_AT_MIPS_has_inlines";
-#endif
     /* HP extensions.  */
+#ifndef MIPS /* collides with DW_AT_MIPS_fde */
     case DW_AT_HP_block_index:
       return "DW_AT_HP_block_index";
+#endif
     case DW_AT_HP_unmodifiable:
       return "DW_AT_HP_unmodifiable";
     case DW_AT_HP_actuals_stmt_list:
@@ -8552,6 +8774,8 @@ dwarf_form_name (unsigned form)
       return "DW_FORM_ref_udata";
     case DW_FORM_indirect:
       return "DW_FORM_indirect";
+    case GDB_FORM_cached_string:
+      return "GDB_FORM_cached_string";
     default:
       return "DW_FORM_<unknown>";
     }
@@ -9039,38 +9263,52 @@ dwarf_cfi_name (unsigned cfi_opc)
 #endif
 
 static void
-dump_die (struct die_info *die)
+dump_die_shallow (struct ui_file *f, int indent, struct die_info *die)
 {
   unsigned int i;
 
-  fprintf_unfiltered (gdb_stderr, "Die: %s (abbrev = %d, offset = %d)\n",
+  print_spaces (indent, f);
+  fprintf_unfiltered (f, "Die: %s (abbrev %d, offset 0x%x)\n",
           dwarf_tag_name (die->tag), die->abbrev, die->offset);
-  fprintf_unfiltered (gdb_stderr, "\thas children: %s\n",
+
+  if (die->parent != NULL)
+    {
+      print_spaces (indent, f);
+      fprintf_unfiltered (f, "  parent at offset: 0x%x\n",
+                         die->parent->offset);
+    }
+
+  print_spaces (indent, f);
+  fprintf_unfiltered (f, "  has children: %s\n",
           dwarf_bool_name (die->child != NULL));
 
-  fprintf_unfiltered (gdb_stderr, "\tattributes:\n");
+  print_spaces (indent, f);
+  fprintf_unfiltered (f, "  attributes:\n");
+
   for (i = 0; i < die->num_attrs; ++i)
     {
-      fprintf_unfiltered (gdb_stderr, "\t\t%s (%s) ",
+      print_spaces (indent, f);
+      fprintf_unfiltered (f, "    %s (%s) ",
               dwarf_attr_name (die->attrs[i].name),
               dwarf_form_name (die->attrs[i].form));
+
       switch (die->attrs[i].form)
        {
        case DW_FORM_ref_addr:
        case DW_FORM_addr:
-         fprintf_unfiltered (gdb_stderr, "address: ");
-         fputs_filtered (paddress (DW_ADDR (&die->attrs[i])), gdb_stderr);
+         fprintf_unfiltered (f, "address: ");
+         fputs_filtered (paddress (DW_ADDR (&die->attrs[i])), f);
          break;
        case DW_FORM_block2:
        case DW_FORM_block4:
        case DW_FORM_block:
        case DW_FORM_block1:
-         fprintf_unfiltered (gdb_stderr, "block: size %d", DW_BLOCK (&die->attrs[i])->size);
+         fprintf_unfiltered (f, "block: size %d", DW_BLOCK (&die->attrs[i])->size);
          break;
        case DW_FORM_ref1:
        case DW_FORM_ref2:
        case DW_FORM_ref4:
-         fprintf_unfiltered (gdb_stderr, "constant ref: %ld (adjusted)",
+         fprintf_unfiltered (f, "constant ref: 0x%lx (adjusted)",
                              (long) (DW_ADDR (&die->attrs[i])));
          break;
        case DW_FORM_data1:
@@ -9079,44 +9317,81 @@ dump_die (struct die_info *die)
        case DW_FORM_data8:
        case DW_FORM_udata:
        case DW_FORM_sdata:
-         fprintf_unfiltered (gdb_stderr, "constant: %ld", DW_UNSND (&die->attrs[i]));
+         fprintf_unfiltered (f, "constant: %ld", DW_UNSND (&die->attrs[i]));
          break;
        case DW_FORM_string:
        case DW_FORM_strp:
-         fprintf_unfiltered (gdb_stderr, "string: \"%s\"",
+       case GDB_FORM_cached_string:
+         fprintf_unfiltered (f, "string: \"%s\"",
                   DW_STRING (&die->attrs[i])
                   ? DW_STRING (&die->attrs[i]) : "");
          break;
        case DW_FORM_flag:
          if (DW_UNSND (&die->attrs[i]))
-           fprintf_unfiltered (gdb_stderr, "flag: TRUE");
+           fprintf_unfiltered (f, "flag: TRUE");
          else
-           fprintf_unfiltered (gdb_stderr, "flag: FALSE");
+           fprintf_unfiltered (f, "flag: FALSE");
          break;
        case DW_FORM_indirect:
          /* the reader will have reduced the indirect form to
             the "base form" so this form should not occur */
-         fprintf_unfiltered (gdb_stderr, "unexpected attribute form: DW_FORM_indirect");
+         fprintf_unfiltered (f, "unexpected attribute form: DW_FORM_indirect");
          break;
        default:
-         fprintf_unfiltered (gdb_stderr, "unsupported attribute form: %d.",
+         fprintf_unfiltered (f, "unsupported attribute form: %d.",
                   die->attrs[i].form);
+         break;
        }
-      fprintf_unfiltered (gdb_stderr, "\n");
+      fprintf_unfiltered (f, "\n");
     }
 }
 
 static void
-dump_die_list (struct die_info *die)
+dump_die_for_error (struct die_info *die)
+{
+  dump_die_shallow (gdb_stderr, 0, die);
+}
+
+static void
+dump_die_1 (struct ui_file *f, int level, int max_level, struct die_info *die)
 {
-  while (die)
+  int indent = level * 4;
+
+  gdb_assert (die != NULL);
+
+  if (level >= max_level)
+    return;
+
+  dump_die_shallow (f, indent, die);
+
+  if (die->child != NULL)
     {
-      dump_die (die);
-      if (die->child != NULL)
-       dump_die_list (die->child);
-      if (die->sibling != NULL)
-       dump_die_list (die->sibling);
+      print_spaces (indent, f);
+      fprintf_unfiltered (f, "  Children:");
+      if (level + 1 < max_level)
+       {
+         fprintf_unfiltered (f, "\n");
+         dump_die_1 (f, level + 1, max_level, die->child);
+       }
+      else
+       {
+         fprintf_unfiltered (f, " [not printed, max nesting level reached]\n");
+       }
     }
+
+  if (die->sibling != NULL && level > 0)
+    {
+      dump_die_1 (f, level, max_level, die->sibling);
+    }
+}
+
+/* This is called from the pdie macro in gdbinit.in.
+   It's not static so gcc will keep a copy callable from gdb.  */
+
+void
+dump_die (struct die_info *die, int max_level)
+{
+  dump_die_1 (gdb_stdlog, 0, max_level, die);
 }
 
 static void
@@ -9130,7 +9405,7 @@ store_in_ref_table (struct die_info *die, struct dwarf2_cu *cu)
 }
 
 static unsigned int
-dwarf2_get_ref_die_offset (struct attribute *attr, struct dwarf2_cu *cu)
+dwarf2_get_ref_die_offset (struct attribute *attr)
 {
   unsigned int result = 0;
 
@@ -9210,14 +9485,12 @@ follow_die_ref (struct die_info *src_die, struct attribute *attr,
   struct die_info temp_die;
   struct dwarf2_cu *target_cu, *cu = *ref_cu;
 
-  offset = dwarf2_get_ref_die_offset (attr, cu);
+  offset = dwarf2_get_ref_die_offset (attr);
 
-  if (DW_ADDR (attr) < cu->header.offset
-      || DW_ADDR (attr) >= cu->header.offset + cu->header.length)
+  if (! offset_in_cu_p (&cu->header, offset))
     {
       struct dwarf2_per_cu_data *per_cu;
-      per_cu = dwarf2_find_containing_comp_unit (DW_ADDR (attr),
-                                                cu->objfile);
+      per_cu = dwarf2_find_containing_comp_unit (offset, cu->objfile);
 
       /* If necessary, add it to the queue and load its DIEs.  */
       maybe_queue_comp_unit (cu, per_cu);
@@ -9764,6 +10037,8 @@ dwarf_decode_macros (struct line_header *lh, unsigned int offset,
 {
   gdb_byte *mac_ptr, *mac_end;
   struct macro_source_file *current_file = 0;
+  enum dwarf_macinfo_record_type macinfo_type;
+  int at_commandline;
 
   if (dwarf2_per_objfile->macinfo_buffer == NULL)
     {
@@ -9771,19 +10046,29 @@ dwarf_decode_macros (struct line_header *lh, unsigned int offset,
       return;
     }
 
+  /* First pass: Find the name of the base filename.
+     This filename is needed in order to process all macros whose definition
+     (or undefinition) comes from the command line.  These macros are defined
+     before the first DW_MACINFO_start_file entry, and yet still need to be
+     associated to the base file.
+
+     To determine the base file name, we scan the macro definitions until we
+     reach the first DW_MACINFO_start_file entry.  We then initialize
+     CURRENT_FILE accordingly so that any macro definition found before the
+     first DW_MACINFO_start_file can still be associated to the base file.  */
+
   mac_ptr = dwarf2_per_objfile->macinfo_buffer + offset;
   mac_end = dwarf2_per_objfile->macinfo_buffer
     + dwarf2_per_objfile->macinfo_size;
 
-  for (;;)
+  do
     {
-      enum dwarf_macinfo_record_type macinfo_type;
-
       /* Do we at least have room for a macinfo type byte?  */
       if (mac_ptr >= mac_end)
         {
-         dwarf2_macros_too_long_complaint ();
-          return;
+         /* Complaint is printed during the second pass as GDB will probably
+            stop the first pass earlier upon finding DW_MACINFO_start_file.  */
+         break;
         }
 
       macinfo_type = read_1_byte (abfd, mac_ptr);
@@ -9794,7 +10079,92 @@ dwarf_decode_macros (struct line_header *lh, unsigned int offset,
           /* A zero macinfo type indicates the end of the macro
              information.  */
         case 0:
-          return;
+         break;
+
+       case DW_MACINFO_define:
+       case DW_MACINFO_undef:
+         /* Only skip the data by MAC_PTR.  */
+         {
+           unsigned int bytes_read;
+
+           read_unsigned_leb128 (abfd, mac_ptr, &bytes_read);
+           mac_ptr += bytes_read;
+           read_string (abfd, mac_ptr, &bytes_read);
+           mac_ptr += bytes_read;
+         }
+         break;
+
+       case DW_MACINFO_start_file:
+         {
+           unsigned int bytes_read;
+           int line, file;
+
+           line = read_unsigned_leb128 (abfd, mac_ptr, &bytes_read);
+           mac_ptr += bytes_read;
+           file = read_unsigned_leb128 (abfd, mac_ptr, &bytes_read);
+           mac_ptr += bytes_read;
+
+           current_file = macro_start_file (file, line, current_file, comp_dir,
+                                            lh, cu->objfile);
+         }
+         break;
+
+       case DW_MACINFO_end_file:
+         /* No data to skip by MAC_PTR.  */
+         break;
+
+       case DW_MACINFO_vendor_ext:
+         /* Only skip the data by MAC_PTR.  */
+         {
+           unsigned int bytes_read;
+
+           read_unsigned_leb128 (abfd, mac_ptr, &bytes_read);
+           mac_ptr += bytes_read;
+           read_string (abfd, mac_ptr, &bytes_read);
+           mac_ptr += bytes_read;
+         }
+         break;
+
+       default:
+         break;
+       }
+    } while (macinfo_type != 0 && current_file == NULL);
+
+  /* Second pass: Process all entries.
+
+     Use the AT_COMMAND_LINE flag to determine whether we are still processing
+     command-line macro definitions/undefinitions.  This flag is unset when we
+     reach the first DW_MACINFO_start_file entry.  */
+
+  mac_ptr = dwarf2_per_objfile->macinfo_buffer + offset;
+
+  /* Determines if GDB is still before first DW_MACINFO_start_file.  If true
+     GDB is still reading the definitions from command line.  First
+     DW_MACINFO_start_file will need to be ignored as it was already executed
+     to create CURRENT_FILE for the main source holding also the command line
+     definitions.  On first met DW_MACINFO_start_file this flag is reset to
+     normally execute all the remaining DW_MACINFO_start_file macinfos.  */
+
+  at_commandline = 1;
+
+  do
+    {
+      /* Do we at least have room for a macinfo type byte?  */
+      if (mac_ptr >= mac_end)
+       {
+         dwarf2_macros_too_long_complaint ();
+         break;
+       }
+
+      macinfo_type = read_1_byte (abfd, mac_ptr);
+      mac_ptr++;
+
+      switch (macinfo_type)
+       {
+         /* A zero macinfo type indicates the end of the macro
+            information.  */
+       case 0:
+         break;
 
         case DW_MACINFO_define:
         case DW_MACINFO_undef:
@@ -9809,19 +10179,31 @@ dwarf_decode_macros (struct line_header *lh, unsigned int offset,
             mac_ptr += bytes_read;
 
             if (! current_file)
+             {
+               /* DWARF violation as no main source is present.  */
+               complaint (&symfile_complaints,
+                          _("debug info with no main source gives macro %s "
+                            "on line %d: %s"),
+                          macinfo_type ==
+                          DW_MACINFO_define ? _("definition") : macinfo_type ==
+                          DW_MACINFO_undef ? _("undefinition") :
+                          "something-or-other", line, body);
+               break;
+             }
+           if ((line == 0 && !at_commandline) || (line != 0 && at_commandline))
              complaint (&symfile_complaints,
-                        _("debug info gives macro %s outside of any file: %s"),
+                        _("debug info gives %s macro %s with %s line %d: %s"),
+                        at_commandline ? _("command-line") : _("in-file"),
                         macinfo_type ==
-                        DW_MACINFO_define ? "definition" : macinfo_type ==
-                        DW_MACINFO_undef ? "undefinition" :
-                        "something-or-other", body);
-            else
-              {
-                if (macinfo_type == DW_MACINFO_define)
-                  parse_macro_definition (current_file, line, body);
-                else if (macinfo_type == DW_MACINFO_undef)
-                  macro_undef (current_file, line, body);
-              }
+                        DW_MACINFO_define ? _("definition") : macinfo_type ==
+                        DW_MACINFO_undef ? _("undefinition") :
+                        "something-or-other",
+                        line == 0 ? _("zero") : _("non-zero"), line, body);
+
+           if (macinfo_type == DW_MACINFO_define)
+             parse_macro_definition (current_file, line, body);
+           else if (macinfo_type == DW_MACINFO_undef)
+             macro_undef (current_file, line, body);
           }
           break;
 
@@ -9835,9 +10217,22 @@ dwarf_decode_macros (struct line_header *lh, unsigned int offset,
             file = read_unsigned_leb128 (abfd, mac_ptr, &bytes_read);
             mac_ptr += bytes_read;
 
-            current_file = macro_start_file (file, line,
-                                             current_file, comp_dir,
-                                             lh, cu->objfile);
+           if ((line == 0 && !at_commandline) || (line != 0 && at_commandline))
+             complaint (&symfile_complaints,
+                        _("debug info gives source %d included "
+                          "from %s at %s line %d"),
+                        file, at_commandline ? _("command-line") : _("file"),
+                        line == 0 ? _("zero") : _("non-zero"), line);
+
+           if (at_commandline)
+             {
+               /* This DW_MACINFO_start_file was executed in the pass one.  */
+               at_commandline = 0;
+             }
+           else
+             current_file = macro_start_file (file, line,
+                                              current_file, comp_dir,
+                                              lh, cu->objfile);
           }
           break;
 
@@ -9891,7 +10286,7 @@ dwarf_decode_macros (struct line_header *lh, unsigned int offset,
           }
           break;
         }
-    }
+    } while (macinfo_type != 0);
 }
 
 /* Check if the attribute's form is a DW_FORM_block*
@@ -9972,8 +10367,8 @@ dwarf2_symbol_mark_computed (struct attribute *attr, struct symbol *sym,
         don't run off the edge of the section.  */
       baton->size = dwarf2_per_objfile->loc_size - DW_UNSND (attr);
       baton->data = dwarf2_per_objfile->loc_buffer + DW_UNSND (attr);
-      baton->base_address = cu->header.base_address;
-      if (cu->header.base_known == 0)
+      baton->base_address = cu->base_address;
+      if (cu->base_known == 0)
        complaint (&symfile_complaints,
                   _("Location list used without specifying the CU base address."));
 
@@ -10053,7 +10448,7 @@ dwarf2_per_cu_addr_size (struct dwarf2_per_cu_data *per_cu)
    DIE at OFFSET.  Raises an error on failure.  */
 
 static struct dwarf2_per_cu_data *
-dwarf2_find_containing_comp_unit (unsigned long offset,
+dwarf2_find_containing_comp_unit (unsigned int offset,
                                  struct objfile *objfile)
 {
   struct dwarf2_per_cu_data *this_cu;
@@ -10085,7 +10480,7 @@ dwarf2_find_containing_comp_unit (unsigned long offset,
       this_cu = dwarf2_per_objfile->all_comp_units[low];
       if (low == dwarf2_per_objfile->n_comp_units - 1
          && offset >= this_cu->offset + this_cu->length)
-       error (_("invalid dwarf2 offset %ld"), offset);
+       error (_("invalid dwarf2 offset %u"), offset);
       gdb_assert (offset < this_cu->offset + this_cu->length);
       return this_cu;
     }
@@ -10095,12 +10490,12 @@ dwarf2_find_containing_comp_unit (unsigned long offset,
    OFFSET.  Raises an error on failure.  */
 
 static struct dwarf2_per_cu_data *
-dwarf2_find_comp_unit (unsigned long offset, struct objfile *objfile)
+dwarf2_find_comp_unit (unsigned int offset, struct objfile *objfile)
 {
   struct dwarf2_per_cu_data *this_cu;
   this_cu = dwarf2_find_containing_comp_unit (offset, objfile);
   if (this_cu->offset != offset)
-    error (_("no compilation unit with offset %ld."), offset);
+    error (_("no compilation unit with offset %u."), offset);
   return this_cu;
 }
 
@@ -10462,4 +10857,13 @@ caching, which can slow down startup."),
                            show_dwarf2_max_cache_age,
                            &set_dwarf2_cmdlist,
                            &show_dwarf2_cmdlist);
+
+  add_setshow_zinteger_cmd ("dwarf2-die", no_class, &dwarf2_die_debug, _("\
+Set debugging of the dwarf2 DIE reader."), _("\
+Show debugging of the dwarf2 DIE reader."), _("\
+When enabled (non-zero), DIEs are dumped after they are read in.\n\
+The value is the maximum depth to print."),
+                           NULL,
+                           NULL,
+                           &setdebuglist, &showdebuglist);
 }
This page took 0.056963 seconds and 4 git commands to generate.