X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fdwarf2read.c;h=dcd49e35ecaa69b2e2d74d9eacc6e44cee68a7d6;hb=5fe966540d6b748f825774868463003700f0c878;hp=898706f4c51aee7b9f596ea2f07151b8b86e6023;hpb=d9823cbb391e015f79687f4d17d7f9a32d27b5eb;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c index 898706f4c5..dcd49e35ec 100644 --- a/gdb/dwarf2read.c +++ b/gdb/dwarf2read.c @@ -1,6 +1,6 @@ /* DWARF 2 debugging format support for GDB. - Copyright (C) 1994-2015 Free Software Foundation, Inc. + Copyright (C) 1994-2016 Free Software Foundation, Inc. Adapted by Gary Funck (gary@intrepid.com), Intrepid Technology, Inc. with support from Florida State University (under contract @@ -69,6 +69,7 @@ #include "source.h" #include "filestuff.h" #include "build-id.h" +#include "namespace.h" #include #include @@ -78,11 +79,14 @@ DEF_VEC_P (symbolp); /* When == 1, print basic high level tracing messages. When > 1, be more verbose. - This is in contrast to the low level DIE reading of dwarf2_die_debug. */ -static unsigned int dwarf2_read_debug = 0; + This is in contrast to the low level DIE reading of dwarf_die_debug. */ +static unsigned int dwarf_read_debug = 0; /* When non-zero, dump DIEs after they are read in. */ -static unsigned int dwarf2_die_debug = 0; +static unsigned int dwarf_die_debug = 0; + +/* When non-zero, dump line number entries as they are read in. */ +static unsigned int dwarf_line_debug = 0; /* When non-zero, cross-check physname against demangler. */ static int check_physname = 0; @@ -120,7 +124,7 @@ struct dwarf2_section_info union { /* If this is a real section, the bfd section. */ - asection *asection; + asection *section; /* If this is a virtual section, pointer to the containing ("real") section. */ struct dwarf2_section_info *containing_section; @@ -135,7 +139,7 @@ struct dwarf2_section_info /* True if we have tried to read this section. */ char readin; /* True if this is a virtual section, False otherwise. - This specifies which of s.asection and s.containing_section to use. */ + This specifies which of s.section and s.containing_section to use. */ char is_virtual; }; @@ -607,7 +611,8 @@ struct dwarf2_per_cu_data struct dwarf2_section_info *section; /* Set to non-NULL iff this CU is currently loaded. When it gets freed out - of the CU cache it gets reset to NULL again. */ + of the CU cache it gets reset to NULL again. This is left as NULL for + dummy CUs (a CU header, but nothing else). */ struct dwarf2_cu *cu; /* The corresponding objfile. @@ -1030,8 +1035,10 @@ struct file_entry unsigned int dir_index; unsigned int mod_time; unsigned int length; - int included_p; /* Non-zero if referenced by the Line Number Program. */ - struct symtab *symtab; /* The associated symbol table, if any. */ + /* Non-zero if referenced by the Line Number Program. */ + int included_p; + /* The associated symbol table, if any. */ + struct symtab *symtab; }; /* The line number information for a compilation unit (found in the @@ -1105,6 +1112,9 @@ struct partial_die_info /* Flag set if the DIE has a byte_size attribute. */ unsigned int has_byte_size : 1; + /* Flag set if the DIE has a DW_AT_const_value attribute. */ + unsigned int has_const_value : 1; + /* Flag set if any of the DIE's children are template arguments. */ unsigned int has_template_arguments : 1; @@ -1368,13 +1378,13 @@ static struct dwarf2_queue_item *dwarf2_queue, *dwarf2_queue_tail; compilation units. Set this to zero to disable caching. Cache sizes of up to at least twenty will improve startup time for typical inter-CU-reference binaries, at an obvious memory cost. */ -static int dwarf2_max_cache_age = 5; +static int dwarf_max_cache_age = 5; static void -show_dwarf2_max_cache_age (struct ui_file *file, int from_tty, - struct cmd_list_element *c, const char *value) +show_dwarf_max_cache_age (struct ui_file *file, int from_tty, + struct cmd_list_element *c, const char *value) { fprintf_filtered (file, _("The upper bound on the age of cached " - "dwarf2 compilation units is %s.\n"), + "DWARF compilation units is %s.\n"), value); } @@ -1514,6 +1524,9 @@ static struct attribute *dwarf2_attr (struct die_info *, unsigned int, static struct attribute *dwarf2_attr_no_follow (struct die_info *, unsigned int); +static const char *dwarf2_string_attr (struct die_info *die, unsigned int name, + struct dwarf2_cu *cu); + static int dwarf2_flag_true_p (struct die_info *die, unsigned name, struct dwarf2_cu *cu); @@ -1626,6 +1639,8 @@ static void read_namespace (struct die_info *die, struct dwarf2_cu *); static void read_module (struct die_info *die, struct dwarf2_cu *cu); +static struct using_direct **using_directives (enum language); + static void read_import_statement (struct die_info *die, struct dwarf2_cu *); static int read_namespace_alias (struct die_info *die, struct dwarf2_cu *cu); @@ -1728,6 +1743,10 @@ static void load_full_type_unit (struct dwarf2_per_cu_data *per_cu); static void read_signatured_type (struct signatured_type *); +static int attr_to_dynamic_prop (const struct attribute *attr, + struct die_info *die, struct dwarf2_cu *cu, + struct dynamic_prop *prop); + /* memory allocation interface */ static struct dwarf_block *dwarf_alloc_block (struct dwarf2_cu *); @@ -1943,7 +1962,7 @@ line_header_hash (const struct line_header *ofs) static hashval_t line_header_hash_voidp (const void *item) { - const struct line_header *ofs = item; + const struct line_header *ofs = (const struct line_header *) item; return line_header_hash (ofs); } @@ -1953,8 +1972,8 @@ line_header_hash_voidp (const void *item) static int line_header_eq_voidp (const void *item_lhs, const void *item_rhs) { - const struct line_header *ofs_lhs = item_lhs; - const struct line_header *ofs_rhs = item_rhs; + const struct line_header *ofs_lhs = (const struct line_header *) item_lhs; + const struct line_header *ofs_rhs = (const struct line_header *) item_rhs; return (ofs_lhs->offset.sect_off == ofs_rhs->offset.sect_off && ofs_lhs->offset_in_dwz == ofs_rhs->offset_in_dwz); @@ -2024,12 +2043,13 @@ int dwarf2_has_info (struct objfile *objfile, const struct dwarf2_debug_sections *names) { - dwarf2_per_objfile = objfile_data (objfile, dwarf2_objfile_data_key); + dwarf2_per_objfile = ((struct 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)); + = XOBNEW (&objfile->objfile_obstack, struct dwarf2_per_objfile); memset (data, 0, sizeof (*data)); set_objfile_data (objfile, dwarf2_objfile_data_key, data); @@ -2040,9 +2060,9 @@ dwarf2_has_info (struct objfile *objfile, dwarf2_per_objfile->objfile = objfile; } return (!dwarf2_per_objfile->info.is_virtual - && dwarf2_per_objfile->info.s.asection != NULL + && dwarf2_per_objfile->info.s.section != NULL && !dwarf2_per_objfile->abbrev.is_virtual - && dwarf2_per_objfile->abbrev.s.asection != NULL); + && dwarf2_per_objfile->abbrev.s.section != NULL); } /* Return the containing section of virtual section SECTION. */ @@ -2064,7 +2084,7 @@ get_section_bfd_owner (const struct dwarf2_section_info *section) section = get_containing_section (section); gdb_assert (!section->is_virtual); } - return section->s.asection->owner; + return section->s.section->owner; } /* Return the bfd section of SECTION. @@ -2078,7 +2098,7 @@ get_section_bfd_section (const struct dwarf2_section_info *section) section = get_containing_section (section); gdb_assert (!section->is_virtual); } - return section->s.asection; + return section->s.section; } /* Return the name of SECTION. */ @@ -2163,57 +2183,57 @@ dwarf2_locate_sections (bfd *abfd, asection *sectp, void *vnames) } else if (section_is_p (sectp->name, &names->info)) { - dwarf2_per_objfile->info.s.asection = sectp; + dwarf2_per_objfile->info.s.section = sectp; dwarf2_per_objfile->info.size = bfd_get_section_size (sectp); } else if (section_is_p (sectp->name, &names->abbrev)) { - dwarf2_per_objfile->abbrev.s.asection = sectp; + dwarf2_per_objfile->abbrev.s.section = sectp; dwarf2_per_objfile->abbrev.size = bfd_get_section_size (sectp); } else if (section_is_p (sectp->name, &names->line)) { - dwarf2_per_objfile->line.s.asection = sectp; + dwarf2_per_objfile->line.s.section = sectp; dwarf2_per_objfile->line.size = bfd_get_section_size (sectp); } else if (section_is_p (sectp->name, &names->loc)) { - dwarf2_per_objfile->loc.s.asection = sectp; + dwarf2_per_objfile->loc.s.section = sectp; dwarf2_per_objfile->loc.size = bfd_get_section_size (sectp); } else if (section_is_p (sectp->name, &names->macinfo)) { - dwarf2_per_objfile->macinfo.s.asection = sectp; + dwarf2_per_objfile->macinfo.s.section = sectp; dwarf2_per_objfile->macinfo.size = bfd_get_section_size (sectp); } else if (section_is_p (sectp->name, &names->macro)) { - dwarf2_per_objfile->macro.s.asection = sectp; + dwarf2_per_objfile->macro.s.section = sectp; dwarf2_per_objfile->macro.size = bfd_get_section_size (sectp); } else if (section_is_p (sectp->name, &names->str)) { - dwarf2_per_objfile->str.s.asection = sectp; + dwarf2_per_objfile->str.s.section = sectp; dwarf2_per_objfile->str.size = bfd_get_section_size (sectp); } else if (section_is_p (sectp->name, &names->addr)) { - dwarf2_per_objfile->addr.s.asection = sectp; + dwarf2_per_objfile->addr.s.section = sectp; dwarf2_per_objfile->addr.size = bfd_get_section_size (sectp); } else if (section_is_p (sectp->name, &names->frame)) { - dwarf2_per_objfile->frame.s.asection = sectp; + dwarf2_per_objfile->frame.s.section = sectp; dwarf2_per_objfile->frame.size = bfd_get_section_size (sectp); } else if (section_is_p (sectp->name, &names->eh_frame)) { - dwarf2_per_objfile->eh_frame.s.asection = sectp; + dwarf2_per_objfile->eh_frame.s.section = sectp; dwarf2_per_objfile->eh_frame.size = bfd_get_section_size (sectp); } else if (section_is_p (sectp->name, &names->ranges)) { - dwarf2_per_objfile->ranges.s.asection = sectp; + dwarf2_per_objfile->ranges.s.section = sectp; dwarf2_per_objfile->ranges.size = bfd_get_section_size (sectp); } else if (section_is_p (sectp->name, &names->types)) @@ -2221,7 +2241,7 @@ dwarf2_locate_sections (bfd *abfd, asection *sectp, void *vnames) struct dwarf2_section_info type_section; memset (&type_section, 0, sizeof (type_section)); - type_section.s.asection = sectp; + type_section.s.section = sectp; type_section.size = bfd_get_section_size (sectp); VEC_safe_push (dwarf2_section_info_def, dwarf2_per_objfile->types, @@ -2229,11 +2249,11 @@ dwarf2_locate_sections (bfd *abfd, asection *sectp, void *vnames) } else if (section_is_p (sectp->name, &names->gdb_index)) { - dwarf2_per_objfile->gdb_index.s.asection = sectp; + dwarf2_per_objfile->gdb_index.s.section = sectp; dwarf2_per_objfile->gdb_index.size = bfd_get_section_size (sectp); } - if ((bfd_get_section_flags (abfd, sectp) & SEC_LOAD) + if ((bfd_get_section_flags (abfd, sectp) & (SEC_LOAD | SEC_ALLOC)) && bfd_section_vma (abfd, sectp) == 0) dwarf2_per_objfile->has_section_at_zero = 1; } @@ -2246,7 +2266,7 @@ dwarf2_section_empty_p (const struct dwarf2_section_info *section) { if (section->is_virtual) return section->size == 0; - return section->s.asection == NULL || section->size == 0; + return section->s.section == NULL || section->size == 0; } /* Read the contents of the section INFO. @@ -2305,7 +2325,7 @@ dwarf2_read_section (struct objfile *objfile, struct dwarf2_section_info *info) return; } - buf = obstack_alloc (&objfile->objfile_obstack, info->size); + buf = (gdb_byte *) obstack_alloc (&objfile->objfile_obstack, info->size); info->buffer = buf; /* When debugging .o files, we may need to apply relocations; see @@ -2357,7 +2377,8 @@ dwarf2_get_section_info (struct objfile *objfile, bfd_size_type *sizep) { struct dwarf2_per_objfile *data - = objfile_data (objfile, dwarf2_objfile_data_key); + = (struct dwarf2_per_objfile *) 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 @@ -2393,38 +2414,38 @@ dwarf2_get_section_info (struct objfile *objfile, static void locate_dwz_sections (bfd *abfd, asection *sectp, void *arg) { - struct dwz_file *dwz_file = arg; + struct dwz_file *dwz_file = (struct dwz_file *) arg; /* Note that we only support the standard ELF names, because .dwz is ELF-only (at the time of writing). */ if (section_is_p (sectp->name, &dwarf2_elf_names.abbrev)) { - dwz_file->abbrev.s.asection = sectp; + dwz_file->abbrev.s.section = sectp; dwz_file->abbrev.size = bfd_get_section_size (sectp); } else if (section_is_p (sectp->name, &dwarf2_elf_names.info)) { - dwz_file->info.s.asection = sectp; + dwz_file->info.s.section = sectp; dwz_file->info.size = bfd_get_section_size (sectp); } else if (section_is_p (sectp->name, &dwarf2_elf_names.str)) { - dwz_file->str.s.asection = sectp; + dwz_file->str.s.section = sectp; dwz_file->str.size = bfd_get_section_size (sectp); } else if (section_is_p (sectp->name, &dwarf2_elf_names.line)) { - dwz_file->line.s.asection = sectp; + dwz_file->line.s.section = sectp; dwz_file->line.size = bfd_get_section_size (sectp); } else if (section_is_p (sectp->name, &dwarf2_elf_names.macro)) { - dwz_file->macro.s.asection = sectp; + dwz_file->macro.s.section = sectp; dwz_file->macro.size = bfd_get_section_size (sectp); } else if (section_is_p (sectp->name, &dwarf2_elf_names.gdb_index)) { - dwz_file->gdb_index.s.asection = sectp; + dwz_file->gdb_index.s.section = sectp; dwz_file->gdb_index.size = bfd_get_section_size (sectp); } } @@ -2590,7 +2611,8 @@ eq_stmt_list_entry (const struct stmt_list_hash *lhs, static hashval_t hash_file_name_entry (const void *e) { - const struct quick_file_names *file_data = e; + const struct quick_file_names *file_data + = (const struct quick_file_names *) e; return hash_stmt_list_entry (&file_data->hash); } @@ -2600,8 +2622,8 @@ hash_file_name_entry (const void *e) static int eq_file_name_entry (const void *a, const void *b) { - const struct quick_file_names *ea = a; - const struct quick_file_names *eb = b; + const struct quick_file_names *ea = (const struct quick_file_names *) a; + const struct quick_file_names *eb = (const struct quick_file_names *) b; return eq_stmt_list_entry (&ea->hash, &eb->hash); } @@ -2611,7 +2633,7 @@ eq_file_name_entry (const void *a, const void *b) static void delete_file_name_entry (void *e) { - struct quick_file_names *file_data = e; + struct quick_file_names *file_data = (struct quick_file_names *) e; int i; for (i = 0; i < file_data->num_file_names; ++i) @@ -2647,7 +2669,8 @@ load_cu (struct dwarf2_per_cu_data *per_cu) else load_full_comp_unit (per_cu, language_minimal); - gdb_assert (per_cu->cu != NULL); + if (per_cu->cu == NULL) + return; /* Dummy CU. */ dwarf2_find_base_address (per_cu->cu->dies, per_cu->cu); } @@ -2677,6 +2700,7 @@ dw2_do_instantiate_symtab (struct dwarf2_per_cu_data *per_cu) that may badly handle TUs, load all the TUs in that DWO as well. http://sourceware.org/bugzilla/show_bug.cgi?id=15021 */ if (!per_cu->is_debug_types + && per_cu->cu != NULL && per_cu->cu->dwo_unit != NULL && dwarf2_per_objfile->index_table != NULL && dwarf2_per_objfile->index_table->version <= 7 @@ -2798,10 +2822,9 @@ create_cus_from_index (struct objfile *objfile, struct dwz_file *dwz; dwarf2_per_objfile->n_comp_units = (cu_list_elements + dwz_elements) / 2; - dwarf2_per_objfile->all_comp_units - = obstack_alloc (&objfile->objfile_obstack, - dwarf2_per_objfile->n_comp_units - * sizeof (struct dwarf2_per_cu_data *)); + dwarf2_per_objfile->all_comp_units = + XOBNEWVEC (&objfile->objfile_obstack, struct dwarf2_per_cu_data *, + dwarf2_per_objfile->n_comp_units); create_cus_from_index_list (objfile, cu_list, cu_list_elements, &dwarf2_per_objfile->info, 0, 0); @@ -2828,9 +2851,8 @@ create_signatured_type_table_from_index (struct objfile *objfile, dwarf2_per_objfile->n_type_units = dwarf2_per_objfile->n_allocated_type_units = elements / 3; - dwarf2_per_objfile->all_type_units - = xmalloc (dwarf2_per_objfile->n_type_units - * sizeof (struct signatured_type *)); + dwarf2_per_objfile->all_type_units = + XNEWVEC (struct signatured_type *, dwarf2_per_objfile->n_type_units); sig_types_hash = allocate_signatured_type_table (objfile); @@ -2966,7 +2988,8 @@ find_slot_in_mapped_hash (struct mapped_index *index, const char *name, if (current_language->la_language == language_cplus || current_language->la_language == language_java - || current_language->la_language == language_fortran) + || current_language->la_language == language_fortran + || current_language->la_language == language_d) { /* NAME is already canonical. Drop any qualifiers as .gdb_index does not contain any. */ @@ -3208,7 +3231,7 @@ dwarf2_read_index (struct objfile *objfile) create_addrmap_from_index (objfile, &local_map); - map = obstack_alloc (&objfile->objfile_obstack, sizeof (struct mapped_index)); + map = XOBNEW (&objfile->objfile_obstack, struct mapped_index); *map = local_map; dwarf2_per_objfile->index_table = map; @@ -3225,7 +3248,8 @@ dwarf2_read_index (struct objfile *objfile) static void dw2_setup (struct objfile *objfile) { - dwarf2_per_objfile = objfile_data (objfile, dwarf2_objfile_data_key); + dwarf2_per_objfile = ((struct dwarf2_per_objfile *) + objfile_data (objfile, dwarf2_objfile_data_key)); gdb_assert (dwarf2_per_objfile); } @@ -3280,7 +3304,7 @@ dw2_get_file_names_reader (const struct die_reader_specs *reader, &find_entry, INSERT); if (*slot != NULL) { - lh_cu->v.quick->file_names = *slot; + lh_cu->v.quick->file_names = (struct quick_file_names *) *slot; return; } @@ -3292,7 +3316,7 @@ dw2_get_file_names_reader (const struct die_reader_specs *reader, return; } - qfn = obstack_alloc (&objfile->objfile_obstack, sizeof (*qfn)); + qfn = XOBNEW (&objfile->objfile_obstack, struct quick_file_names); qfn->hash.dwo_unit = cu->dwo_unit; qfn->hash.line_offset.sect_off = line_offset; gdb_assert (slot != NULL); @@ -3301,8 +3325,8 @@ dw2_get_file_names_reader (const struct die_reader_specs *reader, find_file_and_directory (comp_unit_die, cu, &name, &comp_dir); qfn->num_file_names = lh->num_file_names; - qfn->file_names = obstack_alloc (&objfile->objfile_obstack, - lh->num_file_names * sizeof (char *)); + qfn->file_names = + XOBNEWVEC (&objfile->objfile_obstack, const char *, lh->num_file_names); for (i = 0; i < lh->num_file_names; ++i) qfn->file_names[i] = file_full_name (i + 1, lh, comp_dir); qfn->real_names = NULL; @@ -3660,23 +3684,25 @@ dw2_lookup_symbol (struct objfile *objfile, int block_index, while ((per_cu = dw2_symtab_iter_next (&iter)) != NULL) { - struct symbol *sym = NULL; + struct symbol *sym, *with_opaque = NULL; struct compunit_symtab *stab = dw2_instantiate_symtab (per_cu); const struct blockvector *bv = COMPUNIT_BLOCKVECTOR (stab); struct block *block = BLOCKVECTOR_BLOCK (bv, block_index); + sym = block_find_symbol (block, name, domain, + block_find_non_opaque_type_preferred, + &with_opaque); + /* Some caution must be observed with overloaded functions and methods, since the index will not contain any overload information (but NAME might contain it). */ - sym = block_lookup_symbol (block, name, domain); - if (sym && strcmp_iw (SYMBOL_SEARCH_NAME (sym), name) == 0) - { - if (!TYPE_IS_OPAQUE (SYMBOL_TYPE (sym))) - return stab; - - stab_best = stab; - } + if (sym != NULL + && strcmp_iw (SYMBOL_SEARCH_NAME (sym), name) == 0) + return stab; + if (with_opaque != NULL + && strcmp_iw (SYMBOL_SEARCH_NAME (with_opaque), name) == 0) + stab_best = stab; /* Keep looking through other CUs. */ } @@ -3872,6 +3898,8 @@ dw2_expand_symtabs_matching struct quick_file_names *file_data; void **slot; + QUIT; + per_cu->v.quick->mark = 0; /* We only need to look at symtabs not already expanded. */ @@ -3932,6 +3960,8 @@ dw2_expand_symtabs_matching offset_type *vec, vec_len, vec_idx; int global_seen = 0; + QUIT; + if (index->symbol_table[idx] == 0 && index->symbol_table[idx + 1] == 0) continue; @@ -4066,7 +4096,8 @@ dw2_find_pc_sect_compunit_symtab (struct objfile *objfile, if (!objfile->psymtabs_addrmap) return NULL; - data = addrmap_find (objfile->psymtabs_addrmap, pc); + data = (struct dwarf2_per_cu_data *) addrmap_find (objfile->psymtabs_addrmap, + pc); if (!data) return NULL; @@ -4475,13 +4506,11 @@ dwarf2_create_include_psymtab (const char *name, struct partial_symtab *pst, subpst->dirname = pst->dirname; } - subpst->section_offsets = pst->section_offsets; subpst->textlow = 0; subpst->texthigh = 0; - subpst->dependencies = (struct partial_symtab **) - obstack_alloc (&objfile->objfile_obstack, - sizeof (struct partial_symtab *)); + subpst->dependencies + = XOBNEW (&objfile->objfile_obstack, struct partial_symtab *); subpst->dependencies[0] = pst; subpst->number_of_dependencies = 1; @@ -4526,7 +4555,8 @@ dwarf2_build_include_psymtabs (struct dwarf2_cu *cu, static hashval_t hash_signatured_type (const void *item) { - const struct signatured_type *sig_type = item; + const struct signatured_type *sig_type + = (const struct signatured_type *) item; /* This drops the top 32 bits of the signature, but is ok for a hash. */ return sig_type->signature; @@ -4535,8 +4565,8 @@ hash_signatured_type (const void *item) static int eq_signatured_type (const void *item_lhs, const void *item_rhs) { - const struct signatured_type *lhs = item_lhs; - const struct signatured_type *rhs = item_rhs; + const struct signatured_type *lhs = (const struct signatured_type *) item_lhs; + const struct signatured_type *rhs = (const struct signatured_type *) item_rhs; return lhs->signature == rhs->signature; } @@ -4560,8 +4590,8 @@ allocate_signatured_type_table (struct objfile *objfile) static int add_signatured_type_cu_to_table (void **slot, void *datum) { - struct signatured_type *sigt = *slot; - struct signatured_type ***datap = datum; + struct signatured_type *sigt = (struct signatured_type *) *slot; + struct signatured_type ***datap = (struct signatured_type ***) datum; **datap = sigt; ++*datap; @@ -4595,7 +4625,7 @@ create_debug_types_hash_table (struct dwo_file *dwo_file, ? &dwo_file->sections.abbrev : &dwarf2_per_objfile->abbrev); - if (dwarf2_read_debug) + if (dwarf_read_debug) fprintf_unfiltered (gdb_stdlog, "Reading .debug_types%s for %s:\n", dwo_file ? ".dwo" : "", get_section_file_name (abbrev_section)); @@ -4699,13 +4729,15 @@ create_debug_types_hash_table (struct dwo_file *dwo_file, if (dwo_file) { - const struct dwo_unit *dup_tu = *slot; + const struct dwo_unit *dup_tu + = (const struct dwo_unit *) *slot; dup_offset = dup_tu->offset; } else { - const struct signatured_type *dup_tu = *slot; + const struct signatured_type *dup_tu + = (const struct signatured_type *) *slot; dup_offset = dup_tu->per_cu.offset; } @@ -4718,7 +4750,7 @@ create_debug_types_hash_table (struct dwo_file *dwo_file, } *slot = dwo_file ? (void *) dwo_tu : (void *) sig_type; - if (dwarf2_read_debug > 1) + if (dwarf_read_debug > 1) fprintf_unfiltered (gdb_stdlog, " offset 0x%x, signature %s\n", offset.sect_off, hex_string (signature)); @@ -4753,9 +4785,8 @@ create_all_type_units (struct objfile *objfile) dwarf2_per_objfile->n_type_units = dwarf2_per_objfile->n_allocated_type_units = htab_elements (types_htab); - dwarf2_per_objfile->all_type_units - = xmalloc (dwarf2_per_objfile->n_type_units - * sizeof (struct signatured_type *)); + dwarf2_per_objfile->all_type_units = + XNEWVEC (struct signatured_type *, dwarf2_per_objfile->n_type_units); iter = &dwarf2_per_objfile->all_type_units[0]; htab_traverse_noresize (types_htab, add_signatured_type_cu_to_table, &iter); gdb_assert (iter - &dwarf2_per_objfile->all_type_units[0] @@ -4783,9 +4814,9 @@ add_type_unit (ULONGEST sig, void **slot) dwarf2_per_objfile->n_allocated_type_units = 1; dwarf2_per_objfile->n_allocated_type_units *= 2; dwarf2_per_objfile->all_type_units - = xrealloc (dwarf2_per_objfile->all_type_units, - dwarf2_per_objfile->n_allocated_type_units - * sizeof (struct signatured_type *)); + = XRESIZEVEC (struct signatured_type *, + dwarf2_per_objfile->all_type_units, + dwarf2_per_objfile->n_allocated_type_units); ++dwarf2_per_objfile->tu_stats.nr_all_type_units_reallocs; } dwarf2_per_objfile->n_type_units = n_type_units; @@ -4885,7 +4916,7 @@ lookup_dwo_signatured_type (struct dwarf2_cu *cu, ULONGEST sig) find_sig_entry.signature = sig; slot = htab_find_slot (dwarf2_per_objfile->signatured_types, &find_sig_entry, INSERT); - sig_entry = *slot; + sig_entry = (struct signatured_type *) *slot; /* We can get here with the TU already read, *or* in the process of being read. Don't reassign the global entry to point to this DWO if that's @@ -4907,7 +4938,7 @@ lookup_dwo_signatured_type (struct dwarf2_cu *cu, ULONGEST sig) if (dwo_file->tus == NULL) return NULL; find_dwo_entry.signature = sig; - dwo_entry = htab_find (dwo_file->tus, &find_dwo_entry); + dwo_entry = (struct dwo_unit *) htab_find (dwo_file->tus, &find_dwo_entry); if (dwo_entry == NULL) return NULL; @@ -4948,7 +4979,7 @@ lookup_dwp_signatured_type (struct dwarf2_cu *cu, ULONGEST sig) find_sig_entry.signature = sig; slot = htab_find_slot (dwarf2_per_objfile->signatured_types, &find_sig_entry, INSERT); - sig_entry = *slot; + sig_entry = (struct signatured_type *) *slot; /* Have we already tried to read this TU? Note: sig_entry can be NULL if the skeleton TU was removed (thus it @@ -4993,7 +5024,8 @@ lookup_signatured_type (struct dwarf2_cu *cu, ULONGEST sig) if (dwarf2_per_objfile->signatured_types == NULL) return NULL; find_entry.signature = sig; - entry = htab_find (dwarf2_per_objfile->signatured_types, &find_entry); + entry = ((struct signatured_type *) + htab_find (dwarf2_per_objfile->signatured_types, &find_entry)); return entry; } } @@ -5103,8 +5135,7 @@ read_cutu_die_from_dwo (struct dwarf2_per_cu_data *this_cu, else if (stub_comp_dir != NULL) { /* Reconstruct the comp_dir attribute to simplify the code below. */ - comp_dir = (struct attribute *) - obstack_alloc (&cu->comp_unit_obstack, sizeof (*comp_dir)); + comp_dir = XOBNEW (&cu->comp_unit_obstack, struct attribute); comp_dir->name = DW_AT_comp_dir; comp_dir->form = DW_FORM_string; DW_STRING_IS_CANONICAL (comp_dir) = 0; @@ -5207,14 +5238,14 @@ read_cutu_die_from_dwo (struct dwarf2_per_cu_data *this_cu, comp_unit_die->attrs[i++] = *comp_dir; comp_unit_die->num_attrs += num_extra_attrs; - if (dwarf2_die_debug) + if (dwarf_die_debug) { fprintf_unfiltered (gdb_stdlog, "Read die from %s@0x%x of %s:\n", get_section_name (section), (unsigned) (begin_info_ptr - section->buffer), bfd_get_filename (abfd)); - dump_die (comp_unit_die, dwarf2_die_debug); + dump_die (comp_unit_die, dwarf_die_debug); } /* Save the comp_dir attribute. If there is no DWP file then we'll read @@ -5250,13 +5281,8 @@ lookup_dwo_unit (struct dwarf2_per_cu_data *this_cu, gdb_assert (cu != NULL); /* Yeah, we look dwo_name up again, but it simplifies the code. */ - attr = dwarf2_attr (comp_unit_die, DW_AT_GNU_dwo_name, cu); - gdb_assert (attr != NULL); - dwo_name = DW_STRING (attr); - comp_dir = NULL; - attr = dwarf2_attr (comp_unit_die, DW_AT_comp_dir, cu); - if (attr) - comp_dir = DW_STRING (attr); + dwo_name = dwarf2_string_attr (comp_unit_die, DW_AT_GNU_dwo_name, cu); + comp_dir = dwarf2_string_attr (comp_unit_die, DW_AT_comp_dir, cu); if (this_cu->is_debug_types) { @@ -5327,7 +5353,7 @@ init_tu_and_read_dwo_dies (struct dwarf2_per_cu_data *this_cu, { /* If !use_existing_cu, this_cu->cu must be NULL. */ gdb_assert (this_cu->cu == NULL); - cu = xmalloc (sizeof (*cu)); + cu = XNEW (struct dwarf2_cu); init_one_comp_unit (cu, this_cu); /* If an error occurs while loading, release our storage. */ free_cu_cleanup = make_cleanup (free_heap_comp_unit, cu); @@ -5419,7 +5445,7 @@ init_cutu_and_read_dies (struct dwarf2_per_cu_data *this_cu, before we can reread the DWO file (this only applies to CUs, not TUs). */ int rereading_dwo_cu = 0; - if (dwarf2_die_debug) + if (dwarf_die_debug) fprintf_unfiltered (gdb_stdlog, "Reading %s unit at offset 0x%x\n", this_cu->is_debug_types ? "type" : "comp", this_cu->offset.sect_off); @@ -5464,7 +5490,7 @@ init_cutu_and_read_dies (struct dwarf2_per_cu_data *this_cu, { /* If !use_existing_cu, this_cu->cu must be NULL. */ gdb_assert (this_cu->cu == NULL); - cu = xmalloc (sizeof (*cu)); + cu = XNEW (struct dwarf2_cu); init_one_comp_unit (cu, this_cu); /* If an error occurs while loading, release our storage. */ free_cu_cleanup = make_cleanup (free_heap_comp_unit, cu); @@ -5652,7 +5678,7 @@ init_cutu_and_read_dies_no_follow (struct dwarf2_per_cu_data *this_cu, struct die_info *comp_unit_die; int has_children; - if (dwarf2_die_debug) + if (dwarf_die_debug) fprintf_unfiltered (gdb_stdlog, "Reading %s unit at offset 0x%x\n", this_cu->is_debug_types ? "type" : "comp", this_cu->offset.sect_off); @@ -5724,7 +5750,8 @@ init_cutu_and_read_dies_simple (struct dwarf2_per_cu_data *this_cu, static hashval_t hash_type_unit_group (const void *item) { - const struct type_unit_group *tu_group = item; + const struct type_unit_group *tu_group + = (const struct type_unit_group *) item; return hash_stmt_list_entry (&tu_group->hash); } @@ -5732,8 +5759,8 @@ hash_type_unit_group (const void *item) static int eq_type_unit_group (const void *item_lhs, const void *item_rhs) { - const struct type_unit_group *lhs = item_lhs; - const struct type_unit_group *rhs = item_rhs; + const struct type_unit_group *lhs = (const struct type_unit_group *) item_lhs; + const struct type_unit_group *rhs = (const struct type_unit_group *) item_rhs; return eq_stmt_list_entry (&lhs->hash, &rhs->hash); } @@ -5847,7 +5874,7 @@ get_type_unit_group (struct dwarf2_cu *cu, const struct attribute *stmt_list) &type_unit_group_for_lookup, INSERT); if (*slot != NULL) { - tu_group = *slot; + tu_group = (struct type_unit_group *) *slot; gdb_assert (tu_group != NULL); } else @@ -5876,8 +5903,7 @@ create_partial_symtab (struct dwarf2_per_cu_data *per_cu, const char *name) struct objfile *objfile = per_cu->objfile; struct partial_symtab *pst; - pst = start_psymtab_common (objfile, objfile->section_offsets, - name, 0, + pst = start_psymtab_common (objfile, name, 0, objfile->global_psymbols.next, objfile->static_psymbols.next); @@ -5919,13 +5945,13 @@ process_psymtab_comp_unit_reader (const struct die_reader_specs *reader, struct objfile *objfile = cu->objfile; struct gdbarch *gdbarch = get_objfile_arch (objfile); struct dwarf2_per_cu_data *per_cu = cu->per_cu; - struct attribute *attr; CORE_ADDR baseaddr; CORE_ADDR best_lowpc = 0, best_highpc = 0; struct partial_symtab *pst; int has_pc_info; const char *filename; - struct process_psymtab_comp_unit_data *info = data; + struct process_psymtab_comp_unit_data *info + = (struct process_psymtab_comp_unit_data *) data; if (comp_unit_die->tag == DW_TAG_partial_unit && !info->want_partial_unit) return; @@ -5937,18 +5963,14 @@ process_psymtab_comp_unit_reader (const struct die_reader_specs *reader, cu->list_in_scope = &file_symbols; /* Allocate a new partial symbol table structure. */ - attr = dwarf2_attr (comp_unit_die, DW_AT_name, cu); - if (attr == NULL || !DW_STRING (attr)) + filename = dwarf2_string_attr (comp_unit_die, DW_AT_name, cu); + if (filename == NULL) filename = ""; - else - filename = DW_STRING (attr); pst = create_partial_symtab (per_cu, filename); /* This must be done before calling dwarf2_build_include_psymtabs. */ - attr = dwarf2_attr (comp_unit_die, DW_AT_comp_dir, cu); - if (attr != NULL) - pst->dirname = DW_STRING (attr); + pst->dirname = dwarf2_string_attr (comp_unit_die, DW_AT_comp_dir, cu); baseaddr = ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile)); @@ -6000,11 +6022,7 @@ process_psymtab_comp_unit_reader (const struct die_reader_specs *reader, pst->textlow = gdbarch_adjust_dwarf2_addr (gdbarch, best_lowpc + baseaddr); pst->texthigh = gdbarch_adjust_dwarf2_addr (gdbarch, best_highpc + baseaddr); - pst->n_global_syms = objfile->global_psymbols.next - - (objfile->global_psymbols.list + pst->globals_offset); - pst->n_static_syms = objfile->static_psymbols.next - - (objfile->static_psymbols.list + pst->statics_offset); - sort_pst_symbols (objfile, pst); + end_psymtab_common (objfile, pst); if (!VEC_empty (dwarf2_per_cu_ptr, cu->per_cu->imported_symtabs)) { @@ -6015,8 +6033,8 @@ process_psymtab_comp_unit_reader (const struct die_reader_specs *reader, /* Fill in 'dependencies' here; we fill in 'users' in a post-pass. */ pst->number_of_dependencies = len; - pst->dependencies = obstack_alloc (&objfile->objfile_obstack, - len * sizeof (struct symtab *)); + pst->dependencies = + XOBNEWVEC (&objfile->objfile_obstack, struct partial_symtab *, len); for (i = 0; VEC_iterate (dwarf2_per_cu_ptr, cu->per_cu->imported_symtabs, i, iter); @@ -6030,7 +6048,7 @@ process_psymtab_comp_unit_reader (const struct die_reader_specs *reader, and build a psymtab for each of them. */ dwarf2_build_include_psymtabs (cu, comp_unit_die, pst); - if (dwarf2_read_debug) + if (dwarf_read_debug) { struct gdbarch *gdbarch = get_objfile_arch (objfile); @@ -6116,11 +6134,7 @@ build_type_psymtabs_reader (const struct die_reader_specs *reader, highpc = (CORE_ADDR) 0; scan_partial_symbols (first_die, &lowpc, &highpc, 0, cu); - pst->n_global_syms = objfile->global_psymbols.next - - (objfile->global_psymbols.list + pst->globals_offset); - pst->n_static_syms = objfile->static_psymbols.next - - (objfile->static_psymbols.list + pst->statics_offset); - sort_pst_symbols (objfile, pst); + end_psymtab_common (objfile, pst); } /* Struct used to sort TUs by their abbreviation table offset. */ @@ -6136,8 +6150,10 @@ struct tu_abbrev_offset static int sort_tu_by_abbrev_offset (const void *ap, const void *bp) { - const struct tu_abbrev_offset * const *a = ap; - const struct tu_abbrev_offset * const *b = bp; + const struct tu_abbrev_offset * const *a + = (const struct tu_abbrev_offset * const*) ap; + const struct tu_abbrev_offset * const *b + = (const struct tu_abbrev_offset * const*) bp; unsigned int aoff = (*a)->abbrev_offset.sect_off; unsigned int boff = (*b)->abbrev_offset.sect_off; @@ -6199,7 +6215,7 @@ build_type_psymtabs_1 (void) [IWBN if DWO skeletons had DW_AT_stmt_list] call FUNC */ - if (dwarf2_read_debug) + if (dwarf_read_debug) fprintf_unfiltered (gdb_stdlog, "Building type unit groups ...\n"); /* Sort in a separate table to maintain the order of all_type_units @@ -6291,8 +6307,8 @@ build_type_psymtab_dependencies (void **slot, void *info) gdb_assert (IS_TYPE_UNIT_GROUP (per_cu)); pst->number_of_dependencies = len; - pst->dependencies = obstack_alloc (&objfile->objfile_obstack, - len * sizeof (struct psymtab *)); + pst->dependencies = + XOBNEWVEC (&objfile->objfile_obstack, struct partial_symtab *, len); for (i = 0; VEC_iterate (sig_type_ptr, tu_group->tus, i, iter); ++i) @@ -6326,7 +6342,7 @@ static int process_skeletonless_type_unit (void **slot, void *info) { struct dwo_unit *dwo_unit = (struct dwo_unit *) *slot; - struct objfile *objfile = info; + struct objfile *objfile = (struct objfile *) info; struct signatured_type find_entry, *entry; /* If this TU doesn't exist in the global table, add it and read it in. */ @@ -6396,7 +6412,7 @@ process_skeletonless_type_units (struct objfile *objfile) static void psymtabs_addrmap_cleanup (void *o) { - struct objfile *objfile = o; + struct objfile *objfile = (struct objfile *) o; objfile->psymtabs_addrmap = NULL; } @@ -6436,7 +6452,7 @@ dwarf2_build_psymtabs_hard (struct objfile *objfile) struct obstack temp_obstack; int i; - if (dwarf2_read_debug) + if (dwarf_read_debug) { fprintf_unfiltered (gdb_stdlog, "Building psymtabs of objfile %s ...\n", objfile_name (objfile)); @@ -6478,7 +6494,7 @@ dwarf2_build_psymtabs_hard (struct objfile *objfile) build_type_psymtab_dependencies, NULL); } - if (dwarf2_read_debug) + if (dwarf_read_debug) print_tu_stats (); set_partial_user (objfile); @@ -6489,7 +6505,7 @@ dwarf2_build_psymtabs_hard (struct objfile *objfile) do_cleanups (back_to); - if (dwarf2_read_debug) + if (dwarf_read_debug) fprintf_unfiltered (gdb_stdlog, "Done building psymtabs of %s\n", objfile_name (objfile)); } @@ -6535,7 +6551,7 @@ read_comp_units_from_section (struct objfile *objfile, const gdb_byte *info_ptr; bfd *abfd = get_section_bfd_owner (section); - if (dwarf2_read_debug) + if (dwarf_read_debug) fprintf_unfiltered (gdb_stdlog, "Reading %s for %s\n", get_section_name (section), get_section_file_name (section)); @@ -6557,8 +6573,7 @@ read_comp_units_from_section (struct objfile *objfile, length = read_initial_length (abfd, 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)); + this_cu = XOBNEW (&objfile->objfile_obstack, struct dwarf2_per_cu_data); memset (this_cu, 0, sizeof (*this_cu)); this_cu->offset = offset; this_cu->length = length + initial_length_size; @@ -6569,9 +6584,8 @@ read_comp_units_from_section (struct objfile *objfile, if (*n_comp_units == *n_allocated) { *n_allocated *= 2; - *all_comp_units = xrealloc (*all_comp_units, - *n_allocated - * sizeof (struct dwarf2_per_cu_data *)); + *all_comp_units = XRESIZEVEC (struct dwarf2_per_cu_data *, + *all_comp_units, *n_allocated); } (*all_comp_units)[*n_comp_units] = this_cu; ++*n_comp_units; @@ -6593,8 +6607,7 @@ create_all_comp_units (struct objfile *objfile) n_comp_units = 0; n_allocated = 10; - all_comp_units = xmalloc (n_allocated - * sizeof (struct dwarf2_per_cu_data *)); + all_comp_units = XNEWVEC (struct dwarf2_per_cu_data *, n_allocated); read_comp_units_from_section (objfile, &dwarf2_per_objfile->info, 0, &n_allocated, &n_comp_units, &all_comp_units); @@ -6605,9 +6618,9 @@ create_all_comp_units (struct objfile *objfile) &n_allocated, &n_comp_units, &all_comp_units); - dwarf2_per_objfile->all_comp_units - = obstack_alloc (&objfile->objfile_obstack, - n_comp_units * sizeof (struct dwarf2_per_cu_data *)); + dwarf2_per_objfile->all_comp_units = XOBNEWVEC (&objfile->objfile_obstack, + struct dwarf2_per_cu_data *, + n_comp_units); memcpy (dwarf2_per_objfile->all_comp_units, all_comp_units, n_comp_units * sizeof (struct dwarf2_per_cu_data *)); xfree (all_comp_units); @@ -6841,7 +6854,7 @@ partial_die_full_name (struct partial_die_info *pdi, struct dwarf2_cu *ref_cu = cu; /* DW_FORM_ref_addr is using section offset. */ - attr.name = 0; + attr.name = (enum dwarf_attribute) 0; attr.form = DW_FORM_ref_addr; attr.u.unsnd = pdi->offset.sect_off; die = follow_die_ref (NULL, &attr, &ref_cu); @@ -6886,23 +6899,19 @@ add_partial_symbol (struct partial_die_info *pdi, struct dwarf2_cu *cu) of the global scope. But in Ada, we want to be able to access nested procedures globally. So all Ada subprograms are stored in the global scope. */ - /* prim_record_minimal_symbol (actual_name, addr, mst_text, - objfile); */ add_psymbol_to_list (actual_name, strlen (actual_name), built_actual_name != NULL, VAR_DOMAIN, LOC_BLOCK, &objfile->global_psymbols, - 0, addr, cu->language, objfile); + addr, cu->language, objfile); } else { - /* prim_record_minimal_symbol (actual_name, addr, mst_file_text, - objfile); */ add_psymbol_to_list (actual_name, strlen (actual_name), built_actual_name != NULL, VAR_DOMAIN, LOC_BLOCK, &objfile->static_psymbols, - 0, addr, cu->language, objfile); + addr, cu->language, objfile); } break; case DW_TAG_constant: @@ -6915,7 +6924,7 @@ add_partial_symbol (struct partial_die_info *pdi, struct dwarf2_cu *cu) list = &objfile->static_psymbols; add_psymbol_to_list (actual_name, strlen (actual_name), built_actual_name != NULL, VAR_DOMAIN, LOC_STATIC, - list, 0, 0, cu->language, objfile); + list, 0, cu->language, objfile); } break; case DW_TAG_variable: @@ -6951,24 +6960,26 @@ add_partial_symbol (struct partial_die_info *pdi, struct dwarf2_cu *cu) built_actual_name != NULL, VAR_DOMAIN, LOC_STATIC, &objfile->global_psymbols, - 0, addr + baseaddr, + addr + baseaddr, cu->language, objfile); } else { - /* Static Variable. Skip symbols without location descriptors. */ - if (pdi->d.locdesc == NULL) + int has_loc = pdi->d.locdesc != NULL; + + /* Static Variable. Skip symbols whose value we cannot know (those + without location descriptors or constant values). */ + if (!has_loc && !pdi->has_const_value) { xfree (built_actual_name); return; } - /* prim_record_minimal_symbol (actual_name, addr + baseaddr, - mst_file_data, objfile); */ + add_psymbol_to_list (actual_name, strlen (actual_name), built_actual_name != NULL, VAR_DOMAIN, LOC_STATIC, &objfile->static_psymbols, - 0, addr + baseaddr, + has_loc ? addr + baseaddr : (CORE_ADDR) 0, cu->language, objfile); } break; @@ -6979,7 +6990,7 @@ add_partial_symbol (struct partial_die_info *pdi, struct dwarf2_cu *cu) built_actual_name != NULL, VAR_DOMAIN, LOC_TYPEDEF, &objfile->static_psymbols, - 0, (CORE_ADDR) 0, cu->language, objfile); + 0, cu->language, objfile); break; case DW_TAG_imported_declaration: case DW_TAG_namespace: @@ -6987,14 +6998,14 @@ add_partial_symbol (struct partial_die_info *pdi, struct dwarf2_cu *cu) built_actual_name != NULL, VAR_DOMAIN, LOC_TYPEDEF, &objfile->global_psymbols, - 0, (CORE_ADDR) 0, cu->language, objfile); + 0, cu->language, objfile); break; case DW_TAG_module: add_psymbol_to_list (actual_name, strlen (actual_name), built_actual_name != NULL, MODULE_DOMAIN, LOC_TYPEDEF, &objfile->global_psymbols, - 0, (CORE_ADDR) 0, cu->language, objfile); + 0, cu->language, objfile); break; case DW_TAG_class_type: case DW_TAG_interface_type: @@ -7021,7 +7032,7 @@ add_partial_symbol (struct partial_die_info *pdi, struct dwarf2_cu *cu) || cu->language == language_java) ? &objfile->global_psymbols : &objfile->static_psymbols, - 0, (CORE_ADDR) 0, cu->language, objfile); + 0, cu->language, objfile); break; case DW_TAG_enumerator: @@ -7032,7 +7043,7 @@ add_partial_symbol (struct partial_die_info *pdi, struct dwarf2_cu *cu) || cu->language == language_java) ? &objfile->global_psymbols : &objfile->static_psymbols, - 0, (CORE_ADDR) 0, cu->language, objfile); + 0, cu->language, objfile); break; default: break; @@ -7409,7 +7420,9 @@ dwarf2_read_symtab (struct partial_symtab *self, } /* Restore our global data. */ - dwarf2_per_objfile = objfile_data (objfile, dwarf2_objfile_data_key); + dwarf2_per_objfile + = (struct dwarf2_per_objfile *) objfile_data (objfile, + dwarf2_objfile_data_key); /* If this psymtab is constructed from a debug-only objfile, the has_section_at_zero flag will not necessarily be correct. We @@ -7418,8 +7431,9 @@ dwarf2_read_symtab (struct partial_symtab *self, if (objfile->separate_debug_objfile_backlink) { struct dwarf2_per_objfile *dpo_backlink - = objfile_data (objfile->separate_debug_objfile_backlink, - dwarf2_objfile_data_key); + = ((struct dwarf2_per_objfile *) + objfile_data (objfile->separate_debug_objfile_backlink, + dwarf2_objfile_data_key)); dwarf2_per_objfile->has_section_at_zero = dpo_backlink->has_section_at_zero; @@ -7448,7 +7462,7 @@ queue_comp_unit (struct dwarf2_per_cu_data *per_cu, struct dwarf2_queue_item *item; per_cu->queued = 1; - item = xmalloc (sizeof (*item)); + item = XNEW (struct dwarf2_queue_item); item->per_cu = per_cu; item->pretend_language = pretend_language; item->next = NULL; @@ -7515,7 +7529,7 @@ process_queue (void) { struct dwarf2_queue_item *item, *next_item; - if (dwarf2_read_debug) + if (dwarf_read_debug) { fprintf_unfiltered (gdb_stdlog, "Expanding one or more symtabs of objfile %s ...\n", @@ -7526,9 +7540,11 @@ process_queue (void) may load a new CU, adding it to the end of the queue. */ for (item = dwarf2_queue; item != NULL; dwarf2_queue = item = next_item) { - if (dwarf2_per_objfile->using_index - ? !item->per_cu->v.quick->compunit_symtab - : (item->per_cu->v.psymtab && !item->per_cu->v.psymtab->readin)) + if ((dwarf2_per_objfile->using_index + ? !item->per_cu->v.quick->compunit_symtab + : (item->per_cu->v.psymtab && !item->per_cu->v.psymtab->readin)) + /* Skip dummy CUs. */ + && item->per_cu->cu != NULL) { struct dwarf2_per_cu_data *per_cu = item->per_cu; unsigned int debug_print_threshold; @@ -7552,7 +7568,7 @@ process_queue (void) debug_print_threshold = 1; } - if (dwarf2_read_debug >= debug_print_threshold) + if (dwarf_read_debug >= debug_print_threshold) fprintf_unfiltered (gdb_stdlog, "Expanding symtab of %s\n", buf); if (per_cu->is_debug_types) @@ -7560,7 +7576,7 @@ process_queue (void) else process_full_comp_unit (per_cu, item->pretend_language); - if (dwarf2_read_debug >= debug_print_threshold) + if (dwarf_read_debug >= debug_print_threshold) fprintf_unfiltered (gdb_stdlog, "Done expanding %s\n", buf); } @@ -7571,7 +7587,7 @@ process_queue (void) dwarf2_queue_tail = NULL; - if (dwarf2_read_debug) + if (dwarf_read_debug) { fprintf_unfiltered (gdb_stdlog, "Done expanding symtabs of %s.\n", objfile_name (dwarf2_per_objfile->objfile)); @@ -7637,7 +7653,7 @@ psymtab_to_symtab_1 (struct partial_symtab *pst) psymtab_to_symtab_1 (pst->dependencies[i]); } - per_cu = pst->read_symtab_private; + per_cu = (struct dwarf2_per_cu_data *) pst->read_symtab_private; if (per_cu == NULL) { @@ -7656,7 +7672,7 @@ psymtab_to_symtab_1 (struct partial_symtab *pst) static hashval_t die_hash (const void *item) { - const struct die_info *die = item; + const struct die_info *die = (const struct die_info *) item; return die->offset.sect_off; } @@ -7667,8 +7683,8 @@ die_hash (const void *item) static int 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; + const struct die_info *die_lhs = (const struct die_info *) item_lhs; + const struct die_info *die_rhs = (const struct die_info *) item_rhs; return die_lhs->offset.sect_off == die_rhs->offset.sect_off; } @@ -7685,7 +7701,7 @@ load_full_comp_unit_reader (const struct die_reader_specs *reader, void *data) { struct dwarf2_cu *cu = reader->cu; - enum language *language_ptr = data; + enum language *language_ptr = (enum language *) data; gdb_assert (cu->die_hash == NULL); cu->die_hash = @@ -7828,9 +7844,9 @@ fixup_go_packaging (struct dwarf2_cu *cu) { struct objfile *objfile = cu->objfile; const char *saved_package_name - = obstack_copy0 (&objfile->per_bfd->storage_obstack, - package_name, - strlen (package_name)); + = (const char *) obstack_copy0 (&objfile->per_bfd->storage_obstack, + package_name, + strlen (package_name)); struct type *type = init_type (TYPE_CODE_MODULE, 0, 0, saved_package_name, objfile); struct symbol *sym; @@ -7959,8 +7975,8 @@ compute_compunit_symtab_includes (struct dwarf2_per_cu_data *per_cu) /* Now we have a transitive closure of all the included symtabs. */ len = VEC_length (compunit_symtab_ptr, result_symtabs); cust->includes - = obstack_alloc (&dwarf2_per_objfile->objfile->objfile_obstack, - (len + 1) * sizeof (struct symtab *)); + = XOBNEWVEC (&dwarf2_per_objfile->objfile->objfile_obstack, + struct compunit_symtab *, len + 1); for (ix = 0; VEC_iterate (compunit_symtab_ptr, result_symtabs, ix, compunit_symtab_iter); @@ -8062,7 +8078,7 @@ process_full_comp_unit (struct dwarf2_per_cu_data *per_cu, compilation is from a C file generated by language preprocessors, do not set the language if it was already deduced by start_subfile. */ if (!(cu->language == language_c - && COMPUNIT_FILETABS (cust)->language != language_c)) + && COMPUNIT_FILETABS (cust)->language != language_unknown)) COMPUNIT_FILETABS (cust)->language = cu->language; /* GCC-4.0 has started to support -fvar-tracking. GCC-3.x still can @@ -8218,7 +8234,7 @@ process_imported_unit_die (struct die_info *die, struct dwarf2_cu *cu) static void reset_die_in_process (void *arg) { - struct die_info *die = arg; + struct die_info *die = (struct die_info *) arg; die->in_process = 0; } @@ -8349,6 +8365,7 @@ die_needs_namespace (struct die_info *die, struct dwarf2_cu *cu) case DW_TAG_enumeration_type: case DW_TAG_enumerator: case DW_TAG_subprogram: + case DW_TAG_inlined_subroutine: case DW_TAG_member: case DW_TAG_imported_declaration: return 1; @@ -8423,8 +8440,13 @@ dwarf2_compute_name (const char *name, if (name == NULL) name = dwarf2_name (die, cu); - /* For Fortran GDB prefers DW_AT_*linkage_name if present but otherwise - compute it by typename_concat inside GDB. */ + /* For Fortran GDB prefers DW_AT_*linkage_name for the physname if present + but otherwise compute it by typename_concat inside GDB. + FIXME: Actually this is not really true, or at least not always true. + It's all very confusing. SYMBOL_SET_NAMES doesn't try to demangle + Fortran names because there is no mangling standard. So new_symbol_full + will set the demangled name to the result of dwarf2_full_name, and it is + the demangled name that GDB uses if it exists. */ if (cu->language == language_ada || (cu->language == language_fortran && physname)) { @@ -8433,19 +8455,19 @@ dwarf2_compute_name (const char *name, 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; + const char *linkage_name; - 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)) - return DW_STRING (attr); + linkage_name = dwarf2_string_attr (die, DW_AT_linkage_name, cu); + if (linkage_name == NULL) + linkage_name = dwarf2_string_attr (die, DW_AT_MIPS_linkage_name, cu); + if (linkage_name != NULL) + return linkage_name; } /* These are the only languages we know how to qualify names in. */ if (name != NULL && (cu->language == language_cplus || cu->language == language_java - || cu->language == language_fortran)) + || cu->language == language_fortran || cu->language == language_d)) { if (die_needs_namespace (die, cu)) { @@ -8642,9 +8664,10 @@ dwarf2_compute_name (const char *name, INTERMEDIATE_NAME is already canonical, then we need to copy it to the appropriate obstack. */ if (canonical_name == NULL || canonical_name == intermediate_name) - name = obstack_copy0 (&objfile->per_bfd->storage_obstack, - intermediate_name, - strlen (intermediate_name)); + name = ((const char *) + obstack_copy0 (&objfile->per_bfd->storage_obstack, + intermediate_name, + strlen (intermediate_name))); else name = canonical_name; @@ -8692,18 +8715,16 @@ dwarf2_physname (const char *name, struct die_info *die, struct dwarf2_cu *cu) back_to = make_cleanup (null_cleanup, NULL); - attr = dwarf2_attr (die, DW_AT_linkage_name, cu); - if (!attr) - attr = dwarf2_attr (die, DW_AT_MIPS_linkage_name, cu); + mangled = dwarf2_string_attr (die, DW_AT_linkage_name, cu); + if (mangled == NULL) + mangled = dwarf2_string_attr (die, DW_AT_MIPS_linkage_name, cu); /* DW_AT_linkage_name is missing in some cases - depend on what GDB has computed. */ - if (attr && DW_STRING (attr)) + if (mangled != NULL) { char *demangled; - mangled = DW_STRING (attr); - /* Use DMGL_RET_DROP for C++ template functions to suppress their return type. It is easier for GDB users to search for such functions as `name(params)' than `long name(params)'. In such case the minimal @@ -8772,8 +8793,9 @@ dwarf2_physname (const char *name, struct die_info *die, struct dwarf2_cu *cu) retval = canon; if (need_copy) - retval = obstack_copy0 (&objfile->per_bfd->storage_obstack, - retval, strlen (retval)); + retval = ((const char *) + obstack_copy0 (&objfile->per_bfd->storage_obstack, + retval, strlen (retval))); do_cleanups (back_to); return retval; @@ -8839,6 +8861,24 @@ read_namespace_alias (struct die_info *die, struct dwarf2_cu *cu) return 0; } +/* Return the using directives repository (global or local?) to use in the + current context for LANGUAGE. + + For Ada, imported declarations can materialize renamings, which *may* be + global. However it is impossible (for now?) in DWARF to distinguish + "external" imported declarations and "static" ones. As all imported + declarations seem to be static in all other languages, make them all CU-wide + global only in Ada. */ + +static struct using_direct ** +using_directives (enum language language) +{ + if (language == language_ada && context_stack_depth == 0) + return &global_using_directives; + else + return &local_using_directives; +} + /* Read the import statement specified by the given die and record it. */ static void @@ -8923,8 +8963,9 @@ read_import_statement (struct die_info *die, struct dwarf2_cu *cu) } else if (strlen (imported_name_prefix) > 0) canonical_name = obconcat (&objfile->objfile_obstack, - imported_name_prefix, "::", imported_name, - (char *) NULL); + imported_name_prefix, + (cu->language == language_d ? "." : "::"), + imported_name, (char *) NULL); else canonical_name = imported_name; @@ -8974,13 +9015,14 @@ read_import_statement (struct die_info *die, struct dwarf2_cu *cu) process_die (child_die, cu); } - cp_add_using_directive (import_prefix, - canonical_name, - import_alias, - imported_declaration, - excludes, - 0, - &objfile->objfile_obstack); + add_using_directive (using_directives (cu->language), + import_prefix, + canonical_name, + import_alias, + imported_declaration, + excludes, + 0, + &objfile->objfile_obstack); do_cleanups (cleanups); } @@ -8990,7 +9032,7 @@ read_import_statement (struct die_info *die, struct dwarf2_cu *cu) static void free_cu_line_header (void *arg) { - struct dwarf2_cu *cu = arg; + struct dwarf2_cu *cu = (struct dwarf2_cu *) arg; free_line_header (cu->line_header); cu->line_header = NULL; @@ -9013,24 +9055,14 @@ static void find_file_and_directory (struct die_info *die, struct dwarf2_cu *cu, const char **name, const char **comp_dir) { - struct attribute *attr; - - *name = NULL; - *comp_dir = NULL; - /* Find the filename. Do not use dwarf2_name here, since the filename is not a source language identifier. */ - attr = dwarf2_attr (die, DW_AT_name, cu); - if (attr) - { - *name = DW_STRING (attr); - } + *name = dwarf2_string_attr (die, DW_AT_name, cu); + *comp_dir = dwarf2_string_attr (die, DW_AT_comp_dir, cu); - attr = dwarf2_attr (die, DW_AT_comp_dir, cu); - if (attr) - *comp_dir = DW_STRING (attr); - else if (producer_is_gcc_lt_4_3 (cu) && *name != NULL - && IS_ABSOLUTE_PATH (*name)) + if (*comp_dir == NULL + && producer_is_gcc_lt_4_3 (cu) && *name != NULL + && IS_ABSOLUTE_PATH (*name)) { char *d = ldirname (*name); @@ -9042,7 +9074,7 @@ find_file_and_directory (struct die_info *die, struct dwarf2_cu *cu, { /* Irix 6.2 native cc prepends .: to the compilation directory, get rid of it. */ - char *cp = strchr (*comp_dir, ':'); + const char *cp = strchr (*comp_dir, ':'); if (cp && cp != *comp_dir && cp[-1] == '.' && cp[1] == '/') *comp_dir = cp + 1; @@ -9111,7 +9143,7 @@ handle_DW_AT_stmt_list (struct die_info *die, struct dwarf2_cu *cu, if (die->tag == DW_TAG_partial_unit && slot != NULL) { gdb_assert (*slot != NULL); - cu->line_header = *slot; + cu->line_header = (struct line_header *) *slot; return; } } @@ -9300,6 +9332,11 @@ setup_type_unit_groups (struct die_info *die, struct dwarf2_cu *cu) { struct compunit_symtab *cust = dwarf2_start_symtab (cu, "", NULL, 0); + /* Note: We don't assign tu_group->compunit_symtab yet because we're + still initializing it, and our caller (a few levels up) + process_full_type_unit still needs to know if this is the first + time. */ + tu_group->num_symtabs = lh->num_file_names; tu_group->symtabs = XNEWVEC (struct symtab *, lh->num_file_names); @@ -9308,7 +9345,7 @@ setup_type_unit_groups (struct die_info *die, struct dwarf2_cu *cu) const char *dir = NULL; struct file_entry *fe = &lh->file_names[i]; - if (fe->dir_index) + if (fe->dir_index && lh->include_dirs != NULL) dir = lh->include_dirs[fe->dir_index - 1]; dwarf2_start_subfile (fe->name, dir); @@ -9385,7 +9422,7 @@ read_type_unit_scope (struct die_info *die, struct dwarf2_cu *cu) static hashval_t hash_dwo_file (const void *item) { - const struct dwo_file *dwo_file = item; + const struct dwo_file *dwo_file = (const struct dwo_file *) item; hashval_t hash; hash = htab_hash_string (dwo_file->dwo_name); @@ -9397,8 +9434,8 @@ hash_dwo_file (const void *item) static int eq_dwo_file (const void *item_lhs, const void *item_rhs) { - const struct dwo_file *lhs = item_lhs; - const struct dwo_file *rhs = item_rhs; + const struct dwo_file *lhs = (const struct dwo_file *) item_lhs; + const struct dwo_file *rhs = (const struct dwo_file *) item_rhs; if (strcmp (lhs->dwo_name, rhs->dwo_name) != 0) return 0; @@ -9445,7 +9482,7 @@ lookup_dwo_file_slot (const char *dwo_name, const char *comp_dir) static hashval_t hash_dwo_unit (const void *item) { - const struct dwo_unit *dwo_unit = item; + const struct dwo_unit *dwo_unit = (const struct dwo_unit *) item; /* This drops the top 32 bits of the id, but is ok for a hash. */ return dwo_unit->signature; @@ -9454,8 +9491,8 @@ hash_dwo_unit (const void *item) static int eq_dwo_unit (const void *item_lhs, const void *item_rhs) { - const struct dwo_unit *lhs = item_lhs; - const struct dwo_unit *rhs = item_rhs; + const struct dwo_unit *lhs = (const struct dwo_unit *) item_lhs; + const struct dwo_unit *rhs = (const struct dwo_unit *) item_rhs; /* The signature is assumed to be unique within the DWO file. So while object file CU dwo_id's always have the value zero, @@ -9502,7 +9539,7 @@ create_dwo_cu_reader (const struct die_reader_specs *reader, struct objfile *objfile = dwarf2_per_objfile->objfile; sect_offset offset = cu->per_cu->offset; struct dwarf2_section_info *section = cu->per_cu->section; - struct create_dwo_cu_data *data = datap; + struct create_dwo_cu_data *data = (struct create_dwo_cu_data *) datap; struct dwo_file *dwo_file = data->dwo_file; struct dwo_unit *dwo_unit = &data->dwo_unit; struct attribute *attr; @@ -9523,7 +9560,7 @@ create_dwo_cu_reader (const struct die_reader_specs *reader, dwo_unit->offset = offset; dwo_unit->length = cu->per_cu->length; - if (dwarf2_read_debug) + if (dwarf_read_debug) fprintf_unfiltered (gdb_stdlog, " offset 0x%x, dwo_id %s\n", offset.sect_off, hex_string (dwo_unit->signature)); } @@ -9552,7 +9589,7 @@ create_dwo_cu (struct dwo_file *dwo_file) not present, in which case section->asection will be NULL. */ abfd = get_section_bfd_owner (section); - if (dwarf2_read_debug) + if (dwarf_read_debug) { fprintf_unfiltered (gdb_stdlog, "Reading %s for %s:\n", get_section_name (section), @@ -9908,58 +9945,58 @@ locate_v1_virtual_dwo_sections (asection *sectp, if (section_is_p (sectp->name, &names->abbrev_dwo)) { /* There can be only one. */ - if (sections->abbrev.s.asection != NULL) + if (sections->abbrev.s.section != NULL) return 0; - sections->abbrev.s.asection = sectp; + sections->abbrev.s.section = sectp; sections->abbrev.size = bfd_get_section_size (sectp); } else if (section_is_p (sectp->name, &names->info_dwo) || section_is_p (sectp->name, &names->types_dwo)) { /* There can be only one. */ - if (sections->info_or_types.s.asection != NULL) + if (sections->info_or_types.s.section != NULL) return 0; - sections->info_or_types.s.asection = sectp; + sections->info_or_types.s.section = sectp; sections->info_or_types.size = bfd_get_section_size (sectp); } else if (section_is_p (sectp->name, &names->line_dwo)) { /* There can be only one. */ - if (sections->line.s.asection != NULL) + if (sections->line.s.section != NULL) return 0; - sections->line.s.asection = sectp; + sections->line.s.section = sectp; sections->line.size = bfd_get_section_size (sectp); } else if (section_is_p (sectp->name, &names->loc_dwo)) { /* There can be only one. */ - if (sections->loc.s.asection != NULL) + if (sections->loc.s.section != NULL) return 0; - sections->loc.s.asection = sectp; + sections->loc.s.section = sectp; sections->loc.size = bfd_get_section_size (sectp); } else if (section_is_p (sectp->name, &names->macinfo_dwo)) { /* There can be only one. */ - if (sections->macinfo.s.asection != NULL) + if (sections->macinfo.s.section != NULL) return 0; - sections->macinfo.s.asection = sectp; + sections->macinfo.s.section = sectp; sections->macinfo.size = bfd_get_section_size (sectp); } else if (section_is_p (sectp->name, &names->macro_dwo)) { /* There can be only one. */ - if (sections->macro.s.asection != NULL) + if (sections->macro.s.section != NULL) return 0; - sections->macro.s.asection = sectp; + sections->macro.s.section = sectp; sections->macro.size = bfd_get_section_size (sectp); } else if (section_is_p (sectp->name, &names->str_offsets_dwo)) { /* There can be only one. */ - if (sections->str_offsets.s.asection != NULL) + if (sections->str_offsets.s.section != NULL) return 0; - sections->str_offsets.s.asection = sectp; + sections->str_offsets.s.section = sectp; sections->str_offsets.size = bfd_get_section_size (sectp); } else @@ -9998,7 +10035,7 @@ create_dwo_unit_in_dwp_v1 (struct dwp_file *dwp_file, gdb_assert (dwp_file->version == 1); - if (dwarf2_read_debug) + if (dwarf_read_debug) { fprintf_unfiltered (gdb_stdlog, "Reading %s %s/%s in DWP V1 file: %s\n", kind, @@ -10084,15 +10121,16 @@ create_dwo_unit_in_dwp_v1 (struct dwp_file *dwp_file, /* Create one if necessary. */ if (*dwo_file_slot == NULL) { - if (dwarf2_read_debug) + if (dwarf_read_debug) { fprintf_unfiltered (gdb_stdlog, "Creating virtual DWO: %s\n", virtual_dwo_name); } dwo_file = OBSTACK_ZALLOC (&objfile->objfile_obstack, struct dwo_file); - dwo_file->dwo_name = obstack_copy0 (&objfile->objfile_obstack, - virtual_dwo_name, - strlen (virtual_dwo_name)); + dwo_file->dwo_name + = (const char *) obstack_copy0 (&objfile->objfile_obstack, + virtual_dwo_name, + strlen (virtual_dwo_name)); dwo_file->comp_dir = comp_dir; dwo_file->sections.abbrev = sections.abbrev; dwo_file->sections.line = sections.line; @@ -10113,20 +10151,20 @@ create_dwo_unit_in_dwp_v1 (struct dwp_file *dwp_file, } else { - if (dwarf2_read_debug) + if (dwarf_read_debug) { fprintf_unfiltered (gdb_stdlog, "Using existing virtual DWO: %s\n", virtual_dwo_name); } - dwo_file = *dwo_file_slot; + dwo_file = (struct dwo_file *) *dwo_file_slot; } do_cleanups (cleanups); dwo_unit = OBSTACK_ZALLOC (&objfile->objfile_obstack, struct dwo_unit); dwo_unit->dwo_file = dwo_file; dwo_unit->signature = signature; - dwo_unit->section = obstack_alloc (&objfile->objfile_obstack, - sizeof (struct dwarf2_section_info)); + dwo_unit->section = + XOBNEW (&objfile->objfile_obstack, struct dwarf2_section_info); *dwo_unit->section = sections.info_or_types; /* dwo_unit->{offset,length,type_offset_in_tu} are set later. */ @@ -10203,7 +10241,7 @@ create_dwo_unit_in_dwp_v2 (struct dwp_file *dwp_file, gdb_assert (dwp_file->version == 2); - if (dwarf2_read_debug) + if (dwarf_read_debug) { fprintf_unfiltered (gdb_stdlog, "Reading %s %s/%s in DWP V2 file: %s\n", kind, @@ -10285,15 +10323,16 @@ create_dwo_unit_in_dwp_v2 (struct dwp_file *dwp_file, /* Create one if necessary. */ if (*dwo_file_slot == NULL) { - if (dwarf2_read_debug) + if (dwarf_read_debug) { fprintf_unfiltered (gdb_stdlog, "Creating virtual DWO: %s\n", virtual_dwo_name); } dwo_file = OBSTACK_ZALLOC (&objfile->objfile_obstack, struct dwo_file); - dwo_file->dwo_name = obstack_copy0 (&objfile->objfile_obstack, - virtual_dwo_name, - strlen (virtual_dwo_name)); + dwo_file->dwo_name + = (const char *) obstack_copy0 (&objfile->objfile_obstack, + virtual_dwo_name, + strlen (virtual_dwo_name)); dwo_file->comp_dir = comp_dir; dwo_file->sections.abbrev = create_dwp_v2_section (&dwp_file->sections.abbrev, @@ -10327,20 +10366,20 @@ create_dwo_unit_in_dwp_v2 (struct dwp_file *dwp_file, } else { - if (dwarf2_read_debug) + if (dwarf_read_debug) { fprintf_unfiltered (gdb_stdlog, "Using existing virtual DWO: %s\n", virtual_dwo_name); } - dwo_file = *dwo_file_slot; + dwo_file = (struct dwo_file *) *dwo_file_slot; } do_cleanups (cleanups); dwo_unit = OBSTACK_ZALLOC (&objfile->objfile_obstack, struct dwo_unit); dwo_unit->dwo_file = dwo_file; dwo_unit->signature = signature; - dwo_unit->section = obstack_alloc (&objfile->objfile_obstack, - sizeof (struct dwarf2_section_info)); + dwo_unit->section = + XOBNEW (&objfile->objfile_obstack, struct dwarf2_section_info); *dwo_unit->section = create_dwp_v2_section (is_debug_types ? &dwp_file->sections.types : &dwp_file->sections.info, @@ -10376,7 +10415,7 @@ lookup_dwo_unit_in_dwp (struct dwp_file *dwp_file, const char *comp_dir, &find_dwo_cu, INSERT); if (*slot != NULL) - return *slot; + return (struct dwo_unit *) *slot; /* Use a for loop so that we don't loop forever on bad debug info. */ for (i = 0; i < dwp_htab->nr_slots; ++i) @@ -10403,7 +10442,7 @@ lookup_dwo_unit_in_dwp (struct dwp_file *dwp_file, const char *comp_dir, comp_dir, signature, is_debug_types); } - return *slot; + return (struct dwo_unit *) *slot; } if (signature_in_table == 0) return NULL; @@ -10524,47 +10563,47 @@ open_dwo_file (const char *file_name, const char *comp_dir) static void dwarf2_locate_dwo_sections (bfd *abfd, asection *sectp, void *dwo_sections_ptr) { - struct dwo_sections *dwo_sections = dwo_sections_ptr; + struct dwo_sections *dwo_sections = (struct dwo_sections *) dwo_sections_ptr; const struct dwop_section_names *names = &dwop_section_names; if (section_is_p (sectp->name, &names->abbrev_dwo)) { - dwo_sections->abbrev.s.asection = sectp; + dwo_sections->abbrev.s.section = sectp; dwo_sections->abbrev.size = bfd_get_section_size (sectp); } else if (section_is_p (sectp->name, &names->info_dwo)) { - dwo_sections->info.s.asection = sectp; + dwo_sections->info.s.section = sectp; dwo_sections->info.size = bfd_get_section_size (sectp); } else if (section_is_p (sectp->name, &names->line_dwo)) { - dwo_sections->line.s.asection = sectp; + dwo_sections->line.s.section = sectp; dwo_sections->line.size = bfd_get_section_size (sectp); } else if (section_is_p (sectp->name, &names->loc_dwo)) { - dwo_sections->loc.s.asection = sectp; + dwo_sections->loc.s.section = sectp; dwo_sections->loc.size = bfd_get_section_size (sectp); } else if (section_is_p (sectp->name, &names->macinfo_dwo)) { - dwo_sections->macinfo.s.asection = sectp; + dwo_sections->macinfo.s.section = sectp; dwo_sections->macinfo.size = bfd_get_section_size (sectp); } else if (section_is_p (sectp->name, &names->macro_dwo)) { - dwo_sections->macro.s.asection = sectp; + dwo_sections->macro.s.section = sectp; dwo_sections->macro.size = bfd_get_section_size (sectp); } else if (section_is_p (sectp->name, &names->str_dwo)) { - dwo_sections->str.s.asection = sectp; + dwo_sections->str.s.section = sectp; dwo_sections->str.size = bfd_get_section_size (sectp); } else if (section_is_p (sectp->name, &names->str_offsets_dwo)) { - dwo_sections->str_offsets.s.asection = sectp; + dwo_sections->str_offsets.s.section = sectp; dwo_sections->str_offsets.size = bfd_get_section_size (sectp); } else if (section_is_p (sectp->name, &names->types_dwo)) @@ -10572,7 +10611,7 @@ dwarf2_locate_dwo_sections (bfd *abfd, asection *sectp, void *dwo_sections_ptr) struct dwarf2_section_info type_section; memset (&type_section, 0, sizeof (type_section)); - type_section.s.asection = sectp; + type_section.s.section = sectp; type_section.size = bfd_get_section_size (sectp); VEC_safe_push (dwarf2_section_info_def, dwo_sections->types, &type_section); @@ -10595,7 +10634,7 @@ open_and_init_dwo_file (struct dwarf2_per_cu_data *per_cu, dbfd = open_dwo_file (dwo_name, comp_dir); if (dbfd == NULL) { - if (dwarf2_read_debug) + if (dwarf_read_debug) fprintf_unfiltered (gdb_stdlog, "DWO file not found: %s\n", dwo_name); return NULL; } @@ -10615,7 +10654,7 @@ open_and_init_dwo_file (struct dwarf2_per_cu_data *per_cu, discard_cleanups (cleanups); - if (dwarf2_read_debug) + if (dwarf_read_debug) fprintf_unfiltered (gdb_stdlog, "DWO file found: %s\n", dwo_name); return dwo_file; @@ -10629,7 +10668,7 @@ static void dwarf2_locate_common_dwp_sections (bfd *abfd, asection *sectp, void *dwp_file_ptr) { - struct dwp_file *dwp_file = dwp_file_ptr; + struct dwp_file *dwp_file = (struct dwp_file *) dwp_file_ptr; const struct dwop_section_names *names = &dwop_section_names; unsigned int elf_section_nr = elf_section_data (sectp)->this_idx; @@ -10641,17 +10680,17 @@ dwarf2_locate_common_dwp_sections (bfd *abfd, asection *sectp, /* Look for specific sections that we need. */ if (section_is_p (sectp->name, &names->str_dwo)) { - dwp_file->sections.str.s.asection = sectp; + dwp_file->sections.str.s.section = sectp; dwp_file->sections.str.size = bfd_get_section_size (sectp); } else if (section_is_p (sectp->name, &names->cu_index)) { - dwp_file->sections.cu_index.s.asection = sectp; + dwp_file->sections.cu_index.s.section = sectp; dwp_file->sections.cu_index.size = bfd_get_section_size (sectp); } else if (section_is_p (sectp->name, &names->tu_index)) { - dwp_file->sections.tu_index.s.asection = sectp; + dwp_file->sections.tu_index.s.section = sectp; dwp_file->sections.tu_index.size = bfd_get_section_size (sectp); } } @@ -10664,7 +10703,7 @@ dwarf2_locate_common_dwp_sections (bfd *abfd, asection *sectp, static void dwarf2_locate_v2_dwp_sections (bfd *abfd, asection *sectp, void *dwp_file_ptr) { - struct dwp_file *dwp_file = dwp_file_ptr; + struct dwp_file *dwp_file = (struct dwp_file *) dwp_file_ptr; const struct dwop_section_names *names = &dwop_section_names; unsigned int elf_section_nr = elf_section_data (sectp)->this_idx; @@ -10676,42 +10715,42 @@ dwarf2_locate_v2_dwp_sections (bfd *abfd, asection *sectp, void *dwp_file_ptr) /* Look for specific sections that we need. */ if (section_is_p (sectp->name, &names->abbrev_dwo)) { - dwp_file->sections.abbrev.s.asection = sectp; + dwp_file->sections.abbrev.s.section = sectp; dwp_file->sections.abbrev.size = bfd_get_section_size (sectp); } else if (section_is_p (sectp->name, &names->info_dwo)) { - dwp_file->sections.info.s.asection = sectp; + dwp_file->sections.info.s.section = sectp; dwp_file->sections.info.size = bfd_get_section_size (sectp); } else if (section_is_p (sectp->name, &names->line_dwo)) { - dwp_file->sections.line.s.asection = sectp; + dwp_file->sections.line.s.section = sectp; dwp_file->sections.line.size = bfd_get_section_size (sectp); } else if (section_is_p (sectp->name, &names->loc_dwo)) { - dwp_file->sections.loc.s.asection = sectp; + dwp_file->sections.loc.s.section = sectp; dwp_file->sections.loc.size = bfd_get_section_size (sectp); } else if (section_is_p (sectp->name, &names->macinfo_dwo)) { - dwp_file->sections.macinfo.s.asection = sectp; + dwp_file->sections.macinfo.s.section = sectp; dwp_file->sections.macinfo.size = bfd_get_section_size (sectp); } else if (section_is_p (sectp->name, &names->macro_dwo)) { - dwp_file->sections.macro.s.asection = sectp; + dwp_file->sections.macro.s.section = sectp; dwp_file->sections.macro.size = bfd_get_section_size (sectp); } else if (section_is_p (sectp->name, &names->str_offsets_dwo)) { - dwp_file->sections.str_offsets.s.asection = sectp; + dwp_file->sections.str_offsets.s.section = sectp; dwp_file->sections.str_offsets.size = bfd_get_section_size (sectp); } else if (section_is_p (sectp->name, &names->types_dwo)) { - dwp_file->sections.types.s.asection = sectp; + dwp_file->sections.types.s.section = sectp; dwp_file->sections.types.size = bfd_get_section_size (sectp); } } @@ -10721,7 +10760,7 @@ dwarf2_locate_v2_dwp_sections (bfd *abfd, asection *sectp, void *dwp_file_ptr) static hashval_t hash_dwp_loaded_cutus (const void *item) { - const struct dwo_unit *dwo_unit = item; + const struct dwo_unit *dwo_unit = (const struct dwo_unit *) item; /* This drops the top 32 bits of the signature, but is ok for a hash. */ return dwo_unit->signature; @@ -10732,8 +10771,8 @@ hash_dwp_loaded_cutus (const void *item) static int eq_dwp_loaded_cutus (const void *a, const void *b) { - const struct dwo_unit *dua = a; - const struct dwo_unit *dub = b; + const struct dwo_unit *dua = (const struct dwo_unit *) a; + const struct dwo_unit *dub = (const struct dwo_unit *) b; return dua->signature == dub->signature; } @@ -10817,7 +10856,7 @@ open_and_init_dwp_file (void) if (dbfd == NULL) { - if (dwarf2_read_debug) + if (dwarf_read_debug) fprintf_unfiltered (gdb_stdlog, "DWP file not found: %s\n", dwp_name); do_cleanups (cleanups); return NULL; @@ -10858,7 +10897,7 @@ open_and_init_dwp_file (void) dwp_file->loaded_cus = allocate_dwp_loaded_cutus_table (objfile); dwp_file->loaded_tus = allocate_dwp_loaded_cutus_table (objfile); - if (dwarf2_read_debug) + if (dwarf_read_debug) { fprintf_unfiltered (gdb_stdlog, "DWP file found: %s\n", dwp_file->name); fprintf_unfiltered (gdb_stdlog, @@ -10929,7 +10968,7 @@ lookup_dwo_cutu (struct dwarf2_per_cu_data *this_unit, if (dwo_cutu != NULL) { - if (dwarf2_read_debug) + if (dwarf_read_debug) { fprintf_unfiltered (gdb_stdlog, "Virtual DWO %s %s found: @%s\n", @@ -10951,7 +10990,7 @@ lookup_dwo_cutu (struct dwarf2_per_cu_data *this_unit, *dwo_file_slot = open_and_init_dwo_file (this_unit, dwo_name, comp_dir); } /* NOTE: This will be NULL if unable to open the file. */ - dwo_file = *dwo_file_slot; + dwo_file = (struct dwo_file *) *dwo_file_slot; if (dwo_file != NULL) { @@ -10963,7 +11002,8 @@ lookup_dwo_cutu (struct dwarf2_per_cu_data *this_unit, memset (&find_dwo_cutu, 0, sizeof (find_dwo_cutu)); find_dwo_cutu.signature = signature; - dwo_cutu = htab_find (dwo_file->tus, &find_dwo_cutu); + dwo_cutu + = (struct dwo_unit *) htab_find (dwo_file->tus, &find_dwo_cutu); } else if (!is_debug_types && dwo_file->cu) { @@ -10973,7 +11013,7 @@ lookup_dwo_cutu (struct dwarf2_per_cu_data *this_unit, if (dwo_cutu != NULL) { - if (dwarf2_read_debug) + if (dwarf_read_debug) { fprintf_unfiltered (gdb_stdlog, "DWO %s %s(%s) found: @%s\n", kind, dwo_name, hex_string (signature), @@ -10988,7 +11028,7 @@ lookup_dwo_cutu (struct dwarf2_per_cu_data *this_unit, someone deleted the DWO/DWP file, or the search path isn't set up correctly to find the file. */ - if (dwarf2_read_debug) + if (dwarf_read_debug) { fprintf_unfiltered (gdb_stdlog, "DWO %s %s(%s) not found\n", kind, dwo_name, hex_string (signature)); @@ -11200,21 +11240,32 @@ inherit_abstract_dies (struct die_info *die, struct dwarf2_cu *cu) child_die = sibling_die (child_die); die_children_count++; } - offsets = xmalloc (sizeof (*offsets) * die_children_count); + offsets = XNEWVEC (sect_offset, die_children_count); cleanups = make_cleanup (xfree, offsets); offsets_end = offsets; - child_die = die->child; - while (child_die && child_die->tag) + for (child_die = die->child; + child_die && child_die->tag; + child_die = sibling_die (child_die)) { + struct die_info *child_origin_die; + struct dwarf2_cu *child_origin_cu; + + /* We are trying to process concrete instance entries: + DW_TAG_GNU_call_site DIEs indeed have a DW_AT_abstract_origin tag, but + it's not relevant to our analysis here. i.e. detecting DIEs that are + present in the abstract instance but not referenced in the concrete + one. */ + if (child_die->tag == DW_TAG_GNU_call_site) + continue; + /* For each CHILD_DIE, find the corresponding child of ORIGIN_DIE. If there is more than one layer of DW_AT_abstract_origin, follow them all; there shouldn't be, but GCC versions at least through 4.4 generate this (GCC PR 40573). */ - struct die_info *child_origin_die = child_die; - struct dwarf2_cu *child_origin_cu = cu; - + child_origin_die = child_die; + child_origin_cu = cu; while (1) { attr = dwarf2_attr (child_origin_die, DW_AT_abstract_origin, @@ -11244,7 +11295,6 @@ inherit_abstract_dies (struct die_info *die, struct dwarf2_cu *cu) else *offsets_end++ = child_origin_die->offset; } - child_die = sibling_die (child_die); } qsort (offsets, offsets_end - offsets, sizeof (*offsets), unsigned_int_compar); @@ -11363,6 +11413,16 @@ read_func_scope (struct die_info *die, struct dwarf2_cu *cu) if (attr) dwarf2_symbol_mark_computed (attr, newobj->name, cu, 1); + /* If there is a location for the static link, record it. */ + newobj->static_link = NULL; + attr = dwarf2_attr (die, DW_AT_static_link, cu); + if (attr) + { + newobj->static_link + = XOBNEW (&objfile->objfile_obstack, struct dynamic_prop); + attr_to_dynamic_prop (attr, die, cu, newobj->static_link); + } + cu->list_in_scope = &local_symbols; if (die->child != NULL) @@ -11414,10 +11474,12 @@ read_func_scope (struct die_info *die, struct dwarf2_cu *cu) newobj = pop_context (); /* Make a block for the local symbols within. */ block = finish_block (newobj->name, &local_symbols, newobj->old_blocks, - lowpc, highpc); + newobj->static_link, lowpc, highpc); /* For C++, set the block's scope. */ - if ((cu->language == language_cplus || cu->language == language_fortran) + if ((cu->language == language_cplus + || cu->language == language_fortran + || cu->language == language_d) && cu->processing_has_namespace_info) block_set_scope (block, determine_prefix (die, cu), &objfile->objfile_obstack); @@ -11434,9 +11496,8 @@ read_func_scope (struct die_info *die, struct dwarf2_cu *cu) templ_func->n_template_arguments = VEC_length (symbolp, template_args); templ_func->template_arguments - = obstack_alloc (&objfile->objfile_obstack, - (templ_func->n_template_arguments - * sizeof (struct symbol *))); + = XOBNEWVEC (&objfile->objfile_obstack, struct symbol *, + templ_func->n_template_arguments); memcpy (templ_func->template_arguments, VEC_address (symbolp, template_args), (templ_func->n_template_arguments * sizeof (struct symbol *))); @@ -11448,7 +11509,7 @@ read_func_scope (struct die_info *die, struct dwarf2_cu *cu) when we finish processing a function scope, we may need to go back to building a containing block's symbol lists. */ local_symbols = newobj->locals; - using_directives = newobj->using_directives; + local_using_directives = newobj->local_using_directives; /* If we've finished processing a top-level function, subsequent symbols go in the file symbol list. */ @@ -11491,12 +11552,13 @@ read_lexical_block_scope (struct die_info *die, struct dwarf2_cu *cu) child_die = sibling_die (child_die); } } + inherit_abstract_dies (die, cu); newobj = pop_context (); - if (local_symbols != NULL || using_directives != NULL) + if (local_symbols != NULL || local_using_directives != NULL) { struct block *block - = finish_block (0, &local_symbols, newobj->old_blocks, + = finish_block (0, &local_symbols, newobj->old_blocks, NULL, newobj->start_addr, highpc); /* Note that recording ranges after traversing children, as we @@ -11512,7 +11574,7 @@ read_lexical_block_scope (struct die_info *die, struct dwarf2_cu *cu) dwarf2_record_block_ranges (die, block, baseaddr, cu); } local_symbols = newobj->locals; - using_directives = newobj->using_directives; + local_using_directives = newobj->local_using_directives; } /* Read in DW_TAG_GNU_call_site and insert it to CU->call_site_htab. */ @@ -11578,10 +11640,11 @@ read_call_site_scope (struct die_info *die, struct dwarf2_cu *cu) nparams++; } - call_site = obstack_alloc (&objfile->objfile_obstack, - (sizeof (*call_site) - + (sizeof (*call_site->parameter) - * (nparams - 1)))); + call_site + = ((struct call_site *) + obstack_alloc (&objfile->objfile_obstack, + sizeof (*call_site) + + (sizeof (*call_site->parameter) * (nparams - 1)))); *slot = call_site; memset (call_site, 0, sizeof (*call_site) - sizeof (*call_site->parameter)); call_site->pc = pc; @@ -11643,7 +11706,7 @@ read_call_site_scope (struct die_info *die, struct dwarf2_cu *cu) { struct dwarf2_locexpr_baton *dlbaton; - dlbaton = obstack_alloc (&objfile->objfile_obstack, sizeof (*dlbaton)); + dlbaton = XOBNEW (&objfile->objfile_obstack, struct dwarf2_locexpr_baton); dlbaton->data = DW_BLOCK (attr)->data; dlbaton->size = DW_BLOCK (attr)->size; dlbaton->per_cu = cu->per_cu; @@ -11659,17 +11722,17 @@ read_call_site_scope (struct die_info *die, struct dwarf2_cu *cu) gdb_assert (target_cu->objfile == objfile); if (die_is_declaration (target_die, target_cu)) { - const char *target_physname = NULL; - struct attribute *target_attr; + const char *target_physname; /* Prefer the mangled name; otherwise compute the demangled one. */ - target_attr = dwarf2_attr (target_die, DW_AT_linkage_name, target_cu); - if (target_attr == NULL) - target_attr = dwarf2_attr (target_die, DW_AT_MIPS_linkage_name, - target_cu); - if (target_attr != NULL && DW_STRING (target_attr) != NULL) - target_physname = DW_STRING (target_attr); - else + target_physname = dwarf2_string_attr (target_die, + DW_AT_linkage_name, + target_cu); + if (target_physname == NULL) + target_physname = dwarf2_string_attr (target_die, + DW_AT_MIPS_linkage_name, + target_cu); + if (target_physname == NULL) target_physname = dwarf2_physname (NULL, target_die, target_cu); if (target_physname == NULL) complaint (&symfile_complaints, @@ -11831,7 +11894,6 @@ dwarf2_ranges_read (unsigned offset, CORE_ADDR *low_return, int found_base; unsigned int dummy; const gdb_byte *buffer; - CORE_ADDR marker; int low_set; CORE_ADDR low = 0; CORE_ADDR high = 0; @@ -11850,18 +11912,6 @@ dwarf2_ranges_read (unsigned offset, CORE_ADDR *low_return, } buffer = dwarf2_per_objfile->ranges.buffer + offset; - /* Read in the largest possible address. */ - marker = read_address (obfd, buffer, cu, &dummy); - if ((marker & mask) == mask) - { - /* If we found the largest possible address, then - read the base address. */ - base = read_address (obfd, buffer + addr_size, cu, &dummy); - buffer += 2 * addr_size; - offset += 2 * addr_size; - found_base = 1; - } - low_set = 0; baseaddr = ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile)); @@ -11886,9 +11936,9 @@ dwarf2_ranges_read (unsigned offset, CORE_ADDR *low_return, the base address. Check for a base address here. */ if ((range_beginning & mask) == mask) { - /* If we found the largest possible address, then - read the base address. */ - base = read_address (obfd, buffer + addr_size, cu, &dummy); + /* If we found the largest possible address, then we already + have the base address in range_end. */ + base = range_end; found_base = 1; continue; } @@ -12410,7 +12460,7 @@ dwarf2_add_field (struct field_info *fip, struct die_info *die, const char *fieldname = ""; /* Allocate a new field list entry and link it in. */ - new_field = (struct nextfield *) xmalloc (sizeof (struct nextfield)); + new_field = XNEW (struct nextfield); make_cleanup (xfree, new_field); memset (new_field, 0, sizeof (struct nextfield)); @@ -12596,7 +12646,7 @@ dwarf2_add_typedef (struct field_info *fip, struct die_info *die, char *fieldname = ""; /* Allocate a new field list entry and link it in. */ - new_field = xzalloc (sizeof (*new_field)); + new_field = XCNEW (struct typedef_field_list); make_cleanup (xfree, new_field); gdb_assert (die->tag == DW_TAG_typedef); @@ -12655,7 +12705,7 @@ dwarf2_attach_fields_to_type (struct field_info *fip, struct type *type, unsigned char *pointer; ALLOCATE_CPLUS_STRUCT_TYPE (type); - pointer = TYPE_ALLOC (type, num_bytes); + pointer = (unsigned char *) TYPE_ALLOC (type, num_bytes); TYPE_FIELD_VIRTUAL_BITS (type) = pointer; B_CLRALL (TYPE_FIELD_VIRTUAL_BITS (type), fip->nbaseclasses); TYPE_N_BASECLASSES (type) = fip->nbaseclasses; @@ -12800,7 +12850,7 @@ dwarf2_add_member_fn (struct field_info *fip, struct die_info *die, /* Create a new member function field and chain it to the field list entry. */ - new_fnfield = (struct nextfnfield *) xmalloc (sizeof (struct nextfnfield)); + new_fnfield = XNEW (struct nextfnfield); make_cleanup (xfree, new_fnfield); memset (new_fnfield, 0, sizeof (struct nextfnfield)); new_fnfield->next = flp->head; @@ -12859,7 +12909,7 @@ dwarf2_add_member_fn (struct field_info *fip, struct die_info *die, /* Get accessibility. */ attr = dwarf2_attr (die, DW_AT_accessibility, cu); if (attr) - accessibility = DW_UNSND (attr); + accessibility = (enum dwarf_access_attribute) DW_UNSND (attr); else accessibility = dwarf2_default_access_attribute (die, cu); switch (accessibility) @@ -12918,7 +12968,24 @@ dwarf2_add_member_fn (struct field_info *fip, struct die_info *die, dwarf2_complex_location_expr_complaint (); if (!fnp->fcontext) - fnp->fcontext = TYPE_TARGET_TYPE (TYPE_FIELD_TYPE (this_type, 0)); + { + /* If there is no `this' field and no DW_AT_containing_type, + we cannot actually find a base class context for the + vtable! */ + if (TYPE_NFIELDS (this_type) == 0 + || !TYPE_FIELD_ARTIFICIAL (this_type, 0)) + { + complaint (&symfile_complaints, + _("cannot determine context for virtual member " + "function \"%s\" (offset %d)"), + fieldname, die->offset.sect_off); + } + else + { + fnp->fcontext + = TYPE_TARGET_TYPE (TYPE_FIELD_TYPE (this_type, 0)); + } + } } else if (attr_form_is_section_offset (attr)) { @@ -13094,7 +13161,8 @@ read_structure_type (struct die_info *die, struct dwarf2_cu *cu) if (name != NULL) { if (cu->language == language_cplus - || cu->language == language_java) + || cu->language == language_java + || cu->language == language_d) { const char *full_name = dwarf2_full_name (name, die, cu); @@ -13137,7 +13205,20 @@ read_structure_type (struct die_info *die, struct dwarf2_cu *cu) attr = dwarf2_attr (die, DW_AT_byte_size, cu); if (attr) { - TYPE_LENGTH (type) = DW_UNSND (attr); + if (attr_form_is_constant (attr)) + TYPE_LENGTH (type) = DW_UNSND (attr); + else + { + /* For the moment, dynamic type sizes are not supported + by GDB's struct type. The actual size is determined + on-demand when resolving the type of a given object, + so set the type's length to zero for now. Otherwise, + we record an expression as the length, and that expression + could lead to a very large value, which could eventually + lead to us trying to allocate that much memory when creating + a value of that type. */ + TYPE_LENGTH (type) = 0; + } } else { @@ -13239,9 +13320,9 @@ process_structure_scope (struct die_info *die, struct dwarf2_cu *cu) TYPE_N_TEMPLATE_ARGUMENTS (type) = VEC_length (symbolp, template_args); TYPE_TEMPLATE_ARGUMENTS (type) - = obstack_alloc (&objfile->objfile_obstack, - (TYPE_N_TEMPLATE_ARGUMENTS (type) - * sizeof (struct symbol *))); + = XOBNEWVEC (&objfile->objfile_obstack, + struct symbol *, + TYPE_N_TEMPLATE_ARGUMENTS (type)); memcpy (TYPE_TEMPLATE_ARGUMENTS (type), VEC_address (symbolp, template_args), (TYPE_N_TEMPLATE_ARGUMENTS (type) @@ -13328,7 +13409,8 @@ process_structure_scope (struct die_info *die, struct dwarf2_cu *cu) ALLOCATE_CPLUS_STRUCT_TYPE (type); TYPE_TYPEDEF_FIELD_ARRAY (type) - = TYPE_ALLOC (type, sizeof (TYPE_TYPEDEF_FIELD (type, 0)) * i); + = ((struct typedef_field *) + TYPE_ALLOC (type, sizeof (TYPE_TYPEDEF_FIELD (type, 0)) * i)); TYPE_TYPEDEF_FIELD_COUNT (type) = i; /* Reverse the list order to keep the debug info elements order. */ @@ -13756,7 +13838,8 @@ read_array_order (struct die_info *die, struct dwarf2_cu *cu) attr = dwarf2_attr (die, DW_AT_ordering, cu); - if (attr) return DW_SND (attr); + if (attr) + return (enum dwarf_array_dim_ordering) DW_SND (attr); /* GNU F77 is a special case, as at 08/2004 array type info is the opposite order to the dwarf2 specification, but data is still @@ -13834,8 +13917,7 @@ mark_common_block_symbol_computed (struct symbol *sym, gdb_assert (attr_form_is_block (member_loc) || attr_form_is_constant (member_loc)); - baton = obstack_alloc (&objfile->objfile_obstack, - sizeof (struct dwarf2_locexpr_baton)); + baton = XOBNEW (&objfile->objfile_obstack, struct dwarf2_locexpr_baton); baton->per_cu = cu->per_cu; gdb_assert (baton->per_cu); @@ -13849,7 +13931,7 @@ mark_common_block_symbol_computed (struct symbol *sym, else baton->size += DW_BLOCK (member_loc)->size; - ptr = obstack_alloc (&objfile->objfile_obstack, baton->size); + ptr = (gdb_byte *) obstack_alloc (&objfile->objfile_obstack, baton->size); baton->data = ptr; *ptr++ = DW_OP_call4; @@ -13925,7 +14007,9 @@ read_common_block (struct die_info *die, struct dwarf2_cu *cu) size = (sizeof (struct common_block) + (n_entries - 1) * sizeof (struct symbol *)); - common_block = obstack_alloc (&objfile->objfile_obstack, size); + common_block + = (struct common_block *) obstack_alloc (&objfile->objfile_obstack, + size); memset (common_block->contents, 0, n_entries * sizeof (struct symbol *)); common_block->n_entries = 0; @@ -14019,7 +14103,7 @@ read_namespace_type (struct die_info *die, struct dwarf2_cu *cu) return set_die_type (die, type, cu); } -/* Read a C++ namespace. */ +/* Read a namespace scope. */ static void read_namespace (struct die_info *die, struct dwarf2_cu *cu) @@ -14043,8 +14127,9 @@ read_namespace (struct die_info *die, struct dwarf2_cu *cu) { const char *previous_prefix = determine_prefix (die, cu); - cp_add_using_directive (previous_prefix, TYPE_NAME (type), NULL, - NULL, NULL, 0, &objfile->objfile_obstack); + add_using_directive (using_directives (cu->language), + previous_prefix, TYPE_NAME (type), NULL, + NULL, NULL, 0, &objfile->objfile_obstack); } } @@ -14120,10 +14205,8 @@ namespace_name (struct die_info *die, int *is_anonymous, struct dwarf2_cu *cu) { /* We don't use dwarf2_name here so that we can detect the absence of a name -> anonymous namespace. */ - struct attribute *attr = dwarf2_attr (die, DW_AT_name, cu); + name = dwarf2_string_attr (die, DW_AT_name, cu); - if (attr != NULL) - name = DW_STRING (attr); if (name != NULL) break; } @@ -14749,7 +14832,7 @@ attr_to_dynamic_prop (const struct attribute *attr, struct die_info *die, if (attr_form_is_block (attr)) { - baton = obstack_alloc (obstack, sizeof (*baton)); + baton = XOBNEW (obstack, struct dwarf2_property_baton); baton->referenced_type = NULL; baton->locexpr.per_cu = cu->per_cu; baton->locexpr.size = DW_BLOCK (attr)->size; @@ -14777,7 +14860,7 @@ attr_to_dynamic_prop (const struct attribute *attr, struct die_info *die, case DW_AT_location: if (attr_form_is_section_offset (target_attr)) { - baton = obstack_alloc (obstack, sizeof (*baton)); + baton = XOBNEW (obstack, struct dwarf2_property_baton); baton->referenced_type = die_type (target_die, target_cu); fill_in_loclist_baton (cu, &baton->loclist, target_attr); prop->data.baton = baton; @@ -14786,7 +14869,7 @@ attr_to_dynamic_prop (const struct attribute *attr, struct die_info *die, } else if (attr_form_is_block (target_attr)) { - baton = obstack_alloc (obstack, sizeof (*baton)); + baton = XOBNEW (obstack, struct dwarf2_property_baton); baton->referenced_type = die_type (target_die, target_cu); baton->locexpr.per_cu = cu->per_cu; baton->locexpr.size = DW_BLOCK (target_attr)->size; @@ -14810,9 +14893,9 @@ attr_to_dynamic_prop (const struct attribute *attr, struct die_info *die, &offset)) return 0; - baton = obstack_alloc (obstack, sizeof (*baton)); - baton->referenced_type = get_die_type (target_die->parent, - target_cu); + baton = XOBNEW (obstack, struct dwarf2_property_baton); + baton->referenced_type = read_type_die (target_die->parent, + target_cu); baton->offset_info.offset = offset; baton->offset_info.type = die_type (target_die, target_cu); prop->data.baton = baton; @@ -14965,7 +15048,7 @@ read_subrange_type (struct die_info *die, struct dwarf2_cu *cu) the bounds as signed, and thus sign-extend their values, when the base type is signed. */ negative_mask = - (LONGEST) -1 << (TYPE_LENGTH (base_type) * TARGET_CHAR_BIT - 1); + -((LONGEST) 1 << (TYPE_LENGTH (base_type) * TARGET_CHAR_BIT - 1)); if (low.kind == PROP_CONST && !TYPE_UNSIGNED (base_type) && (low.data.const_val & negative_mask)) low.data.const_val |= negative_mask; @@ -15098,14 +15181,14 @@ read_die_and_siblings (const struct die_reader_specs *reader, struct die_info *die = read_die_and_siblings_1 (reader, info_ptr, new_info_ptr, parent); - if (dwarf2_die_debug) + if (dwarf_die_debug) { fprintf_unfiltered (gdb_stdlog, "Read die from %s@0x%x of %s:\n", get_section_name (reader->die_section), (unsigned) (info_ptr - reader->die_section->buffer), bfd_get_filename (reader->abfd)); - dump_die (die, dwarf2_die_debug); + dump_die (die, dwarf_die_debug); } return die; @@ -15180,14 +15263,14 @@ read_full_die (const struct die_reader_specs *reader, result = read_full_die_1 (reader, diep, info_ptr, has_children, 0); - if (dwarf2_die_debug) + if (dwarf_die_debug) { fprintf_unfiltered (gdb_stdlog, "Read die from %s@0x%x of %s:\n", get_section_name (reader->die_section), (unsigned) (info_ptr - reader->die_section->buffer), bfd_get_filename (reader->abfd)); - dump_die (*diep, dwarf2_die_debug); + dump_die (*diep, dwarf_die_debug); } return result; @@ -15207,9 +15290,9 @@ abbrev_table_alloc_abbrev (struct abbrev_table *abbrev_table) { struct abbrev_info *abbrev; - abbrev = (struct abbrev_info *) - obstack_alloc (&abbrev_table->abbrev_obstack, sizeof (struct abbrev_info)); + abbrev = XOBNEW (&abbrev_table->abbrev_obstack, struct abbrev_info); memset (abbrev, 0, sizeof (struct abbrev_info)); + return abbrev; } @@ -15268,9 +15351,9 @@ abbrev_table_read_table (struct dwarf2_section_info *section, abbrev_table = XNEW (struct abbrev_table); abbrev_table->offset = offset; obstack_init (&abbrev_table->abbrev_obstack); - abbrev_table->abbrevs = obstack_alloc (&abbrev_table->abbrev_obstack, - (ABBREV_HASH_SIZE - * sizeof (struct abbrev_info *))); + abbrev_table->abbrevs = + XOBNEWVEC (&abbrev_table->abbrev_obstack, struct abbrev_info *, + ABBREV_HASH_SIZE); memset (abbrev_table->abbrevs, 0, ABBREV_HASH_SIZE * sizeof (struct abbrev_info *)); @@ -15280,7 +15363,7 @@ abbrev_table_read_table (struct dwarf2_section_info *section, abbrev_ptr += bytes_read; allocated_attrs = ATTR_ALLOC_CHUNK; - cur_attrs = xmalloc (allocated_attrs * sizeof (struct attr_abbrev)); + cur_attrs = XNEWVEC (struct attr_abbrev, allocated_attrs); /* Loop until we reach an abbrev number of 0. */ while (abbrev_number) @@ -15289,7 +15372,8 @@ abbrev_table_read_table (struct dwarf2_section_info *section, /* read in abbrev header */ cur_abbrev->number = abbrev_number; - cur_abbrev->tag = read_unsigned_leb128 (abfd, abbrev_ptr, &bytes_read); + cur_abbrev->tag + = (enum dwarf_tag) read_unsigned_leb128 (abfd, abbrev_ptr, &bytes_read); abbrev_ptr += bytes_read; cur_abbrev->has_children = read_1_byte (abfd, abbrev_ptr); abbrev_ptr += 1; @@ -15305,21 +15389,22 @@ abbrev_table_read_table (struct dwarf2_section_info *section, { allocated_attrs += ATTR_ALLOC_CHUNK; cur_attrs - = xrealloc (cur_attrs, (allocated_attrs - * sizeof (struct attr_abbrev))); + = XRESIZEVEC (struct attr_abbrev, cur_attrs, allocated_attrs); } - cur_attrs[cur_abbrev->num_attrs].name = abbrev_name; - cur_attrs[cur_abbrev->num_attrs++].form = abbrev_form; + cur_attrs[cur_abbrev->num_attrs].name + = (enum dwarf_attribute) abbrev_name; + cur_attrs[cur_abbrev->num_attrs++].form + = (enum dwarf_form) abbrev_form; abbrev_name = read_unsigned_leb128 (abfd, abbrev_ptr, &bytes_read); abbrev_ptr += bytes_read; abbrev_form = read_unsigned_leb128 (abfd, abbrev_ptr, &bytes_read); abbrev_ptr += bytes_read; } - cur_abbrev->attrs = obstack_alloc (&abbrev_table->abbrev_obstack, - (cur_abbrev->num_attrs - * sizeof (struct attr_abbrev))); + cur_abbrev->attrs = + XOBNEWVEC (&abbrev_table->abbrev_obstack, struct attr_abbrev, + cur_abbrev->num_attrs); memcpy (cur_abbrev->attrs, cur_attrs, cur_abbrev->num_attrs * sizeof (struct attr_abbrev)); @@ -15361,7 +15446,7 @@ abbrev_table_free (struct abbrev_table *abbrev_table) static void abbrev_table_free_cleanup (void *table_ptr) { - struct abbrev_table **abbrev_table_ptr = table_ptr; + struct abbrev_table **abbrev_table_ptr = (struct abbrev_table **) table_ptr; if (*abbrev_table_ptr != NULL) abbrev_table_free (*abbrev_table_ptr); @@ -15383,7 +15468,7 @@ dwarf2_read_abbrevs (struct dwarf2_cu *cu, static void dwarf2_free_abbrev_table (void *ptr_to_cu) { - struct dwarf2_cu *cu = ptr_to_cu; + struct dwarf2_cu *cu = (struct dwarf2_cu *) ptr_to_cu; if (cu->abbrev_table != NULL) abbrev_table_free (cu->abbrev_table); @@ -15455,8 +15540,7 @@ load_partial_dies (const struct die_reader_specs *reader, hashtab_obstack_allocate, dummy_obstack_deallocate); - part_die = obstack_alloc (&cu->comp_unit_obstack, - sizeof (struct partial_die_info)); + part_die = XOBNEW (&cu->comp_unit_obstack, struct partial_die_info); while (1) { @@ -15561,7 +15645,7 @@ load_partial_dies (const struct die_reader_specs *reader, add_psymbol_to_list (part_die->name, strlen (part_die->name), 0, VAR_DOMAIN, LOC_TYPEDEF, &objfile->static_psymbols, - 0, (CORE_ADDR) 0, cu->language, objfile); + 0, cu->language, objfile); info_ptr = locate_pdi_sibling (reader, part_die, info_ptr); continue; } @@ -15600,7 +15684,7 @@ load_partial_dies (const struct die_reader_specs *reader, || cu->language == language_java) ? &objfile->global_psymbols : &objfile->static_psymbols, - 0, (CORE_ADDR) 0, cu->language, objfile); + 0, cu->language, objfile); info_ptr = locate_pdi_sibling (reader, part_die, info_ptr); continue; @@ -15656,8 +15740,7 @@ load_partial_dies (const struct die_reader_specs *reader, *slot = part_die; } - part_die = obstack_alloc (&cu->comp_unit_obstack, - sizeof (struct partial_die_info)); + part_die = XOBNEW (&cu->comp_unit_obstack, 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 @@ -15834,6 +15917,9 @@ read_partial_die (const struct die_reader_specs *reader, case DW_AT_byte_size: part_die->has_byte_size = 1; break; + case DW_AT_const_value: + part_die->has_const_value = 1; + break; case DW_AT_calling_convention: /* DWARF doesn't provide a way to identify a program's source-level entry point. DW_AT_calling_convention attributes are only meant @@ -15850,7 +15936,8 @@ read_partial_die (const struct die_reader_specs *reader, compilers pick up the new representation, we'll support this practice. */ if (DW_UNSND (&attr) == DW_CC_program - && cu->language == language_fortran) + && cu->language == language_fortran + && part_die->name != NULL) set_objfile_main_name (objfile, part_die->name, language_fortran); break; case DW_AT_inline: @@ -15924,8 +16011,9 @@ find_partial_die_in_comp_unit (sect_offset offset, struct dwarf2_cu *cu) struct partial_die_info part_die; part_die.offset = offset; - lookup_die = htab_find_with_hash (cu->partial_dies, &part_die, - offset.sect_off); + lookup_die = ((struct partial_die_info *) + htab_find_with_hash (cu->partial_dies, &part_die, + offset.sect_off)); return lookup_die; } @@ -16040,9 +16128,10 @@ guess_partial_die_structure_name (struct partial_die_info *struct_pdi, if (actual_class_name != NULL) { struct_pdi->name - = obstack_copy0 (&cu->objfile->per_bfd->storage_obstack, - actual_class_name, - strlen (actual_class_name)); + = ((const char *) + obstack_copy0 (&cu->objfile->per_bfd->storage_obstack, + actual_class_name, + strlen (actual_class_name))); xfree (actual_class_name); } break; @@ -16127,8 +16216,9 @@ fixup_partial_die (struct partial_die_info *part_die, base = demangled; part_die->name - = obstack_copy0 (&cu->objfile->per_bfd->storage_obstack, - base, strlen (base)); + = ((const char *) + obstack_copy0 (&cu->objfile->per_bfd->storage_obstack, + base, strlen (base))); xfree (demangled); } } @@ -16151,7 +16241,7 @@ read_attribute_value (const struct die_reader_specs *reader, unsigned int bytes_read; struct dwarf_block *blk; - attr->form = form; + attr->form = (enum dwarf_form) form; switch (form) { case DW_FORM_ref_addr: @@ -17020,6 +17110,33 @@ dwarf2_attr_no_follow (struct die_info *die, unsigned int name) return NULL; } +/* Return the string associated with a string-typed attribute, or NULL if it + is either not found or is of an incorrect type. */ + +static const char * +dwarf2_string_attr (struct die_info *die, unsigned int name, struct dwarf2_cu *cu) +{ + struct attribute *attr; + const char *str = NULL; + + attr = dwarf2_attr (die, name, cu); + + if (attr != NULL) + { + if (attr->form == DW_FORM_strp || attr->form == DW_FORM_string + || attr->form == DW_FORM_GNU_strp_alt) + str = DW_STRING (attr); + else + complaint (&symfile_complaints, + _("string type expected for attribute %s for " + "DIE at 0x%x in module %s"), + dwarf_attr_name (name), die->offset.sect_off, + objfile_name (cu->objfile)); + } + + return str; +} + /* 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 or DW_FORM_flag_present attributes. */ @@ -17094,7 +17211,7 @@ free_line_header (struct line_header *lh) static void free_line_header_voidp (void *arg) { - struct line_header *lh = arg; + struct line_header *lh = (struct line_header *) arg; free_line_header (lh); } @@ -17104,19 +17221,21 @@ free_line_header_voidp (void *arg) static void add_include_dir (struct line_header *lh, const char *include_dir) { + if (dwarf_line_debug >= 2) + fprintf_unfiltered (gdb_stdlog, "Adding dir %u: %s\n", + lh->num_include_dirs + 1, include_dir); + /* Grow the array if necessary. */ if (lh->include_dirs_size == 0) { lh->include_dirs_size = 1; /* for testing */ - lh->include_dirs = xmalloc (lh->include_dirs_size - * sizeof (*lh->include_dirs)); + lh->include_dirs = XNEWVEC (const char *, lh->include_dirs_size); } else if (lh->num_include_dirs >= lh->include_dirs_size) { lh->include_dirs_size *= 2; - lh->include_dirs = xrealloc (lh->include_dirs, - (lh->include_dirs_size - * sizeof (*lh->include_dirs))); + lh->include_dirs = XRESIZEVEC (const char *, lh->include_dirs, + lh->include_dirs_size); } lh->include_dirs[lh->num_include_dirs++] = include_dir; @@ -17133,19 +17252,21 @@ add_file_name (struct line_header *lh, { struct file_entry *fe; + if (dwarf_line_debug >= 2) + fprintf_unfiltered (gdb_stdlog, "Adding file %u: %s\n", + lh->num_file_names + 1, name); + /* Grow the array if necessary. */ if (lh->file_names_size == 0) { lh->file_names_size = 1; /* for testing */ - lh->file_names = xmalloc (lh->file_names_size - * sizeof (*lh->file_names)); + lh->file_names = XNEWVEC (struct file_entry, lh->file_names_size); } else if (lh->num_file_names >= lh->file_names_size) { lh->file_names_size *= 2; - lh->file_names = xrealloc (lh->file_names, - (lh->file_names_size - * sizeof (*lh->file_names))); + lh->file_names + = XRESIZEVEC (struct file_entry, lh->file_names, lh->file_names_size); } fe = &lh->file_names[lh->num_file_names++]; @@ -17157,8 +17278,7 @@ add_file_name (struct line_header *lh, fe->symtab = NULL; } -/* A convenience function to find the proper .debug_line section for a - CU. */ +/* A convenience function to find the proper .debug_line section for a CU. */ static struct dwarf2_section_info * get_debug_line_section (struct dwarf2_cu *cu) @@ -17226,7 +17346,7 @@ dwarf_decode_line_header (unsigned int offset, struct dwarf2_cu *cu) return 0; } - lh = xmalloc (sizeof (*lh)); + lh = XNEW (struct line_header); memset (lh, 0, sizeof (*lh)); back_to = make_cleanup ((make_cleanup_ftype *) free_line_header, (void *) lh); @@ -17286,8 +17406,7 @@ dwarf_decode_line_header (unsigned int offset, struct dwarf2_cu *cu) line_ptr += 1; lh->opcode_base = read_1_byte (abfd, line_ptr); line_ptr += 1; - lh->standard_opcode_lengths - = xmalloc (lh->opcode_base * sizeof (lh->standard_opcode_lengths[0])); + lh->standard_opcode_lengths = XNEWVEC (unsigned char, lh->opcode_base); lh->standard_opcode_lengths[0] = 1; /* This should never be used anyway. */ for (i = 1; i < lh->opcode_base; ++i) @@ -17353,7 +17472,7 @@ psymtab_include_file_name (const struct line_header *lh, int file_index, char *copied_name = NULL; int file_is_pst; - if (fe.dir_index) + if (fe.dir_index && lh->include_dirs != NULL) dir_name = lh->include_dirs[fe.dir_index - 1]; if (!IS_ABSOLUTE_PATH (include_name) @@ -17417,6 +17536,54 @@ psymtab_include_file_name (const struct line_header *lh, int file_index, return include_name; } +/* State machine to track the state of the line number program. */ + +typedef struct +{ + /* These are part of the standard DWARF line number state machine. */ + + unsigned char op_index; + unsigned int file; + unsigned int line; + CORE_ADDR address; + int is_stmt; + unsigned int discriminator; + + /* Additional bits of state we need to track. */ + + /* The last file that we called dwarf2_start_subfile for. + This is only used for TLLs. */ + unsigned int last_file; + /* The last file a line number was recorded for. */ + struct subfile *last_subfile; + + /* The function to call to record a line. */ + record_line_ftype *record_line; + + /* The last line number that was recorded, used to coalesce + consecutive entries for the same line. This can happen, for + example, when discriminators are present. PR 17276. */ + unsigned int last_line; + int line_has_non_zero_discriminator; +} lnp_state_machine; + +/* There's a lot of static state to pass to dwarf_record_line. + This keeps it all together. */ + +typedef struct +{ + /* The gdbarch. */ + struct gdbarch *gdbarch; + + /* The line number header. */ + struct line_header *line_header; + + /* Non-zero if we're recording lines. + Otherwise we're building partial symtabs and are just interested in + finding include files mentioned by the line number program. */ + int record_lines_p; +} lnp_reader_state; + /* Ignore this record_line request. */ static void @@ -17476,30 +17643,169 @@ dwarf_record_line_p (unsigned int line, unsigned int last_line, in the line table of subfile SUBFILE. */ static void -dwarf_record_line (struct gdbarch *gdbarch, struct subfile *subfile, - unsigned int line, CORE_ADDR address, - record_line_ftype p_record_line) +dwarf_record_line_1 (struct gdbarch *gdbarch, struct subfile *subfile, + unsigned int line, CORE_ADDR address, + record_line_ftype p_record_line) { CORE_ADDR addr = gdbarch_addr_bits_remove (gdbarch, address); + if (dwarf_line_debug) + { + fprintf_unfiltered (gdb_stdlog, + "Recording line %u, file %s, address %s\n", + line, lbasename (subfile->name), + paddress (gdbarch, address)); + } + (*p_record_line) (subfile, line, addr); } /* Subroutine of dwarf_decode_lines_1 to simplify it. Mark the end of a set of line number records. - The arguments are the same as for dwarf_record_line. + The arguments are the same as for dwarf_record_line_1. If SUBFILE is NULL the request is ignored. */ static void dwarf_finish_line (struct gdbarch *gdbarch, struct subfile *subfile, CORE_ADDR address, record_line_ftype p_record_line) { - if (subfile != NULL) - dwarf_record_line (gdbarch, subfile, 0, address, p_record_line); + if (subfile == NULL) + return; + + if (dwarf_line_debug) + { + fprintf_unfiltered (gdb_stdlog, + "Finishing current line, file %s, address %s\n", + lbasename (subfile->name), + paddress (gdbarch, address)); + } + + dwarf_record_line_1 (gdbarch, subfile, 0, address, p_record_line); +} + +/* Record the line in STATE. + END_SEQUENCE is non-zero if we're processing the end of a sequence. */ + +static void +dwarf_record_line (lnp_reader_state *reader, lnp_state_machine *state, + int end_sequence) +{ + const struct line_header *lh = reader->line_header; + unsigned int file, line, discriminator; + int is_stmt; + + file = state->file; + line = state->line; + is_stmt = state->is_stmt; + discriminator = state->discriminator; + + if (dwarf_line_debug) + { + fprintf_unfiltered (gdb_stdlog, + "Processing actual line %u: file %u," + " address %s, is_stmt %u, discrim %u\n", + line, file, + paddress (reader->gdbarch, state->address), + is_stmt, discriminator); + } + + if (file == 0 || file - 1 >= lh->num_file_names) + dwarf2_debug_line_missing_file_complaint (); + /* For now we ignore lines not starting on an instruction boundary. + But not when processing end_sequence for compatibility with the + previous version of the code. */ + else if (state->op_index == 0 || end_sequence) + { + lh->file_names[file - 1].included_p = 1; + if (reader->record_lines_p && is_stmt) + { + if (state->last_subfile != current_subfile || end_sequence) + { + dwarf_finish_line (reader->gdbarch, state->last_subfile, + state->address, state->record_line); + } + + if (!end_sequence) + { + if (dwarf_record_line_p (line, state->last_line, + state->line_has_non_zero_discriminator, + state->last_subfile)) + { + dwarf_record_line_1 (reader->gdbarch, current_subfile, + line, state->address, + state->record_line); + } + state->last_subfile = current_subfile; + state->last_line = line; + } + } + } +} + +/* Initialize STATE for the start of a line number program. */ + +static void +init_lnp_state_machine (lnp_state_machine *state, + const lnp_reader_state *reader) +{ + memset (state, 0, sizeof (*state)); + + /* Just starting, there is no "last file". */ + state->last_file = 0; + state->last_subfile = NULL; + + state->record_line = record_line; + + state->last_line = 0; + state->line_has_non_zero_discriminator = 0; + + /* Initialize these according to the DWARF spec. */ + state->op_index = 0; + state->file = 1; + state->line = 1; + /* Call `gdbarch_adjust_dwarf2_line' on the initial 0 address as if there + was a line entry for it so that the backend has a chance to adjust it + and also record it in case it needs it. This is currently used by MIPS + code, cf. `mips_adjust_dwarf2_line'. */ + state->address = gdbarch_adjust_dwarf2_line (reader->gdbarch, 0, 0); + state->is_stmt = reader->line_header->default_is_stmt; + state->discriminator = 0; +} + +/* Check address and if invalid nop-out the rest of the lines in this + sequence. */ + +static void +check_line_address (struct dwarf2_cu *cu, lnp_state_machine *state, + const gdb_byte *line_ptr, + CORE_ADDR lowpc, CORE_ADDR address) +{ + /* If address < lowpc then it's not a usable value, it's outside the + pc range of the CU. However, we restrict the test to only address + values of zero to preserve GDB's previous behaviour which is to + handle the specific case of a function being GC'd by the linker. */ + + if (address == 0 && address < lowpc) + { + /* This line table is for a function which has been + GCd by the linker. Ignore it. PR gdb/12528 */ + + struct objfile *objfile = cu->objfile; + long line_offset = line_ptr - get_debug_line_section (cu)->buffer; + + complaint (&symfile_complaints, + _(".debug_line address at offset 0x%lx is 0 [in module %s]"), + line_offset, objfile_name (objfile)); + state->record_line = noop_record_line; + /* Note: sm.record_line is left as noop_record_line + until we see DW_LNE_end_sequence. */ + } } /* Subroutine of dwarf_decode_lines to simplify it. - Process the line number information in LH. */ + Process the line number information in LH. + If DECODE_FOR_PST_P is non-zero, all we do is process the line number + program in order to set included_p for every referenced header. */ static void dwarf_decode_lines_1 (struct line_header *lh, struct dwarf2_cu *cu, @@ -17513,61 +17819,51 @@ dwarf_decode_lines_1 (struct line_header *lh, struct dwarf2_cu *cu, struct objfile *objfile = cu->objfile; bfd *abfd = objfile->obfd; struct gdbarch *gdbarch = get_objfile_arch (objfile); - struct subfile *last_subfile = NULL; - void (*p_record_line) (struct subfile *subfile, int line, CORE_ADDR pc) - = record_line; + /* Non-zero if we're recording line info (as opposed to building partial + symtabs). */ + int record_lines_p = !decode_for_pst_p; + /* A collection of things we need to pass to dwarf_record_line. */ + lnp_reader_state reader_state; baseaddr = ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile)); line_ptr = lh->statement_program_start; line_end = lh->statement_program_end; + reader_state.gdbarch = gdbarch; + reader_state.line_header = lh; + reader_state.record_lines_p = record_lines_p; + /* Read the statement sequences until there's nothing left. */ while (line_ptr < line_end) { - /* State machine registers. Call `gdbarch_adjust_dwarf2_line' - on the initial 0 address as if there was a line entry for it - so that the backend has a chance to adjust it and also record - it in case it needs it. This is currently used by MIPS code, - cf. `mips_adjust_dwarf2_line'. */ - CORE_ADDR address = gdbarch_adjust_dwarf2_line (gdbarch, 0, 0); - unsigned int file = 1; - unsigned int line = 1; - int is_stmt = lh->default_is_stmt; + /* The DWARF line number program state machine. */ + lnp_state_machine state_machine; int end_sequence = 0; - unsigned char op_index = 0; - unsigned int discriminator = 0; - /* The last line number that was recorded, used to coalesce - consecutive entries for the same line. This can happen, for - example, when discriminators are present. PR 17276. */ - unsigned int last_line = 0; - int line_has_non_zero_discriminator = 0; - - if (!decode_for_pst_p && lh->num_file_names >= file) + + /* Reset the state machine at the start of each sequence. */ + init_lnp_state_machine (&state_machine, &reader_state); + + if (record_lines_p && lh->num_file_names >= state_machine.file) { /* Start a subfile for the current file of the state machine. */ /* lh->include_dirs and lh->file_names are 0-based, but the directory and file name numbers in the statement program are 1-based. */ - struct file_entry *fe = &lh->file_names[file - 1]; + struct file_entry *fe = &lh->file_names[state_machine.file - 1]; const char *dir = NULL; - if (fe->dir_index) + if (fe->dir_index && lh->include_dirs != NULL) dir = lh->include_dirs[fe->dir_index - 1]; dwarf2_start_subfile (fe->name, dir); } /* Decode the table. */ - while (!end_sequence) + while (line_ptr < line_end && !end_sequence) { 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) { @@ -17577,42 +17873,23 @@ dwarf_decode_lines_1 (struct line_header *lh, struct dwarf2_cu *cu, int line_delta; adj_opcode = op_code - lh->opcode_base; - addr_adj = (((op_index + (adj_opcode / lh->line_range)) + addr_adj = (((state_machine.op_index + + (adj_opcode / lh->line_range)) / lh->maximum_ops_per_instruction) * lh->minimum_instruction_length); - address += gdbarch_adjust_dwarf2_line (gdbarch, addr_adj, 1); - op_index = ((op_index + (adj_opcode / lh->line_range)) - % lh->maximum_ops_per_instruction); + state_machine.address + += gdbarch_adjust_dwarf2_line (gdbarch, addr_adj, 1); + state_machine.op_index = ((state_machine.op_index + + (adj_opcode / lh->line_range)) + % lh->maximum_ops_per_instruction); line_delta = lh->line_base + (adj_opcode % lh->line_range); - line += line_delta; + state_machine.line += line_delta; if (line_delta != 0) - line_has_non_zero_discriminator = discriminator != 0; - if (lh->num_file_names < file || file == 0) - dwarf2_debug_line_missing_file_complaint (); - /* 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) - { - if (last_subfile != current_subfile) - { - dwarf_finish_line (gdbarch, last_subfile, - address, p_record_line); - } - if (dwarf_record_line_p (line, last_line, - line_has_non_zero_discriminator, - last_subfile)) - { - dwarf_record_line (gdbarch, current_subfile, - line, address, p_record_line); - } - last_subfile = current_subfile; - last_line = line; - } - } - discriminator = 0; + state_machine.line_has_non_zero_discriminator + = state_machine.discriminator != 0; + + dwarf_record_line (&reader_state, &state_machine, 0); + state_machine.discriminator = 0; } else switch (op_code) { @@ -17626,38 +17903,22 @@ dwarf_decode_lines_1 (struct line_header *lh, struct dwarf2_cu *cu, switch (extended_op) { case DW_LNE_end_sequence: - p_record_line = record_line; + state_machine.record_line = record_line; end_sequence = 1; break; case DW_LNE_set_address: - address = read_address (abfd, line_ptr, cu, &bytes_read); - - /* If address < lowpc then it's not a usable value, it's - outside the pc range of the CU. However, we restrict - the test to only address values of zero to preserve - GDB's previous behaviour which is to handle the specific - case of a function being GC'd by the linker. */ - if (address == 0 && address < lowpc) - { - /* This line table is for a function which has been - GCd by the linker. Ignore it. PR gdb/12528 */ - - long line_offset - = line_ptr - get_debug_line_section (cu)->buffer; - - complaint (&symfile_complaints, - _(".debug_line address at offset 0x%lx is 0 " - "[in module %s]"), - line_offset, objfile_name (objfile)); - p_record_line = noop_record_line; - /* Note: p_record_line is left as noop_record_line - until we see DW_LNE_end_sequence. */ - } + { + CORE_ADDR address + = read_address (abfd, line_ptr, cu, &bytes_read); - op_index = 0; - line_ptr += bytes_read; - address += baseaddr; - address = gdbarch_adjust_dwarf2_line (gdbarch, address, 0); + line_ptr += bytes_read; + check_line_address (cu, &state_machine, line_ptr, + lowpc, address); + state_machine.op_index = 0; + address += baseaddr; + state_machine.address + = gdbarch_adjust_dwarf2_line (gdbarch, address, 0); + } break; case DW_LNE_define_file: { @@ -17685,9 +17946,10 @@ dwarf_decode_lines_1 (struct line_header *lh, struct dwarf2_cu *cu, if there are consecutive entries for the same (non-prologue) line we want to coalesce them. PR 17276. */ - discriminator = read_unsigned_leb128 (abfd, line_ptr, - &bytes_read); - line_has_non_zero_discriminator |= discriminator != 0; + state_machine.discriminator + = read_unsigned_leb128 (abfd, line_ptr, &bytes_read); + state_machine.line_has_non_zero_discriminator + |= state_machine.discriminator != 0; line_ptr += bytes_read; break; default: @@ -17706,30 +17968,8 @@ dwarf_decode_lines_1 (struct line_header *lh, struct dwarf2_cu *cu, } break; case DW_LNS_copy: - 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 && is_stmt) - { - if (last_subfile != current_subfile) - { - dwarf_finish_line (gdbarch, last_subfile, - address, p_record_line); - } - if (dwarf_record_line_p (line, last_line, - line_has_non_zero_discriminator, - last_subfile)) - { - dwarf_record_line (gdbarch, current_subfile, - line, address, p_record_line); - } - last_subfile = current_subfile; - last_line = line; - } - } - discriminator = 0; + dwarf_record_line (&reader_state, &state_machine, 0); + state_machine.discriminator = 0; break; case DW_LNS_advance_pc: { @@ -17737,12 +17977,13 @@ dwarf_decode_lines_1 (struct line_header *lh, struct dwarf2_cu *cu, = read_unsigned_leb128 (abfd, line_ptr, &bytes_read); CORE_ADDR addr_adj; - addr_adj = (((op_index + adjust) + addr_adj = (((state_machine.op_index + adjust) / lh->maximum_ops_per_instruction) * lh->minimum_instruction_length); - address += gdbarch_adjust_dwarf2_line (gdbarch, addr_adj, 1); - op_index = ((op_index + adjust) - % lh->maximum_ops_per_instruction); + state_machine.address + += gdbarch_adjust_dwarf2_line (gdbarch, addr_adj, 1); + state_machine.op_index = ((state_machine.op_index + adjust) + % lh->maximum_ops_per_instruction); line_ptr += bytes_read; } break; @@ -17751,44 +17992,48 @@ dwarf_decode_lines_1 (struct line_header *lh, struct dwarf2_cu *cu, int line_delta = read_signed_leb128 (abfd, line_ptr, &bytes_read); - line += line_delta; + state_machine.line += line_delta; if (line_delta != 0) - line_has_non_zero_discriminator = discriminator != 0; + state_machine.line_has_non_zero_discriminator + = state_machine.discriminator != 0; line_ptr += bytes_read; } break; case DW_LNS_set_file: - { - /* The arrays lh->include_dirs and lh->file_names are - 0-based, but the directory and file name numbers in - the statement program are 1-based. */ - struct file_entry *fe; - const char *dir = NULL; - - file = read_unsigned_leb128 (abfd, line_ptr, &bytes_read); - line_ptr += bytes_read; - if (lh->num_file_names < file || file == 0) - dwarf2_debug_line_missing_file_complaint (); - else - { - fe = &lh->file_names[file - 1]; - if (fe->dir_index) - dir = lh->include_dirs[fe->dir_index - 1]; - if (!decode_for_pst_p) - { - last_subfile = current_subfile; - line_has_non_zero_discriminator = discriminator != 0; - dwarf2_start_subfile (fe->name, dir); - } - } - } + { + /* The arrays lh->include_dirs and lh->file_names are + 0-based, but the directory and file name numbers in + the statement program are 1-based. */ + struct file_entry *fe; + const char *dir = NULL; + + state_machine.file = read_unsigned_leb128 (abfd, line_ptr, + &bytes_read); + line_ptr += bytes_read; + if (state_machine.file == 0 + || state_machine.file - 1 >= lh->num_file_names) + dwarf2_debug_line_missing_file_complaint (); + else + { + fe = &lh->file_names[state_machine.file - 1]; + if (fe->dir_index && lh->include_dirs != NULL) + dir = lh->include_dirs[fe->dir_index - 1]; + if (record_lines_p) + { + state_machine.last_subfile = current_subfile; + state_machine.line_has_non_zero_discriminator + = state_machine.discriminator != 0; + dwarf2_start_subfile (fe->name, dir); + } + } + } break; case DW_LNS_set_column: (void) read_unsigned_leb128 (abfd, line_ptr, &bytes_read); line_ptr += bytes_read; break; case DW_LNS_negate_stmt: - is_stmt = (!is_stmt); + state_machine.is_stmt = (!state_machine.is_stmt); break; case DW_LNS_set_basic_block: break; @@ -17802,12 +18047,13 @@ dwarf_decode_lines_1 (struct line_header *lh, struct dwarf2_cu *cu, CORE_ADDR adjust = (255 - lh->opcode_base) / lh->line_range; CORE_ADDR addr_adj; - addr_adj = (((op_index + adjust) + addr_adj = (((state_machine.op_index + adjust) / lh->maximum_ops_per_instruction) * lh->minimum_instruction_length); - address += gdbarch_adjust_dwarf2_line (gdbarch, addr_adj, 1); - op_index = ((op_index + adjust) - % lh->maximum_ops_per_instruction); + state_machine.address + += gdbarch_adjust_dwarf2_line (gdbarch, addr_adj, 1); + state_machine.op_index = ((state_machine.op_index + adjust) + % lh->maximum_ops_per_instruction); } break; case DW_LNS_fixed_advance_pc: @@ -17815,8 +18061,9 @@ dwarf_decode_lines_1 (struct line_header *lh, struct dwarf2_cu *cu, CORE_ADDR addr_adj; addr_adj = read_2_bytes (abfd, line_ptr); - address += gdbarch_adjust_dwarf2_line (gdbarch, addr_adj, 1); - op_index = 0; + state_machine.address + += gdbarch_adjust_dwarf2_line (gdbarch, addr_adj, 1); + state_machine.op_index = 0; line_ptr += 2; } break; @@ -17833,17 +18080,13 @@ dwarf_decode_lines_1 (struct line_header *lh, struct dwarf2_cu *cu, } } } - 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) - { - dwarf_finish_line (gdbarch, current_subfile, address, - p_record_line); - } - } + + if (!end_sequence) + dwarf2_debug_line_missing_end_sequence_complaint (); + + /* We got a DW_LNE_end_sequence (or we ran off the end of the buffer, + in which case we still finish recording the last line). */ + dwarf_record_line (&reader_state, &state_machine, 1); } } @@ -17915,7 +18158,7 @@ dwarf_decode_lines (struct line_header *lh, const char *comp_dir, struct file_entry *fe; fe = &lh->file_names[i]; - if (fe->dir_index) + if (fe->dir_index && lh->include_dirs != NULL) dir = lh->include_dirs[fe->dir_index - 1]; dwarf2_start_subfile (fe->name, dir); @@ -18263,7 +18506,7 @@ new_symbol_full (struct die_info *die, struct type *type, struct dwarf2_cu *cu, if (cu->language == language_fortran && die->parent && die->parent->tag == DW_TAG_module && cu->producer - && startswith (cu->producer, "GNU Fortran ")) + && startswith (cu->producer, "GNU Fortran")) SYMBOL_ACLASS_INDEX (sym) = LOC_UNRESOLVED; /* A variable with DW_AT_external is never static, @@ -18374,7 +18617,8 @@ new_symbol_full (struct die_info *die, struct type *type, struct dwarf2_cu *cu, class. */ if (cu->language == language_cplus || cu->language == language_java - || cu->language == language_ada) + || cu->language == language_ada + || cu->language == language_d) { /* The symbol's name is already allocated along with this objfile, so we don't need to @@ -18490,7 +18734,7 @@ dwarf2_const_value_data (const struct attribute *attr, struct obstack *obstack, *value = l; else { - gdb_byte *bytes = obstack_alloc (obstack, bits / 8); + gdb_byte *bytes = (gdb_byte *) obstack_alloc (obstack, bits / 8); store_unsigned_integer (bytes, bits / 8, byte_order, l); return bytes; } @@ -18535,12 +18779,12 @@ dwarf2_const_value_attr (const struct attribute *attr, struct type *type, /* Symbols of this form are reasonably rare, so we just piggyback on the existing location code rather than writing a new implementation of symbol_computed_ops. */ - *baton = obstack_alloc (obstack, sizeof (struct dwarf2_locexpr_baton)); + *baton = XOBNEW (obstack, struct dwarf2_locexpr_baton); (*baton)->per_cu = cu->per_cu; gdb_assert ((*baton)->per_cu); (*baton)->size = 2 + cu_header->addr_size; - data = obstack_alloc (obstack, (*baton)->size); + data = (gdb_byte *) obstack_alloc (obstack, (*baton)->size); (*baton)->data = data; data[0] = DW_OP_addr; @@ -18734,8 +18978,8 @@ build_error_marker_type (struct dwarf2_cu *cu, struct die_info *die) objfile_name (objfile), cu->header.offset.sect_off, die->offset.sect_off); - saved = obstack_copy0 (&objfile->objfile_obstack, - message, strlen (message)); + saved = (char *) obstack_copy0 (&objfile->objfile_obstack, + message, strlen (message)); xfree (message); return init_type (TYPE_CODE_ERROR, 0, 0, saved, objfile); @@ -18945,16 +19189,17 @@ guess_full_die_structure_name (struct die_info *die, struct dwarf2_cu *cu) { if (child->tag == DW_TAG_subprogram) { - struct attribute *attr; + const char *linkage_name; - attr = dwarf2_attr (child, DW_AT_linkage_name, cu); - if (attr == NULL) - attr = dwarf2_attr (child, DW_AT_MIPS_linkage_name, cu); - if (attr != NULL) + linkage_name = dwarf2_string_attr (child, DW_AT_linkage_name, cu); + if (linkage_name == NULL) + linkage_name = dwarf2_string_attr (child, DW_AT_MIPS_linkage_name, + cu); + if (linkage_name != NULL) { char *actual_name = language_class_name_from_physname (cu->language_defn, - DW_STRING (attr)); + linkage_name); char *name = NULL; if (actual_name != NULL) @@ -18973,10 +19218,9 @@ guess_full_die_structure_name (struct die_info *die, struct dwarf2_cu *cu) if (actual_name_len > die_name_len + 2 && actual_name[actual_name_len - die_name_len - 1] == ':') - name = - obstack_copy0 (&cu->objfile->per_bfd->storage_obstack, - actual_name, - actual_name_len - die_name_len - 2); + name = (char *) obstack_copy0 ( + &cu->objfile->per_bfd->storage_obstack, + actual_name, actual_name_len - die_name_len - 2); } } xfree (actual_name); @@ -18996,14 +19240,13 @@ static char * anonymous_struct_prefix (struct die_info *die, struct dwarf2_cu *cu) { struct attribute *attr; - char *base; + const char *base; if (die->tag != DW_TAG_class_type && die->tag != DW_TAG_interface_type && die->tag != DW_TAG_structure_type && die->tag != DW_TAG_union_type) return NULL; - attr = dwarf2_attr (die, DW_AT_name, cu); - if (attr != NULL && DW_STRING (attr) != NULL) + if (dwarf2_string_attr (die, DW_AT_name, cu) != NULL) return NULL; attr = dwarf2_attr (die, DW_AT_linkage_name, cu); @@ -19020,8 +19263,9 @@ anonymous_struct_prefix (struct die_info *die, struct dwarf2_cu *cu) if (base == NULL || base == DW_STRING (attr) || base[-1] != ':') return ""; - return obstack_copy0 (&cu->objfile->per_bfd->storage_obstack, - DW_STRING (attr), &base[-1] - DW_STRING (attr)); + return (char *) obstack_copy0 (&cu->objfile->per_bfd->storage_obstack, + DW_STRING (attr), + &base[-1] - DW_STRING (attr)); } /* Return the name of the namespace/class that DIE is defined within, @@ -19048,7 +19292,7 @@ determine_prefix (struct die_info *die, struct dwarf2_cu *cu) char *retval; if (cu->language != language_cplus && cu->language != language_java - && cu->language != language_fortran) + && cu->language != language_fortran && cu->language != language_d) return ""; retval = anonymous_struct_prefix (die, cu); @@ -19204,6 +19448,18 @@ typename_concat (struct obstack *obs, const char *prefix, const char *suffix, sep = ""; else if (cu->language == language_java) sep = "."; + else if (cu->language == language_d) + { + /* For D, the 'main' function could be defined in any module, but it + should never be prefixed. */ + if (strcmp (suffix, "D main") == 0) + { + prefix = ""; + sep = ""; + } + else + sep = "."; + } else if (cu->language == language_fortran && physname) { /* This is gfortran specific mangling. Normally DW_AT_linkage_name or @@ -19223,7 +19479,8 @@ 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); + = ((char *) + xmalloc (strlen (prefix) + MAX_SEP_LEN + strlen (suffix) + 1)); strcpy (retval, lead); strcat (retval, prefix); @@ -19259,7 +19516,8 @@ dwarf2_canonicalize_name (const char *name, struct dwarf2_cu *cu, if (canon_name != NULL) { if (strcmp (canon_name, name) != 0) - name = obstack_copy0 (obstack, canon_name, strlen (canon_name)); + name = (const char *) obstack_copy0 (obstack, canon_name, + strlen (canon_name)); xfree (canon_name); } } @@ -19364,12 +19622,13 @@ dwarf2_name (struct die_info *die, struct dwarf2_cu *cu) if (demangled) { - char *base; + const char *base; /* FIXME: we already did this for the partial symbol... */ DW_STRING (attr) - = obstack_copy0 (&cu->objfile->per_bfd->storage_obstack, - demangled, strlen (demangled)); + = ((const char *) + obstack_copy0 (&cu->objfile->per_bfd->storage_obstack, + demangled, strlen (demangled))); DW_STRING_IS_CANONICAL (attr) = 1; xfree (demangled); @@ -19771,7 +20030,8 @@ follow_die_offset (sect_offset offset, int offset_in_dwz, *ref_cu = target_cu; temp_die.offset = offset; - return htab_find_with_hash (target_cu->die_hash, &temp_die, offset.sect_off); + return (struct die_info *) htab_find_with_hash (target_cu->die_hash, + &temp_die, offset.sect_off); } /* Follow reference attribute ATTR of SRC_DIE. @@ -19819,6 +20079,13 @@ dwarf2_fetch_die_loc_sect_off (sect_offset offset, if (per_cu->cu == NULL) load_cu (per_cu); cu = per_cu->cu; + if (cu == NULL) + { + /* We shouldn't get here for a dummy CU, but don't crash on the user. + Instead just throw an error, not much else we can do. */ + error (_("Dwarf Error: Dummy CU at 0x%x referenced in module %s"), + offset.sect_off, objfile_name (per_cu->objfile)); + } die = follow_die_offset (offset, per_cu->is_dwz, &cu); if (!die) @@ -19890,7 +20157,7 @@ write_constant_as_bytes (struct obstack *obstack, gdb_byte *result; *len = TYPE_LENGTH (type); - result = obstack_alloc (obstack, *len); + result = (gdb_byte *) obstack_alloc (obstack, *len); store_unsigned_integer (result, *len, byte_order, value); return result; @@ -19920,6 +20187,13 @@ dwarf2_fetch_constant_bytes (sect_offset offset, if (per_cu->cu == NULL) load_cu (per_cu); cu = per_cu->cu; + if (cu == NULL) + { + /* We shouldn't get here for a dummy CU, but don't crash on the user. + Instead just throw an error, not much else we can do. */ + error (_("Dwarf Error: Dummy CU at 0x%x referenced in module %s"), + offset.sect_off, objfile_name (per_cu->objfile)); + } die = follow_die_offset (offset, per_cu->is_dwz, &cu); if (!die) @@ -19942,7 +20216,7 @@ dwarf2_fetch_constant_bytes (sect_offset offset, gdb_byte *tem; *len = cu->header.addr_size; - tem = obstack_alloc (obstack, *len); + tem = (gdb_byte *) obstack_alloc (obstack, *len); store_unsigned_integer (tem, *len, byte_order, DW_ADDR (attr)); result = tem; } @@ -20063,8 +20337,8 @@ follow_die_sig_1 (struct die_info *src_die, struct signatured_type *sig_type, gdb_assert (sig_cu != NULL); gdb_assert (sig_type->type_offset_in_section.sect_off != 0); temp_die.offset = sig_type->type_offset_in_section; - die = htab_find_with_hash (sig_cu->die_hash, &temp_die, - temp_die.offset.sect_off); + die = (struct die_info *) htab_find_with_hash (sig_cu->die_hash, &temp_die, + temp_die.offset.sect_off); if (die) { /* For .gdb_index version 7 keep track of included TUs. @@ -20560,11 +20834,7 @@ decode_locdesc (struct dwarf_block *blk, struct dwarf2_cu *cu) static struct dwarf_block * dwarf_alloc_block (struct dwarf2_cu *cu) { - struct dwarf_block *blk; - - blk = (struct dwarf_block *) - obstack_alloc (&cu->comp_unit_obstack, sizeof (struct dwarf_block)); - return (blk); + return XOBNEW (&cu->comp_unit_obstack, struct dwarf_block); } static struct die_info * @@ -20597,7 +20867,8 @@ file_file_name (int file, struct line_header *lh) { struct file_entry *fe = &lh->file_names[file - 1]; - if (IS_ABSOLUTE_PATH (fe->name) || fe->dir_index == 0) + if (IS_ABSOLUTE_PATH (fe->name) || fe->dir_index == 0 + || lh->include_dirs == NULL) return xstrdup (fe->name); return concat (lh->include_dirs[fe->dir_index - 1], SLASH_STRING, fe->name, NULL); @@ -20675,7 +20946,7 @@ macro_start_file (int file, int line, static char * copy_string (const char *buf, int len) { - char *s = xmalloc (len + 1); + char *s = (char *) xmalloc (len + 1); memcpy (s, buf, len); s[len] = '\0'; @@ -20763,7 +21034,7 @@ parse_macro_definition (struct macro_source_file *file, int line, char *name = copy_string (body, p - body); int argc = 0; int argv_size = 1; - char **argv = xmalloc (argv_size * sizeof (*argv)); + char **argv = XNEWVEC (char *, argv_size); p++; @@ -20786,7 +21057,7 @@ parse_macro_definition (struct macro_source_file *file, int line, if (argc >= argv_size) { argv_size *= 2; - argv = xrealloc (argv, argv_size * sizeof (*argv)); + argv = XRESIZEVEC (char *, argv, argv_size); } argv[argc++] = copy_string (arg_start, p - arg_start); @@ -20952,7 +21223,8 @@ skip_unknown_opcode (unsigned int opcode, for (i = 0; i < arg; ++i) { - mac_ptr = skip_form_bytes (abfd, mac_ptr, mac_end, defn[i], offset_size, + mac_ptr = skip_form_bytes (abfd, mac_ptr, mac_end, + (enum dwarf_form) defn[i], offset_size, section); if (mac_ptr == NULL) { @@ -21069,7 +21341,7 @@ dwarf_decode_macro_bytes (bfd *abfd, break; } - macinfo_type = read_1_byte (abfd, mac_ptr); + macinfo_type = (enum dwarf_macro_record_type) read_1_byte (abfd, mac_ptr); mac_ptr++; /* Note that we rely on the fact that the corresponding GNU and @@ -21209,7 +21481,9 @@ dwarf_decode_macro_bytes (bfd *abfd, /* We don't increment mac_ptr here, so this is just a look-ahead. */ - next_type = read_1_byte (abfd, mac_ptr); + next_type + = (enum dwarf_macro_record_type) read_1_byte (abfd, + mac_ptr); if (next_type != 0) complaint (&symfile_complaints, _("no terminating 0-type entry for " @@ -21385,7 +21659,7 @@ dwarf_decode_macros (struct dwarf2_cu *cu, unsigned int offset, break; } - macinfo_type = read_1_byte (abfd, mac_ptr); + macinfo_type = (enum dwarf_macro_record_type) read_1_byte (abfd, mac_ptr); mac_ptr++; /* Note that we rely on the fact that the corresponding GNU and @@ -21620,8 +21894,7 @@ dwarf2_symbol_mark_computed (const struct attribute *attr, struct symbol *sym, { struct dwarf2_loclist_baton *baton; - baton = obstack_alloc (&objfile->objfile_obstack, - sizeof (struct dwarf2_loclist_baton)); + baton = XOBNEW (&objfile->objfile_obstack, struct dwarf2_loclist_baton); fill_in_loclist_baton (cu, baton, attr); @@ -21639,8 +21912,7 @@ dwarf2_symbol_mark_computed (const struct attribute *attr, struct symbol *sym, { struct dwarf2_locexpr_baton *baton; - baton = obstack_alloc (&objfile->objfile_obstack, - sizeof (struct dwarf2_locexpr_baton)); + baton = XOBNEW (&objfile->objfile_obstack, struct dwarf2_locexpr_baton); baton->per_cu = cu->per_cu; gdb_assert (baton->per_cu); @@ -21844,9 +22116,7 @@ prepare_one_comp_unit (struct dwarf2_cu *cu, struct die_info *comp_unit_die, cu->language_defn = language_def (cu->language); } - attr = dwarf2_attr (comp_unit_die, DW_AT_producer, cu); - if (attr) - cu->producer = DW_STRING (attr); + cu->producer = dwarf2_string_attr (comp_unit_die, DW_AT_producer, cu); } /* Release one cached compilation unit, CU. We unlink it from the tree @@ -21858,7 +22128,7 @@ prepare_one_comp_unit (struct dwarf2_cu *cu, struct die_info *comp_unit_die, static void free_heap_comp_unit (void *data) { - struct dwarf2_cu *cu = data; + struct dwarf2_cu *cu = (struct dwarf2_cu *) data; gdb_assert (cu->per_cu != NULL); cu->per_cu->cu = NULL; @@ -21876,7 +22146,7 @@ free_heap_comp_unit (void *data) static void free_stack_comp_unit (void *data) { - struct dwarf2_cu *cu = data; + struct dwarf2_cu *cu = (struct dwarf2_cu *) data; gdb_assert (cu->per_cu != NULL); cu->per_cu->cu = NULL; @@ -21921,7 +22191,7 @@ age_cached_comp_units (void) while (per_cu != NULL) { per_cu->cu->last_used ++; - if (per_cu->cu->last_used <= dwarf2_max_cache_age) + if (per_cu->cu->last_used <= dwarf_max_cache_age) dwarf2_mark (per_cu->cu); per_cu = per_cu->cu->read_in_chain; } @@ -21980,7 +22250,9 @@ free_one_cached_comp_unit (struct dwarf2_per_cu_data *target_per_cu) void dwarf2_free_objfile (struct objfile *objfile) { - dwarf2_per_objfile = objfile_data (objfile, dwarf2_objfile_data_key); + dwarf2_per_objfile + = (struct dwarf2_per_objfile *) objfile_data (objfile, + dwarf2_objfile_data_key); if (dwarf2_per_objfile == NULL) return; @@ -22023,7 +22295,8 @@ struct dwarf2_per_cu_offset_and_type static hashval_t per_cu_offset_and_type_hash (const void *item) { - const struct dwarf2_per_cu_offset_and_type *ofs = item; + const struct dwarf2_per_cu_offset_and_type *ofs + = (const struct dwarf2_per_cu_offset_and_type *) item; return (uintptr_t) ofs->per_cu + ofs->offset.sect_off; } @@ -22033,8 +22306,10 @@ per_cu_offset_and_type_hash (const void *item) static int per_cu_offset_and_type_eq (const void *item_lhs, const void *item_rhs) { - const struct dwarf2_per_cu_offset_and_type *ofs_lhs = item_lhs; - const struct dwarf2_per_cu_offset_and_type *ofs_rhs = item_rhs; + const struct dwarf2_per_cu_offset_and_type *ofs_lhs + = (const struct dwarf2_per_cu_offset_and_type *) item_lhs; + const struct dwarf2_per_cu_offset_and_type *ofs_rhs + = (const struct dwarf2_per_cu_offset_and_type *) item_rhs; return (ofs_lhs->per_cu == ofs_rhs->per_cu && ofs_lhs->offset.sect_off == ofs_rhs->offset.sect_off); @@ -22082,10 +22357,40 @@ set_die_type (struct die_info *die, struct type *type, struct dwarf2_cu *cu) && !HAVE_GNAT_AUX_INFO (type)) INIT_GNAT_SPECIFIC (type); + /* Read DW_AT_allocated and set in type. */ + attr = dwarf2_attr (die, DW_AT_allocated, cu); + if (attr_form_is_block (attr)) + { + if (attr_to_dynamic_prop (attr, die, cu, &prop)) + add_dyn_prop (DYN_PROP_ALLOCATED, prop, type, objfile); + } + else if (attr != NULL) + { + complaint (&symfile_complaints, + _("DW_AT_allocated has the wrong form (%s) at DIE 0x%x"), + (attr != NULL ? dwarf_form_name (attr->form) : "n/a"), + die->offset.sect_off); + } + + /* Read DW_AT_associated and set in type. */ + attr = dwarf2_attr (die, DW_AT_associated, cu); + if (attr_form_is_block (attr)) + { + if (attr_to_dynamic_prop (attr, die, cu, &prop)) + add_dyn_prop (DYN_PROP_ASSOCIATED, prop, type, objfile); + } + else if (attr != NULL) + { + complaint (&symfile_complaints, + _("DW_AT_associated has the wrong form (%s) at DIE 0x%x"), + (attr != NULL ? dwarf_form_name (attr->form) : "n/a"), + die->offset.sect_off); + } + /* Read DW_AT_data_location and set in type. */ attr = dwarf2_attr (die, DW_AT_data_location, cu); if (attr_to_dynamic_prop (attr, die, cu, &prop)) - add_dyn_prop (DYN_ATTR_DATA_LOCATION, prop, type, objfile); + add_dyn_prop (DYN_PROP_DATA_LOCATION, prop, type, objfile); if (dwarf2_per_objfile->die_type_hash == NULL) { @@ -22108,7 +22413,8 @@ set_die_type (struct die_info *die, struct type *type, struct dwarf2_cu *cu) complaint (&symfile_complaints, _("A problem internal to GDB: DIE 0x%x has type already set"), die->offset.sect_off); - *slot = obstack_alloc (&objfile->objfile_obstack, sizeof (**slot)); + *slot = XOBNEW (&objfile->objfile_obstack, + struct dwarf2_per_cu_offset_and_type); **slot = ofs; return type; } @@ -22127,7 +22433,8 @@ get_die_type_at_offset (sect_offset offset, ofs.per_cu = per_cu; ofs.offset = offset; - slot = htab_find (dwarf2_per_objfile->die_type_hash, &ofs); + slot = ((struct dwarf2_per_cu_offset_and_type *) + htab_find (dwarf2_per_objfile->die_type_hash, &ofs)); if (slot) return slot->type; else @@ -22219,7 +22526,8 @@ dwarf2_clear_marks (struct dwarf2_per_cu_data *per_cu) static hashval_t partial_die_hash (const void *item) { - const struct partial_die_info *part_die = item; + const struct partial_die_info *part_die + = (const struct partial_die_info *) item; return part_die->offset.sect_off; } @@ -22230,26 +22538,28 @@ partial_die_hash (const void *item) static int 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; + const struct partial_die_info *part_die_lhs + = (const struct partial_die_info *) item_lhs; + const struct partial_die_info *part_die_rhs + = (const struct partial_die_info *) item_rhs; return part_die_lhs->offset.sect_off == part_die_rhs->offset.sect_off; } -static struct cmd_list_element *set_dwarf2_cmdlist; -static struct cmd_list_element *show_dwarf2_cmdlist; +static struct cmd_list_element *set_dwarf_cmdlist; +static struct cmd_list_element *show_dwarf_cmdlist; static void -set_dwarf2_cmd (char *args, int from_tty) +set_dwarf_cmd (char *args, int from_tty) { - help_list (set_dwarf2_cmdlist, "maintenance set dwarf2 ", all_commands, + help_list (set_dwarf_cmdlist, "maintenance set dwarf ", all_commands, gdb_stdout); } static void -show_dwarf2_cmd (char *args, int from_tty) +show_dwarf_cmd (char *args, int from_tty) { - cmd_show_list (show_dwarf2_cmdlist, from_tty, ""); + cmd_show_list (show_dwarf_cmdlist, from_tty, ""); } /* Free data associated with OBJFILE, if necessary. */ @@ -22257,7 +22567,7 @@ show_dwarf2_cmd (char *args, int from_tty) static void dwarf2_per_objfile_free (struct objfile *objfile, void *d) { - struct dwarf2_per_objfile *data = d; + struct dwarf2_per_objfile *data = (struct dwarf2_per_objfile *) d; int ix; /* Make sure we don't accidentally use dwarf2_per_objfile while @@ -22302,7 +22612,7 @@ struct strtab_entry static hashval_t hash_strtab_entry (const void *e) { - const struct strtab_entry *entry = e; + const struct strtab_entry *entry = (const struct strtab_entry *) e; return mapped_index_string_hash (INT_MAX, entry->str); } @@ -22311,8 +22621,8 @@ hash_strtab_entry (const void *e) static int eq_strtab_entry (const void *a, const void *b) { - const struct strtab_entry *ea = a; - const struct strtab_entry *eb = b; + const struct strtab_entry *ea = (const struct strtab_entry *) a; + const struct strtab_entry *eb = (const struct strtab_entry *) b; return !strcmp (ea->str, eb->str); } @@ -22338,7 +22648,7 @@ add_string (htab_t table, struct obstack *cpool, const char *str) entry.str = str; slot = htab_find_slot (table, &entry, INSERT); if (*slot) - result = *slot; + result = (struct strtab_entry *) *slot; else { result = XNEW (struct strtab_entry); @@ -22375,7 +22685,8 @@ struct mapped_symtab static hashval_t hash_symtab_entry (const void *e) { - const struct symtab_index_entry *entry = e; + const struct symtab_index_entry *entry + = (const struct symtab_index_entry *) e; return iterative_hash (VEC_address (offset_type, entry->cu_indices), sizeof (offset_type) * VEC_length (offset_type, entry->cu_indices), @@ -22387,8 +22698,8 @@ hash_symtab_entry (const void *e) static int eq_symtab_entry (const void *a, const void *b) { - const struct symtab_index_entry *ea = a; - const struct symtab_index_entry *eb = b; + const struct symtab_index_entry *ea = (const struct symtab_index_entry *) a; + const struct symtab_index_entry *eb = (const struct symtab_index_entry *) b; int len = VEC_length (offset_type, ea->cu_indices); if (len != VEC_length (offset_type, eb->cu_indices)) return 0; @@ -22402,7 +22713,7 @@ eq_symtab_entry (const void *a, const void *b) static void delete_symtab_entry (void *p) { - struct symtab_index_entry *entry = p; + struct symtab_index_entry *entry = (struct symtab_index_entry *) p; VEC_free (offset_type, entry->cu_indices); xfree (entry); } @@ -22433,7 +22744,7 @@ create_mapped_symtab (void) static void cleanup_mapped_symtab (void *p) { - struct mapped_symtab *symtab = p; + struct mapped_symtab *symtab = (struct mapped_symtab *) p; /* The contents of the array are freed when the other hash table is destroyed. */ xfree (symtab->data); @@ -22610,7 +22921,8 @@ add_indices_to_cpool (htab_t symbol_hash_table, struct obstack *cpool, } else { - struct symtab_index_entry *old_entry = *slot; + struct symtab_index_entry *old_entry + = (struct symtab_index_entry *) *slot; entry->index_offset = old_entry->index_offset; entry = old_entry; } @@ -22678,7 +22990,8 @@ struct psymtab_cu_index_map static hashval_t hash_psymtab_cu_index (const void *item) { - const struct psymtab_cu_index_map *map = item; + const struct psymtab_cu_index_map *map + = (const struct psymtab_cu_index_map *) item; return htab_hash_pointer (map->psymtab); } @@ -22686,8 +22999,10 @@ hash_psymtab_cu_index (const void *item) static int eq_psymtab_cu_index (const void *item_lhs, const void *item_rhs) { - const struct psymtab_cu_index_map *lhs = item_lhs; - const struct psymtab_cu_index_map *rhs = item_rhs; + const struct psymtab_cu_index_map *lhs + = (const struct psymtab_cu_index_map *) item_lhs; + const struct psymtab_cu_index_map *rhs + = (const struct psymtab_cu_index_map *) item_rhs; return lhs->psymtab == rhs->psymtab; } @@ -22734,8 +23049,8 @@ add_address_entry (struct objfile *objfile, struct obstack *obstack, static int add_address_entry_worker (void *datap, CORE_ADDR start_addr, void *obj) { - struct addrmap_index_data *data = datap; - struct partial_symtab *pst = obj; + struct addrmap_index_data *data = (struct addrmap_index_data *) datap; + struct partial_symtab *pst = (struct partial_symtab *) obj; if (data->previous_valid) add_address_entry (data->objfile, data->addr_obstack, @@ -22747,7 +23062,8 @@ add_address_entry_worker (void *datap, CORE_ADDR start_addr, void *obj) { struct psymtab_cu_index_map find_map, *map; find_map.psymtab = pst; - map = htab_find (data->cu_index_htab, &find_map); + map = ((struct psymtab_cu_index_map *) + htab_find (data->cu_index_htab, &find_map)); gdb_assert (map != NULL); data->previous_cu_index = map->cu_index; data->previous_valid = 1; @@ -22877,7 +23193,7 @@ write_obstack (FILE *file, struct obstack *obstack) static void unlink_if_set (void *p) { - char **filename = p; + char **filename = (char **) p; if (*filename) unlink (*filename); } @@ -22898,7 +23214,8 @@ struct signatured_type_index_data static int write_one_signatured_type (void **slot, void *d) { - struct signatured_type_index_data *info = d; + struct signatured_type_index_data *info + = (struct signatured_type_index_data *) d; struct signatured_type *entry = (struct signatured_type *) *slot; struct partial_symtab *psymtab = entry->per_cu.v.psymtab; gdb_byte val[8]; @@ -23025,9 +23342,8 @@ write_psymtabs_to_index (struct objfile *objfile, const char *dir) eq_psymtab_cu_index, NULL, xcalloc, xfree); make_cleanup_htab_delete (cu_index_htab); - psymtab_cu_index_map = (struct psymtab_cu_index_map *) - xmalloc (sizeof (struct psymtab_cu_index_map) - * dwarf2_per_objfile->n_comp_units); + psymtab_cu_index_map = XNEWVEC (struct psymtab_cu_index_map, + dwarf2_per_objfile->n_comp_units); make_cleanup (xfree, psymtab_cu_index_map); /* The CU list is already sorted, so we don't need to do additional @@ -23166,7 +23482,9 @@ save_gdb_index_command (char *arg, int from_tty) if (stat (objfile_name (objfile), &st) < 0) continue; - dwarf2_per_objfile = objfile_data (objfile, dwarf2_objfile_data_key); + dwarf2_per_objfile + = (struct dwarf2_per_objfile *) objfile_data (objfile, + dwarf2_objfile_data_key); if (dwarf2_per_objfile) { @@ -23187,11 +23505,11 @@ save_gdb_index_command (char *arg, int from_tty) -int dwarf2_always_disassemble; +int dwarf_always_disassemble; static void -show_dwarf2_always_disassemble (struct ui_file *file, int from_tty, - struct cmd_list_element *c, const char *value) +show_dwarf_always_disassemble (struct ui_file *file, int from_tty, + struct cmd_list_element *c, const char *value) { fprintf_filtered (file, _("Whether to always disassemble " @@ -23218,61 +23536,71 @@ _initialize_dwarf2_read (void) dwarf2_objfile_data_key = register_objfile_data_with_cleanup (NULL, dwarf2_per_objfile_free); - add_prefix_cmd ("dwarf2", class_maintenance, set_dwarf2_cmd, _("\ -Set DWARF 2 specific variables.\n\ -Configure DWARF 2 variables such as the cache size"), - &set_dwarf2_cmdlist, "maintenance set dwarf2 ", + add_prefix_cmd ("dwarf", class_maintenance, set_dwarf_cmd, _("\ +Set DWARF specific variables.\n\ +Configure DWARF variables such as the cache size"), + &set_dwarf_cmdlist, "maintenance set dwarf ", 0/*allow-unknown*/, &maintenance_set_cmdlist); - add_prefix_cmd ("dwarf2", class_maintenance, show_dwarf2_cmd, _("\ -Show DWARF 2 specific variables\n\ -Show DWARF 2 variables such as the cache size"), - &show_dwarf2_cmdlist, "maintenance show dwarf2 ", + add_prefix_cmd ("dwarf", class_maintenance, show_dwarf_cmd, _("\ +Show DWARF specific variables\n\ +Show DWARF variables such as the cache size"), + &show_dwarf_cmdlist, "maintenance show dwarf ", 0/*allow-unknown*/, &maintenance_show_cmdlist); add_setshow_zinteger_cmd ("max-cache-age", class_obscure, - &dwarf2_max_cache_age, _("\ -Set the upper bound on the age of cached dwarf2 compilation units."), _("\ -Show the upper bound on the age of cached dwarf2 compilation units."), _("\ + &dwarf_max_cache_age, _("\ +Set the upper bound on the age of cached DWARF compilation units."), _("\ +Show the upper bound on the age of cached DWARF compilation units."), _("\ A higher limit means that cached compilation units will be stored\n\ in memory longer, and more total memory will be used. Zero disables\n\ caching, which can slow down startup."), NULL, - show_dwarf2_max_cache_age, - &set_dwarf2_cmdlist, - &show_dwarf2_cmdlist); + show_dwarf_max_cache_age, + &set_dwarf_cmdlist, + &show_dwarf_cmdlist); add_setshow_boolean_cmd ("always-disassemble", class_obscure, - &dwarf2_always_disassemble, _("\ + &dwarf_always_disassemble, _("\ Set whether `info address' always disassembles DWARF expressions."), _("\ Show whether `info address' always disassembles DWARF expressions."), _("\ When enabled, DWARF expressions are always printed in an assembly-like\n\ syntax. When disabled, expressions will be printed in a more\n\ conversational style, when possible."), NULL, - show_dwarf2_always_disassemble, - &set_dwarf2_cmdlist, - &show_dwarf2_cmdlist); - - add_setshow_zuinteger_cmd ("dwarf2-read", no_class, &dwarf2_read_debug, _("\ -Set debugging of the dwarf2 reader."), _("\ -Show debugging of the dwarf2 reader."), _("\ -When enabled (non-zero), debugging messages are printed during dwarf2\n\ + show_dwarf_always_disassemble, + &set_dwarf_cmdlist, + &show_dwarf_cmdlist); + + add_setshow_zuinteger_cmd ("dwarf-read", no_class, &dwarf_read_debug, _("\ +Set debugging of the DWARF reader."), _("\ +Show debugging of the DWARF reader."), _("\ +When enabled (non-zero), debugging messages are printed during DWARF\n\ reading and symtab expansion. A value of 1 (one) provides basic\n\ information. A value greater than 1 provides more verbose information."), NULL, NULL, &setdebuglist, &showdebuglist); - add_setshow_zuinteger_cmd ("dwarf2-die", no_class, &dwarf2_die_debug, _("\ -Set debugging of the dwarf2 DIE reader."), _("\ -Show debugging of the dwarf2 DIE reader."), _("\ + add_setshow_zuinteger_cmd ("dwarf-die", no_class, &dwarf_die_debug, _("\ +Set debugging of the DWARF DIE reader."), _("\ +Show debugging of the DWARF 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); + add_setshow_zuinteger_cmd ("dwarf-line", no_class, &dwarf_line_debug, _("\ +Set debugging of the dwarf line reader."), _("\ +Show debugging of the dwarf line reader."), _("\ +When enabled (non-zero), line number entries are dumped as they are read in.\n\ +A value of 1 (one) provides basic information.\n\ +A value greater than 1 provides more verbose information."), + NULL, + NULL, + &setdebuglist, &showdebuglist); + add_setshow_boolean_cmd ("check-physname", no_class, &check_physname, _("\ Set cross-checking of \"physname\" code against demangler."), _("\ Show cross-checking of \"physname\" code against demangler."), _("\