X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fdwarf2read.c;h=dcd49e35ecaa69b2e2d74d9eacc6e44cee68a7d6;hb=5fe966540d6b748f825774868463003700f0c878;hp=d79b2e3a98e9693c52cd1d200d33451fd41b1666;hpb=e815d2d2714a395d11abb350eff385931257ed9a;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c index d79b2e3a98..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 @@ -123,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; @@ -138,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; }; @@ -610,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. @@ -1522,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); @@ -1634,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); @@ -1736,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 *); @@ -1951,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); } @@ -1961,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); @@ -2032,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); @@ -2048,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. */ @@ -2072,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. @@ -2086,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. */ @@ -2171,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)) @@ -2229,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, @@ -2237,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; } @@ -2254,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. @@ -2313,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 @@ -2365,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 @@ -2401,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); } } @@ -2598,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); } @@ -2608,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); } @@ -2619,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) @@ -2655,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); } @@ -2685,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 @@ -2806,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); @@ -2836,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); @@ -2974,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. */ @@ -3216,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; @@ -3233,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); } @@ -3288,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; } @@ -3300,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); @@ -3309,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; @@ -4080,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; @@ -4489,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; @@ -4540,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; @@ -4549,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; } @@ -4574,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; @@ -4713,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; } @@ -4767,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] @@ -4797,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; @@ -4899,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 @@ -4921,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; @@ -4962,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 @@ -5007,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; } } @@ -5117,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; @@ -5264,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) { @@ -5341,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); @@ -5478,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); @@ -5738,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); } @@ -5746,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); } @@ -5861,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 @@ -5890,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); @@ -5933,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; @@ -5951,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)); @@ -6014,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)) { @@ -6029,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); @@ -6130,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. */ @@ -6150,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; @@ -6305,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) @@ -6340,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. */ @@ -6410,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; } @@ -6571,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; @@ -6583,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; @@ -6607,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); @@ -6619,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); @@ -6855,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); @@ -6900,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: @@ -6929,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: @@ -6965,7 +6960,7 @@ 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 @@ -6980,13 +6975,10 @@ add_partial_symbol (struct partial_die_info *pdi, struct dwarf2_cu *cu) 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, has_loc ? addr + baseaddr : (CORE_ADDR) 0, cu->language, objfile); } @@ -6998,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: @@ -7006,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: @@ -7040,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: @@ -7051,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; @@ -7428,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 @@ -7437,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; @@ -7467,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; @@ -7545,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; @@ -7656,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) { @@ -7675,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; } @@ -7686,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; } @@ -7704,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 = @@ -7847,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; @@ -7978,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); @@ -8081,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 @@ -8237,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; } @@ -8443,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)) { @@ -8453,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)) { @@ -8662,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; @@ -8712,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 @@ -8792,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; @@ -8859,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 @@ -8943,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; @@ -8994,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); } @@ -9010,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; @@ -9033,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); @@ -9062,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; @@ -9131,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; } } @@ -9320,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); @@ -9405,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); @@ -9417,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; @@ -9465,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; @@ -9474,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, @@ -9522,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; @@ -9928,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 @@ -10110,9 +10127,10 @@ create_dwo_unit_in_dwp_v1 (struct dwp_file *dwp_file, 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; @@ -10138,15 +10156,15 @@ create_dwo_unit_in_dwp_v1 (struct dwp_file *dwp_file, 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. */ @@ -10311,9 +10329,10 @@ create_dwo_unit_in_dwp_v2 (struct dwp_file *dwp_file, 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, @@ -10352,15 +10371,15 @@ create_dwo_unit_in_dwp_v2 (struct dwp_file *dwp_file, 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, @@ -10396,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) @@ -10423,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; @@ -10544,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)) @@ -10592,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); @@ -10649,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; @@ -10661,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); } } @@ -10684,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; @@ -10696,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); } } @@ -10741,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; @@ -10752,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; } @@ -10971,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) { @@ -10983,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) { @@ -11220,7 +11240,7 @@ 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; @@ -11393,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) @@ -11444,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); @@ -11464,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 *))); @@ -11478,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. */ @@ -11524,10 +11555,10 @@ read_lexical_block_scope (struct die_info *die, struct dwarf2_cu *cu) 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 @@ -11543,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. */ @@ -11609,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; @@ -11674,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; @@ -11690,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, @@ -11862,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; @@ -11881,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)); @@ -11917,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; } @@ -12441,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)); @@ -12627,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); @@ -12686,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; @@ -12831,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; @@ -12890,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) @@ -13142,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); @@ -13185,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 { @@ -13287,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) @@ -13376,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. */ @@ -13804,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 @@ -13882,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); @@ -13897,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; @@ -13973,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; @@ -14067,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) @@ -14091,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); } } @@ -14168,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; } @@ -14797,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; @@ -14825,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; @@ -14834,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; @@ -14858,7 +14893,7 @@ attr_to_dynamic_prop (const struct attribute *attr, struct die_info *die, &offset)) return 0; - baton = obstack_alloc (obstack, sizeof (*baton)); + baton = XOBNEW (obstack, struct dwarf2_property_baton); baton->referenced_type = read_type_die (target_die->parent, target_cu); baton->offset_info.offset = offset; @@ -15013,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; @@ -15255,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; } @@ -15316,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 *)); @@ -15328,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) @@ -15337,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; @@ -15353,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)); @@ -15409,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); @@ -15431,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); @@ -15503,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) { @@ -15609,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; } @@ -15648,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; @@ -15704,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 @@ -15901,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: @@ -15975,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; } @@ -16091,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; @@ -16178,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); } } @@ -16202,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: @@ -17071,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. */ @@ -17145,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); } @@ -17163,15 +17229,13 @@ add_include_dir (struct line_header *lh, const char *include_dir) 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; @@ -17196,15 +17260,13 @@ add_file_name (struct line_header *lh, 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++]; @@ -17284,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); @@ -17344,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) @@ -18445,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, @@ -18556,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 @@ -18672,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; } @@ -18717,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; @@ -18916,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); @@ -19127,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) @@ -19155,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); @@ -19178,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); @@ -19202,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, @@ -19230,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); @@ -19386,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 @@ -19405,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); @@ -19441,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); } } @@ -19546,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); @@ -19953,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. @@ -20001,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) @@ -20072,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; @@ -20102,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) @@ -20124,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; } @@ -20245,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. @@ -20742,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 * @@ -20858,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'; @@ -20946,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++; @@ -20969,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); @@ -21135,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) { @@ -21252,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 @@ -21392,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 " @@ -21568,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 @@ -21803,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); @@ -21822,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); @@ -22027,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 @@ -22041,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; @@ -22059,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; @@ -22163,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; @@ -22206,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; } @@ -22216,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); @@ -22265,6 +22357,36 @@ 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)) @@ -22291,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; } @@ -22310,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 @@ -22402,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; } @@ -22413,8 +22538,10 @@ 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; } @@ -22440,7 +22567,7 @@ show_dwarf_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 @@ -22485,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); } @@ -22494,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); } @@ -22521,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); @@ -22558,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), @@ -22570,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; @@ -22585,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); } @@ -22616,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); @@ -22793,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; } @@ -22861,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); } @@ -22869,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; } @@ -22917,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, @@ -22930,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; @@ -23060,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); } @@ -23081,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]; @@ -23208,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 @@ -23349,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) {