X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=gdb%2Fdwarf2read.c;h=da895737dced49979f7cc738e6ab157d4b038224;hb=359cc68c808f70750a020c9bb76de330735a3202;hp=2205ef72d51dc3be91c07c61f00515dfeff5a701;hpb=0fe7935b333f7332ffd501dc45ff73ceec09b45f;p=binutils-gdb.git diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c index 2205ef72d51..da895737dce 100644 --- a/gdb/dwarf2read.c +++ b/gdb/dwarf2read.c @@ -1,7 +1,7 @@ /* DWARF 2 debugging format support for GDB. Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, - 2004, 2005, 2006, 2007, 2008, 2009 + 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. Adapted by Gary Funck (gary@intrepid.com), Intrepid Technology, @@ -48,6 +48,9 @@ #include "gdbcmd.h" #include "block.h" #include "addrmap.h" +#include "typeprint.h" +#include "jv-lang.h" +#include "psympriv.h" #include #include "gdb_string.h" @@ -80,38 +83,6 @@ _COMP_UNIT_HEADER; #define _ACTUAL_COMP_UNIT_HEADER_SIZE 11 #endif -/* .debug_pubnames header - Because of alignment constraints, this structure has padding and cannot - be mapped directly onto the beginning of the .debug_info section. */ -typedef struct pubnames_header - { - unsigned int length; /* length of the .debug_pubnames - contribution */ - unsigned char version; /* version number -- 2 for DWARF - version 2 */ - unsigned int info_offset; /* offset into .debug_info section */ - unsigned int info_size; /* byte size of .debug_info section - portion */ - } -_PUBNAMES_HEADER; -#define _ACTUAL_PUBNAMES_HEADER_SIZE 13 - -/* .debug_pubnames header - Because of alignment constraints, this structure has padding and cannot - be mapped directly onto the beginning of the .debug_info section. */ -typedef struct aranges_header - { - unsigned int length; /* byte len of the .debug_aranges - contribution */ - unsigned short version; /* version number -- 2 for DWARF - version 2 */ - unsigned int info_offset; /* offset into .debug_info section */ - unsigned char addr_size; /* byte size of an address */ - unsigned char seg_size; /* byte size of segment descriptor */ - } -_ARANGES_HEADER; -#define _ACTUAL_ARANGES_HEADER_SIZE 12 - /* .debug_line statement program prologue Because of alignment constraints, this structure has padding and cannot be mapped directly onto the beginning of the .debug_info section. */ @@ -154,6 +125,8 @@ struct dwarf2_section_info gdb_byte *buffer; bfd_size_type size; int was_mmapped; + /* True if we have tried to read this section. */ + int readin; }; struct dwarf2_per_objfile @@ -161,8 +134,6 @@ struct dwarf2_per_objfile struct dwarf2_section_info info; struct dwarf2_section_info abbrev; struct dwarf2_section_info line; - struct dwarf2_section_info pubnames; - struct dwarf2_section_info aranges; struct dwarf2_section_info loc; struct dwarf2_section_info macinfo; struct dwarf2_section_info str; @@ -171,6 +142,9 @@ struct dwarf2_per_objfile struct dwarf2_section_info frame; struct dwarf2_section_info eh_frame; + /* Back link. */ + struct objfile *objfile; + /* A list of all the compilation units. This is used to locate the target compilation unit of a particular reference. */ struct dwarf2_per_cu_data **all_comp_units; @@ -201,8 +175,6 @@ static struct dwarf2_per_objfile *dwarf2_per_objfile; #define INFO_SECTION "debug_info" #define ABBREV_SECTION "debug_abbrev" #define LINE_SECTION "debug_line" -#define PUBNAMES_SECTION "debug_pubnames" -#define ARANGES_SECTION "debug_aranges" #define LOC_SECTION "debug_loc" #define MACINFO_SECTION "debug_macinfo" #define STR_SECTION "debug_str" @@ -424,6 +396,7 @@ struct line_header unsigned short version; unsigned int header_length; unsigned char minimum_instruction_length; + unsigned char maximum_ops_per_instruction; unsigned char default_is_stmt; int line_base; unsigned char line_range; @@ -487,8 +460,7 @@ struct partial_die_info unsigned int has_byte_size : 1; /* The name of this DIE. Normally the value of DW_AT_name, but - sometimes DW_TAG_MIPS_linkage_name or a string computed in some - other fashion. */ + sometimes a default name for unnamed DIEs. */ char *name; /* The scope to prepend to our children. This is generally @@ -621,9 +593,6 @@ struct dwarf_block #define DW_FIELD_ALLOC_CHUNK 4 #endif -/* A zeroed version of a partial die for initialization purposes. */ -static struct partial_die_info zeroed_partial_die; - /* FIXME: We might want to set this from BFD via bfd_arch_bits_per_byte, but this would require a corresponding change in unpack_field_as_long and friends. */ @@ -768,10 +737,6 @@ dwarf2_invalid_attrib_class_complaint (const char *arg1, const char *arg2) static void dwarf2_locate_sections (bfd *, asection *, void *); -#if 0 -static void dwarf2_build_psymtabs_easy (struct objfile *); -#endif - static void dwarf2_create_include_psymtab (char *, struct partial_symtab *, struct objfile *); @@ -788,8 +753,6 @@ static void scan_partial_symbols (struct partial_die_info *, static void add_partial_symbol (struct partial_die_info *, struct dwarf2_cu *); -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, int need_pc, struct dwarf2_cu *cu); @@ -926,6 +889,13 @@ static void dwarf2_const_value_data (struct attribute *attr, static struct type *die_type (struct die_info *, struct dwarf2_cu *); +static int need_gnat_info (struct dwarf2_cu *); + +static struct type *die_descriptive_type (struct die_info *, struct dwarf2_cu *); + +static void set_descriptive_type (struct type *, struct die_info *, + struct dwarf2_cu *); + static struct type *die_containing_type (struct die_info *, struct dwarf2_cu *); @@ -977,9 +947,6 @@ static void dwarf2_attach_fn_fields_to_type (struct field_info *, static void process_structure_scope (struct die_info *, struct dwarf2_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 *); @@ -1021,8 +988,6 @@ static gdb_byte *read_full_die (const struct die_reader_specs *reader, 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 *); @@ -1162,16 +1127,22 @@ static struct type *get_die_type (struct die_info *die, struct dwarf2_cu *cu); int dwarf2_has_info (struct objfile *objfile) { - struct dwarf2_per_objfile *data; + dwarf2_per_objfile = objfile_data (objfile, dwarf2_objfile_data_key); + if (!dwarf2_per_objfile) + { + /* Initialize per-objfile state. */ + struct dwarf2_per_objfile *data + = obstack_alloc (&objfile->objfile_obstack, sizeof (*data)); - /* Initialize per-objfile state. */ - data = obstack_alloc (&objfile->objfile_obstack, sizeof (*data)); - memset (data, 0, sizeof (*data)); - set_objfile_data (objfile, dwarf2_objfile_data_key, data); - dwarf2_per_objfile = data; + memset (data, 0, sizeof (*data)); + set_objfile_data (objfile, dwarf2_objfile_data_key, data); + dwarf2_per_objfile = data; - bfd_map_over_sections (objfile->obfd, dwarf2_locate_sections, NULL); - return (data->info.asection != NULL && data->abbrev.asection != NULL); + bfd_map_over_sections (objfile->obfd, dwarf2_locate_sections, NULL); + dwarf2_per_objfile->objfile = objfile; + } + return (dwarf2_per_objfile->info.asection != NULL + && dwarf2_per_objfile->abbrev.asection != NULL); } /* When loading sections, we can either look for ".", or for @@ -1208,16 +1179,6 @@ dwarf2_locate_sections (bfd *abfd, asection *sectp, void *ignore_ptr) dwarf2_per_objfile->line.asection = sectp; dwarf2_per_objfile->line.size = bfd_get_section_size (sectp); } - else if (section_is_p (sectp->name, PUBNAMES_SECTION)) - { - dwarf2_per_objfile->pubnames.asection = sectp; - dwarf2_per_objfile->pubnames.size = bfd_get_section_size (sectp); - } - else if (section_is_p (sectp->name, ARANGES_SECTION)) - { - dwarf2_per_objfile->aranges.asection = sectp; - dwarf2_per_objfile->aranges.size = bfd_get_section_size (sectp); - } else if (section_is_p (sectp->name, LOC_SECTION)) { dwarf2_per_objfile->loc.asection = sectp; @@ -1241,6 +1202,7 @@ dwarf2_locate_sections (bfd *abfd, asection *sectp, void *ignore_ptr) else if (section_is_p (sectp->name, EH_FRAME_SECTION)) { flagword aflag = bfd_get_section_flags (ignore_abfd, sectp); + if (aflag & SEC_HAS_CONTENTS) { dwarf2_per_objfile->eh_frame.asection = sectp; @@ -1353,8 +1315,11 @@ dwarf2_read_section (struct objfile *objfile, struct dwarf2_section_info *info) gdb_byte *buf, *retbuf; unsigned char header[4]; + if (info->readin) + return; info->buffer = NULL; info->was_mmapped = 0; + info->readin = 1; if (info->asection == NULL || info->size == 0) return; @@ -1392,6 +1357,9 @@ dwarf2_read_section (struct objfile *objfile, struct dwarf2_section_info *info) { info->was_mmapped = 1; info->buffer = retbuf + (sectp->filepos & (pagesize - 1)) ; +#if HAVE_POSIX_MADVISE + posix_madvise (retbuf, map_length, POSIX_MADV_WILLNEED); +#endif return; } } @@ -1405,7 +1373,7 @@ dwarf2_read_section (struct objfile *objfile, struct dwarf2_section_info *info) http://sourceware.org/ml/gdb-patches/2002-04/msg00136.html . We never compress sections in .o files, so we only need to try this when the section is not compressed. */ - retbuf = symfile_relocate_debug_section (abfd, sectp, buf); + retbuf = symfile_relocate_debug_section (objfile, sectp, buf); if (retbuf != NULL) { info->buffer = retbuf; @@ -1429,6 +1397,16 @@ dwarf2_get_section_info (struct objfile *objfile, const char *section_name, struct dwarf2_per_objfile *data = objfile_data (objfile, dwarf2_objfile_data_key); struct dwarf2_section_info *info; + + /* We may see an objfile without any DWARF, in which case we just + return nothing. */ + if (data == NULL) + { + *sectp = NULL; + *bufp = NULL; + *sizep = 0; + return; + } if (section_is_p (section_name, EH_FRAME_SECTION)) info = &data->eh_frame; else if (section_is_p (section_name, FRAME_SECTION)) @@ -1450,74 +1428,14 @@ dwarf2_get_section_info (struct objfile *objfile, const char *section_name, void dwarf2_build_psymtabs (struct objfile *objfile) { - dwarf2_read_section (objfile, &dwarf2_per_objfile->info); - dwarf2_read_section (objfile, &dwarf2_per_objfile->abbrev); - dwarf2_read_section (objfile, &dwarf2_per_objfile->line); - dwarf2_read_section (objfile, &dwarf2_per_objfile->str); - dwarf2_read_section (objfile, &dwarf2_per_objfile->macinfo); - dwarf2_read_section (objfile, &dwarf2_per_objfile->ranges); - dwarf2_read_section (objfile, &dwarf2_per_objfile->types); - dwarf2_read_section (objfile, &dwarf2_per_objfile->loc); - dwarf2_read_section (objfile, &dwarf2_per_objfile->eh_frame); - dwarf2_read_section (objfile, &dwarf2_per_objfile->frame); - if (objfile->global_psymbols.size == 0 && objfile->static_psymbols.size == 0) { init_psymbol_list (objfile, 1024); } -#if 0 - if (dwarf_aranges_offset && dwarf_pubnames_offset) - { - /* Things are significantly easier if we have .debug_aranges and - .debug_pubnames sections */ - - dwarf2_build_psymtabs_easy (objfile); - } - else -#endif - /* only test this case for now */ - { - /* In this case we have to work a bit harder */ - dwarf2_build_psymtabs_hard (objfile); - } + dwarf2_build_psymtabs_hard (objfile); } -#if 0 -/* Build the partial symbol table from the information in the - .debug_pubnames and .debug_aranges sections. */ - -static void -dwarf2_build_psymtabs_easy (struct objfile *objfile) -{ - bfd *abfd = objfile->obfd; - char *aranges_buffer, *pubnames_buffer; - char *aranges_ptr, *pubnames_ptr; - unsigned int entry_length, version, info_offset, info_size; - - pubnames_buffer = dwarf2_read_section (objfile, - dwarf_pubnames_section); - pubnames_ptr = pubnames_buffer; - while ((pubnames_ptr - pubnames_buffer) < dwarf2_per_objfile->pubnames.size) - { - unsigned int 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; - info_offset = read_4_bytes (abfd, pubnames_ptr); - pubnames_ptr += 4; - info_size = read_4_bytes (abfd, pubnames_ptr); - pubnames_ptr += 4; - } - - aranges_buffer = dwarf2_read_section (objfile, - dwarf_aranges_section); - -} -#endif - /* Return TRUE if OFFSET is within CU_HEADER. */ static inline int @@ -1527,6 +1445,7 @@ offset_in_cu_p (const struct comp_unit_head *cu_header, unsigned int offset) unsigned int top = (cu_header->offset + cu_header->length + cu_header->initial_length_size); + return (offset >= bottom && offset < top); } @@ -1570,10 +1489,10 @@ partial_read_comp_unit_head (struct comp_unit_head *header, gdb_byte *info_ptr, info_ptr = read_comp_unit_head (header, info_ptr, abfd); - if (header->version != 2 && header->version != 3) + if (header->version != 2 && header->version != 3 && header->version != 4) error (_("Dwarf Error: wrong version in compilation unit header " - "(is %d, should be %d) [in module %s]"), header->version, - 2, bfd_get_filename (abfd)); + "(is %d, should be 2, 3, or 4) [in module %s]"), header->version, + bfd_get_filename (abfd)); if (header->abbrev_offset >= dwarf2_per_objfile->abbrev.size) error (_("Dwarf Error: bad offset (0x%lx) in compilation unit header " @@ -1601,9 +1520,10 @@ read_type_comp_unit_head (struct comp_unit_head *cu_header, ULONGEST *signature, gdb_byte *types_ptr, bfd *abfd) { - unsigned int bytes_read; gdb_byte *initial_types_ptr = types_ptr; + dwarf2_read_section (dwarf2_per_objfile->objfile, + &dwarf2_per_objfile->types); cu_header->offset = types_ptr - dwarf2_per_objfile->types.buffer; types_ptr = read_comp_unit_head (cu_header, types_ptr, abfd); @@ -1667,6 +1587,7 @@ dwarf2_build_include_psymtabs (struct dwarf2_cu *cu, if (attr) { unsigned int line_offset = DW_UNSND (attr); + lh = dwarf_decode_line_header (line_offset, abfd, cu); } if (lh == NULL) @@ -1681,6 +1602,7 @@ static hashval_t hash_type_signature (const void *item) { const struct signatured_type *type_sig = item; + /* This drops the top 32 bits of the signature, but is ok for a hash. */ return type_sig->signature; } @@ -1690,6 +1612,7 @@ eq_type_signature (const void *item_lhs, const void *item_rhs) { const struct signatured_type *lhs = item_lhs; const struct signatured_type *rhs = item_rhs; + return lhs->signature == rhs->signature; } @@ -1700,9 +1623,12 @@ eq_type_signature (const void *item_lhs, const void *item_rhs) static int create_debug_types_hash_table (struct objfile *objfile) { - gdb_byte *info_ptr = dwarf2_per_objfile->types.buffer; + gdb_byte *info_ptr; htab_t types_htab; + dwarf2_read_section (objfile, &dwarf2_per_objfile->types); + info_ptr = dwarf2_per_objfile->types.buffer; + if (info_ptr == NULL) { dwarf2_per_objfile->signatured_types = NULL; @@ -1808,9 +1734,15 @@ init_cu_die_reader (struct die_reader_specs *reader, reader->abfd = cu->objfile->obfd; reader->cu = cu; if (cu->per_cu->from_debug_types) - reader->buffer = dwarf2_per_objfile->types.buffer; + { + gdb_assert (dwarf2_per_objfile->types.readin); + reader->buffer = dwarf2_per_objfile->types.buffer; + } else - reader->buffer = dwarf2_per_objfile->info.buffer; + { + gdb_assert (dwarf2_per_objfile->info.readin); + reader->buffer = dwarf2_per_objfile->info.buffer; + } } /* Find the base address of the compilation unit for range lists and @@ -1865,10 +1797,8 @@ process_psymtab_comp_unit (struct objfile *objfile, CORE_ADDR baseaddr; struct cleanup *back_to_inner; struct dwarf2_cu cu; - unsigned int bytes_read; int has_children, has_pc_info; struct attribute *attr; - const char *name; CORE_ADDR best_lowpc = 0, best_highpc = 0; struct die_reader_specs reader_specs; @@ -1949,7 +1879,7 @@ process_psymtab_comp_unit (struct objfile *objfile, if (attr != NULL) pst->dirname = DW_STRING (attr); - pst->read_symtab_private = (char *) this_cu; + pst->read_symtab_private = this_cu; baseaddr = ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile)); @@ -2009,12 +1939,6 @@ process_psymtab_comp_unit (struct objfile *objfile, (objfile->static_psymbols.list + pst->statics_offset); sort_pst_symbols (pst); - /* If there is already a psymtab or symtab for a file of this - name, remove it. (If there is a symtab, more drastic things - also happen.) This happens in VxWorks. */ - if (! this_cu->from_debug_types) - free_named_symtabs (pst->filename); - info_ptr = (beg_of_comp_unit + cu.header.length + cu.header.initial_length_size); @@ -2048,6 +1972,7 @@ process_type_comp_unit (void **slot, void *info) this_cu = &entry->per_cu; this_cu->from_debug_types = 1; + gdb_assert (dwarf2_per_objfile->types.readin); process_psymtab_comp_unit (objfile, this_cu, dwarf2_per_objfile->types.buffer, dwarf2_per_objfile->types.buffer + entry->offset, @@ -2075,12 +2000,10 @@ build_type_psymtabs (struct objfile *objfile) static void dwarf2_build_psymtabs_hard (struct objfile *objfile) { - /* Instead of reading this into a big buffer, we should probably use - mmap() on architectures that support it. (FIXME) */ - bfd *abfd = objfile->obfd; gdb_byte *info_ptr; struct cleanup *back_to; + dwarf2_read_section (objfile, &dwarf2_per_objfile->info); info_ptr = dwarf2_per_objfile->info.buffer; /* Any cached compilation units will be linked by the per-objfile @@ -2138,7 +2061,6 @@ load_partial_comp_unit (struct dwarf2_per_cu_data *this_cu, gdb_byte *info_ptr, *beg_of_comp_unit; struct die_info *comp_unit_die; struct dwarf2_cu *cu; - unsigned int bytes_read; struct cleanup *back_to; struct attribute *attr; int has_children; @@ -2146,6 +2068,7 @@ load_partial_comp_unit (struct dwarf2_per_cu_data *this_cu, gdb_assert (! this_cu->from_debug_types); + gdb_assert (dwarf2_per_objfile->info.readin); info_ptr = dwarf2_per_objfile->info.buffer + this_cu->offset; beg_of_comp_unit = info_ptr; @@ -2203,7 +2126,10 @@ create_all_comp_units (struct objfile *objfile) int n_allocated; int n_comp_units; struct dwarf2_per_cu_data **all_comp_units; - gdb_byte *info_ptr = dwarf2_per_objfile->info.buffer; + gdb_byte *info_ptr; + + dwarf2_read_section (objfile, &dwarf2_per_objfile->info); + info_ptr = dwarf2_per_objfile->info.buffer; n_comp_units = 0; n_allocated = 10; @@ -2213,7 +2139,6 @@ create_all_comp_units (struct objfile *objfile) while (info_ptr < dwarf2_per_objfile->info.buffer + dwarf2_per_objfile->info.size) { unsigned int length, initial_length_size; - gdb_byte *beg_of_comp_unit; struct dwarf2_per_cu_data *this_cu; unsigned int offset; @@ -2263,8 +2188,6 @@ static void scan_partial_symbols (struct partial_die_info *first_die, CORE_ADDR *lowpc, CORE_ADDR *highpc, int need_pc, struct dwarf2_cu *cu) { - struct objfile *objfile = cu->objfile; - bfd *abfd = objfile->obfd; struct partial_die_info *pdi; /* Now, march along the PDI's, descending into ones which have @@ -2381,11 +2304,25 @@ partial_die_parent_scope (struct partial_die_info *pdi, grandparent_scope = partial_die_parent_scope (parent, cu); + /* GCC 4.0 and 4.1 had a bug (PR c++/28460) where they generated bogus + DW_TAG_namespace DIEs with a name of "::" for the global namespace. + Work around this problem here. */ + if (cu->language == language_cplus + && parent->tag == DW_TAG_namespace + && strcmp (parent->name, "::") == 0 + && grandparent_scope == NULL) + { + parent->scope = NULL; + parent->scope_set = 1; + return NULL; + } + if (parent->tag == DW_TAG_namespace || parent->tag == DW_TAG_structure_type || parent->tag == DW_TAG_class_type || parent->tag == DW_TAG_interface_type - || parent->tag == DW_TAG_union_type) + || parent->tag == DW_TAG_union_type + || parent->tag == DW_TAG_enumeration_type) { if (grandparent_scope == NULL) parent->scope = parent->name; @@ -2393,7 +2330,7 @@ partial_die_parent_scope (struct partial_die_info *pdi, parent->scope = typename_concat (&cu->comp_unit_obstack, grandparent_scope, parent->name, cu); } - else if (parent->tag == DW_TAG_enumeration_type) + else if (parent->tag == DW_TAG_enumerator) /* Enumerators should not get the name of the enumeration as a prefix. */ parent->scope = grandparent_scope; else @@ -2432,19 +2369,15 @@ add_partial_symbol (struct partial_die_info *pdi, struct dwarf2_cu *cu) struct objfile *objfile = cu->objfile; CORE_ADDR addr = 0; char *actual_name = NULL; - const char *my_prefix; const struct partial_symbol *psym = NULL; CORE_ADDR baseaddr; int built_actual_name = 0; baseaddr = ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile)); - if (pdi_needs_namespace (pdi->tag)) - { - actual_name = partial_die_full_name (pdi, cu); - if (actual_name) - built_actual_name = 1; - } + actual_name = partial_die_full_name (pdi, cu); + if (actual_name) + built_actual_name = 1; if (actual_name == NULL) actual_name = pdi->name; @@ -2584,49 +2517,10 @@ add_partial_symbol (struct partial_die_info *pdi, struct dwarf2_cu *cu) break; } - /* Check to see if we should scan the name for possible namespace - info. Only do this if this is C++, if we don't have namespace - debugging info in the file, if the psym is of an appropriate type - (otherwise we'll have psym == NULL), and if we actually had a - mangled name to begin with. */ - - /* FIXME drow/2004-02-22: Why don't we do this for classes, i.e. the - cases which do not set PSYM above? */ - - if (cu->language == language_cplus - && cu->has_namespace_info == 0 - && psym != NULL - && SYMBOL_CPLUS_DEMANGLED_NAME (psym) != NULL) - cp_check_possible_namespace_symbols (SYMBOL_CPLUS_DEMANGLED_NAME (psym), - objfile); - if (built_actual_name) xfree (actual_name); } -/* Determine whether a die of type TAG living in a C++ class or - namespace needs to have the name of the scope prepended to the - name listed in the die. */ - -static int -pdi_needs_namespace (enum dwarf_tag tag) -{ - switch (tag) - { - case DW_TAG_namespace: - case DW_TAG_typedef: - case DW_TAG_class_type: - case DW_TAG_interface_type: - case DW_TAG_structure_type: - case DW_TAG_union_type: - case DW_TAG_enumeration_type: - case DW_TAG_enumerator: - return 1; - default: - return 0; - } -} - /* Read a partial die corresponding to a namespace; also, add a symbol corresponding to that namespace to the symbol table. NAMESPACE is the name of the enclosing namespace. */ @@ -2636,8 +2530,6 @@ add_partial_namespace (struct partial_die_info *pdi, CORE_ADDR *lowpc, CORE_ADDR *highpc, int need_pc, struct dwarf2_cu *cu) { - struct objfile *objfile = cu->objfile; - /* Add a symbol for the namespace. */ add_partial_symbol (pdi, cu); @@ -2693,11 +2585,16 @@ add_partial_subprogram (struct partial_die_info *pdi, baseaddr = ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile)); addrmap_set_empty (objfile->psymtabs_addrmap, - pdi->lowpc, pdi->highpc - 1, + pdi->lowpc + baseaddr, + pdi->highpc - 1 + baseaddr, cu->per_cu->psymtab); } if (!pdi->is_declaration) - add_partial_symbol (pdi, cu); + /* Ignore subprogram DIEs that do not have a name, they are + illegal. Do not emit a complaint at this point, we will + do so when we convert this psymtab into a symtab. */ + if (pdi->name) + add_partial_symbol (pdi, cu); } } @@ -2737,7 +2634,6 @@ guess_structure_name (struct partial_die_info *struct_pdi, could fix this by only using the demangled name to get the prefix (but see comment in read_structure_type). */ - struct partial_die_info *child_pdi = struct_pdi->die_child; struct partial_die_info *real_pdi; /* If this DIE (this DIE's specification, if any) has a parent, then @@ -2750,27 +2646,6 @@ guess_structure_name (struct partial_die_info *struct_pdi, if (real_pdi->die_parent != NULL) return; - - while (child_pdi != NULL) - { - if (child_pdi->tag == DW_TAG_subprogram) - { - char *actual_class_name - = language_class_name_from_physname (cu->language_defn, - child_pdi->name); - if (actual_class_name != NULL) - { - struct_pdi->name - = obsavestring (actual_class_name, - strlen (actual_class_name), - &cu->comp_unit_obstack); - xfree (actual_class_name); - } - break; - } - - child_pdi = child_pdi->die_sibling; - } } } @@ -2780,8 +2655,6 @@ static void add_partial_enumeration (struct partial_die_info *enum_pdi, struct dwarf2_cu *cu) { - struct objfile *objfile = cu->objfile; - bfd *abfd = objfile->obfd; struct partial_die_info *pdi; if (enum_pdi->name != NULL) @@ -2879,8 +2752,15 @@ skip_one_die (gdb_byte *buffer, gdb_byte *info_ptr, skip_attribute: switch (form) { - case DW_FORM_addr: case DW_FORM_ref_addr: + /* In DWARF 2, DW_FORM_ref_addr is address sized; in DWARF 3 + and later it is offset sized. */ + if (cu->header.version == 2) + info_ptr += cu->header.addr_size; + else + info_ptr += cu->header.offset_size; + break; + case DW_FORM_addr: info_ptr += cu->header.addr_size; break; case DW_FORM_data1: @@ -2888,6 +2768,8 @@ skip_one_die (gdb_byte *buffer, gdb_byte *info_ptr, case DW_FORM_flag: info_ptr += 1; break; + case DW_FORM_flag_present: + break; case DW_FORM_data2: case DW_FORM_ref2: info_ptr += 2; @@ -2905,9 +2787,11 @@ skip_one_die (gdb_byte *buffer, gdb_byte *info_ptr, read_string (abfd, info_ptr, &bytes_read); info_ptr += bytes_read; break; + case DW_FORM_sec_offset: case DW_FORM_strp: info_ptr += cu->header.offset_size; break; + case DW_FORM_exprloc: case DW_FORM_block: info_ptr += read_unsigned_leb128 (abfd, info_ptr, &bytes_read); info_ptr += bytes_read; @@ -3003,6 +2887,7 @@ dwarf2_psymtab_to_symtab (struct partial_symtab *pst) struct dwarf2_per_objfile *dpo_backlink = objfile_data (pst->objfile->separate_debug_objfile_backlink, dwarf2_objfile_data_key); + dwarf2_per_objfile->has_section_at_zero = dpo_backlink->has_section_at_zero; } @@ -3114,7 +2999,7 @@ psymtab_to_symtab_1 (struct partial_symtab *pst) psymtab_to_symtab_1 (pst->dependencies[i]); } - per_cu = (struct dwarf2_per_cu_data *) pst->read_symtab_private; + per_cu = pst->read_symtab_private; if (per_cu == NULL) { @@ -3153,13 +3038,13 @@ load_full_comp_unit (struct dwarf2_per_cu_data *per_cu, struct objfile *objfile) gdb_byte *info_ptr, *beg_of_comp_unit; struct cleanup *back_to, *free_cu_cleanup; struct attribute *attr; - CORE_ADDR baseaddr; gdb_assert (! per_cu->from_debug_types); /* Set local variables from the partial symbol table info. */ offset = per_cu->offset; + dwarf2_read_section (objfile, &dwarf2_per_objfile->info); info_ptr = dwarf2_per_objfile->info.buffer + offset; beg_of_comp_unit = info_ptr; @@ -3196,6 +3081,12 @@ load_full_comp_unit (struct dwarf2_per_cu_data *per_cu, struct objfile *objfile) else set_cu_language (language_minimal, cu); + /* Similarly, if we do not read the producer, we can not apply + producer-specific interpretation. */ + attr = dwarf2_attr (cu->dies, DW_AT_producer, cu); + if (attr) + cu->producer = DW_STRING (attr); + /* Link this CU into read_in_chain. */ per_cu->cu->read_in_chain = dwarf2_per_objfile->read_in_chain; dwarf2_per_objfile->read_in_chain = per_cu; @@ -3216,7 +3107,6 @@ process_full_comp_unit (struct dwarf2_per_cu_data *per_cu) struct partial_symtab *pst = per_cu->psymtab; struct dwarf2_cu *cu = per_cu->cu; struct objfile *objfile = pst->objfile; - bfd *abfd = objfile->obfd; CORE_ADDR lowpc, highpc; struct symtab *symtab; struct cleanup *back_to; @@ -3304,6 +3194,8 @@ process_die (struct die_info *die, struct dwarf2_cu *cu) case DW_TAG_base_type: case DW_TAG_subrange_type: case DW_TAG_typedef: + case DW_TAG_const_type: + case DW_TAG_volatile_type: /* Add a typedef symbol for the type definition, if it has a DW_AT_name. */ new_symbol (die, read_type_die (die, cu), cu); @@ -3335,42 +3227,186 @@ process_die (struct die_info *die, struct dwarf2_cu *cu) } } +/* A helper function for dwarf2_compute_name which determines whether DIE + needs to have the name of the scope prepended to the name listed in the + die. */ + +static int +die_needs_namespace (struct die_info *die, struct dwarf2_cu *cu) +{ + struct attribute *attr; + + switch (die->tag) + { + case DW_TAG_namespace: + case DW_TAG_typedef: + case DW_TAG_class_type: + case DW_TAG_interface_type: + case DW_TAG_structure_type: + case DW_TAG_union_type: + case DW_TAG_enumeration_type: + case DW_TAG_enumerator: + case DW_TAG_subprogram: + case DW_TAG_member: + return 1; + + case DW_TAG_variable: + /* We only need to prefix "globally" visible variables. These include + any variable marked with DW_AT_external or any variable that + lives in a namespace. [Variables in anonymous namespaces + require prefixing, but they are not DW_AT_external.] */ + + if (dwarf2_attr (die, DW_AT_specification, cu)) + { + struct dwarf2_cu *spec_cu = cu; + + return die_needs_namespace (die_specification (die, &spec_cu), + spec_cu); + } + + attr = dwarf2_attr (die, DW_AT_external, cu); + if (attr == NULL && die->parent->tag != DW_TAG_namespace) + return 0; + /* A variable in a lexical block of some kind does not need a + namespace, even though in C++ such variables may be external + and have a mangled name. */ + if (die->parent->tag == DW_TAG_lexical_block + || die->parent->tag == DW_TAG_try_block + || die->parent->tag == DW_TAG_catch_block + || die->parent->tag == DW_TAG_subprogram) + return 0; + return 1; + + default: + return 0; + } +} + +/* Compute the fully qualified name of DIE in CU. If PHYSNAME is nonzero, + compute the physname for the object, which include a method's + formal parameters (C++/Java) and return type (Java). + + For Ada, return the DIE's linkage name rather than the fully qualified + name. PHYSNAME is ignored.. + + The result is allocated on the objfile_obstack and canonicalized. */ + +static const char * +dwarf2_compute_name (char *name, struct die_info *die, struct dwarf2_cu *cu, + int physname) +{ + if (name == NULL) + name = dwarf2_name (die, cu); + + /* These are the only languages we know how to qualify names in. */ + if (name != NULL + && (cu->language == language_cplus || cu->language == language_java)) + { + if (die_needs_namespace (die, cu)) + { + long length; + char *prefix; + struct ui_file *buf; + + prefix = determine_prefix (die, cu); + buf = mem_fileopen (); + if (*prefix != '\0') + { + char *prefixed_name = typename_concat (NULL, prefix, name, cu); + + fputs_unfiltered (prefixed_name, buf); + xfree (prefixed_name); + } + else + fputs_unfiltered (name ? name : "", buf); + + /* For Java and C++ methods, append formal parameter type + information, if PHYSNAME. */ + + if (physname && die->tag == DW_TAG_subprogram + && (cu->language == language_cplus + || cu->language == language_java)) + { + struct type *type = read_type_die (die, cu); + + c_type_print_args (type, buf, 0, cu->language); + + if (cu->language == language_java) + { + /* For java, we must append the return type to method + names. */ + if (die->tag == DW_TAG_subprogram) + java_print_type (TYPE_TARGET_TYPE (type), "", buf, + 0, 0); + } + else if (cu->language == language_cplus) + { + if (TYPE_NFIELDS (type) > 0 + && TYPE_FIELD_ARTIFICIAL (type, 0) + && TYPE_CONST (TYPE_TARGET_TYPE (TYPE_FIELD_TYPE (type, 0)))) + fputs_unfiltered (" const", buf); + } + } + + name = ui_file_obsavestring (buf, &cu->objfile->objfile_obstack, + &length); + ui_file_delete (buf); + + if (cu->language == language_cplus) + { + char *cname + = dwarf2_canonicalize_name (name, cu, + &cu->objfile->objfile_obstack); + + if (cname != NULL) + name = cname; + } + } + } + else if (cu->language == language_ada) + { + /* For Ada unit, we prefer the linkage name over the name, as + the former contains the exported name, which the user expects + to be able to reference. Ideally, we want the user to be able + to reference this entity using either natural or linkage name, + but we haven't started looking at this enhancement yet. */ + struct attribute *attr; + + attr = dwarf2_attr (die, DW_AT_linkage_name, cu); + if (attr == NULL) + attr = dwarf2_attr (die, DW_AT_MIPS_linkage_name, cu); + if (attr && DW_STRING (attr)) + name = DW_STRING (attr); + } + + return name; +} + /* 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. */ + not have a name. NAME may either be from a previous call to + dwarf2_name or NULL. + + The output string will be canonicalized (if C++/Java). */ static const char * -dwarf2_full_name (struct die_info *die, struct dwarf2_cu *cu) +dwarf2_full_name (char *name, struct die_info *die, struct dwarf2_cu *cu) { - struct attribute *attr; - char *prefix, *name; - struct ui_file *buf = NULL; + return dwarf2_compute_name (name, die, cu, 0); +} - name = dwarf2_name (die, cu); - if (!name) - return NULL; +/* Construct a physname for the given DIE in CU. NAME may either be + from a previous call to dwarf2_name or NULL. The result will be + allocated on the objfile_objstack or NULL if the DIE does not have a + name. - /* 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); + The output string will be canonicalized (if C++/Java). */ - return name; +static const char * +dwarf2_physname (char *name, struct die_info *die, struct dwarf2_cu *cu) +{ + return dwarf2_compute_name (name, die, cu, 1); } /* Read the import statement specified by the given die and record it. */ @@ -3383,8 +3419,12 @@ read_import_statement (struct die_info *die, struct dwarf2_cu *cu) struct dwarf2_cu *imported_cu; const char *imported_name; const char *imported_name_prefix; + const char *canonical_name; + const char *import_alias; + const char *imported_declaration = NULL; const char *import_prefix; - char *canonical_name; + + char *temp; import_attr = dwarf2_attr (die, DW_AT_import, cu); if (import_attr == NULL) @@ -3434,7 +3474,8 @@ read_import_statement (struct die_info *die, struct dwarf2_cu *cu) return; } - /* FIXME: dwarf2_name (die); for the local name after import. */ + /* Figure out the local name after import. */ + import_alias = dwarf2_name (die, cu); /* Figure out where the statement is being imported to. */ import_prefix = determine_prefix (die, cu); @@ -3443,20 +3484,28 @@ read_import_statement (struct die_info *die, struct dwarf2_cu *cu) to the name of the imported die. */ imported_name_prefix = determine_prefix (imported_die, imported_cu); - if (strlen (imported_name_prefix) > 0) + if (imported_die->tag != DW_TAG_namespace) { - canonical_name = alloca (strlen (imported_name_prefix) + 2 + strlen (imported_name) + 1); - strcpy (canonical_name, imported_name_prefix); - strcat (canonical_name, "::"); - strcat (canonical_name, imported_name); + imported_declaration = imported_name; + canonical_name = imported_name_prefix; } - else + else if (strlen (imported_name_prefix) > 0) { - canonical_name = alloca (strlen (imported_name) + 1); - strcpy (canonical_name, imported_name); + temp = alloca (strlen (imported_name_prefix) + + 2 + strlen (imported_name) + 1); + strcpy (temp, imported_name_prefix); + strcat (temp, "::"); + strcat (temp, imported_name); + canonical_name = temp; } + else + canonical_name = imported_name; - using_directives = cp_add_using (import_prefix,canonical_name, using_directives); + cp_add_using_directive (import_prefix, + canonical_name, + import_alias, + imported_declaration, + &cu->objfile->objfile_obstack); } static void @@ -3478,7 +3527,6 @@ static void read_file_scope (struct die_info *die, struct dwarf2_cu *cu) { struct objfile *objfile = cu->objfile; - struct comp_unit_head *cu_header = &cu->header; struct cleanup *back_to = make_cleanup (null_cleanup, 0); CORE_ADDR lowpc = ((CORE_ADDR) -1); CORE_ADDR highpc = ((CORE_ADDR) 0); @@ -3587,6 +3635,7 @@ read_file_scope (struct die_info *die, struct dwarf2_cu *cu) if (attr && line_header) { unsigned int macro_offset = DW_UNSND (attr); + dwarf_decode_macros (line_header, macro_offset, comp_dir, abfd, cu); } @@ -3608,7 +3657,6 @@ read_type_unit_scope (struct die_info *die, struct dwarf2_cu *cu) char *comp_dir = NULL; struct die_info *child_die; bfd *abfd = objfile->obfd; - struct line_header *line_header = 0; /* start_symtab needs a low pc, but we don't really have one. Do what read_file_scope would do in the absence of such info. */ @@ -3756,6 +3804,7 @@ inherit_abstract_dies (struct die_info *die, struct dwarf2_cu *cu) but GCC versions at least through 4.4 generate this (GCC PR 40573). */ struct die_info *child_origin_die = child_die; + while (1) { attr = dwarf2_attr (child_origin_die, DW_AT_abstract_origin, cu); @@ -3841,12 +3890,27 @@ read_func_scope (struct die_info *die, struct dwarf2_cu *cu) baseaddr = ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile)); - name = dwarf2_linkage_name (die, cu); + name = dwarf2_name (die, cu); - /* Ignore functions with missing or empty names and functions with - missing or invalid low and high pc attributes. */ - if (name == NULL || !dwarf2_get_pc_bounds (die, &lowpc, &highpc, cu, NULL)) - return; + /* Ignore functions with missing or empty names. These are actually + illegal according to the DWARF standard. */ + if (name == NULL) + { + complaint (&symfile_complaints, + _("missing name for subprogram DIE at %d"), die->offset); + return; + } + + /* Ignore functions with missing or invalid low and high pc attributes. */ + if (!dwarf2_get_pc_bounds (die, &lowpc, &highpc, cu, NULL)) + { + attr = dwarf2_attr (die, DW_AT_external, cu); + if (!attr || !DW_UNSND (attr)) + complaint (&symfile_complaints, + _("cannot get low and high bounds for subprogram DIE at %d"), + die->offset); + return; + } lowpc += baseaddr; highpc += baseaddr; @@ -3886,6 +3950,31 @@ read_func_scope (struct die_info *die, struct dwarf2_cu *cu) inherit_abstract_dies (die, cu); + /* If we have a DW_AT_specification, we might need to import using + directives from the context of the specification DIE. See the + comment in determine_prefix. */ + if (cu->language == language_cplus + && dwarf2_attr (die, DW_AT_specification, cu)) + { + struct dwarf2_cu *spec_cu = cu; + struct die_info *spec_die = die_specification (die, &spec_cu); + + while (spec_die) + { + child_die = spec_die->child; + while (child_die && child_die->tag) + { + if (child_die->tag == DW_TAG_imported_module) + process_die (child_die, spec_cu); + child_die = sibling_die (child_die); + } + + /* In some cases, GCC generates specification DIEs that + themselves contain DW_AT_specification attributes. */ + spec_die = die_specification (spec_die, &spec_cu); + } + } + new = pop_context (); /* Make a block for the local symbols within. */ block = finish_block (new->name, &local_symbols, new->old_blocks, @@ -3950,7 +4039,7 @@ read_lexical_block_scope (struct die_info *die, struct dwarf2_cu *cu) } new = pop_context (); - if (local_symbols != NULL) + if (local_symbols != NULL || using_directives != NULL) { struct block *block = finish_block (0, &local_symbols, new->old_blocks, new->start_addr, @@ -4000,6 +4089,7 @@ dwarf2_ranges_read (unsigned offset, CORE_ADDR *low_return, found_base = cu->base_known; base = cu->base_address; + dwarf2_read_section (objfile, &dwarf2_per_objfile->ranges); if (offset >= dwarf2_per_objfile->ranges.size) { complaint (&symfile_complaints, @@ -4267,10 +4357,12 @@ dwarf2_record_block_ranges (struct die_info *die, struct block *block, if (attr) { CORE_ADDR high = DW_ADDR (attr); + attr = dwarf2_attr (die, DW_AT_low_pc, cu); if (attr) { CORE_ADDR low = DW_ADDR (attr); + record_block_range (block, baseaddr + low, baseaddr + high - 1); } } @@ -4302,6 +4394,7 @@ dwarf2_record_block_ranges (struct die_info *die, struct block *block, CORE_ADDR base = cu->base_address; int base_known = cu->base_known; + gdb_assert (dwarf2_per_objfile->ranges.readin); if (offset >= dwarf2_per_objfile->ranges.size) { complaint (&symfile_complaints, @@ -4515,7 +4608,7 @@ dwarf2_add_field (struct field_info *fip, struct die_info *die, return; /* Get physical name. */ - physname = dwarf2_linkage_name (die, cu); + physname = (char *) dwarf2_physname (fieldname, die, cu); /* The name is already allocated along with this objfile, so we don't need to duplicate it for the type. */ @@ -4564,7 +4657,7 @@ dwarf2_attach_fields_to_type (struct field_info *fip, struct type *type, TYPE_ALLOC (type, sizeof (struct field) * nfields); memset (TYPE_FIELDS (type), 0, sizeof (struct field) * nfields); - if (fip->non_public_fields) + if (fip->non_public_fields && cu->language != language_ada) { ALLOCATE_CPLUS_STRUCT_TYPE (type); @@ -4583,7 +4676,7 @@ dwarf2_attach_fields_to_type (struct field_info *fip, struct type *type, /* If the type has baseclasses, allocate and clear a bit vector for TYPE_FIELD_VIRTUAL_BITS. */ - if (fip->nbaseclasses) + if (fip->nbaseclasses && cu->language != language_ada) { int num_bytes = B_BYTES (fip->nbaseclasses); unsigned char *pointer; @@ -4617,11 +4710,13 @@ dwarf2_attach_fields_to_type (struct field_info *fip, struct type *type, switch (fieldp->accessibility) { case DW_ACCESS_private: - SET_TYPE_FIELD_PRIVATE (type, nfields); + if (cu->language != language_ada) + SET_TYPE_FIELD_PRIVATE (type, nfields); break; case DW_ACCESS_protected: - SET_TYPE_FIELD_PROTECTED (type, nfields); + if (cu->language != language_ada) + SET_TYPE_FIELD_PROTECTED (type, nfields); break; case DW_ACCESS_public: @@ -4641,6 +4736,8 @@ dwarf2_attach_fields_to_type (struct field_info *fip, struct type *type, { case DW_VIRTUALITY_virtual: case DW_VIRTUALITY_pure_virtual: + if (cu->language == language_ada) + error ("unexpected virtuality in component of Ada type"); SET_TYPE_FIELD_VIRTUAL (type, nfields); break; } @@ -4664,13 +4761,16 @@ dwarf2_add_member_fn (struct field_info *fip, struct die_info *die, struct nextfnfield *new_fnfield; struct type *this_type; + if (cu->language == language_ada) + error ("unexpected member function in Ada type"); + /* Get name of member function. */ fieldname = dwarf2_name (die, cu); if (fieldname == NULL) return; /* Get the mangled name. */ - physname = dwarf2_linkage_name (die, cu); + physname = (char *) dwarf2_physname (fieldname, die, cu); /* Look up member function name in fieldlist. */ for (i = 0; i < fip->nfnfields; i++) @@ -4800,6 +4900,7 @@ dwarf2_add_member_fn (struct field_info *fip, struct die_info *die, && DW_BLOCK (attr)->data[0] == DW_OP_deref) { struct dwarf_block blk; + blk.size = DW_BLOCK (attr)->size - 1; blk.data = DW_BLOCK (attr)->data + 1; fnp->voffset = decode_locdesc (&blk, cu); @@ -4837,6 +4938,9 @@ dwarf2_attach_fn_fields_to_type (struct field_info *fip, struct type *type, int total_length = 0; int i; + if (cu->language == language_ada) + error ("unexpected member functions in Ada type"); + ALLOCATE_CPLUS_STRUCT_TYPE (type); TYPE_FN_FIELDLISTS (type) = (struct fn_fieldlist *) TYPE_ALLOC (type, sizeof (struct fn_fieldlist) * fip->nfnfields); @@ -4880,68 +4984,48 @@ is_vtable_name (const char *name, struct dwarf2_cu *cu) } /* GCC outputs unnamed structures that are really pointers to member - functions, with the ABI-specified layout. If DIE (from CU) describes - such a structure, set its type, and return nonzero. Otherwise return - zero. + functions, with the ABI-specified layout. If TYPE describes + such a structure, smash it into a member function type. GCC shouldn't do this; it should just output pointer to member DIEs. This is GCC PR debug/28767. */ -static struct type * -quirk_gcc_member_function_pointer (struct die_info *die, struct dwarf2_cu *cu) +static void +quirk_gcc_member_function_pointer (struct type *type, struct objfile *objfile) { - struct objfile *objfile = cu->objfile; - struct type *type; - struct die_info *pfn_die, *delta_die; - struct attribute *pfn_name, *delta_name; - struct type *pfn_type, *domain_type; + struct type *pfn_type, *domain_type, *new_type; /* Check for a structure with no name and two children. */ - if (die->tag != DW_TAG_structure_type - || dwarf2_attr (die, DW_AT_name, cu) != NULL - || die->child == NULL - || die->child->sibling == NULL - || (die->child->sibling->sibling != NULL - && die->child->sibling->sibling->tag != DW_TAG_padding)) - return NULL; + if (TYPE_CODE (type) != TYPE_CODE_STRUCT || TYPE_NFIELDS (type) != 2) + return; /* Check for __pfn and __delta members. */ - pfn_die = die->child; - pfn_name = dwarf2_attr (pfn_die, DW_AT_name, cu); - if (pfn_die->tag != DW_TAG_member - || pfn_name == NULL - || DW_STRING (pfn_name) == NULL - || strcmp ("__pfn", DW_STRING (pfn_name)) != 0) - return NULL; - - delta_die = pfn_die->sibling; - delta_name = dwarf2_attr (delta_die, DW_AT_name, cu); - if (delta_die->tag != DW_TAG_member - || delta_name == NULL - || DW_STRING (delta_name) == NULL - || strcmp ("__delta", DW_STRING (delta_name)) != 0) - return NULL; + if (TYPE_FIELD_NAME (type, 0) == NULL + || strcmp (TYPE_FIELD_NAME (type, 0), "__pfn") != 0 + || TYPE_FIELD_NAME (type, 1) == NULL + || strcmp (TYPE_FIELD_NAME (type, 1), "__delta") != 0) + return; /* Find the type of the method. */ - pfn_type = die_type (pfn_die, cu); + pfn_type = TYPE_FIELD_TYPE (type, 0); if (pfn_type == NULL || TYPE_CODE (pfn_type) != TYPE_CODE_PTR || TYPE_CODE (TYPE_TARGET_TYPE (pfn_type)) != TYPE_CODE_FUNC) - return NULL; + return; /* Look for the "this" argument. */ pfn_type = TYPE_TARGET_TYPE (pfn_type); if (TYPE_NFIELDS (pfn_type) == 0 + /* || TYPE_FIELD_TYPE (pfn_type, 0) == NULL */ || TYPE_CODE (TYPE_FIELD_TYPE (pfn_type, 0)) != TYPE_CODE_PTR) - return NULL; + return; domain_type = TYPE_TARGET_TYPE (TYPE_FIELD_TYPE (pfn_type, 0)); - type = alloc_type (objfile); - smash_to_method_type (type, domain_type, TYPE_TARGET_TYPE (pfn_type), + new_type = alloc_type (objfile); + smash_to_method_type (new_type, domain_type, TYPE_TARGET_TYPE (pfn_type), TYPE_FIELDS (pfn_type), TYPE_NFIELDS (pfn_type), TYPE_VARARGS (pfn_type)); - type = lookup_methodptr_type (type); - return set_die_type (die, type, cu); + smash_to_methodptr_type (type, new_type); } /* Called when we find the DIE that starts a structure or union scope @@ -4969,10 +5053,6 @@ read_structure_type (struct die_info *die, struct dwarf2_cu *cu) char *name; struct cleanup *back_to = make_cleanup (null_cleanup, 0); - type = quirk_gcc_member_function_pointer (die, cu); - if (type) - return type; - /* If the definition of this type lives in .debug_types, read that type. Don't follow DW_AT_specification though, that will take us back up the chain and we want to go down. */ @@ -4981,6 +5061,7 @@ read_structure_type (struct die_info *die, struct dwarf2_cu *cu) { struct dwarf2_cu *type_cu = cu; struct die_info *type_die = follow_die_ref_or_sig (die, attr, &type_cu); + /* We could just recurse on read_structure_type, but we need to call get_die_type to ensure only one type for this DIE is created. This is important, for example, because for c++ classes we need @@ -4998,14 +5079,18 @@ read_structure_type (struct die_info *die, struct dwarf2_cu *cu) if (cu->language == language_cplus || cu->language == language_java) { - const char *new_prefix = determine_class_name (die, cu); - TYPE_TAG_NAME (type) = (char *) new_prefix; + TYPE_TAG_NAME (type) = (char *) dwarf2_full_name (name, die, cu); + if (die->tag == DW_TAG_structure_type + || die->tag == DW_TAG_class_type) + TYPE_NAME (type) = TYPE_TAG_NAME (type); } 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; + if (die->tag == DW_TAG_class_type) + TYPE_NAME (type) = TYPE_TAG_NAME (type); } } @@ -5019,11 +5104,12 @@ read_structure_type (struct die_info *die, struct dwarf2_cu *cu) } else { - /* FIXME: TYPE_CODE_CLASS is currently defined to TYPE_CODE_STRUCT - in gdbtypes.h. */ TYPE_CODE (type) = TYPE_CODE_CLASS; } + if (cu->language == language_cplus && die->tag == DW_TAG_class_type) + TYPE_DECLARED_CLASS (type) = 1; + attr = dwarf2_attr (die, DW_AT_byte_size, cu); if (attr) { @@ -5037,6 +5123,13 @@ read_structure_type (struct die_info *die, struct dwarf2_cu *cu) TYPE_STUB_SUPPORTED (type) = 1; if (die_is_declaration (die, cu)) TYPE_STUB (type) = 1; + else if (attr == NULL && die->child == NULL + && producer_is_realview (cu->producer)) + /* RealView does not output the required DW_AT_declaration + on incomplete types. */ + TYPE_STUB (type) = 1; + + set_descriptive_type (type, die, cu); /* We need to add the type field to the die immediately so we don't infinitely recurse when dealing with pointers to the structure @@ -5149,6 +5242,8 @@ read_structure_type (struct die_info *die, struct dwarf2_cu *cu) } } + quirk_gcc_member_function_pointer (type, cu->objfile); + do_cleanups (back_to); return type; } @@ -5156,7 +5251,6 @@ read_structure_type (struct die_info *die, struct dwarf2_cu *cu) static void process_structure_scope (struct die_info *die, struct dwarf2_cu *cu) { - struct objfile *objfile = cu->objfile; struct die_info *child_die = die->child; struct type *this_type; @@ -5212,6 +5306,7 @@ read_enumeration_type (struct die_info *die, struct dwarf2_cu *cu) { struct dwarf2_cu *type_cu = cu; struct die_info *type_die = follow_die_ref_or_sig (die, attr, &type_cu); + type = read_type_die (type_die, type_cu); return set_die_type (die, type, cu); } @@ -5219,7 +5314,7 @@ read_enumeration_type (struct die_info *die, struct dwarf2_cu *cu) type = alloc_type (objfile); TYPE_CODE (type) = TYPE_CODE_ENUM; - name = dwarf2_full_name (die, cu); + name = dwarf2_full_name (NULL, die, cu); if (name != NULL) TYPE_TAG_NAME (type) = (char *) name; @@ -5244,51 +5339,6 @@ read_enumeration_type (struct die_info *die, struct dwarf2_cu *cu) 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, - allocated on the objfile obstack. */ - -static const char * -determine_class_name (struct die_info *die, struct dwarf2_cu *cu) -{ - 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 - guess_structure_name. */ - if (!processing_has_namespace_info) - { - struct die_info *child; - - for (child = die->child; - child != NULL && child->tag != 0; - child = sibling_die (child)) - { - if (child->tag == DW_TAG_subprogram) - { - char *phys_prefix - = language_class_name_from_physname (cu->language_defn, - dwarf2_linkage_name - (child, cu)); - - if (phys_prefix != NULL) - { - new_prefix - = obsavestring (phys_prefix, strlen (phys_prefix), - &cu->objfile->objfile_obstack); - xfree (phys_prefix); - break; - } - } - } - } - - if (new_prefix == NULL) - new_prefix = dwarf2_full_name (die, cu); - - return new_prefix; -} - /* Given a pointer to a die which begins an enumeration, process all the dies that define the members of the enumeration, and create the symbol for the enumeration type. @@ -5298,7 +5348,6 @@ determine_class_name (struct die_info *die, struct dwarf2_cu *cu) static void process_enumeration_scope (struct die_info *die, struct dwarf2_cu *cu) { - struct objfile *objfile = cu->objfile; struct die_info *child_die; struct field *fields; struct symbol *sym; @@ -5402,6 +5451,7 @@ read_array_type (struct die_info *die, struct dwarf2_cu *cu) if (child_die->tag == DW_TAG_subrange_type) { struct type *child_type = read_type_die (child_die, cu); + if (child_type != NULL) { /* The range type was succesfully read. Save it for @@ -5428,6 +5478,7 @@ read_array_type (struct die_info *die, struct dwarf2_cu *cu) if (read_array_order (die, cu) == DW_ORD_col_major) { int i = 0; + while (i < ndim) type = create_array_type (NULL, type, range_types[i++]); } @@ -5451,6 +5502,8 @@ read_array_type (struct die_info *die, struct dwarf2_cu *cu) if (name) TYPE_NAME (type) = name; + set_descriptive_type (type, die, cu); + do_cleanups (back_to); /* Install the type in the die. */ @@ -5498,7 +5551,10 @@ static struct type * read_set_type (struct die_info *die, struct dwarf2_cu *cu) { struct type *set_type = create_set_type (NULL, die_type (die, cu)); + struct attribute *attr = dwarf2_attr (die, DW_AT_byte_size, cu); + if (attr) + TYPE_LENGTH (set_type) = DW_UNSND (attr); return set_die_type (die, set_type, cu); } @@ -5573,6 +5629,7 @@ read_namespace_type (struct die_info *die, struct dwarf2_cu *cu) { 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); @@ -5593,9 +5650,7 @@ read_namespace_type (struct die_info *die, struct dwarf2_cu *cu) TYPE_NAME (type) = (char *) name; TYPE_TAG_NAME (type) = TYPE_NAME (type); - set_die_type (die, type, cu); - - return type; + return set_die_type (die, type, cu); } /* Read a C++ namespace. */ @@ -5622,7 +5677,9 @@ read_namespace (struct die_info *die, struct dwarf2_cu *cu) if (is_anonymous) { const char *previous_prefix = determine_prefix (die, cu); - cp_add_using_directive (previous_prefix, TYPE_NAME (type)); + + cp_add_using_directive (previous_prefix, TYPE_NAME (type), NULL, + NULL, &objfile->objfile_obstack); } } @@ -5730,9 +5787,10 @@ read_tag_pointer_type (struct die_info *die, struct dwarf2_cu *cu) { complaint (&symfile_complaints, _("invalid pointer size %d"), byte_size); } - else { - /* Should we also complain about unhandled address classes? */ - } + else + { + /* Should we also complain about unhandled address classes? */ + } } TYPE_LENGTH (type) = byte_size; @@ -5745,7 +5803,6 @@ read_tag_pointer_type (struct die_info *die, struct dwarf2_cu *cu) static struct type * read_tag_ptr_to_member_type (struct die_info *die, struct dwarf2_cu *cu) { - struct objfile *objfile = cu->objfile; struct type *type; struct type *to_type; struct type *domain; @@ -5873,6 +5930,12 @@ read_subroutine_type (struct die_info *die, struct dwarf2_cu *cu) || cu->language == language_java || cu->language == language_pascal) TYPE_PROTOTYPED (ftype) = 1; + else if (producer_is_realview (cu->producer)) + /* RealView does not emit DW_AT_prototyped. We can not + distinguish prototyped and unprototyped functions; default to + prototyped, since that is more common in modern code (and + RealView warns about unprototyped functions). */ + 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 @@ -5887,13 +5950,14 @@ read_subroutine_type (struct die_info *die, struct dwarf2_cu *cu) if (die->child != NULL) { + struct type *void_type = objfile_type (cu->objfile)->builtin_void; struct die_info *child_die; - int nparams = 0; - int iparams = 0; + int nparams, iparams; /* Count the number of parameters. FIXME: GDB currently ignores vararg functions, but knows about vararg member functions. */ + nparams = 0; child_die = die->child; while (child_die && child_die->tag) { @@ -5909,6 +5973,12 @@ read_subroutine_type (struct die_info *die, struct dwarf2_cu *cu) TYPE_FIELDS (ftype) = (struct field *) TYPE_ZALLOC (ftype, nparams * sizeof (struct field)); + /* TYPE_FIELD_TYPE must never be NULL. Pre-fill the array to ensure it + even if we error out during the parameters reading below. */ + for (iparams = 0; iparams < nparams; iparams++) + TYPE_FIELD_TYPE (ftype, iparams) = void_type; + + iparams = 0; child_die = die->child; while (child_die && child_die->tag) { @@ -5923,7 +5993,19 @@ read_subroutine_type (struct die_info *die, struct dwarf2_cu *cu) if (attr) TYPE_FIELD_ARTIFICIAL (ftype, iparams) = DW_UNSND (attr); else - TYPE_FIELD_ARTIFICIAL (ftype, iparams) = 0; + { + TYPE_FIELD_ARTIFICIAL (ftype, iparams) = 0; + + /* GCC/43521: In java, the formal parameter + "this" is sometimes not marked with DW_AT_artificial. */ + if (cu->language == language_java) + { + const char *name = dwarf2_name (child_die, cu); + + if (name && !strcmp (name, "this")) + TYPE_FIELD_ARTIFICIAL (ftype, iparams) = 1; + } + } TYPE_FIELD_TYPE (ftype, iparams) = die_type (child_die, cu); iparams++; } @@ -5938,11 +6020,10 @@ static struct type * read_typedef (struct die_info *die, struct dwarf2_cu *cu) { struct objfile *objfile = cu->objfile; - struct attribute *attr; const char *name = NULL; struct type *this_type; - name = dwarf2_full_name (die, cu); + name = dwarf2_full_name (NULL, die, cu); this_type = init_type (TYPE_CODE_TYPEDEF, 0, TYPE_FLAG_TARGET_STUB, NULL, objfile); TYPE_NAME (this_type) = (char *) name; @@ -6050,16 +6131,8 @@ read_subrange_type (struct die_info *die, struct dwarf2_cu *cu) LONGEST high = -1; char *name; LONGEST negative_mask; - + base_type = die_type (die, cu); - if (TYPE_CODE (base_type) == TYPE_CODE_VOID) - { - complaint (&symfile_complaints, - _("DW_AT_type missing from DW_TAG_subrange_type")); - base_type - = init_type (TYPE_CODE_INT, gdbarch_addr_bit (gdbarch) / 8, - 0, NULL, cu->objfile); - } if (cu->language == language_fortran) { @@ -6077,10 +6150,10 @@ read_subrange_type (struct die_info *die, struct dwarf2_cu *cu) attr = dwarf2_attr (die, DW_AT_upper_bound, cu); if (attr) { - if (attr->form == DW_FORM_block1) + if (attr->form == DW_FORM_block1 || is_ref_attr (attr)) { /* GCC encodes arrays with unspecified or dynamic length - with a DW_FORM_block1 attribute. + with a DW_FORM_block1 attribute or a reference attribute. FIXME: GDB does not yet know how to handle dynamic arrays properly, treat them as arrays with unspecified length for now. @@ -6095,6 +6168,54 @@ read_subrange_type (struct die_info *die, struct dwarf2_cu *cu) else high = dwarf2_get_attr_constant_value (attr, 1); } + else + { + attr = dwarf2_attr (die, DW_AT_count, cu); + if (attr) + { + int count = dwarf2_get_attr_constant_value (attr, 1); + high = low + count - 1; + } + } + + /* Dwarf-2 specifications explicitly allows to create subrange types + without specifying a base type. + In that case, the base type must be set to the type of + the lower bound, upper bound or count, in that order, if any of these + three attributes references an object that has a type. + If no base type is found, the Dwarf-2 specifications say that + a signed integer type of size equal to the size of an address should + be used. + For the following C code: `extern char gdb_int [];' + GCC produces an empty range DIE. + FIXME: muller/2010-05-28: Possible references to object for low bound, + high bound or count are not yet handled by this code. + */ + if (TYPE_CODE (base_type) == TYPE_CODE_VOID) + { + struct objfile *objfile = cu->objfile; + struct gdbarch *gdbarch = get_objfile_arch (objfile); + int addr_size = gdbarch_addr_bit (gdbarch) /8; + struct type *int_type = objfile_type (objfile)->builtin_int; + + /* Test "int", "long int", and "long long int" objfile types, + and select the first one having a size above or equal to the + architecture address size. */ + if (int_type && TYPE_LENGTH (int_type) >= addr_size) + base_type = int_type; + else + { + int_type = objfile_type (objfile)->builtin_long; + if (int_type && TYPE_LENGTH (int_type) >= addr_size) + base_type = int_type; + else + { + int_type = objfile_type (objfile)->builtin_long_long; + if (int_type && TYPE_LENGTH (int_type) >= addr_size) + base_type = int_type; + } + } + } negative_mask = (LONGEST) -1 << (TYPE_LENGTH (base_type) * TARGET_CHAR_BIT - 1); @@ -6105,6 +6226,12 @@ read_subrange_type (struct die_info *die, struct dwarf2_cu *cu) range_type = create_range_type (NULL, base_type, low, high); + /* Mark arrays with dynamic length at least as an array of unspecified + length. GDB could check the boundary but before it gets implemented at + least allow accessing the array elements. */ + if (attr && attr->form == DW_FORM_block1) + TYPE_HIGH_BOUND_UNDEFINED (range_type) = 1; + name = dwarf2_name (die, cu); if (name) TYPE_NAME (range_type) = name; @@ -6113,6 +6240,8 @@ read_subrange_type (struct die_info *die, struct dwarf2_cu *cu) if (attr) TYPE_LENGTH (range_type) = DW_UNSND (attr); + set_descriptive_type (range_type, die, cu); + return set_die_type (die, range_type, cu); } @@ -6136,6 +6265,7 @@ static hashval_t die_hash (const void *item) { const struct die_info *die = item; + return die->offset; } @@ -6147,6 +6277,7 @@ die_eq (const void *item_lhs, const void *item_rhs) { const struct die_info *die_lhs = item_lhs; const struct die_info *die_rhs = item_rhs; + return die_lhs->offset == die_rhs->offset; } @@ -6346,6 +6477,8 @@ dwarf2_read_abbrevs (bfd *abfd, struct dwarf2_cu *cu) memset (cu->dwarf2_abbrevs, 0, ABBREV_HASH_SIZE * sizeof (struct abbrev_info *)); + dwarf2_read_section (dwarf2_per_objfile->objfile, + &dwarf2_per_objfile->abbrev); abbrev_ptr = dwarf2_per_objfile->abbrev.buffer + cu_header->abbrev_offset; abbrev_number = read_unsigned_leb128 (abfd, abbrev_ptr, &bytes_read); abbrev_ptr += bytes_read; @@ -6722,7 +6855,7 @@ read_partial_die (struct partial_die_info *part_die, gdb_byte *buffer, gdb_byte *info_ptr, struct dwarf2_cu *cu) { - unsigned int bytes_read, i; + unsigned int i; struct attribute attr; int has_low_pc_attr = 0; int has_high_pc_attr = 0; @@ -6763,12 +6896,17 @@ read_partial_die (struct partial_die_info *part_die, default: part_die->name = dwarf2_canonicalize_name (DW_STRING (&attr), cu, - &cu->comp_unit_obstack); + &cu->objfile->objfile_obstack); break; } break; + case DW_AT_linkage_name: case DW_AT_MIPS_linkage_name: - part_die->name = DW_STRING (&attr); + /* Note that both forms of linkage name might appear. We + assume they will be the same, and we only store the last + one we see. */ + if (cu->language == language_ada) + part_die->name = DW_STRING (&attr); break; case DW_AT_low_pc: has_low_pc_attr = 1; @@ -7012,8 +7150,14 @@ read_attribute_value (struct attribute *attr, unsigned form, attr->form = form; switch (form) { - case DW_FORM_addr: case DW_FORM_ref_addr: + if (cu->header.version == 2) + DW_ADDR (attr) = read_address (abfd, info_ptr, cu, &bytes_read); + else + DW_ADDR (attr) = read_offset (abfd, info_ptr, &cu->header, &bytes_read); + info_ptr += bytes_read; + break; + case DW_FORM_addr: DW_ADDR (attr) = read_address (abfd, info_ptr, cu, &bytes_read); info_ptr += bytes_read; break; @@ -7045,6 +7189,10 @@ read_attribute_value (struct attribute *attr, unsigned form, DW_UNSND (attr) = read_8_bytes (abfd, info_ptr); info_ptr += 8; break; + case DW_FORM_sec_offset: + DW_UNSND (attr) = read_offset (abfd, info_ptr, &cu->header, &bytes_read); + info_ptr += bytes_read; + break; case DW_FORM_string: DW_STRING (attr) = read_string (abfd, info_ptr, &bytes_read); DW_STRING_IS_CANONICAL (attr) = 0; @@ -7056,6 +7204,7 @@ read_attribute_value (struct attribute *attr, unsigned form, DW_STRING_IS_CANONICAL (attr) = 0; info_ptr += bytes_read; break; + case DW_FORM_exprloc: case DW_FORM_block: blk = dwarf_alloc_block (cu); blk->size = read_unsigned_leb128 (abfd, info_ptr, &bytes_read); @@ -7080,6 +7229,9 @@ read_attribute_value (struct attribute *attr, unsigned form, DW_UNSND (attr) = read_1_byte (abfd, info_ptr); info_ptr += 1; break; + case DW_FORM_flag_present: + DW_UNSND (attr) = 1; + break; case DW_FORM_sdata: DW_SND (attr) = read_signed_leb128 (abfd, info_ptr, &bytes_read); info_ptr += bytes_read; @@ -7350,6 +7502,7 @@ 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; } @@ -7411,6 +7564,7 @@ read_indirect_string (bfd *abfd, gdb_byte *buf, { LONGEST str_offset = read_offset (abfd, buf, cu_header, bytes_read_ptr); + dwarf2_read_section (dwarf2_per_objfile->objfile, &dwarf2_per_objfile->str); if (dwarf2_per_objfile->str.buffer == NULL) { error (_("DW_FORM_strp used without .debug_str section [in module %s]"), @@ -7515,6 +7669,9 @@ set_cu_language (unsigned int lang, struct dwarf2_cu *cu) case DW_LANG_C_plus_plus: cu->language = language_cplus; break; + case DW_LANG_D: + cu->language = language_d; + break; case DW_LANG_Fortran77: case DW_LANG_Fortran90: case DW_LANG_Fortran95: @@ -7595,7 +7752,7 @@ dwarf2_attr_no_follow (struct die_info *die, unsigned int name, /* Return non-zero iff the attribute NAME is defined for the given DIE, and holds a non-zero value. This function should only be used for - DW_FORM_flag attributes. */ + DW_FORM_flag or DW_FORM_flag_present attributes. */ static int dwarf2_flag_true_p (struct die_info *die, unsigned name, struct dwarf2_cu *cu) @@ -7737,6 +7894,7 @@ dwarf_decode_line_header (unsigned int offset, bfd *abfd, int i; char *cur_dir, *cur_file; + dwarf2_read_section (dwarf2_per_objfile->objfile, &dwarf2_per_objfile->line); if (dwarf2_per_objfile->line.buffer == NULL) { complaint (&symfile_complaints, _("missing .debug_line section")); @@ -7776,6 +7934,21 @@ dwarf_decode_line_header (unsigned int offset, bfd *abfd, line_ptr += offset_size; lh->minimum_instruction_length = read_1_byte (abfd, line_ptr); line_ptr += 1; + if (lh->version >= 4) + { + lh->maximum_ops_per_instruction = read_1_byte (abfd, line_ptr); + line_ptr += 1; + } + else + lh->maximum_ops_per_instruction = 1; + + if (lh->maximum_ops_per_instruction == 0) + { + lh->maximum_ops_per_instruction = 1; + complaint (&symfile_complaints, + _("invalid maximum_ops_per_instruction in `.debug_line' section")); + } + lh->default_is_stmt = read_1_byte (abfd, line_ptr); line_ptr += 1; lh->line_base = read_1_signed_byte (abfd, line_ptr); @@ -7924,6 +8097,7 @@ dwarf_decode_lines (struct line_header *lh, char *comp_dir, bfd *abfd, int basic_block = 0; int end_sequence = 0; CORE_ADDR addr; + unsigned char op_index = 0; if (!decode_for_pst_p && lh->num_file_names >= file) { @@ -7955,12 +8129,17 @@ dwarf_decode_lines (struct line_header *lh, char *comp_dir, bfd *abfd, { /* Special operand. */ adj_opcode = op_code - lh->opcode_base; - address += (adj_opcode / lh->line_range) - * lh->minimum_instruction_length; + address += (((op_index + (adj_opcode / lh->line_range)) + / lh->maximum_ops_per_instruction) + * lh->minimum_instruction_length); + op_index = ((op_index + (adj_opcode / lh->line_range)) + % lh->maximum_ops_per_instruction); line += lh->line_base + (adj_opcode % lh->line_range); if (lh->num_file_names < file || file == 0) dwarf2_debug_line_missing_file_complaint (); - else + /* For now we ignore lines not starting on an + instruction boundary. */ + else if (op_index == 0) { lh->file_names[file - 1].included_p = 1; if (!decode_for_pst_p && is_stmt) @@ -7995,6 +8174,7 @@ dwarf_decode_lines (struct line_header *lh, char *comp_dir, bfd *abfd, break; case DW_LNE_set_address: address = read_address (abfd, line_ptr, cu, &bytes_read); + op_index = 0; line_ptr += bytes_read; address += baseaddr; break; @@ -8060,9 +8240,17 @@ dwarf_decode_lines (struct line_header *lh, char *comp_dir, bfd *abfd, basic_block = 0; break; case DW_LNS_advance_pc: - address += lh->minimum_instruction_length - * read_unsigned_leb128 (abfd, line_ptr, &bytes_read); - line_ptr += bytes_read; + { + CORE_ADDR adjust + = read_unsigned_leb128 (abfd, line_ptr, &bytes_read); + + address += (((op_index + adjust) + / lh->maximum_ops_per_instruction) + * lh->minimum_instruction_length); + op_index = ((op_index + adjust) + % lh->maximum_ops_per_instruction); + line_ptr += bytes_read; + } break; case DW_LNS_advance_line: line += read_signed_leb128 (abfd, line_ptr, &bytes_read); @@ -8109,11 +8297,19 @@ dwarf_decode_lines (struct line_header *lh, char *comp_dir, bfd *abfd, instruction length since special opcode 255 would have scaled the the increment. */ case DW_LNS_const_add_pc: - address += (lh->minimum_instruction_length - * ((255 - lh->opcode_base) / lh->line_range)); + { + CORE_ADDR adjust = (255 - lh->opcode_base) / lh->line_range; + + address += (((op_index + adjust) + / lh->maximum_ops_per_instruction) + * lh->minimum_instruction_length); + op_index = ((op_index + adjust) + % lh->maximum_ops_per_instruction); + } break; case DW_LNS_fixed_advance_pc: address += read_2_bytes (abfd, line_ptr); + op_index = 0; line_ptr += 2; break; default: @@ -8189,6 +8385,7 @@ dwarf_decode_lines (struct line_header *lh, char *comp_dir, bfd *abfd, for (i = 0; i < lh->num_file_names; i++) { char *dir = NULL; + fe = &lh->file_names[i]; if (fe->dir_index) dir = lh->include_dirs[fe->dir_index - 1]; @@ -8333,13 +8530,11 @@ new_symbol (struct die_info *die, struct type *type, struct dwarf2_cu *cu) baseaddr = ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile)); - if (die->tag != DW_TAG_namespace) - name = dwarf2_linkage_name (die, cu); - else - name = TYPE_NAME (type); - + name = dwarf2_name (die, cu); if (name) { + const char *linkagename; + sym = (struct symbol *) obstack_alloc (&objfile->objfile_obstack, sizeof (struct symbol)); OBJSTAT (objfile, n_syms++); @@ -8347,7 +8542,8 @@ new_symbol (struct die_info *die, struct type *type, struct dwarf2_cu *cu) /* Cache this symbol's name and the name's demangled form (if any). */ SYMBOL_LANGUAGE (sym) = cu->language; - SYMBOL_SET_NAMES (sym, name, strlen (name), 0, objfile); + linkagename = dwarf2_physname (name, die, cu); + SYMBOL_SET_NAMES (sym, linkagename, strlen (linkagename), 0, objfile); /* Default assumptions. Use the passed type or decode it from the die. */ @@ -8371,6 +8567,7 @@ new_symbol (struct die_info *die, struct type *type, struct dwarf2_cu *cu) if (attr) { int file_index = DW_UNSND (attr); + if (cu->line_header == NULL || file_index > cu->line_header->num_file_names) complaint (&symfile_complaints, @@ -8378,6 +8575,7 @@ new_symbol (struct die_info *die, struct type *type, struct dwarf2_cu *cu) else if (file_index > 0) { struct file_entry *fe; + fe = &cu->line_header->file_names[file_index - 1]; SYMBOL_SYMTAB (sym) = fe->symtab; } @@ -8447,7 +8645,15 @@ new_symbol (struct die_info *die, struct type *type, struct dwarf2_cu *cu) var_decode_location (attr, sym, cu); attr2 = dwarf2_attr (die, DW_AT_external, cu); if (attr2 && (DW_UNSND (attr2) != 0)) - add_symbol_to_list (sym, &global_symbols); + { + struct pending **list_to_add; + + /* A variable with DW_AT_external is never static, + but it may be block-scoped. */ + list_to_add = (cu->list_in_scope == &file_symbols + ? &global_symbols : cu->list_in_scope); + add_symbol_to_list (sym, list_to_add); + } else add_symbol_to_list (sym, cu->list_in_scope); } @@ -8500,6 +8706,15 @@ new_symbol (struct die_info *die, struct type *type, struct dwarf2_cu *cu) { dwarf2_const_value (attr, sym, cu); } + attr = dwarf2_attr (die, DW_AT_variable_parameter, cu); + if (attr && DW_UNSND (attr)) + { + struct type *ref_type; + + ref_type = lookup_reference_type (SYMBOL_TYPE (sym)); + SYMBOL_TYPE (sym) = ref_type; + } + add_symbol_to_list (sym, cu->list_in_scope); break; case DW_TAG_unspecified_parameters: @@ -8572,19 +8787,23 @@ new_symbol (struct die_info *die, struct type *type, struct dwarf2_cu *cu) } break; case DW_TAG_typedef: - SYMBOL_LINKAGE_NAME (sym) = (char *) dwarf2_full_name (die, cu); + SYMBOL_LINKAGE_NAME (sym) + = (char *) dwarf2_full_name (name, die, cu); SYMBOL_CLASS (sym) = LOC_TYPEDEF; SYMBOL_DOMAIN (sym) = VAR_DOMAIN; add_symbol_to_list (sym, cu->list_in_scope); break; case DW_TAG_base_type: case DW_TAG_subrange_type: + case DW_TAG_const_type: + case DW_TAG_volatile_type: SYMBOL_CLASS (sym) = LOC_TYPEDEF; SYMBOL_DOMAIN (sym) = VAR_DOMAIN; add_symbol_to_list (sym, cu->list_in_scope); break; case DW_TAG_enumerator: - SYMBOL_LINKAGE_NAME (sym) = (char *) dwarf2_full_name (die, cu); + SYMBOL_LINKAGE_NAME (sym) + = (char *) dwarf2_full_name (name, die, cu); attr = dwarf2_attr (die, DW_AT_const_value, cu); if (attr) { @@ -8621,8 +8840,7 @@ new_symbol (struct die_info *die, struct type *type, struct dwarf2_cu *cu) /* For the benefit of old versions of GCC, check for anonymous namespaces based on the demangled name. */ if (!processing_has_namespace_info - && cu->language == language_cplus - && dwarf2_attr (die, DW_AT_MIPS_linkage_name, cu) != NULL) + && cu->language == language_cplus) cp_scan_for_anonymous_namespaces (sym); } return (sym); @@ -8667,6 +8885,7 @@ dwarf2_const_value (struct attribute *attr, struct symbol *sym, case DW_FORM_block2: case DW_FORM_block4: case DW_FORM_block: + case DW_FORM_exprloc: blk = DW_BLOCK (attr); if (TYPE_LENGTH (SYMBOL_TYPE (sym)) != blk->size) dwarf2_const_value_length_mismatch_complaint (SYMBOL_PRINT_NAME (sym), @@ -8745,7 +8964,6 @@ dwarf2_const_value_data (struct attribute *attr, static struct type * die_type (struct die_info *die, struct dwarf2_cu *cu) { - struct type *type; struct attribute *type_attr; struct die_info *type_die; @@ -8758,14 +8976,60 @@ die_type (struct die_info *die, struct dwarf2_cu *cu) type_die = follow_die_ref_or_sig (die, type_attr, &cu); - type = tag_type_to_type (type_die, cu); - if (!type) + return tag_type_to_type (type_die, cu); +} + +/* True iff CU's producer generates GNAT Ada auxiliary information + that allows to find parallel types through that information instead + of having to do expensive parallel lookups by type name. */ + +static int +need_gnat_info (struct dwarf2_cu *cu) +{ + /* FIXME: brobecker/2010-10-12: As of now, only the AdaCore version + of GNAT produces this auxiliary information, without any indication + that it is produced. Part of enhancing the FSF version of GNAT + to produce that information will be to put in place an indicator + that we can use in order to determine whether the descriptive type + info is available or not. One suggestion that has been made is + to use a new attribute, attached to the CU die. For now, assume + that the descriptive type info is not available. */ + return 0; +} + + +/* Return the auxiliary type of the die in question using its + DW_AT_GNAT_descriptive_type attribute. Returns NULL if the + attribute is not present. */ + +static struct type * +die_descriptive_type (struct die_info *die, struct dwarf2_cu *cu) +{ + struct attribute *type_attr; + struct die_info *type_die; + + type_attr = dwarf2_attr (die, DW_AT_GNAT_descriptive_type, cu); + if (!type_attr) + return NULL; + + type_die = follow_die_ref (die, type_attr, &cu); + return tag_type_to_type (type_die, cu); +} + +/* If DIE has a descriptive_type attribute, then set the TYPE's + descriptive type accordingly. */ + +static void +set_descriptive_type (struct type *type, struct die_info *die, + struct dwarf2_cu *cu) +{ + struct type *descriptive_type = die_descriptive_type (die, cu); + + if (descriptive_type) { - dump_die_for_error (type_die); - error (_("Dwarf Error: Problem turning type die at offset into gdb type [in module %s]"), - cu->objfile->name); + ALLOCATE_GNAT_AUX_TYPE (type); + TYPE_DESCRIPTIVE_TYPE (type) = descriptive_type; } - return type; } /* Return the containing type of the die in question using its @@ -8774,24 +9038,16 @@ die_type (struct die_info *die, struct dwarf2_cu *cu) static struct type * die_containing_type (struct die_info *die, struct dwarf2_cu *cu) { - struct type *type = NULL; struct attribute *type_attr; - struct die_info *type_die = NULL; + struct die_info *type_die; type_attr = dwarf2_attr (die, DW_AT_containing_type, cu); - if (type_attr) - { - type_die = follow_die_ref_or_sig (die, type_attr, &cu); - type = tag_type_to_type (type_die, cu); - } - if (!type) - { - if (type_die) - dump_die_for_error (type_die); - error (_("Dwarf Error: Problem turning containing type into gdb type [in module %s]"), - cu->objfile->name); - } - return type; + if (!type_attr) + error (_("Dwarf Error: Problem turning containing type into gdb type " + "[in module %s]"), cu->objfile->name); + + type_die = follow_die_ref_or_sig (die, type_attr, &cu); + return tag_type_to_type (type_die, cu); } static struct type * @@ -8945,6 +9201,12 @@ determine_prefix (struct die_info *die, struct dwarf2_cu *cu) { case DW_TAG_namespace: parent_type = read_type_die (parent, cu); + /* GCC 4.0 and 4.1 had a bug (PR c++/28460) where they generated bogus + DW_TAG_namespace DIEs with a name of "::" for the global namespace. + Work around this problem here. */ + if (cu->language == language_cplus + && strcmp (TYPE_TAG_NAME (parent_type), "::") == 0) + return ""; /* We give a name to even anonymous namespaces. */ return TYPE_TAG_NAME (parent_type); case DW_TAG_class_type: @@ -8993,6 +9255,7 @@ typename_concat (struct obstack *obs, const char *prefix, const char *suffix, if (obs == NULL) { char *retval = xmalloc (strlen (prefix) + MAX_SEP_LEN + strlen (suffix) + 1); + strcpy (retval, prefix); strcat (retval, sep); strcat (retval, suffix); @@ -9001,7 +9264,7 @@ typename_concat (struct obstack *obs, const char *prefix, const char *suffix, else { /* We have an obstack. */ - return obconcat (obs, prefix, sep, suffix); + return obconcat (obs, prefix, sep, suffix, (char *) NULL); } } @@ -9013,19 +9276,6 @@ sibling_die (struct die_info *die) return die->sibling; } -/* Get linkage name of a die, return NULL if not found. */ - -static char * -dwarf2_linkage_name (struct die_info *die, struct dwarf2_cu *cu) -{ - struct attribute *attr; - - attr = dwarf2_attr (die, DW_AT_MIPS_linkage_name, cu); - if (attr && DW_STRING (attr)) - return DW_STRING (attr); - return dwarf2_name (die, cu); -} - /* Get name of a die, return NULL if not found. */ static char * @@ -9069,16 +9319,61 @@ dwarf2_name (struct die_info *die, struct dwarf2_cu *cu) /* These tags always have simple identifiers already; no need to canonicalize them. */ return DW_STRING (attr); - default: - if (!DW_STRING_IS_CANONICAL (attr)) + + case DW_TAG_subprogram: + /* Java constructors will all be named "", so return + the class name when we see this special case. */ + if (cu->language == language_java + && DW_STRING (attr) != NULL + && strcmp (DW_STRING (attr), "") == 0) { - DW_STRING (attr) - = dwarf2_canonicalize_name (DW_STRING (attr), cu, - &cu->objfile->objfile_obstack); - DW_STRING_IS_CANONICAL (attr) = 1; + struct dwarf2_cu *spec_cu = cu; + struct die_info *spec_die; + + /* GCJ will output '' for Java constructor names. + For this special case, return the name of the parent class. */ + + /* GCJ may output suprogram DIEs with AT_specification set. + If so, use the name of the specified DIE. */ + spec_die = die_specification (die, &spec_cu); + if (spec_die != NULL) + return dwarf2_name (spec_die, spec_cu); + + do + { + die = die->parent; + if (die->tag == DW_TAG_class_type) + return dwarf2_name (die, cu); + } + while (die->tag != DW_TAG_compile_unit); } - return DW_STRING (attr); + break; + + case DW_TAG_class_type: + case DW_TAG_interface_type: + case DW_TAG_structure_type: + case DW_TAG_union_type: + /* Some GCC versions emit spurious DW_AT_name attributes for unnamed + structures or unions. These were of the form "._%d" in GCC 4.1, + or simply "" or "" in GCC 4.3 + and GCC 4.4. We work around this problem by ignoring these. */ + if (strncmp (DW_STRING (attr), "._", 2) == 0 + || strncmp (DW_STRING (attr), "objfile->objfile_obstack); + DW_STRING_IS_CANONICAL (attr) = 1; } + return DW_STRING (attr); } /* Return the die that this die in an extension of, or NULL if there @@ -9440,6 +9735,8 @@ dwarf_attr_name (unsigned attr) /* DWARF 4 values. */ case DW_AT_signature: return "DW_AT_signature"; + case DW_AT_linkage_name: + return "DW_AT_linkage_name"; /* SGI/MIPS extensions. */ #ifdef MIPS /* collides with DW_AT_HP_block_index */ case DW_AT_MIPS_fde: @@ -10115,6 +10412,10 @@ dump_die_shallow (struct ui_file *f, int indent, struct die_info *die) case DW_FORM_block1: fprintf_unfiltered (f, "block: size %d", DW_BLOCK (&die->attrs[i])->size); break; + case DW_FORM_exprloc: + fprintf_unfiltered (f, "expression: size %u", + DW_BLOCK (&die->attrs[i])->size); + break; case DW_FORM_ref1: case DW_FORM_ref2: case DW_FORM_ref4: @@ -10130,6 +10431,10 @@ dump_die_shallow (struct ui_file *f, int indent, struct die_info *die) fprintf_unfiltered (f, "constant: %s", pulongest (DW_UNSND (&die->attrs[i]))); break; + case DW_FORM_sec_offset: + fprintf_unfiltered (f, "section offset: %s", + pulongest (DW_UNSND (&die->attrs[i]))); + break; case DW_FORM_sig8: if (DW_SIGNATURED_TYPE (&die->attrs[i]) != NULL) fprintf_unfiltered (f, "signatured type, offset: 0x%x", @@ -10150,6 +10455,9 @@ dump_die_shallow (struct ui_file *f, int indent, struct die_info *die) else fprintf_unfiltered (f, "flag: FALSE"); break; + case DW_FORM_flag_present: + fprintf_unfiltered (f, "flag: TRUE"); + break; case DW_FORM_indirect: /* the reader will have reduced the indirect form to the "base form" so this form should not occur */ @@ -10357,6 +10665,7 @@ follow_die_ref (struct die_info *src_die, struct attribute *attr, else if (! offset_in_cu_p (&cu->header, offset)) { struct dwarf2_per_cu_data *per_cu; + per_cu = dwarf2_find_containing_comp_unit (offset, cu->objfile); /* If necessary, add it to the queue and load its DIEs. */ @@ -10457,6 +10766,8 @@ read_signatured_type_at_offset (struct objfile *objfile, { struct signatured_type *type_sig; + dwarf2_read_section (objfile, &dwarf2_per_objfile->types); + /* We have the section offset, but we need the signature to do the hash table lookup. */ type_sig = lookup_signatured_type_at_offset (objfile, offset); @@ -10560,7 +10871,6 @@ static CORE_ADDR decode_locdesc (struct dwarf_block *blk, struct dwarf2_cu *cu) { struct objfile *objfile = cu->objfile; - struct comp_unit_head *cu_header = &cu->header; int i; int size = blk->size; gdb_byte *data = blk->data; @@ -10843,6 +11153,7 @@ file_full_name (int file, struct line_header *lh, const char *comp_dir) record the macro definitions made in the file, even if we won't be able to find the file by name. */ char fake_name[80]; + sprintf (fake_name, "", file); complaint (&symfile_complaints, @@ -10888,9 +11199,9 @@ static char * copy_string (const char *buf, int len) { char *s = xmalloc (len + 1); + memcpy (s, buf, len); s[len] = '\0'; - return s; } @@ -11063,6 +11374,8 @@ dwarf_decode_macros (struct line_header *lh, unsigned int offset, enum dwarf_macinfo_record_type macinfo_type; int at_commandline; + dwarf2_read_section (dwarf2_per_objfile->objfile, + &dwarf2_per_objfile->macinfo); if (dwarf2_per_objfile->macinfo.buffer == NULL) { complaint (&symfile_complaints, _("missing .debug_macinfo section")); @@ -11323,7 +11636,8 @@ attr_form_is_block (struct attribute *attr) attr->form == DW_FORM_block1 || attr->form == DW_FORM_block2 || attr->form == DW_FORM_block4 - || attr->form == DW_FORM_block); + || attr->form == DW_FORM_block + || attr->form == DW_FORM_exprloc); } /* Return non-zero if ATTR's value is a section offset --- classes @@ -11338,7 +11652,8 @@ static int attr_form_is_section_offset (struct attribute *attr) { return (attr->form == DW_FORM_data4 - || attr->form == DW_FORM_data8); + || attr->form == DW_FORM_data8 + || attr->form == DW_FORM_sec_offset); } @@ -11388,6 +11703,9 @@ dwarf2_symbol_mark_computed (struct attribute *attr, struct symbol *sym, baton->per_cu = cu->per_cu; gdb_assert (baton->per_cu); + dwarf2_read_section (dwarf2_per_objfile->objfile, + &dwarf2_per_objfile->loc); + /* We don't know how long the location list is, but make sure we don't run off the edge of the section. */ baton->size = dwarf2_per_objfile->loc.size - DW_UNSND (attr); @@ -11461,8 +11779,8 @@ dwarf2_per_cu_addr_size (struct dwarf2_per_cu_data *per_cu) struct dwarf2_per_objfile *per_objfile = objfile_data (objfile, dwarf2_objfile_data_key); gdb_byte *info_ptr = per_objfile->info.buffer + per_cu->offset; - struct comp_unit_head cu_header; + memset (&cu_header, 0, sizeof cu_header); read_comp_unit_head (&cu_header, info_ptr, objfile->obfd); return cu_header.addr_size; @@ -11484,6 +11802,7 @@ dwarf2_find_containing_comp_unit (unsigned int offset, while (high > low) { int mid = low + (high - low) / 2; + if (dwarf2_per_objfile->all_comp_units[mid]->offset >= offset) high = mid; else @@ -11518,6 +11837,7 @@ static struct dwarf2_per_cu_data * 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 %u."), offset); @@ -11703,6 +12023,7 @@ static hashval_t offset_and_type_hash (const void *item) { const struct dwarf2_offset_and_type *ofs = item; + return ofs->offset; } @@ -11713,6 +12034,7 @@ offset_and_type_eq (const void *item_lhs, const void *item_rhs) { const struct dwarf2_offset_and_type *ofs_lhs = item_lhs; const struct dwarf2_offset_and_type *ofs_rhs = item_rhs; + return ofs_lhs->offset == ofs_rhs->offset; } @@ -11724,6 +12046,19 @@ set_die_type (struct die_info *die, struct type *type, struct dwarf2_cu *cu) { struct dwarf2_offset_and_type **slot, ofs; + /* For Ada types, make sure that the gnat-specific data is always + initialized (if not already set). There are a few types where + we should not be doing so, because the type-specific area is + already used to hold some other piece of info (eg: TYPE_CODE_FLT + where the type-specific area is used to store the floatformat). + But this is not a problem, because the gnat-specific information + is actually not needed for these types. */ + if (need_gnat_info (cu) + && TYPE_CODE (type) != TYPE_CODE_FUNC + && TYPE_CODE (type) != TYPE_CODE_FLT + && !HAVE_GNAT_AUX_INFO (type)) + INIT_GNAT_SPECIFIC (type); + if (cu->type_hash == NULL) { gdb_assert (cu->per_cu != NULL); @@ -11837,6 +12172,7 @@ static hashval_t partial_die_hash (const void *item) { const struct partial_die_info *part_die = item; + return part_die->offset; } @@ -11848,6 +12184,7 @@ partial_die_eq (const void *item_lhs, const void *item_rhs) { const struct partial_die_info *part_die_lhs = item_lhs; const struct partial_die_info *part_die_rhs = item_rhs; + return part_die_lhs->offset == part_die_rhs->offset; } @@ -11877,6 +12214,7 @@ munmap_section_buffer (struct dwarf2_section_info *info) intptr_t begin = (intptr_t) info->buffer; intptr_t map_begin = begin & ~(pagesize - 1); size_t map_length = info->size + begin - map_begin; + gdb_assert (munmap ((void *) map_begin, map_length) == 0); #else /* Without HAVE_MMAP, we should never be here to begin with. */ @@ -11891,6 +12229,7 @@ static void dwarf2_per_objfile_free (struct objfile *objfile, void *d) { struct dwarf2_per_objfile *data = d; + munmap_section_buffer (&data->info); munmap_section_buffer (&data->abbrev); munmap_section_buffer (&data->line);