X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fdwarf2read.c;h=8a6684883cd7ba1936ab93c73f4dd239112c08e6;hb=192b62ce0b4bb5c61188f570e127a26d2c32f716;hp=9a2113eeb9c6d8eb0934b7a688b556201c84aef3;hpb=83769d0b125e2043aba13ff05a4e8d08014e08a5;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c index 9a2113eeb9..8a6684883c 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-2017 Free Software Foundation, Inc. Adapted by Gary Funck (gary@intrepid.com), Intrepid Technology, Inc. with support from Florida State University (under contract @@ -53,7 +53,6 @@ #include "block.h" #include "addrmap.h" #include "typeprint.h" -#include "jv-lang.h" #include "psympriv.h" #include #include "completer.h" @@ -69,20 +68,25 @@ #include "source.h" #include "filestuff.h" #include "build-id.h" +#include "namespace.h" #include #include +#include typedef struct symbol *symbolp; DEF_VEC_P (symbolp); /* When == 1, print basic high level tracing messages. When > 1, be more verbose. - This is in contrast to the low level DIE reading of dwarf2_die_debug. */ -static unsigned int dwarf2_read_debug = 0; + This is in contrast to the low level DIE reading of dwarf_die_debug. */ +static unsigned int dwarf_read_debug = 0; /* When non-zero, dump DIEs after they are read in. */ -static unsigned int dwarf2_die_debug = 0; +static unsigned int dwarf_die_debug = 0; + +/* When non-zero, dump line number entries as they are read in. */ +static unsigned int dwarf_line_debug = 0; /* When non-zero, cross-check physname against demangler. */ static int check_physname = 0; @@ -120,7 +124,7 @@ struct dwarf2_section_info union { /* If this is a real section, the bfd section. */ - asection *asection; + asection *section; /* If this is a virtual section, pointer to the containing ("real") section. */ struct dwarf2_section_info *containing_section; @@ -135,7 +139,7 @@ struct dwarf2_section_info /* True if we have tried to read this section. */ char readin; /* True if this is a virtual section, False otherwise. - This specifies which of s.asection and s.containing_section to use. */ + This specifies which of s.section and s.containing_section to use. */ char is_virtual; }; @@ -607,7 +611,8 @@ struct dwarf2_per_cu_data struct dwarf2_section_info *section; /* Set to non-NULL iff this CU is currently loaded. When it gets freed out - of the CU cache it gets reset to NULL again. */ + of the CU cache it gets reset to NULL again. This is left as NULL for + dummy CUs (a CU header, but nothing else). */ struct dwarf2_cu *cu; /* The corresponding objfile. @@ -1100,6 +1105,9 @@ struct partial_die_info unsigned int has_pc_info : 1; unsigned int may_be_inlined : 1; + /* This DIE has been marked DW_AT_main_subprogram. */ + unsigned int main_subprogram : 1; + /* Flag set if the SCOPE field of this structure has been computed. */ unsigned int scope_set : 1; @@ -1373,13 +1381,13 @@ static struct dwarf2_queue_item *dwarf2_queue, *dwarf2_queue_tail; compilation units. Set this to zero to disable caching. Cache sizes of up to at least twenty will improve startup time for typical inter-CU-reference binaries, at an obvious memory cost. */ -static int dwarf2_max_cache_age = 5; +static int dwarf_max_cache_age = 5; static void -show_dwarf2_max_cache_age (struct ui_file *file, int from_tty, - struct cmd_list_element *c, const char *value) +show_dwarf_max_cache_age (struct ui_file *file, int from_tty, + struct cmd_list_element *c, const char *value) { fprintf_filtered (file, _("The upper bound on the age of cached " - "dwarf2 compilation units is %s.\n"), + "DWARF compilation units is %s.\n"), value); } @@ -1519,6 +1527,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); @@ -1598,9 +1609,28 @@ static void read_call_site_scope (struct die_info *die, struct dwarf2_cu *cu); static int dwarf2_ranges_read (unsigned, CORE_ADDR *, CORE_ADDR *, struct dwarf2_cu *, struct partial_symtab *); -static int dwarf2_get_pc_bounds (struct die_info *, - CORE_ADDR *, CORE_ADDR *, struct dwarf2_cu *, - struct partial_symtab *); +/* How dwarf2_get_pc_bounds constructed its *LOWPC and *HIGHPC return + values. Keep the items ordered with increasing constraints compliance. */ +enum pc_bounds_kind +{ + /* No attribute DW_AT_low_pc, DW_AT_high_pc or DW_AT_ranges was found. */ + PC_BOUNDS_NOT_PRESENT, + + /* Some of the attributes DW_AT_low_pc, DW_AT_high_pc or DW_AT_ranges + were present but they do not form a valid range of PC addresses. */ + PC_BOUNDS_INVALID, + + /* Discontiguous range was found - that is DW_AT_ranges was found. */ + PC_BOUNDS_RANGES, + + /* Contiguous range was found - DW_AT_low_pc and DW_AT_high_pc were found. */ + PC_BOUNDS_HIGH_LOW, +}; + +static enum pc_bounds_kind dwarf2_get_pc_bounds (struct die_info *, + CORE_ADDR *, CORE_ADDR *, + struct dwarf2_cu *, + struct partial_symtab *); static void get_scope_pc_bounds (struct die_info *, CORE_ADDR *, CORE_ADDR *, @@ -1631,6 +1661,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); @@ -1733,6 +1765,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 *); @@ -1948,7 +1984,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); } @@ -1958,8 +1994,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); @@ -2029,12 +2065,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); @@ -2045,9 +2082,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. */ @@ -2069,7 +2106,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. @@ -2083,7 +2120,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. */ @@ -2168,57 +2205,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)) @@ -2226,7 +2263,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, @@ -2234,11 +2271,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; } @@ -2251,7 +2288,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. @@ -2310,7 +2347,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 @@ -2362,7 +2399,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 @@ -2398,38 +2436,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); } } @@ -2441,7 +2479,6 @@ locate_dwz_sections (bfd *abfd, asection *sectp, void *arg) static struct dwz_file * dwarf2_get_dwz_file (void) { - bfd *dwz_bfd; char *data; struct cleanup *cleanup; const char *filename; @@ -2485,14 +2522,11 @@ dwarf2_get_dwz_file (void) /* First try the file name given in the section. If that doesn't work, try to use the build-id instead. */ - dwz_bfd = gdb_bfd_open (filename, gnutarget, -1); + gdb_bfd_ref_ptr dwz_bfd (gdb_bfd_open (filename, gnutarget, -1)); if (dwz_bfd != NULL) { - if (!build_id_verify (dwz_bfd, buildid_len, buildid)) - { - gdb_bfd_unref (dwz_bfd); - dwz_bfd = NULL; - } + if (!build_id_verify (dwz_bfd.get (), buildid_len, buildid)) + dwz_bfd.release (); } if (dwz_bfd == NULL) @@ -2504,13 +2538,13 @@ dwarf2_get_dwz_file (void) result = OBSTACK_ZALLOC (&dwarf2_per_objfile->objfile->objfile_obstack, struct dwz_file); - result->dwz_bfd = dwz_bfd; + result->dwz_bfd = dwz_bfd.release (); - bfd_map_over_sections (dwz_bfd, locate_dwz_sections, result); + bfd_map_over_sections (result->dwz_bfd, locate_dwz_sections, result); do_cleanups (cleanup); - gdb_bfd_record_inclusion (dwarf2_per_objfile->objfile->obfd, dwz_bfd); + gdb_bfd_record_inclusion (dwarf2_per_objfile->objfile->obfd, result->dwz_bfd); dwarf2_per_objfile->dwz_file = result; return result; } @@ -2595,7 +2629,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); } @@ -2605,8 +2640,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); } @@ -2616,7 +2651,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) @@ -2652,7 +2687,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); } @@ -2682,6 +2718,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 @@ -2803,10 +2840,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); @@ -2833,9 +2869,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); @@ -2970,8 +3005,8 @@ find_slot_in_mapped_hash (struct mapped_index *index, const char *name, int (*cmp) (const char *, const char *); 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. */ @@ -3213,7 +3248,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; @@ -3230,7 +3265,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); } @@ -3285,7 +3321,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; } @@ -3297,7 +3333,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); @@ -3306,8 +3342,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; @@ -3665,23 +3701,25 @@ dw2_lookup_symbol (struct objfile *objfile, int block_index, while ((per_cu = dw2_symtab_iter_next (&iter)) != NULL) { - struct symbol *sym = NULL; + struct symbol *sym, *with_opaque = NULL; struct compunit_symtab *stab = dw2_instantiate_symtab (per_cu); const struct blockvector *bv = COMPUNIT_BLOCKVECTOR (stab); struct block *block = BLOCKVECTOR_BLOCK (bv, block_index); + sym = block_find_symbol (block, name, domain, + block_find_non_opaque_type_preferred, + &with_opaque); + /* Some caution must be observed with overloaded functions and methods, since the index will not contain any overload information (but NAME might contain it). */ - sym = block_lookup_symbol (block, name, domain); - if (sym && strcmp_iw (SYMBOL_SEARCH_NAME (sym), name) == 0) - { - if (!TYPE_IS_OPAQUE (SYMBOL_TYPE (sym))) - return stab; - - stab_best = stab; - } + if (sym != NULL + && strcmp_iw (SYMBOL_SEARCH_NAME (sym), name) == 0) + return stab; + if (with_opaque != NULL + && strcmp_iw (SYMBOL_SEARCH_NAME (with_opaque), name) == 0) + stab_best = stab; /* Keep looking through other CUs. */ } @@ -3855,17 +3893,12 @@ dw2_expand_symtabs_matching if (file_matcher != NULL) { - struct cleanup *cleanup; - htab_t visited_found, visited_not_found; - - visited_found = htab_create_alloc (10, - htab_hash_pointer, htab_eq_pointer, - NULL, xcalloc, xfree); - cleanup = make_cleanup_htab_delete (visited_found); - visited_not_found = htab_create_alloc (10, - htab_hash_pointer, htab_eq_pointer, - NULL, xcalloc, xfree); - make_cleanup_htab_delete (visited_not_found); + htab_up visited_found (htab_create_alloc (10, htab_hash_pointer, + htab_eq_pointer, + NULL, xcalloc, xfree)); + htab_up visited_not_found (htab_create_alloc (10, htab_hash_pointer, + htab_eq_pointer, + NULL, xcalloc, xfree)); /* The rule is CUs specify all the files, including those used by any TU, so there's no need to scan TUs here. */ @@ -3889,9 +3922,9 @@ dw2_expand_symtabs_matching if (file_data == NULL) continue; - if (htab_find (visited_not_found, file_data) != NULL) + if (htab_find (visited_not_found.get (), file_data) != NULL) continue; - else if (htab_find (visited_found, file_data) != NULL) + else if (htab_find (visited_found.get (), file_data) != NULL) { per_cu->v.quick->mark = 1; continue; @@ -3923,13 +3956,11 @@ dw2_expand_symtabs_matching } slot = htab_find_slot (per_cu->v.quick->mark - ? visited_found - : visited_not_found, + ? visited_found.get () + : visited_not_found.get (), file_data, INSERT); *slot = file_data; } - - do_cleanups (cleanup); } for (iter = 0; iter < index->symbol_table_slots; ++iter) @@ -4075,7 +4106,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; @@ -4095,11 +4127,9 @@ dw2_map_symbol_filenames (struct objfile *objfile, symbol_filename_ftype *fun, void *data, int need_fullname) { int i; - struct cleanup *cleanup; - htab_t visited = htab_create_alloc (10, htab_hash_pointer, htab_eq_pointer, - NULL, xcalloc, xfree); + htab_up visited (htab_create_alloc (10, htab_hash_pointer, htab_eq_pointer, + NULL, xcalloc, xfree)); - cleanup = make_cleanup_htab_delete (visited); dw2_setup (objfile); /* The rule is CUs specify all the files, including those used by @@ -4112,7 +4142,8 @@ dw2_map_symbol_filenames (struct objfile *objfile, symbol_filename_ftype *fun, if (per_cu->v.quick->compunit_symtab) { - void **slot = htab_find_slot (visited, per_cu->v.quick->file_names, + void **slot = htab_find_slot (visited.get (), + per_cu->v.quick->file_names, INSERT); *slot = per_cu->v.quick->file_names; @@ -4134,7 +4165,7 @@ dw2_map_symbol_filenames (struct objfile *objfile, symbol_filename_ftype *fun, if (file_data == NULL) continue; - slot = htab_find_slot (visited, file_data, INSERT); + slot = htab_find_slot (visited.get (), file_data, INSERT); if (*slot) { /* Already visited. */ @@ -4153,8 +4184,6 @@ dw2_map_symbol_filenames (struct objfile *objfile, symbol_filename_ftype *fun, (*fun) (file_data->file_names[j], this_real_name, data); } } - - do_cleanups (cleanup); } static int @@ -4359,7 +4388,6 @@ error_check_comp_unit_head (struct comp_unit_head *header, struct dwarf2_section_info *section, struct dwarf2_section_info *abbrev_section) { - bfd *abfd = get_section_bfd_owner (section); const char *filename = get_section_file_name (section); if (header->version != 2 && header->version != 3 && header->version != 4) @@ -4457,12 +4485,12 @@ read_abbrev_offset (struct dwarf2_section_info *section, { bfd *abfd = get_section_bfd_owner (section); const gdb_byte *info_ptr; - unsigned int length, initial_length_size, offset_size; + unsigned int initial_length_size, offset_size; sect_offset abbrev_offset; dwarf2_read_section (dwarf2_per_objfile->objfile, section); info_ptr = section->buffer + offset.sect_off; - length = read_initial_length (abfd, info_ptr, &initial_length_size); + read_initial_length (abfd, info_ptr, &initial_length_size); offset_size = initial_length_size == 4 ? 4 : 8; info_ptr += initial_length_size + 2 /*version*/; abbrev_offset.sect_off = read_offset_1 (abfd, info_ptr, offset_size); @@ -4484,13 +4512,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; @@ -4535,7 +4561,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; @@ -4544,8 +4571,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; } @@ -4569,8 +4596,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; @@ -4604,7 +4631,7 @@ create_debug_types_hash_table (struct dwo_file *dwo_file, ? &dwo_file->sections.abbrev : &dwarf2_per_objfile->abbrev); - if (dwarf2_read_debug) + if (dwarf_read_debug) fprintf_unfiltered (gdb_stdlog, "Reading .debug_types%s for %s:\n", dwo_file ? ".dwo" : "", get_section_file_name (abbrev_section)); @@ -4708,13 +4735,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; } @@ -4727,7 +4756,7 @@ create_debug_types_hash_table (struct dwo_file *dwo_file, } *slot = dwo_file ? (void *) dwo_tu : (void *) sig_type; - if (dwarf2_read_debug > 1) + if (dwarf_read_debug > 1) fprintf_unfiltered (gdb_stdlog, " offset 0x%x, signature %s\n", offset.sect_off, hex_string (signature)); @@ -4762,9 +4791,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] @@ -4792,9 +4820,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; @@ -4894,7 +4922,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 @@ -4916,7 +4944,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; @@ -4957,7 +4985,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 @@ -5002,7 +5030,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; } } @@ -5112,8 +5141,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; @@ -5216,14 +5244,14 @@ read_cutu_die_from_dwo (struct dwarf2_per_cu_data *this_cu, comp_unit_die->attrs[i++] = *comp_dir; comp_unit_die->num_attrs += num_extra_attrs; - if (dwarf2_die_debug) + if (dwarf_die_debug) { fprintf_unfiltered (gdb_stdlog, "Read die from %s@0x%x of %s:\n", get_section_name (section), (unsigned) (begin_info_ptr - section->buffer), bfd_get_filename (abfd)); - dump_die (comp_unit_die, dwarf2_die_debug); + dump_die (comp_unit_die, dwarf_die_debug); } /* Save the comp_dir attribute. If there is no DWP file then we'll read @@ -5259,13 +5287,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) { @@ -5336,7 +5359,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); @@ -5428,7 +5451,7 @@ init_cutu_and_read_dies (struct dwarf2_per_cu_data *this_cu, before we can reread the DWO file (this only applies to CUs, not TUs). */ int rereading_dwo_cu = 0; - if (dwarf2_die_debug) + if (dwarf_die_debug) fprintf_unfiltered (gdb_stdlog, "Reading %s unit at offset 0x%x\n", this_cu->is_debug_types ? "type" : "comp", this_cu->offset.sect_off); @@ -5473,7 +5496,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); @@ -5661,7 +5684,7 @@ init_cutu_and_read_dies_no_follow (struct dwarf2_per_cu_data *this_cu, struct die_info *comp_unit_die; int has_children; - if (dwarf2_die_debug) + if (dwarf_die_debug) fprintf_unfiltered (gdb_stdlog, "Reading %s unit at offset 0x%x\n", this_cu->is_debug_types ? "type" : "comp", this_cu->offset.sect_off); @@ -5733,7 +5756,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); } @@ -5741,8 +5765,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); } @@ -5856,7 +5880,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 @@ -5885,8 +5909,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); @@ -5928,13 +5951,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; + enum pc_bounds_kind cu_bounds_kind; 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; @@ -5946,18 +5969,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)); @@ -5965,9 +5984,9 @@ process_psymtab_comp_unit_reader (const struct die_reader_specs *reader, /* Possibly set the default values of LOWPC and HIGHPC from `DW_AT_ranges'. */ - has_pc_info = dwarf2_get_pc_bounds (comp_unit_die, &best_lowpc, - &best_highpc, cu, pst); - if (has_pc_info == 1 && best_lowpc < best_highpc) + cu_bounds_kind = dwarf2_get_pc_bounds (comp_unit_die, &best_lowpc, + &best_highpc, cu, pst); + if (cu_bounds_kind == PC_BOUNDS_HIGH_LOW && best_lowpc < best_highpc) /* Store the contiguous range if it is not empty; it can be empty for CUs with no code. */ addrmap_set_empty (objfile->psymtabs_addrmap, @@ -5991,7 +6010,7 @@ process_psymtab_comp_unit_reader (const struct die_reader_specs *reader, first_die = load_partial_dies (reader, info_ptr, 1); scan_partial_symbols (first_die, &lowpc, &highpc, - ! has_pc_info, cu); + cu_bounds_kind <= PC_BOUNDS_INVALID, cu); /* If we didn't find a lowpc, set it to highpc to avoid complaints from `maint check'. */ @@ -6000,7 +6019,7 @@ process_psymtab_comp_unit_reader (const struct die_reader_specs *reader, /* If the compilation unit didn't have an explicit address range, then use the information extracted from its child dies. */ - if (! has_pc_info) + if (cu_bounds_kind <= PC_BOUNDS_INVALID) { best_lowpc = lowpc; best_highpc = highpc; @@ -6009,11 +6028,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)) { @@ -6024,8 +6039,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); @@ -6039,7 +6054,7 @@ process_psymtab_comp_unit_reader (const struct die_reader_specs *reader, and build a psymtab for each of them. */ dwarf2_build_include_psymtabs (cu, comp_unit_die, pst); - if (dwarf2_read_debug) + if (dwarf_read_debug) { struct gdbarch *gdbarch = get_objfile_arch (objfile); @@ -6125,11 +6140,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. */ @@ -6145,8 +6156,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; @@ -6174,13 +6187,11 @@ sort_tu_by_abbrev_offset (const void *ap, const void *bp) static void build_type_psymtabs_1 (void) { - struct objfile *objfile = dwarf2_per_objfile->objfile; struct tu_stats *tu_stats = &dwarf2_per_objfile->tu_stats; struct cleanup *cleanups; struct abbrev_table *abbrev_table; sect_offset abbrev_offset; struct tu_abbrev_offset *sorted_by_abbrev; - struct type_unit_group **iter; int i; /* It's up to the caller to not call us multiple times. */ @@ -6208,7 +6219,7 @@ build_type_psymtabs_1 (void) [IWBN if DWO skeletons had DW_AT_stmt_list] call FUNC */ - if (dwarf2_read_debug) + if (dwarf_read_debug) fprintf_unfiltered (gdb_stdlog, "Building type unit groups ...\n"); /* Sort in a separate table to maintain the order of all_type_units @@ -6300,8 +6311,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) @@ -6335,7 +6346,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. */ @@ -6405,7 +6416,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; } @@ -6445,7 +6456,7 @@ dwarf2_build_psymtabs_hard (struct objfile *objfile) struct obstack temp_obstack; int i; - if (dwarf2_read_debug) + if (dwarf_read_debug) { fprintf_unfiltered (gdb_stdlog, "Building psymtabs of objfile %s ...\n", objfile_name (objfile)); @@ -6487,7 +6498,7 @@ dwarf2_build_psymtabs_hard (struct objfile *objfile) build_type_psymtab_dependencies, NULL); } - if (dwarf2_read_debug) + if (dwarf_read_debug) print_tu_stats (); set_partial_user (objfile); @@ -6498,7 +6509,7 @@ dwarf2_build_psymtabs_hard (struct objfile *objfile) do_cleanups (back_to); - if (dwarf2_read_debug) + if (dwarf_read_debug) fprintf_unfiltered (gdb_stdlog, "Done building psymtabs of %s\n", objfile_name (objfile)); } @@ -6544,7 +6555,7 @@ read_comp_units_from_section (struct objfile *objfile, const gdb_byte *info_ptr; bfd *abfd = get_section_bfd_owner (section); - if (dwarf2_read_debug) + if (dwarf_read_debug) fprintf_unfiltered (gdb_stdlog, "Reading %s for %s\n", get_section_name (section), get_section_file_name (section)); @@ -6566,8 +6577,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; @@ -6578,9 +6588,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; @@ -6602,8 +6611,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); @@ -6614,9 +6622,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); @@ -6675,6 +6683,9 @@ scan_partial_symbols (struct partial_die_info *first_die, CORE_ADDR *lowpc, { add_partial_symbol (pdi, cu); } + if (cu->language == language_rust && pdi->has_children) + scan_partial_symbols (pdi->die_child, lowpc, highpc, + set_addrmap, cu); break; case DW_TAG_enumeration_type: if (!pdi->is_declaration) @@ -6733,8 +6744,7 @@ scan_partial_symbols (struct partial_die_info *first_die, CORE_ADDR *lowpc, /* Functions used to compute the fully scoped name of a partial DIE. Normally, this is simple. For C++, the parent DIE's fully scoped - name is concatenated with "::" and the partial DIE's name. For - Java, the same thing occurs except that "." is used instead of "::". + name is concatenated with "::" and the partial DIE's name. Enumerators are an exception; they use the scope of their parent enumeration type, i.e. the name of the enumeration type is not prepended to the enumerator. @@ -6850,7 +6860,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); @@ -6895,24 +6905,23 @@ 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); } + + if (pdi->main_subprogram && actual_name != NULL) + set_objfile_main_name (objfile, actual_name, cu->language); break; case DW_TAG_constant: { @@ -6924,7 +6933,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: @@ -6960,7 +6969,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 @@ -6975,13 +6984,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); } @@ -6993,7 +6999,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: @@ -7001,14 +7007,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: @@ -7031,22 +7037,20 @@ add_partial_symbol (struct partial_die_info *pdi, struct dwarf2_cu *cu) add_psymbol_to_list (actual_name, strlen (actual_name), built_actual_name != NULL, STRUCT_DOMAIN, LOC_TYPEDEF, - (cu->language == language_cplus - || cu->language == language_java) + cu->language == language_cplus ? &objfile->global_psymbols : &objfile->static_psymbols, - 0, (CORE_ADDR) 0, cu->language, objfile); + 0, cu->language, objfile); break; case DW_TAG_enumerator: add_psymbol_to_list (actual_name, strlen (actual_name), built_actual_name != NULL, VAR_DOMAIN, LOC_CONST, - (cu->language == language_cplus - || cu->language == language_java) + cu->language == language_cplus ? &objfile->global_psymbols : &objfile->static_psymbols, - 0, (CORE_ADDR) 0, cu->language, objfile); + 0, cu->language, objfile); break; default: break; @@ -7261,7 +7265,6 @@ skip_one_die (const struct die_reader_specs *reader, const gdb_byte *info_ptr, struct dwarf2_cu *cu = reader->cu; const gdb_byte *buffer = reader->buffer; const gdb_byte *buffer_end = reader->buffer_end; - const gdb_byte *start_info_ptr = info_ptr; unsigned int form, i; for (i = 0; i < abbrev->num_attrs; i++) @@ -7423,7 +7426,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 @@ -7432,8 +7437,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; @@ -7462,7 +7468,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; @@ -7529,7 +7535,7 @@ process_queue (void) { struct dwarf2_queue_item *item, *next_item; - if (dwarf2_read_debug) + if (dwarf_read_debug) { fprintf_unfiltered (gdb_stdlog, "Expanding one or more symtabs of objfile %s ...\n", @@ -7540,9 +7546,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; @@ -7566,7 +7574,7 @@ process_queue (void) debug_print_threshold = 1; } - if (dwarf2_read_debug >= debug_print_threshold) + if (dwarf_read_debug >= debug_print_threshold) fprintf_unfiltered (gdb_stdlog, "Expanding symtab of %s\n", buf); if (per_cu->is_debug_types) @@ -7574,7 +7582,7 @@ process_queue (void) else process_full_comp_unit (per_cu, item->pretend_language); - if (dwarf2_read_debug >= debug_print_threshold) + if (dwarf_read_debug >= debug_print_threshold) fprintf_unfiltered (gdb_stdlog, "Done expanding %s\n", buf); } @@ -7585,7 +7593,7 @@ process_queue (void) dwarf2_queue_tail = NULL; - if (dwarf2_read_debug) + if (dwarf_read_debug) { fprintf_unfiltered (gdb_stdlog, "Done expanding symtabs of %s.\n", objfile_name (dwarf2_per_objfile->objfile)); @@ -7651,7 +7659,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) { @@ -7670,7 +7678,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; } @@ -7681,8 +7689,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; } @@ -7699,7 +7707,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 = @@ -7842,11 +7850,11 @@ 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)); - struct type *type = init_type (TYPE_CODE_MODULE, 0, 0, - saved_package_name, objfile); + = (const char *) obstack_copy0 (&objfile->per_bfd->storage_obstack, + package_name, + strlen (package_name)); + struct type *type = init_type (objfile, TYPE_CODE_MODULE, 0, + saved_package_name); struct symbol *sym; TYPE_TAG_NAME (type) = TYPE_NAME (type); @@ -7973,8 +7981,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); @@ -8076,7 +8084,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 @@ -8210,7 +8218,6 @@ process_imported_unit_die (struct die_info *die, struct dwarf2_cu *cu) if (attr != NULL) { struct dwarf2_per_cu_data *per_cu; - struct symtab *imported_symtab; sect_offset offset; int is_dwz; @@ -8232,7 +8239,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; } @@ -8363,6 +8370,7 @@ die_needs_namespace (struct die_info *die, struct dwarf2_cu *cu) case DW_TAG_enumeration_type: case DW_TAG_enumerator: case DW_TAG_subprogram: + case DW_TAG_inlined_subroutine: case DW_TAG_member: case DW_TAG_imported_declaration: return 1; @@ -8414,9 +8422,8 @@ do_ui_file_peek_last (void *object, const char *buffer, long length) /* Compute the fully qualified name of DIE in CU. If PHYSNAME is nonzero, compute the physname for the object, which include a method's: - - formal parameters (C++/Java), + - formal parameters (C++), - receiver type (Go), - - return type (Java). The term "physname" is a bit confusing. For C++, for example, it is the demangled name. @@ -8437,8 +8444,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)) { @@ -8447,26 +8459,26 @@ 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_cplus + || cu->language == language_fortran || cu->language == language_d + || cu->language == language_rust)) { if (die_needs_namespace (die, cu)) { long length; const char *prefix; struct ui_file *buf; - char *intermediate_name; const char *canonical_name = NULL; prefix = determine_prefix (die, cu); @@ -8608,27 +8620,18 @@ dwarf2_compute_name (const char *name, } } - /* For Java and C++ methods, append formal parameter type + /* For C++ methods, append formal parameter type information, if PHYSNAME. */ if (physname && die->tag == DW_TAG_subprogram - && (cu->language == language_cplus - || cu->language == language_java)) + && cu->language == language_cplus) { struct type *type = read_type_die (die, cu); c_type_print_args (type, buf, 1, cu->language, &type_print_raw_options); - if (cu->language == language_java) - { - /* For java, we must append the return type to method - names. */ - if (die->tag == DW_TAG_subprogram) - java_print_type (TYPE_TARGET_TYPE (type), "", buf, - 0, 0, &type_print_raw_options); - } - else if (cu->language == language_cplus) + if (cu->language == language_cplus) { /* Assume that an artificial first parameter is "this", but do not crash if it is not. RealView @@ -8644,25 +8647,24 @@ dwarf2_compute_name (const char *name, } } - intermediate_name = ui_file_xstrdup (buf, &length); + std::string intermediate_name = ui_file_as_string (buf); ui_file_delete (buf); if (cu->language == language_cplus) canonical_name - = dwarf2_canonicalize_name (intermediate_name, cu, + = dwarf2_canonicalize_name (intermediate_name.c_str (), cu, &objfile->per_bfd->storage_obstack); /* If we only computed INTERMEDIATE_NAME, or if 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)); + if (canonical_name == NULL || canonical_name == intermediate_name.c_str ()) + name = ((const char *) + obstack_copy0 (&objfile->per_bfd->storage_obstack, + intermediate_name.c_str (), + intermediate_name.length ())); else name = canonical_name; - - xfree (intermediate_name); } } @@ -8675,7 +8677,7 @@ dwarf2_compute_name (const char *name, not have a name. NAME may either be from a previous call to dwarf2_name or NULL. - The output string will be canonicalized (if C++/Java). */ + The output string will be canonicalized (if C++). */ static const char * dwarf2_full_name (const char *name, struct die_info *die, struct dwarf2_cu *cu) @@ -8688,13 +8690,12 @@ dwarf2_full_name (const char *name, struct die_info *die, struct dwarf2_cu *cu) allocated on the objfile_objstack or NULL if the DIE does not have a name. - The output string will be canonicalized (if C++/Java). */ + The output string will be canonicalized (if C++). */ static const char * dwarf2_physname (const char *name, struct die_info *die, struct dwarf2_cu *cu) { struct objfile *objfile = cu->objfile; - struct attribute *attr; const char *retval, *mangled = NULL, *canon = NULL; struct cleanup *back_to; int need_copy = 1; @@ -8706,18 +8707,22 @@ 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); + + /* rustc emits invalid values for DW_AT_linkage_name. Ignore these. + See https://github.com/rust-lang/rust/issues/32925. */ + if (cu->language == language_rust && mangled != NULL + && strchr (mangled, '{') != NULL) + mangled = NULL; /* 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 @@ -8737,10 +8742,7 @@ dwarf2_physname (const char *name, struct die_info *die, struct dwarf2_cu *cu) else { demangled = gdb_demangle (mangled, - (DMGL_PARAMS | DMGL_ANSI - | (cu->language == language_java - ? DMGL_JAVA | DMGL_RET_POSTFIX - : DMGL_RET_DROP))); + (DMGL_PARAMS | DMGL_ANSI | DMGL_RET_DROP)); } if (demangled) { @@ -8786,8 +8788,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; @@ -8853,6 +8856,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 @@ -8937,8 +8958,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; @@ -8988,13 +9010,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); } @@ -9004,7 +9027,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; @@ -9027,24 +9050,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); @@ -9056,7 +9069,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; @@ -9125,7 +9138,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; } } @@ -9180,7 +9193,6 @@ read_file_scope (struct die_info *die, struct dwarf2_cu *cu) const char *name = NULL; const char *comp_dir = NULL; struct die_info *child_die; - bfd *abfd = objfile->obfd; CORE_ADDR baseaddr; baseaddr = ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile)); @@ -9261,7 +9273,6 @@ read_file_scope (struct die_info *die, struct dwarf2_cu *cu) static void setup_type_unit_groups (struct die_info *die, struct dwarf2_cu *cu) { - struct objfile *objfile = dwarf2_per_objfile->objfile; struct dwarf2_per_cu_data *per_cu = cu->per_cu; struct type_unit_group *tu_group; int first_time; @@ -9314,6 +9325,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); @@ -9399,7 +9415,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); @@ -9411,8 +9427,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; @@ -9459,7 +9475,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; @@ -9468,8 +9484,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, @@ -9513,10 +9529,9 @@ create_dwo_cu_reader (const struct die_reader_specs *reader, void *datap) { struct dwarf2_cu *cu = reader->cu; - 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; @@ -9537,7 +9552,7 @@ create_dwo_cu_reader (const struct die_reader_specs *reader, dwo_unit->offset = offset; dwo_unit->length = cu->per_cu->length; - if (dwarf2_read_debug) + if (dwarf_read_debug) fprintf_unfiltered (gdb_stdlog, " offset 0x%x, dwo_id %s\n", offset.sect_off, hex_string (dwo_unit->signature)); } @@ -9550,8 +9565,6 @@ create_dwo_cu (struct dwo_file *dwo_file) { struct objfile *objfile = dwarf2_per_objfile->objfile; struct dwarf2_section_info *section = &dwo_file->sections.info; - bfd *abfd; - htab_t cu_htab; const gdb_byte *info_ptr, *end_ptr; struct create_dwo_cu_data create_dwo_cu_data; struct dwo_unit *dwo_unit; @@ -9562,11 +9575,7 @@ create_dwo_cu (struct dwo_file *dwo_file) if (info_ptr == NULL) return NULL; - /* We can't set abfd until now because the section may be empty or - not present, in which case section->asection will be NULL. */ - abfd = get_section_bfd_owner (section); - - if (dwarf2_read_debug) + if (dwarf_read_debug) { fprintf_unfiltered (gdb_stdlog, "Reading %s for %s:\n", get_section_name (section), @@ -9922,58 +9931,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 @@ -10006,13 +10015,12 @@ create_dwo_unit_in_dwp_v1 (struct dwp_file *dwp_file, struct virtual_v1_dwo_sections sections; void **dwo_file_slot; char *virtual_dwo_name; - struct dwarf2_section_info *cutu; struct cleanup *cleanups; int i; gdb_assert (dwp_file->version == 1); - if (dwarf2_read_debug) + if (dwarf_read_debug) { fprintf_unfiltered (gdb_stdlog, "Reading %s %s/%s in DWP V1 file: %s\n", kind, @@ -10098,15 +10106,16 @@ create_dwo_unit_in_dwp_v1 (struct dwp_file *dwp_file, /* Create one if necessary. */ if (*dwo_file_slot == NULL) { - if (dwarf2_read_debug) + if (dwarf_read_debug) { fprintf_unfiltered (gdb_stdlog, "Creating virtual DWO: %s\n", virtual_dwo_name); } dwo_file = OBSTACK_ZALLOC (&objfile->objfile_obstack, struct dwo_file); - dwo_file->dwo_name = obstack_copy0 (&objfile->objfile_obstack, - virtual_dwo_name, - strlen (virtual_dwo_name)); + dwo_file->dwo_name + = (const char *) obstack_copy0 (&objfile->objfile_obstack, + virtual_dwo_name, + strlen (virtual_dwo_name)); dwo_file->comp_dir = comp_dir; dwo_file->sections.abbrev = sections.abbrev; dwo_file->sections.line = sections.line; @@ -10127,20 +10136,20 @@ create_dwo_unit_in_dwp_v1 (struct dwp_file *dwp_file, } else { - if (dwarf2_read_debug) + if (dwarf_read_debug) { fprintf_unfiltered (gdb_stdlog, "Using existing virtual DWO: %s\n", virtual_dwo_name); } - dwo_file = *dwo_file_slot; + dwo_file = (struct dwo_file *) *dwo_file_slot; } do_cleanups (cleanups); dwo_unit = OBSTACK_ZALLOC (&objfile->objfile_obstack, struct dwo_unit); dwo_unit->dwo_file = dwo_file; dwo_unit->signature = signature; - dwo_unit->section = obstack_alloc (&objfile->objfile_obstack, - sizeof (struct dwarf2_section_info)); + dwo_unit->section = + XOBNEW (&objfile->objfile_obstack, struct dwarf2_section_info); *dwo_unit->section = sections.info_or_types; /* dwo_unit->{offset,length,type_offset_in_tu} are set later. */ @@ -10211,13 +10220,12 @@ create_dwo_unit_in_dwp_v2 (struct dwp_file *dwp_file, struct virtual_v2_dwo_sections sections; void **dwo_file_slot; char *virtual_dwo_name; - struct dwarf2_section_info *cutu; struct cleanup *cleanups; int i; gdb_assert (dwp_file->version == 2); - if (dwarf2_read_debug) + if (dwarf_read_debug) { fprintf_unfiltered (gdb_stdlog, "Reading %s %s/%s in DWP V2 file: %s\n", kind, @@ -10299,15 +10307,16 @@ create_dwo_unit_in_dwp_v2 (struct dwp_file *dwp_file, /* Create one if necessary. */ if (*dwo_file_slot == NULL) { - if (dwarf2_read_debug) + if (dwarf_read_debug) { fprintf_unfiltered (gdb_stdlog, "Creating virtual DWO: %s\n", virtual_dwo_name); } dwo_file = OBSTACK_ZALLOC (&objfile->objfile_obstack, struct dwo_file); - dwo_file->dwo_name = obstack_copy0 (&objfile->objfile_obstack, - virtual_dwo_name, - strlen (virtual_dwo_name)); + dwo_file->dwo_name + = (const char *) obstack_copy0 (&objfile->objfile_obstack, + virtual_dwo_name, + strlen (virtual_dwo_name)); dwo_file->comp_dir = comp_dir; dwo_file->sections.abbrev = create_dwp_v2_section (&dwp_file->sections.abbrev, @@ -10341,20 +10350,20 @@ create_dwo_unit_in_dwp_v2 (struct dwp_file *dwp_file, } else { - if (dwarf2_read_debug) + if (dwarf_read_debug) { fprintf_unfiltered (gdb_stdlog, "Using existing virtual DWO: %s\n", virtual_dwo_name); } - dwo_file = *dwo_file_slot; + dwo_file = (struct dwo_file *) *dwo_file_slot; } do_cleanups (cleanups); dwo_unit = OBSTACK_ZALLOC (&objfile->objfile_obstack, struct dwo_unit); dwo_unit->dwo_file = dwo_file; dwo_unit->signature = signature; - dwo_unit->section = obstack_alloc (&objfile->objfile_obstack, - sizeof (struct dwarf2_section_info)); + dwo_unit->section = + XOBNEW (&objfile->objfile_obstack, struct dwarf2_section_info); *dwo_unit->section = create_dwp_v2_section (is_debug_types ? &dwp_file->sections.types : &dwp_file->sections.info, @@ -10380,7 +10389,7 @@ lookup_dwo_unit_in_dwp (struct dwp_file *dwp_file, const char *comp_dir, uint32_t hash2 = ((signature >> 32) & mask) | 1; unsigned int i; void **slot; - struct dwo_unit find_dwo_cu, *dwo_cu; + struct dwo_unit find_dwo_cu; memset (&find_dwo_cu, 0, sizeof (find_dwo_cu)); find_dwo_cu.signature = signature; @@ -10390,7 +10399,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) @@ -10417,7 +10426,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; @@ -10441,10 +10450,9 @@ lookup_dwo_unit_in_dwp (struct dwp_file *dwp_file, const char *comp_dir, If unable to find/open the file, return NULL. NOTE: This function is derived from symfile_bfd_open. */ -static bfd * +static gdb_bfd_ref_ptr try_open_dwop_file (const char *file_name, int is_dwp, int search_cwd) { - bfd *sym_bfd; int desc, flags; char *absolute_name; /* Blech. OPF_TRY_CWD_FIRST also disables searching the path list if @@ -10457,7 +10465,7 @@ try_open_dwop_file (const char *file_name, int is_dwp, int search_cwd) { if (*debug_file_directory != '\0') search_path = concat (".", dirname_separator_string, - debug_file_directory, NULL); + debug_file_directory, (char *) NULL); else search_path = xstrdup ("."); } @@ -10473,23 +10481,20 @@ try_open_dwop_file (const char *file_name, int is_dwp, int search_cwd) if (desc < 0) return NULL; - sym_bfd = gdb_bfd_open (absolute_name, gnutarget, desc); + gdb_bfd_ref_ptr sym_bfd (gdb_bfd_open (absolute_name, gnutarget, desc)); xfree (absolute_name); if (sym_bfd == NULL) return NULL; - bfd_set_cacheable (sym_bfd, 1); + bfd_set_cacheable (sym_bfd.get (), 1); - if (!bfd_check_format (sym_bfd, bfd_object)) - { - gdb_bfd_unref (sym_bfd); /* This also closes desc. */ - return NULL; - } + if (!bfd_check_format (sym_bfd.get (), bfd_object)) + return NULL; /* Success. Record the bfd as having been included by the objfile's bfd. This is important because things like demangled_names_hash lives in the objfile's per_bfd space and may have references to things like symbol names that live in the DWO/DWP file's per_bfd space. PR 16426. */ - gdb_bfd_record_inclusion (dwarf2_per_objfile->objfile->obfd, sym_bfd); + gdb_bfd_record_inclusion (dwarf2_per_objfile->objfile->obfd, sym_bfd.get ()); return sym_bfd; } @@ -10501,11 +10506,9 @@ try_open_dwop_file (const char *file_name, int is_dwp, int search_cwd) Upon success, the canonicalized path of the file is stored in the bfd, same as symfile_bfd_open. */ -static bfd * +static gdb_bfd_ref_ptr open_dwo_file (const char *file_name, const char *comp_dir) { - bfd *abfd; - if (IS_ABSOLUTE_PATH (file_name)) return try_open_dwop_file (file_name, 0 /*is_dwp*/, 0 /*search_cwd*/); @@ -10513,11 +10516,13 @@ open_dwo_file (const char *file_name, const char *comp_dir) if (comp_dir != NULL) { - char *path_to_try = concat (comp_dir, SLASH_STRING, file_name, NULL); + char *path_to_try = concat (comp_dir, SLASH_STRING, + file_name, (char *) NULL); /* NOTE: If comp_dir is a relative path, this will also try the search path, which seems useful. */ - abfd = try_open_dwop_file (path_to_try, 0 /*is_dwp*/, 1 /*search_cwd*/); + gdb_bfd_ref_ptr abfd (try_open_dwop_file (path_to_try, 0 /*is_dwp*/, + 1 /*search_cwd*/)); xfree (path_to_try); if (abfd != NULL) return abfd; @@ -10538,47 +10543,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)) @@ -10586,7 +10591,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); @@ -10603,24 +10608,24 @@ open_and_init_dwo_file (struct dwarf2_per_cu_data *per_cu, { struct objfile *objfile = dwarf2_per_objfile->objfile; struct dwo_file *dwo_file; - bfd *dbfd; struct cleanup *cleanups; - dbfd = open_dwo_file (dwo_name, comp_dir); + gdb_bfd_ref_ptr dbfd (open_dwo_file (dwo_name, comp_dir)); if (dbfd == NULL) { - if (dwarf2_read_debug) + if (dwarf_read_debug) fprintf_unfiltered (gdb_stdlog, "DWO file not found: %s\n", dwo_name); return NULL; } dwo_file = OBSTACK_ZALLOC (&objfile->objfile_obstack, struct dwo_file); dwo_file->dwo_name = dwo_name; dwo_file->comp_dir = comp_dir; - dwo_file->dbfd = dbfd; + dwo_file->dbfd = dbfd.release (); cleanups = make_cleanup (free_dwo_file_cleanup, dwo_file); - bfd_map_over_sections (dbfd, dwarf2_locate_dwo_sections, &dwo_file->sections); + bfd_map_over_sections (dwo_file->dbfd, dwarf2_locate_dwo_sections, + &dwo_file->sections); dwo_file->cu = create_dwo_cu (dwo_file); @@ -10629,7 +10634,7 @@ open_and_init_dwo_file (struct dwarf2_per_cu_data *per_cu, discard_cleanups (cleanups); - if (dwarf2_read_debug) + if (dwarf_read_debug) fprintf_unfiltered (gdb_stdlog, "DWO file found: %s\n", dwo_name); return dwo_file; @@ -10643,7 +10648,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; @@ -10655,17 +10660,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); } } @@ -10678,7 +10683,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; @@ -10690,42 +10695,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); } } @@ -10735,7 +10740,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; @@ -10746,8 +10751,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; } @@ -10772,12 +10777,11 @@ allocate_dwp_loaded_cutus_table (struct objfile *objfile) Upon success, the canonicalized path of the file is stored in the bfd, same as symfile_bfd_open. */ -static bfd * +static gdb_bfd_ref_ptr open_dwp_file (const char *file_name) { - bfd *abfd; - - abfd = try_open_dwop_file (file_name, 1 /*is_dwp*/, 1 /*search_cwd*/); + gdb_bfd_ref_ptr abfd (try_open_dwop_file (file_name, 1 /*is_dwp*/, + 1 /*search_cwd*/)); if (abfd != NULL) return abfd; @@ -10811,15 +10815,28 @@ open_and_init_dwp_file (void) struct objfile *objfile = dwarf2_per_objfile->objfile; struct dwp_file *dwp_file; char *dwp_name; - bfd *dbfd; - struct cleanup *cleanups; + struct cleanup *cleanups = make_cleanup (null_cleanup, 0); /* Try to find first .dwp for the binary file before any symbolic links resolving. */ - dwp_name = xstrprintf ("%s.dwp", objfile->original_name); - cleanups = make_cleanup (xfree, dwp_name); - dbfd = open_dwp_file (dwp_name); + /* If the objfile is a debug file, find the name of the real binary + file and get the name of dwp file from there. */ + if (objfile->separate_debug_objfile_backlink != NULL) + { + struct objfile *backlink = objfile->separate_debug_objfile_backlink; + const char *backlink_basename = lbasename (backlink->original_name); + char *debug_dirname = ldirname (objfile->original_name); + + make_cleanup (xfree, debug_dirname); + dwp_name = xstrprintf ("%s%s%s.dwp", debug_dirname, + SLASH_STRING, backlink_basename); + } + else + dwp_name = xstrprintf ("%s.dwp", objfile->original_name); + make_cleanup (xfree, dwp_name); + + gdb_bfd_ref_ptr dbfd (open_dwp_file (dwp_name)); if (dbfd == NULL && strcmp (objfile->original_name, objfile_name (objfile)) != 0) { @@ -10831,23 +10848,24 @@ open_and_init_dwp_file (void) if (dbfd == NULL) { - if (dwarf2_read_debug) + if (dwarf_read_debug) fprintf_unfiltered (gdb_stdlog, "DWP file not found: %s\n", dwp_name); do_cleanups (cleanups); return NULL; } dwp_file = OBSTACK_ZALLOC (&objfile->objfile_obstack, struct dwp_file); - dwp_file->name = bfd_get_filename (dbfd); - dwp_file->dbfd = dbfd; + dwp_file->name = bfd_get_filename (dbfd.get ()); + dwp_file->dbfd = dbfd.release (); do_cleanups (cleanups); /* +1: section 0 is unused */ - dwp_file->num_sections = bfd_count_sections (dbfd) + 1; + dwp_file->num_sections = bfd_count_sections (dwp_file->dbfd) + 1; dwp_file->elf_sections = OBSTACK_CALLOC (&objfile->objfile_obstack, dwp_file->num_sections, asection *); - bfd_map_over_sections (dbfd, dwarf2_locate_common_dwp_sections, dwp_file); + bfd_map_over_sections (dwp_file->dbfd, dwarf2_locate_common_dwp_sections, + dwp_file); dwp_file->cus = create_dwp_hash_table (dwp_file, 0); @@ -10867,12 +10885,13 @@ open_and_init_dwp_file (void) dwp_file->version = dwp_file->cus->version; if (dwp_file->version == 2) - bfd_map_over_sections (dbfd, dwarf2_locate_v2_dwp_sections, dwp_file); + bfd_map_over_sections (dwp_file->dbfd, dwarf2_locate_v2_dwp_sections, + dwp_file); dwp_file->loaded_cus = allocate_dwp_loaded_cutus_table (objfile); dwp_file->loaded_tus = allocate_dwp_loaded_cutus_table (objfile); - if (dwarf2_read_debug) + if (dwarf_read_debug) { fprintf_unfiltered (gdb_stdlog, "DWP file found: %s\n", dwp_file->name); fprintf_unfiltered (gdb_stdlog, @@ -10943,7 +10962,7 @@ lookup_dwo_cutu (struct dwarf2_per_cu_data *this_unit, if (dwo_cutu != NULL) { - if (dwarf2_read_debug) + if (dwarf_read_debug) { fprintf_unfiltered (gdb_stdlog, "Virtual DWO %s %s found: @%s\n", @@ -10965,7 +10984,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) { @@ -10977,7 +10996,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) { @@ -10987,7 +11007,7 @@ lookup_dwo_cutu (struct dwarf2_per_cu_data *this_unit, if (dwo_cutu != NULL) { - if (dwarf2_read_debug) + if (dwarf_read_debug) { fprintf_unfiltered (gdb_stdlog, "DWO %s %s(%s) found: @%s\n", kind, dwo_name, hex_string (signature), @@ -11002,7 +11022,7 @@ lookup_dwo_cutu (struct dwarf2_per_cu_data *this_unit, someone deleted the DWO/DWP file, or the search path isn't set up correctly to find the file. */ - if (dwarf2_read_debug) + if (dwarf_read_debug) { fprintf_unfiltered (gdb_stdlog, "DWO %s %s(%s) not found\n", kind, dwo_name, hex_string (signature)); @@ -11109,8 +11129,6 @@ queue_and_load_all_dwo_tus (struct dwarf2_per_cu_data *per_cu) static void free_dwo_file (struct dwo_file *dwo_file, struct objfile *objfile) { - int ix; - struct dwarf2_section_info *section; /* Note: dbfd is NULL for virtual DWO files. */ gdb_bfd_unref (dwo_file->dbfd); @@ -11214,7 +11232,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; @@ -11350,7 +11368,8 @@ read_func_scope (struct die_info *die, struct dwarf2_cu *cu) } /* Ignore functions with missing or invalid low and high pc attributes. */ - if (!dwarf2_get_pc_bounds (die, &lowpc, &highpc, cu, NULL)) + if (dwarf2_get_pc_bounds (die, &lowpc, &highpc, cu, NULL) + <= PC_BOUNDS_INVALID) { attr = dwarf2_attr (die, DW_AT_external, cu); if (!attr || !DW_UNSND (attr)) @@ -11387,6 +11406,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) @@ -11438,10 +11467,13 @@ 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->language == language_rust) && cu->processing_has_namespace_info) block_set_scope (block, determine_prefix (die, cu), &objfile->objfile_obstack); @@ -11458,9 +11490,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 *))); @@ -11472,7 +11503,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. */ @@ -11500,8 +11531,20 @@ read_lexical_block_scope (struct die_info *die, struct dwarf2_cu *cu) as multiple lexical blocks? Handling children in a sane way would be nasty. Might be easier to properly extend generic blocks to describe ranges. */ - if (!dwarf2_get_pc_bounds (die, &lowpc, &highpc, cu, NULL)) - return; + switch (dwarf2_get_pc_bounds (die, &lowpc, &highpc, cu, NULL)) + { + case PC_BOUNDS_NOT_PRESENT: + /* DW_TAG_lexical_block has no attributes, process its children as if + there was no wrapping by that DW_TAG_lexical_block. + GCC does no longer produces such DWARF since GCC r224161. */ + for (child_die = die->child; + child_die != NULL && child_die->tag; + child_die = sibling_die (child_die)) + process_die (child_die, cu); + return; + case PC_BOUNDS_INVALID: + return; + } lowpc = gdbarch_adjust_dwarf2_addr (gdbarch, lowpc + baseaddr); highpc = gdbarch_adjust_dwarf2_addr (gdbarch, highpc + baseaddr); @@ -11518,10 +11561,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 @@ -11537,7 +11580,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. */ @@ -11603,10 +11646,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; @@ -11668,7 +11712,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; @@ -11684,17 +11728,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, @@ -11709,7 +11753,8 @@ read_call_site_scope (struct die_info *die, struct dwarf2_cu *cu) CORE_ADDR lowpc; /* DW_AT_entry_pc should be preferred. */ - if (!dwarf2_get_pc_bounds (target_die, &lowpc, NULL, target_cu, NULL)) + if (dwarf2_get_pc_bounds (target_die, &lowpc, NULL, target_cu, NULL) + <= PC_BOUNDS_INVALID) complaint (&symfile_complaints, _("DW_AT_GNU_call_site_target target DIE has invalid " "low pc, for referencing DIE 0x%x [in module %s]"), @@ -11856,7 +11901,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; @@ -11875,18 +11919,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)); @@ -11911,9 +11943,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; } @@ -11997,11 +12029,11 @@ dwarf2_ranges_read (unsigned offset, CORE_ADDR *low_return, return 1; } -/* Get low and high pc attributes from a die. Return 1 if the attributes - are present and valid, otherwise, return 0. Return -1 if the range is - discontinuous, i.e. derived from DW_AT_ranges information. */ +/* Get low and high pc attributes from a die. See enum pc_bounds_kind + definition for the return value. *LOWPC and *HIGHPC are set iff + neither PC_BOUNDS_NOT_PRESENT nor PC_BOUNDS_INVALID are returned. */ -static int +static enum pc_bounds_kind dwarf2_get_pc_bounds (struct die_info *die, CORE_ADDR *lowpc, CORE_ADDR *highpc, struct dwarf2_cu *cu, struct partial_symtab *pst) @@ -12010,7 +12042,7 @@ dwarf2_get_pc_bounds (struct die_info *die, CORE_ADDR *lowpc, struct attribute *attr_high; CORE_ADDR low = 0; CORE_ADDR high = 0; - int ret = 0; + enum pc_bounds_kind ret; attr_high = dwarf2_attr (die, DW_AT_high_pc, cu); if (attr_high) @@ -12025,10 +12057,10 @@ dwarf2_get_pc_bounds (struct die_info *die, CORE_ADDR *lowpc, } else /* Found high w/o low attribute. */ - return 0; + return PC_BOUNDS_INVALID; /* Found consecutive range of addresses. */ - ret = 1; + ret = PC_BOUNDS_HIGH_LOW; } else { @@ -12047,15 +12079,17 @@ dwarf2_get_pc_bounds (struct die_info *die, CORE_ADDR *lowpc, /* Value of the DW_AT_ranges attribute is the offset in the .debug_ranges section. */ if (!dwarf2_ranges_read (ranges_offset, &low, &high, cu, pst)) - return 0; + return PC_BOUNDS_INVALID; /* Found discontinuous range of addresses. */ - ret = -1; + ret = PC_BOUNDS_RANGES; } + else + return PC_BOUNDS_NOT_PRESENT; } /* read_partial_die has also the strict LOW < HIGH requirement. */ if (high <= low) - return 0; + return PC_BOUNDS_INVALID; /* When using the GNU linker, .gnu.linkonce. sections are used to eliminate duplicate copies of functions and vtables and such. @@ -12066,7 +12100,7 @@ dwarf2_get_pc_bounds (struct die_info *die, CORE_ADDR *lowpc, If this is a discarded function, mark the pc bounds as invalid, so that GDB will ignore it. */ if (low == 0 && !dwarf2_per_objfile->has_section_at_zero) - return 0; + return PC_BOUNDS_INVALID; *lowpc = low; if (highpc) @@ -12087,10 +12121,10 @@ dwarf2_get_subprogram_pc_bounds (struct die_info *die, CORE_ADDR low, high; struct die_info *child = die->child; - if (dwarf2_get_pc_bounds (die, &low, &high, cu, NULL)) + if (dwarf2_get_pc_bounds (die, &low, &high, cu, NULL) >= PC_BOUNDS_RANGES) { - *lowpc = min (*lowpc, low); - *highpc = max (*highpc, high); + *lowpc = std::min (*lowpc, low); + *highpc = std::max (*highpc, high); } /* If the language does not allow nested subprograms (either inside @@ -12124,7 +12158,8 @@ get_scope_pc_bounds (struct die_info *die, CORE_ADDR best_high = (CORE_ADDR) 0; CORE_ADDR current_low, current_high; - if (dwarf2_get_pc_bounds (die, ¤t_low, ¤t_high, cu, NULL)) + if (dwarf2_get_pc_bounds (die, ¤t_low, ¤t_high, cu, NULL) + >= PC_BOUNDS_RANGES) { best_low = current_low; best_high = current_high; @@ -12153,8 +12188,8 @@ get_scope_pc_bounds (struct die_info *die, if (current_low != ((CORE_ADDR) -1)) { - best_low = min (best_low, current_low); - best_high = max (best_high, current_high); + best_low = std::min (best_low, current_low); + best_high = std::max (best_high, current_high); } break; default: @@ -12314,7 +12349,6 @@ dwarf2_record_block_ranges (struct die_info *die, struct block *block, static void check_producer (struct dwarf2_cu *cu) { - const char *cs; int major, minor; if (cu->producer == NULL) @@ -12435,7 +12469,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)); @@ -12537,6 +12571,10 @@ dwarf2_add_field (struct field_info *fip, struct die_info *die, - bit_offset - FIELD_BITSIZE (*fp))); } } + attr = dwarf2_attr (die, DW_AT_data_bit_offset, cu); + if (attr != NULL) + SET_FIELD_BITPOS (*fp, (FIELD_BITPOS (*fp) + + dwarf2_get_attr_constant_value (attr, 0))); /* Get name of field. */ fieldname = dwarf2_name (die, cu); @@ -12614,14 +12652,11 @@ static void dwarf2_add_typedef (struct field_info *fip, struct die_info *die, struct dwarf2_cu *cu) { - struct objfile *objfile = cu->objfile; struct typedef_field_list *new_field; - struct attribute *attr; struct typedef_field *fp; - 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); @@ -12680,7 +12715,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; @@ -12825,7 +12860,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; @@ -12836,7 +12871,7 @@ dwarf2_add_member_fn (struct field_info *fip, struct die_info *die, fnp = &new_fnfield->fnfield; /* Delay processing of the physname until later. */ - if (cu->language == language_cplus || cu->language == language_java) + if (cu->language == language_cplus) { add_to_method_list (type, i, flp->length - 1, fieldname, die, cu); @@ -12884,7 +12919,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) @@ -12925,13 +12960,6 @@ dwarf2_add_member_fn (struct field_info *fip, struct die_info *die, && DW_BLOCK (attr)->data[0] == DW_OP_deref_size && DW_BLOCK (attr)->data[1] == cu->header.addr_size)) { - struct dwarf_block blk; - int offset; - - offset = (DW_BLOCK (attr)->data[0] == DW_OP_deref - ? 1 : 2); - blk.size = DW_BLOCK (attr)->size - offset; - blk.data = DW_BLOCK (attr)->data + offset; fnp->voffset = decode_locdesc (DW_BLOCK (attr), cu); if ((fnp->voffset % cu->header.addr_size) != 0) dwarf2_complex_location_expr_complaint (); @@ -13029,11 +13057,8 @@ is_vtable_name (const char *name, struct dwarf2_cu *cu) static const char vptr[] = "_vptr"; static const char vtable[] = "vtable"; - /* Look for the C++ and Java forms of the vtable. */ - if ((cu->language == language_java - && startswith (name, vtable)) - || (startswith (name, vptr) - && is_cplus_marker (name[sizeof (vptr) - 1]))) + /* Look for the C++ form of the vtable. */ + if (startswith (name, vptr) && is_cplus_marker (name[sizeof (vptr) - 1])) return 1; return 0; @@ -13136,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_d + || cu->language == language_rust) { const char *full_name = dwarf2_full_name (name, die, cu); @@ -13179,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 { @@ -13252,8 +13291,16 @@ process_structure_scope (struct die_info *die, struct dwarf2_cu *cu) } else if (child_die->tag == DW_TAG_subprogram) { - /* C++ member function. */ - dwarf2_add_member_fn (&fi, child_die, type, cu); + /* Rust doesn't have member functions in the C++ sense. + However, it does emit ordinary functions as children + of a struct DIE. */ + if (cu->language == language_rust) + read_func_scope (child_die, cu); + else + { + /* C++ member function. */ + dwarf2_add_member_fn (&fi, child_die, type, cu); + } } else if (child_die->tag == DW_TAG_inheritance) { @@ -13281,9 +13328,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) @@ -13370,7 +13417,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. */ @@ -13386,9 +13434,6 @@ process_structure_scope (struct die_info *die, struct dwarf2_cu *cu) } do_cleanups (back_to); - - if (HAVE_CPLUS_STRUCT (type)) - TYPE_CPLUS_REALLY_JAVA (type) = cu->language == language_java; } quirk_gcc_member_function_pointer (type, objfile); @@ -13798,7 +13843,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 @@ -13876,8 +13922,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); @@ -13891,7 +13936,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; @@ -13967,7 +14012,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; @@ -14053,15 +14100,13 @@ read_namespace_type (struct die_info *die, struct dwarf2_cu *cu) previous_prefix, name, 0, cu); /* Create the type. */ - type = init_type (TYPE_CODE_NAMESPACE, 0, 0, NULL, - objfile); - TYPE_NAME (type) = name; + type = init_type (objfile, TYPE_CODE_NAMESPACE, 0, name); TYPE_TAG_NAME (type) = TYPE_NAME (type); 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) @@ -14085,8 +14130,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); } } @@ -14118,7 +14164,7 @@ read_module_type (struct die_info *die, struct dwarf2_cu *cu) complaint (&symfile_complaints, _("DW_TAG_module has no name, offset 0x%x"), die->offset.sect_off); - type = init_type (TYPE_CODE_MODULE, 0, 0, module_name, objfile); + type = init_type (objfile, TYPE_CODE_MODULE, 0, module_name); /* determine_prefix uses TYPE_TAG_NAME. */ TYPE_TAG_NAME (type) = TYPE_NAME (type); @@ -14162,10 +14208,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; } @@ -14594,19 +14638,7 @@ read_subroutine_type (struct die_info *die, struct dwarf2_cu *cu) if (attr) TYPE_FIELD_ARTIFICIAL (ftype, iparams) = DW_UNSND (attr); else - { - TYPE_FIELD_ARTIFICIAL (ftype, iparams) = 0; - - /* GCC/43521: In java, the formal parameter - "this" is sometimes not marked with DW_AT_artificial. */ - if (cu->language == language_java) - { - const char *name = dwarf2_name (child_die, cu); - - if (name && !strcmp (name, "this")) - TYPE_FIELD_ARTIFICIAL (ftype, iparams) = 1; - } - } + TYPE_FIELD_ARTIFICIAL (ftype, iparams) = 0; arg_type = die_type (child_die, cu); /* RealView does not mark THIS as const, which the testsuite @@ -14658,9 +14690,8 @@ read_typedef (struct die_info *die, struct dwarf2_cu *cu) struct type *this_type, *target_type; name = dwarf2_full_name (NULL, die, cu); - this_type = init_type (TYPE_CODE_TYPEDEF, 0, - TYPE_FLAG_TARGET_STUB, NULL, objfile); - TYPE_NAME (this_type) = name; + this_type = init_type (objfile, TYPE_CODE_TYPEDEF, 0, name); + TYPE_TARGET_STUB (this_type) = 1; set_die_type (die, this_type, cu); target_type = die_type (die, cu); if (target_type != this_type) @@ -14678,6 +14709,27 @@ read_typedef (struct die_info *die, struct dwarf2_cu *cu) return this_type; } +/* Allocate a floating-point type of size BITS and name NAME. Pass NAME_HINT + (which may be different from NAME) to the architecture back-end to allow + it to guess the correct format if necessary. */ + +static struct type * +dwarf2_init_float_type (struct objfile *objfile, int bits, const char *name, + const char *name_hint) +{ + struct gdbarch *gdbarch = get_objfile_arch (objfile); + const struct floatformat **format; + struct type *type; + + format = gdbarch_floatformat_for_type (gdbarch, name_hint, bits); + if (format) + type = init_float_type (objfile, bits, name, format); + else + type = init_type (objfile, TYPE_CODE_ERROR, bits / TARGET_CHAR_BIT, name); + + return type; +} + /* Find a representation of a given base type and install it in the TYPE field of the die. */ @@ -14687,11 +14739,8 @@ read_base_type (struct die_info *die, struct dwarf2_cu *cu) struct objfile *objfile = cu->objfile; struct type *type; struct attribute *attr; - int encoding = 0, size = 0; + int encoding = 0, bits = 0; const char *name; - enum type_code code = TYPE_CODE_INT; - int type_flags = 0; - struct type *target_type = NULL; attr = dwarf2_attr (die, DW_AT_encoding, cu); if (attr) @@ -14701,7 +14750,7 @@ read_base_type (struct die_info *die, struct dwarf2_cu *cu) attr = dwarf2_attr (die, DW_AT_byte_size, cu); if (attr) { - size = DW_UNSND (attr); + bits = DW_UNSND (attr) * TARGET_CHAR_BIT; } name = dwarf2_name (die, cu); if (!name) @@ -14714,61 +14763,64 @@ read_base_type (struct die_info *die, struct dwarf2_cu *cu) { case DW_ATE_address: /* Turn DW_ATE_address into a void * pointer. */ - code = TYPE_CODE_PTR; - type_flags |= TYPE_FLAG_UNSIGNED; - target_type = init_type (TYPE_CODE_VOID, 1, 0, NULL, objfile); + type = init_type (objfile, TYPE_CODE_VOID, 1, NULL); + type = init_pointer_type (objfile, bits, name, type); break; case DW_ATE_boolean: - code = TYPE_CODE_BOOL; - type_flags |= TYPE_FLAG_UNSIGNED; + type = init_boolean_type (objfile, bits, 1, name); break; case DW_ATE_complex_float: - code = TYPE_CODE_COMPLEX; - target_type = init_type (TYPE_CODE_FLT, size / 2, 0, NULL, objfile); + type = dwarf2_init_float_type (objfile, bits / 2, NULL, name); + type = init_complex_type (objfile, name, type); break; case DW_ATE_decimal_float: - code = TYPE_CODE_DECFLOAT; + type = init_decfloat_type (objfile, bits, name); break; case DW_ATE_float: - code = TYPE_CODE_FLT; + type = dwarf2_init_float_type (objfile, bits, name, name); break; case DW_ATE_signed: + type = init_integer_type (objfile, bits, 0, name); break; case DW_ATE_unsigned: - type_flags |= TYPE_FLAG_UNSIGNED; if (cu->language == language_fortran && name && startswith (name, "character(")) - code = TYPE_CODE_CHAR; + type = init_character_type (objfile, bits, 1, name); + else + type = init_integer_type (objfile, bits, 1, name); break; case DW_ATE_signed_char: if (cu->language == language_ada || cu->language == language_m2 || cu->language == language_pascal || cu->language == language_fortran) - code = TYPE_CODE_CHAR; + type = init_character_type (objfile, bits, 0, name); + else + type = init_integer_type (objfile, bits, 0, name); break; case DW_ATE_unsigned_char: if (cu->language == language_ada || cu->language == language_m2 || cu->language == language_pascal - || cu->language == language_fortran) - code = TYPE_CODE_CHAR; - type_flags |= TYPE_FLAG_UNSIGNED; + || cu->language == language_fortran + || cu->language == language_rust) + type = init_character_type (objfile, bits, 1, name); + else + type = init_integer_type (objfile, bits, 1, name); break; case DW_ATE_UTF: /* We just treat this as an integer and then recognize the type by name elsewhere. */ + type = init_integer_type (objfile, bits, 0, name); break; default: complaint (&symfile_complaints, _("unsupported DW_AT_encoding: '%s'"), dwarf_type_encoding_name (encoding)); + type = init_type (objfile, TYPE_CODE_ERROR, + bits / TARGET_CHAR_BIT, name); break; } - type = init_type (code, size, type_flags, NULL, objfile); - TYPE_NAME (type) = name; - TYPE_TARGET_TYPE (type) = target_type; - if (name && strcmp (name, "char") == 0) TYPE_NOSIGN (type) = 1; @@ -14791,7 +14843,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; @@ -14819,7 +14871,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; @@ -14828,7 +14880,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; @@ -14852,7 +14904,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; @@ -14922,8 +14974,8 @@ read_subrange_type (struct die_info *die, struct dwarf2_cu *cu) low_default_is_valid = 1; break; case language_d: - case language_java: case language_objc: + case language_rust: low.data.const_val = 0; low_default_is_valid = (cu->header.version >= 4); break; @@ -15007,7 +15059,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; @@ -15047,7 +15099,7 @@ read_unspecified_type (struct die_info *die, struct dwarf2_cu *cu) /* For now, we only support the C meaning of an unspecified type: void. */ - type = init_type (TYPE_CODE_VOID, 0, 0, NULL, cu->objfile); + type = init_type (cu->objfile, TYPE_CODE_VOID, 0, NULL); TYPE_NAME (type) = dwarf2_name (die, cu); return set_die_type (die, type, cu); @@ -15140,14 +15192,14 @@ read_die_and_siblings (const struct die_reader_specs *reader, struct die_info *die = read_die_and_siblings_1 (reader, info_ptr, new_info_ptr, parent); - if (dwarf2_die_debug) + if (dwarf_die_debug) { fprintf_unfiltered (gdb_stdlog, "Read die from %s@0x%x of %s:\n", get_section_name (reader->die_section), (unsigned) (info_ptr - reader->die_section->buffer), bfd_get_filename (reader->abfd)); - dump_die (die, dwarf2_die_debug); + dump_die (die, dwarf_die_debug); } return die; @@ -15222,14 +15274,14 @@ read_full_die (const struct die_reader_specs *reader, result = read_full_die_1 (reader, diep, info_ptr, has_children, 0); - if (dwarf2_die_debug) + if (dwarf_die_debug) { fprintf_unfiltered (gdb_stdlog, "Read die from %s@0x%x of %s:\n", get_section_name (reader->die_section), (unsigned) (info_ptr - reader->die_section->buffer), bfd_get_filename (reader->abfd)); - dump_die (*diep, dwarf2_die_debug); + dump_die (*diep, dwarf_die_debug); } return result; @@ -15249,9 +15301,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; } @@ -15310,9 +15362,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 *)); @@ -15322,7 +15374,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) @@ -15331,7 +15383,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; @@ -15347,21 +15400,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)); @@ -15403,7 +15457,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); @@ -15425,7 +15479,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); @@ -15497,8 +15551,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) { @@ -15603,7 +15656,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; } @@ -15638,11 +15691,10 @@ load_partial_dies (const struct die_reader_specs *reader, else if (building_psymtab) add_psymbol_to_list (part_die->name, strlen (part_die->name), 0, VAR_DOMAIN, LOC_CONST, - (cu->language == language_cplus - || cu->language == language_java) + cu->language == language_cplus ? &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; @@ -15698,8 +15750,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 @@ -15885,18 +15936,18 @@ read_partial_die (const struct die_reader_specs *reader, to describe functions' calling conventions. However, because it's a necessary piece of information in - Fortran, and because DW_CC_program is the only piece of debugging - information whose definition refers to a 'main program' at all, - several compilers have begun marking Fortran main programs with - DW_CC_program --- even when those functions use the standard - calling conventions. - - So until DWARF specifies a way to provide this information and - compilers pick up the new representation, we'll support this - practice. */ + Fortran, and before DWARF 4 DW_CC_program was the only + piece of debugging information whose definition refers to + a 'main program' at all, several compilers marked Fortran + main programs with DW_CC_program --- even when those + functions use the standard calling conventions. + + Although DWARF now specifies a way to provide this + information, we support this practice for backward + compatibility. */ if (DW_UNSND (&attr) == DW_CC_program && cu->language == language_fortran) - set_objfile_main_name (objfile, part_die->name, language_fortran); + part_die->main_subprogram = 1; break; case DW_AT_inline: if (DW_UNSND (&attr) == DW_INL_inlined @@ -15913,6 +15964,10 @@ read_partial_die (const struct die_reader_specs *reader, } break; + case DW_AT_main_subprogram: + part_die->main_subprogram = DW_UNSND (&attr); + break; + default: break; } @@ -15969,8 +16024,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; } @@ -16085,9 +16141,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; @@ -16172,8 +16229,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); } } @@ -16196,7 +16254,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: @@ -16722,13 +16780,12 @@ read_unsigned_leb128 (bfd *abfd, const gdb_byte *buf, { ULONGEST result; unsigned int num_read; - int i, shift; + int shift; unsigned char byte; result = 0; shift = 0; num_read = 0; - i = 0; while (1) { byte = bfd_get_8 (abfd, buf); @@ -16750,13 +16807,12 @@ read_signed_leb128 (bfd *abfd, const gdb_byte *buf, unsigned int *bytes_read_ptr) { LONGEST result; - int i, shift, num_read; + int shift, num_read; unsigned char byte; result = 0; shift = 0; num_read = 0; - i = 0; while (1) { byte = bfd_get_8 (abfd, buf); @@ -16973,6 +17029,7 @@ set_cu_language (unsigned int lang, struct dwarf2_cu *cu) case DW_LANG_UPC: cu->language = language_c; break; + case DW_LANG_Java: case DW_LANG_C_plus_plus: case DW_LANG_C_plus_plus_11: case DW_LANG_C_plus_plus_14: @@ -16994,9 +17051,6 @@ set_cu_language (unsigned int lang, struct dwarf2_cu *cu) case DW_LANG_Mips_Assembler: cu->language = language_asm; break; - case DW_LANG_Java: - cu->language = language_java; - break; case DW_LANG_Ada83: case DW_LANG_Ada95: cu->language = language_ada; @@ -17010,6 +17064,10 @@ set_cu_language (unsigned int lang, struct dwarf2_cu *cu) case DW_LANG_ObjC: cu->language = language_objc; break; + case DW_LANG_Rust: + case DW_LANG_Rust_old: + cu->language = language_rust; + break; case DW_LANG_Cobol74: case DW_LANG_Cobol85: default: @@ -17065,6 +17123,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. */ @@ -17139,7 +17224,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); } @@ -17149,19 +17234,21 @@ free_line_header_voidp (void *arg) static void add_include_dir (struct line_header *lh, const char *include_dir) { + if (dwarf_line_debug >= 2) + fprintf_unfiltered (gdb_stdlog, "Adding dir %u: %s\n", + lh->num_include_dirs + 1, include_dir); + /* Grow the array if necessary. */ if (lh->include_dirs_size == 0) { lh->include_dirs_size = 1; /* for testing */ - lh->include_dirs = xmalloc (lh->include_dirs_size - * sizeof (*lh->include_dirs)); + lh->include_dirs = XNEWVEC (const char *, lh->include_dirs_size); } else if (lh->num_include_dirs >= lh->include_dirs_size) { lh->include_dirs_size *= 2; - lh->include_dirs = xrealloc (lh->include_dirs, - (lh->include_dirs_size - * sizeof (*lh->include_dirs))); + lh->include_dirs = XRESIZEVEC (const char *, lh->include_dirs, + lh->include_dirs_size); } lh->include_dirs[lh->num_include_dirs++] = include_dir; @@ -17178,19 +17265,21 @@ add_file_name (struct line_header *lh, { struct file_entry *fe; + if (dwarf_line_debug >= 2) + fprintf_unfiltered (gdb_stdlog, "Adding file %u: %s\n", + lh->num_file_names + 1, name); + /* Grow the array if necessary. */ if (lh->file_names_size == 0) { lh->file_names_size = 1; /* for testing */ - lh->file_names = xmalloc (lh->file_names_size - * sizeof (*lh->file_names)); + lh->file_names = XNEWVEC (struct file_entry, lh->file_names_size); } else if (lh->num_file_names >= lh->file_names_size) { lh->file_names_size *= 2; - lh->file_names = xrealloc (lh->file_names, - (lh->file_names_size - * sizeof (*lh->file_names))); + lh->file_names + = XRESIZEVEC (struct file_entry, lh->file_names, lh->file_names_size); } fe = &lh->file_names[lh->num_file_names++]; @@ -17270,7 +17359,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); @@ -17330,8 +17419,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) @@ -17461,6 +17549,54 @@ psymtab_include_file_name (const struct line_header *lh, int file_index, return include_name; } +/* State machine to track the state of the line number program. */ + +typedef struct +{ + /* These are part of the standard DWARF line number state machine. */ + + unsigned char op_index; + unsigned int file; + unsigned int line; + CORE_ADDR address; + int is_stmt; + unsigned int discriminator; + + /* Additional bits of state we need to track. */ + + /* The last file that we called dwarf2_start_subfile for. + This is only used for TLLs. */ + unsigned int last_file; + /* The last file a line number was recorded for. */ + struct subfile *last_subfile; + + /* The function to call to record a line. */ + record_line_ftype *record_line; + + /* The last line number that was recorded, used to coalesce + consecutive entries for the same line. This can happen, for + example, when discriminators are present. PR 17276. */ + unsigned int last_line; + int line_has_non_zero_discriminator; +} lnp_state_machine; + +/* There's a lot of static state to pass to dwarf_record_line. + This keeps it all together. */ + +typedef struct +{ + /* The gdbarch. */ + struct gdbarch *gdbarch; + + /* The line number header. */ + struct line_header *line_header; + + /* Non-zero if we're recording lines. + Otherwise we're building partial symtabs and are just interested in + finding include files mentioned by the line number program. */ + int record_lines_p; +} lnp_reader_state; + /* Ignore this record_line request. */ static void @@ -17520,30 +17656,169 @@ dwarf_record_line_p (unsigned int line, unsigned int last_line, in the line table of subfile SUBFILE. */ static void -dwarf_record_line (struct gdbarch *gdbarch, struct subfile *subfile, - unsigned int line, CORE_ADDR address, - record_line_ftype p_record_line) +dwarf_record_line_1 (struct gdbarch *gdbarch, struct subfile *subfile, + unsigned int line, CORE_ADDR address, + record_line_ftype p_record_line) { CORE_ADDR addr = gdbarch_addr_bits_remove (gdbarch, address); + if (dwarf_line_debug) + { + fprintf_unfiltered (gdb_stdlog, + "Recording line %u, file %s, address %s\n", + line, lbasename (subfile->name), + paddress (gdbarch, address)); + } + (*p_record_line) (subfile, line, addr); } /* Subroutine of dwarf_decode_lines_1 to simplify it. Mark the end of a set of line number records. - The arguments are the same as for dwarf_record_line. + The arguments are the same as for dwarf_record_line_1. If SUBFILE is NULL the request is ignored. */ static void dwarf_finish_line (struct gdbarch *gdbarch, struct subfile *subfile, CORE_ADDR address, record_line_ftype p_record_line) { - if (subfile != NULL) - dwarf_record_line (gdbarch, subfile, 0, address, p_record_line); + if (subfile == NULL) + return; + + if (dwarf_line_debug) + { + fprintf_unfiltered (gdb_stdlog, + "Finishing current line, file %s, address %s\n", + lbasename (subfile->name), + paddress (gdbarch, address)); + } + + dwarf_record_line_1 (gdbarch, subfile, 0, address, p_record_line); +} + +/* Record the line in STATE. + END_SEQUENCE is non-zero if we're processing the end of a sequence. */ + +static void +dwarf_record_line (lnp_reader_state *reader, lnp_state_machine *state, + int end_sequence) +{ + const struct line_header *lh = reader->line_header; + unsigned int file, line, discriminator; + int is_stmt; + + file = state->file; + line = state->line; + is_stmt = state->is_stmt; + discriminator = state->discriminator; + + if (dwarf_line_debug) + { + fprintf_unfiltered (gdb_stdlog, + "Processing actual line %u: file %u," + " address %s, is_stmt %u, discrim %u\n", + line, file, + paddress (reader->gdbarch, state->address), + is_stmt, discriminator); + } + + if (file == 0 || file - 1 >= lh->num_file_names) + dwarf2_debug_line_missing_file_complaint (); + /* For now we ignore lines not starting on an instruction boundary. + But not when processing end_sequence for compatibility with the + previous version of the code. */ + else if (state->op_index == 0 || end_sequence) + { + lh->file_names[file - 1].included_p = 1; + if (reader->record_lines_p && is_stmt) + { + if (state->last_subfile != current_subfile || end_sequence) + { + dwarf_finish_line (reader->gdbarch, state->last_subfile, + state->address, state->record_line); + } + + if (!end_sequence) + { + if (dwarf_record_line_p (line, state->last_line, + state->line_has_non_zero_discriminator, + state->last_subfile)) + { + dwarf_record_line_1 (reader->gdbarch, current_subfile, + line, state->address, + state->record_line); + } + state->last_subfile = current_subfile; + state->last_line = line; + } + } + } +} + +/* Initialize STATE for the start of a line number program. */ + +static void +init_lnp_state_machine (lnp_state_machine *state, + const lnp_reader_state *reader) +{ + memset (state, 0, sizeof (*state)); + + /* Just starting, there is no "last file". */ + state->last_file = 0; + state->last_subfile = NULL; + + state->record_line = record_line; + + state->last_line = 0; + state->line_has_non_zero_discriminator = 0; + + /* Initialize these according to the DWARF spec. */ + state->op_index = 0; + state->file = 1; + state->line = 1; + /* Call `gdbarch_adjust_dwarf2_line' on the initial 0 address as if there + was a line entry for it so that the backend has a chance to adjust it + and also record it in case it needs it. This is currently used by MIPS + code, cf. `mips_adjust_dwarf2_line'. */ + state->address = gdbarch_adjust_dwarf2_line (reader->gdbarch, 0, 0); + state->is_stmt = reader->line_header->default_is_stmt; + state->discriminator = 0; +} + +/* Check address and if invalid nop-out the rest of the lines in this + sequence. */ + +static void +check_line_address (struct dwarf2_cu *cu, lnp_state_machine *state, + const gdb_byte *line_ptr, + CORE_ADDR lowpc, CORE_ADDR address) +{ + /* If address < lowpc then it's not a usable value, it's outside the + pc range of the CU. However, we restrict the test to only address + values of zero to preserve GDB's previous behaviour which is to + handle the specific case of a function being GC'd by the linker. */ + + if (address == 0 && address < lowpc) + { + /* This line table is for a function which has been + GCd by the linker. Ignore it. PR gdb/12528 */ + + struct objfile *objfile = cu->objfile; + long line_offset = line_ptr - get_debug_line_section (cu)->buffer; + + complaint (&symfile_complaints, + _(".debug_line address at offset 0x%lx is 0 [in module %s]"), + line_offset, objfile_name (objfile)); + state->record_line = noop_record_line; + /* Note: sm.record_line is left as noop_record_line + until we see DW_LNE_end_sequence. */ + } } /* Subroutine of dwarf_decode_lines to simplify it. - Process the line number information in LH. */ + Process the line number information in LH. + If DECODE_FOR_PST_P is non-zero, all we do is process the line number + program in order to set included_p for every referenced header. */ static void dwarf_decode_lines_1 (struct line_header *lh, struct dwarf2_cu *cu, @@ -17557,43 +17832,38 @@ dwarf_decode_lines_1 (struct line_header *lh, struct dwarf2_cu *cu, struct objfile *objfile = cu->objfile; bfd *abfd = objfile->obfd; struct gdbarch *gdbarch = get_objfile_arch (objfile); - struct subfile *last_subfile = NULL; - void (*p_record_line) (struct subfile *subfile, int line, CORE_ADDR pc) - = record_line; + /* Non-zero if we're recording line info (as opposed to building partial + symtabs). */ + int record_lines_p = !decode_for_pst_p; + /* A collection of things we need to pass to dwarf_record_line. */ + lnp_reader_state reader_state; baseaddr = ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile)); line_ptr = lh->statement_program_start; line_end = lh->statement_program_end; + reader_state.gdbarch = gdbarch; + reader_state.line_header = lh; + reader_state.record_lines_p = record_lines_p; + /* Read the statement sequences until there's nothing left. */ while (line_ptr < line_end) { - /* State machine registers. Call `gdbarch_adjust_dwarf2_line' - on the initial 0 address as if there was a line entry for it - so that the backend has a chance to adjust it and also record - it in case it needs it. This is currently used by MIPS code, - cf. `mips_adjust_dwarf2_line'. */ - CORE_ADDR address = gdbarch_adjust_dwarf2_line (gdbarch, 0, 0); - unsigned int file = 1; - unsigned int line = 1; - int is_stmt = lh->default_is_stmt; + /* The DWARF line number program state machine. */ + lnp_state_machine state_machine; int end_sequence = 0; - unsigned char op_index = 0; - unsigned int discriminator = 0; - /* The last line number that was recorded, used to coalesce - consecutive entries for the same line. This can happen, for - example, when discriminators are present. PR 17276. */ - unsigned int last_line = 0; - int line_has_non_zero_discriminator = 0; - - if (!decode_for_pst_p && lh->num_file_names >= file) + + /* Reset the state machine at the start of each sequence. */ + init_lnp_state_machine (&state_machine, &reader_state); + + if (record_lines_p && lh->num_file_names >= state_machine.file) { /* Start a subfile for the current file of the state machine. */ /* lh->include_dirs and lh->file_names are 0-based, but the directory and file name numbers in the statement program are 1-based. */ - struct file_entry *fe = &lh->file_names[file - 1]; + struct file_entry *fe = &lh->file_names[state_machine.file - 1]; const char *dir = NULL; if (fe->dir_index && lh->include_dirs != NULL) @@ -17603,15 +17873,10 @@ dwarf_decode_lines_1 (struct line_header *lh, struct dwarf2_cu *cu, } /* Decode the table. */ - while (!end_sequence) + while (line_ptr < line_end && !end_sequence) { op_code = read_1_byte (abfd, line_ptr); line_ptr += 1; - if (line_ptr > line_end) - { - dwarf2_debug_line_missing_end_sequence_complaint (); - break; - } if (op_code >= lh->opcode_base) { @@ -17621,42 +17886,23 @@ dwarf_decode_lines_1 (struct line_header *lh, struct dwarf2_cu *cu, int line_delta; adj_opcode = op_code - lh->opcode_base; - addr_adj = (((op_index + (adj_opcode / lh->line_range)) + addr_adj = (((state_machine.op_index + + (adj_opcode / lh->line_range)) / lh->maximum_ops_per_instruction) * lh->minimum_instruction_length); - address += gdbarch_adjust_dwarf2_line (gdbarch, addr_adj, 1); - op_index = ((op_index + (adj_opcode / lh->line_range)) - % lh->maximum_ops_per_instruction); + state_machine.address + += gdbarch_adjust_dwarf2_line (gdbarch, addr_adj, 1); + state_machine.op_index = ((state_machine.op_index + + (adj_opcode / lh->line_range)) + % lh->maximum_ops_per_instruction); line_delta = lh->line_base + (adj_opcode % lh->line_range); - line += line_delta; + state_machine.line += line_delta; if (line_delta != 0) - line_has_non_zero_discriminator = discriminator != 0; - if (lh->num_file_names < file || file == 0) - dwarf2_debug_line_missing_file_complaint (); - /* For now we ignore lines not starting on an - instruction boundary. */ - else if (op_index == 0) - { - lh->file_names[file - 1].included_p = 1; - if (!decode_for_pst_p && is_stmt) - { - if (last_subfile != current_subfile) - { - dwarf_finish_line (gdbarch, last_subfile, - address, p_record_line); - } - if (dwarf_record_line_p (line, last_line, - line_has_non_zero_discriminator, - last_subfile)) - { - dwarf_record_line (gdbarch, current_subfile, - line, address, p_record_line); - } - last_subfile = current_subfile; - last_line = line; - } - } - discriminator = 0; + state_machine.line_has_non_zero_discriminator + = state_machine.discriminator != 0; + + dwarf_record_line (&reader_state, &state_machine, 0); + state_machine.discriminator = 0; } else switch (op_code) { @@ -17670,38 +17916,22 @@ dwarf_decode_lines_1 (struct line_header *lh, struct dwarf2_cu *cu, switch (extended_op) { case DW_LNE_end_sequence: - p_record_line = record_line; + state_machine.record_line = record_line; end_sequence = 1; break; case DW_LNE_set_address: - address = read_address (abfd, line_ptr, cu, &bytes_read); - - /* If address < lowpc then it's not a usable value, it's - outside the pc range of the CU. However, we restrict - the test to only address values of zero to preserve - GDB's previous behaviour which is to handle the specific - case of a function being GC'd by the linker. */ - if (address == 0 && address < lowpc) - { - /* This line table is for a function which has been - GCd by the linker. Ignore it. PR gdb/12528 */ - - long line_offset - = line_ptr - get_debug_line_section (cu)->buffer; - - complaint (&symfile_complaints, - _(".debug_line address at offset 0x%lx is 0 " - "[in module %s]"), - line_offset, objfile_name (objfile)); - p_record_line = noop_record_line; - /* Note: p_record_line is left as noop_record_line - until we see DW_LNE_end_sequence. */ - } + { + CORE_ADDR address + = read_address (abfd, line_ptr, cu, &bytes_read); - op_index = 0; - line_ptr += bytes_read; - address += baseaddr; - address = gdbarch_adjust_dwarf2_line (gdbarch, address, 0); + line_ptr += bytes_read; + check_line_address (cu, &state_machine, line_ptr, + lowpc, address); + state_machine.op_index = 0; + address += baseaddr; + state_machine.address + = gdbarch_adjust_dwarf2_line (gdbarch, address, 0); + } break; case DW_LNE_define_file: { @@ -17729,9 +17959,10 @@ dwarf_decode_lines_1 (struct line_header *lh, struct dwarf2_cu *cu, if there are consecutive entries for the same (non-prologue) line we want to coalesce them. PR 17276. */ - discriminator = read_unsigned_leb128 (abfd, line_ptr, - &bytes_read); - line_has_non_zero_discriminator |= discriminator != 0; + state_machine.discriminator + = read_unsigned_leb128 (abfd, line_ptr, &bytes_read); + state_machine.line_has_non_zero_discriminator + |= state_machine.discriminator != 0; line_ptr += bytes_read; break; default: @@ -17750,30 +17981,8 @@ dwarf_decode_lines_1 (struct line_header *lh, struct dwarf2_cu *cu, } break; case DW_LNS_copy: - if (lh->num_file_names < file || file == 0) - dwarf2_debug_line_missing_file_complaint (); - else - { - lh->file_names[file - 1].included_p = 1; - if (!decode_for_pst_p && is_stmt) - { - if (last_subfile != current_subfile) - { - dwarf_finish_line (gdbarch, last_subfile, - address, p_record_line); - } - if (dwarf_record_line_p (line, last_line, - line_has_non_zero_discriminator, - last_subfile)) - { - dwarf_record_line (gdbarch, current_subfile, - line, address, p_record_line); - } - last_subfile = current_subfile; - last_line = line; - } - } - discriminator = 0; + dwarf_record_line (&reader_state, &state_machine, 0); + state_machine.discriminator = 0; break; case DW_LNS_advance_pc: { @@ -17781,12 +17990,13 @@ dwarf_decode_lines_1 (struct line_header *lh, struct dwarf2_cu *cu, = read_unsigned_leb128 (abfd, line_ptr, &bytes_read); CORE_ADDR addr_adj; - addr_adj = (((op_index + adjust) + addr_adj = (((state_machine.op_index + adjust) / lh->maximum_ops_per_instruction) * lh->minimum_instruction_length); - address += gdbarch_adjust_dwarf2_line (gdbarch, addr_adj, 1); - op_index = ((op_index + adjust) - % lh->maximum_ops_per_instruction); + state_machine.address + += gdbarch_adjust_dwarf2_line (gdbarch, addr_adj, 1); + state_machine.op_index = ((state_machine.op_index + adjust) + % lh->maximum_ops_per_instruction); line_ptr += bytes_read; } break; @@ -17795,44 +18005,48 @@ dwarf_decode_lines_1 (struct line_header *lh, struct dwarf2_cu *cu, int line_delta = read_signed_leb128 (abfd, line_ptr, &bytes_read); - line += line_delta; + state_machine.line += line_delta; if (line_delta != 0) - line_has_non_zero_discriminator = discriminator != 0; + state_machine.line_has_non_zero_discriminator + = state_machine.discriminator != 0; line_ptr += bytes_read; } break; case DW_LNS_set_file: - { - /* The arrays lh->include_dirs and lh->file_names are - 0-based, but the directory and file name numbers in - the statement program are 1-based. */ - struct file_entry *fe; - const char *dir = NULL; - - file = read_unsigned_leb128 (abfd, line_ptr, &bytes_read); - line_ptr += bytes_read; - if (lh->num_file_names < file || file == 0) - dwarf2_debug_line_missing_file_complaint (); - else - { - fe = &lh->file_names[file - 1]; - if (fe->dir_index && lh->include_dirs != NULL) - dir = lh->include_dirs[fe->dir_index - 1]; - if (!decode_for_pst_p) - { - last_subfile = current_subfile; - line_has_non_zero_discriminator = discriminator != 0; - dwarf2_start_subfile (fe->name, dir); - } - } - } + { + /* The arrays lh->include_dirs and lh->file_names are + 0-based, but the directory and file name numbers in + the statement program are 1-based. */ + struct file_entry *fe; + const char *dir = NULL; + + state_machine.file = read_unsigned_leb128 (abfd, line_ptr, + &bytes_read); + line_ptr += bytes_read; + if (state_machine.file == 0 + || state_machine.file - 1 >= lh->num_file_names) + dwarf2_debug_line_missing_file_complaint (); + else + { + fe = &lh->file_names[state_machine.file - 1]; + if (fe->dir_index && lh->include_dirs != NULL) + dir = lh->include_dirs[fe->dir_index - 1]; + if (record_lines_p) + { + state_machine.last_subfile = current_subfile; + state_machine.line_has_non_zero_discriminator + = state_machine.discriminator != 0; + dwarf2_start_subfile (fe->name, dir); + } + } + } break; case DW_LNS_set_column: (void) read_unsigned_leb128 (abfd, line_ptr, &bytes_read); line_ptr += bytes_read; break; case DW_LNS_negate_stmt: - is_stmt = (!is_stmt); + state_machine.is_stmt = (!state_machine.is_stmt); break; case DW_LNS_set_basic_block: break; @@ -17846,12 +18060,13 @@ dwarf_decode_lines_1 (struct line_header *lh, struct dwarf2_cu *cu, CORE_ADDR adjust = (255 - lh->opcode_base) / lh->line_range; CORE_ADDR addr_adj; - addr_adj = (((op_index + adjust) + addr_adj = (((state_machine.op_index + adjust) / lh->maximum_ops_per_instruction) * lh->minimum_instruction_length); - address += gdbarch_adjust_dwarf2_line (gdbarch, addr_adj, 1); - op_index = ((op_index + adjust) - % lh->maximum_ops_per_instruction); + state_machine.address + += gdbarch_adjust_dwarf2_line (gdbarch, addr_adj, 1); + state_machine.op_index = ((state_machine.op_index + adjust) + % lh->maximum_ops_per_instruction); } break; case DW_LNS_fixed_advance_pc: @@ -17859,8 +18074,9 @@ dwarf_decode_lines_1 (struct line_header *lh, struct dwarf2_cu *cu, CORE_ADDR addr_adj; addr_adj = read_2_bytes (abfd, line_ptr); - address += gdbarch_adjust_dwarf2_line (gdbarch, addr_adj, 1); - op_index = 0; + state_machine.address + += gdbarch_adjust_dwarf2_line (gdbarch, addr_adj, 1); + state_machine.op_index = 0; line_ptr += 2; } break; @@ -17877,17 +18093,13 @@ dwarf_decode_lines_1 (struct line_header *lh, struct dwarf2_cu *cu, } } } - if (lh->num_file_names < file || file == 0) - dwarf2_debug_line_missing_file_complaint (); - else - { - lh->file_names[file - 1].included_p = 1; - if (!decode_for_pst_p) - { - dwarf_finish_line (gdbarch, current_subfile, address, - p_record_line); - } - } + + if (!end_sequence) + dwarf2_debug_line_missing_end_sequence_complaint (); + + /* We got a DW_LNE_end_sequence (or we ran off the end of the buffer, + in which case we still finish recording the last line). */ + dwarf_record_line (&reader_state, &state_machine, 1); } } @@ -18307,7 +18519,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, @@ -18397,7 +18609,7 @@ new_symbol_full (struct die_info *die, struct type *type, struct dwarf2_cu *cu, SYMBOL_DOMAIN (sym) = STRUCT_DOMAIN; { - /* NOTE: carlton/2003-11-10: C++ and Java class symbols shouldn't + /* NOTE: carlton/2003-11-10: C++ class symbols shouldn't really ever be static objects: otherwise, if you try to, say, break of a class's method and you're in a file which doesn't mention that class, it won't work unless @@ -18408,17 +18620,15 @@ new_symbol_full (struct die_info *die, struct type *type, struct dwarf2_cu *cu, if (!suppress_add) { list_to_add = (cu->list_in_scope == &file_symbols - && (cu->language == language_cplus - || cu->language == language_java) + && cu->language == language_cplus ? &global_symbols : cu->list_in_scope); /* The semantics of C++ state that "struct foo { - ... }" also defines a typedef for "foo". A Java - class declaration also defines a typedef for the - class. */ + ... }" also defines a typedef for "foo". */ if (cu->language == language_cplus - || cu->language == language_java - || cu->language == language_ada) + || cu->language == language_ada + || cu->language == language_d + || cu->language == language_rust) { /* The symbol's name is already allocated along with this objfile, so we don't need to @@ -18451,8 +18661,7 @@ new_symbol_full (struct die_info *die, struct type *type, struct dwarf2_cu *cu, DW_TAG_class_type, etc. block. */ list_to_add = (cu->list_in_scope == &file_symbols - && (cu->language == language_cplus - || cu->language == language_java) + && cu->language == language_cplus ? &global_symbols : cu->list_in_scope); } break; @@ -18534,7 +18743,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; } @@ -18579,12 +18788,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; @@ -18656,7 +18865,6 @@ dwarf2_const_value (const struct attribute *attr, struct symbol *sym, struct dwarf2_cu *cu) { struct objfile *objfile = cu->objfile; - struct comp_unit_head *cu_header = &cu->header; LONGEST value; const gdb_byte *bytes; struct dwarf2_locexpr_baton *baton; @@ -18778,11 +18986,11 @@ 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); + return init_type (objfile, TYPE_CODE_ERROR, 0, saved); } /* Look up the type of DIE in CU using its type attribute ATTR. @@ -18989,16 +19197,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) @@ -19017,10 +19226,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); @@ -19040,14 +19248,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); @@ -19064,8 +19271,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, @@ -19091,8 +19299,9 @@ determine_prefix (struct die_info *die, struct dwarf2_cu *cu) struct type *parent_type; char *retval; - if (cu->language != language_cplus && cu->language != language_java - && cu->language != language_fortran) + if (cu->language != language_cplus + && cu->language != language_fortran && cu->language != language_d + && cu->language != language_rust) return ""; retval = anonymous_struct_prefix (die, cu); @@ -19246,8 +19455,18 @@ typename_concat (struct obstack *obs, const char *prefix, const char *suffix, if (suffix == NULL || suffix[0] == '\0' || prefix == NULL || prefix[0] == '\0') 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 @@ -19267,7 +19486,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); @@ -19298,13 +19518,14 @@ dwarf2_canonicalize_name (const char *name, struct dwarf2_cu *cu, { if (name && cu->language == language_cplus) { - char *canon_name = cp_canonicalize_string (name); + std::string canon_name = cp_canonicalize_string (name); - if (canon_name != NULL) + if (!canon_name.empty ()) { - if (strcmp (canon_name, name) != 0) - name = obstack_copy0 (obstack, canon_name, strlen (canon_name)); - xfree (canon_name); + if (canon_name != name) + name = (const char *) obstack_copy0 (obstack, + canon_name.c_str (), + canon_name.length ()); } } @@ -19345,36 +19566,6 @@ dwarf2_name (struct die_info *die, struct dwarf2_cu *cu) return DW_STRING (attr); return CP_ANONYMOUS_NAMESPACE_STR; - case DW_TAG_subprogram: - /* Java constructors will all be named "", so return - the class name when we see this special case. */ - if (cu->language == language_java - && DW_STRING (attr) != NULL - && strcmp (DW_STRING (attr), "") == 0) - { - struct dwarf2_cu *spec_cu = cu; - struct die_info *spec_die; - - /* GCJ will output '' for Java constructor names. - For this special case, return the name of the parent class. */ - - /* GCJ may output subprogram DIEs with AT_specification set. - If so, use the name of the specified DIE. */ - spec_die = die_specification (die, &spec_cu); - if (spec_die != NULL) - return dwarf2_name (spec_die, spec_cu); - - do - { - die = die->parent; - if (die->tag == DW_TAG_class_type) - return dwarf2_name (die, cu); - } - while (die->tag != DW_TAG_compile_unit - && die->tag != DW_TAG_partial_unit); - } - break; - case DW_TAG_class_type: case DW_TAG_interface_type: case DW_TAG_structure_type: @@ -19408,12 +19599,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); @@ -19815,7 +20007,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. @@ -19863,6 +20056,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) @@ -19934,7 +20134,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; @@ -19964,6 +20164,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) @@ -19986,7 +20193,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; } @@ -20089,7 +20296,6 @@ static struct die_info * follow_die_sig_1 (struct die_info *src_die, struct signatured_type *sig_type, struct dwarf2_cu **ref_cu) { - struct objfile *objfile = (*ref_cu)->objfile; struct die_info temp_die; struct dwarf2_cu *sig_cu; struct die_info *die; @@ -20107,8 +20313,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. @@ -20542,6 +20748,7 @@ decode_locdesc (struct dwarf_block *blk, struct dwarf2_cu *cu) break; case DW_OP_GNU_push_tls_address: + case DW_OP_form_tls_address: /* The top of the stack has the offset from the beginning of the thread control block at which the variable is located. */ /* Nothing should follow this operator, so the top of stack would @@ -20604,11 +20811,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 * @@ -20645,7 +20848,7 @@ file_file_name (int file, struct line_header *lh) || lh->include_dirs == NULL) return xstrdup (fe->name); return concat (lh->include_dirs[fe->dir_index - 1], SLASH_STRING, - fe->name, NULL); + fe->name, (char *) NULL); } else { @@ -20680,7 +20883,8 @@ file_full_name (int file, struct line_header *lh, const char *comp_dir) if (IS_ABSOLUTE_PATH (relative) || comp_dir == NULL) return relative; - return reconcat (relative, comp_dir, SLASH_STRING, relative, NULL); + return reconcat (relative, comp_dir, SLASH_STRING, + relative, (char *) NULL); } else return file_file_name (file, lh); @@ -20720,7 +20924,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'; @@ -20808,7 +21012,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++; @@ -20831,7 +21035,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); @@ -20997,7 +21201,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) { @@ -21114,7 +21319,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 @@ -21254,7 +21459,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 " @@ -21272,7 +21479,6 @@ dwarf_decode_macro_bytes (bfd *abfd, void **slot; bfd *include_bfd = abfd; struct dwarf2_section_info *include_section = section; - struct dwarf2_section_info alt_section; const gdb_byte *include_mac_end = mac_end; int is_dwz = section_is_dwz; const gdb_byte *new_mac_ptr; @@ -21321,9 +21527,10 @@ dwarf_decode_macro_bytes (bfd *abfd, if (!section_is_gnu) { unsigned int bytes_read; - int constant; - constant = read_unsigned_leb128 (abfd, mac_ptr, &bytes_read); + /* This reads the constant, but since we don't recognize + any vendor extensions, we ignore it. */ + read_unsigned_leb128 (abfd, mac_ptr, &bytes_read); mac_ptr += bytes_read; read_direct_string (abfd, mac_ptr, &bytes_read); mac_ptr += bytes_read; @@ -21357,7 +21564,6 @@ dwarf_decode_macros (struct dwarf2_cu *cu, unsigned int offset, unsigned int offset_size = cu->header.offset_size; const gdb_byte *opcode_definitions[256]; struct cleanup *cleanup; - htab_t include_hash; void **slot; struct dwarf2_section_info *section; const char *section_name; @@ -21430,7 +21636,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 @@ -21523,16 +21729,16 @@ dwarf_decode_macros (struct dwarf2_cu *cu, unsigned int offset, command-line macro definitions/undefinitions. This flag is unset when we reach the first DW_MACINFO_start_file entry. */ - include_hash = htab_create_alloc (1, htab_hash_pointer, htab_eq_pointer, - NULL, xcalloc, xfree); - cleanup = make_cleanup_htab_delete (include_hash); + htab_up include_hash (htab_create_alloc (1, htab_hash_pointer, + htab_eq_pointer, + NULL, xcalloc, xfree)); mac_ptr = section->buffer + offset; - slot = htab_find_slot (include_hash, mac_ptr, INSERT); + slot = htab_find_slot (include_hash.get (), mac_ptr, INSERT); *slot = (void *) mac_ptr; dwarf_decode_macro_bytes (abfd, mac_ptr, mac_end, current_file, lh, section, - section_is_gnu, 0, offset_size, include_hash); - do_cleanups (cleanup); + section_is_gnu, 0, offset_size, + include_hash.get ()); } /* Check if the attribute's form is a DW_FORM_block* @@ -21665,8 +21871,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); @@ -21684,8 +21889,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); @@ -21889,9 +22093,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 @@ -21903,7 +22105,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; @@ -21921,7 +22123,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; @@ -21966,7 +22168,7 @@ age_cached_comp_units (void) while (per_cu != NULL) { per_cu->cu->last_used ++; - if (per_cu->cu->last_used <= dwarf2_max_cache_age) + if (per_cu->cu->last_used <= dwarf_max_cache_age) dwarf2_mark (per_cu->cu); per_cu = per_cu->cu->read_in_chain; } @@ -22025,7 +22227,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; @@ -22068,7 +22272,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; } @@ -22078,8 +22283,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); @@ -22127,6 +22334,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)) @@ -22153,7 +22390,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; } @@ -22172,7 +22410,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 @@ -22264,7 +22503,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; } @@ -22275,26 +22515,28 @@ partial_die_hash (const void *item) static int partial_die_eq (const void *item_lhs, const void *item_rhs) { - const struct partial_die_info *part_die_lhs = item_lhs; - const struct partial_die_info *part_die_rhs = item_rhs; + const struct partial_die_info *part_die_lhs + = (const struct partial_die_info *) item_lhs; + const struct partial_die_info *part_die_rhs + = (const struct partial_die_info *) item_rhs; return part_die_lhs->offset.sect_off == part_die_rhs->offset.sect_off; } -static struct cmd_list_element *set_dwarf2_cmdlist; -static struct cmd_list_element *show_dwarf2_cmdlist; +static struct cmd_list_element *set_dwarf_cmdlist; +static struct cmd_list_element *show_dwarf_cmdlist; static void -set_dwarf2_cmd (char *args, int from_tty) +set_dwarf_cmd (char *args, int from_tty) { - help_list (set_dwarf2_cmdlist, "maintenance set dwarf2 ", all_commands, + help_list (set_dwarf_cmdlist, "maintenance set dwarf ", all_commands, gdb_stdout); } static void -show_dwarf2_cmd (char *args, int from_tty) +show_dwarf_cmd (char *args, int from_tty) { - cmd_show_list (show_dwarf2_cmdlist, from_tty, ""); + cmd_show_list (show_dwarf_cmdlist, from_tty, ""); } /* Free data associated with OBJFILE, if necessary. */ @@ -22302,7 +22544,7 @@ show_dwarf2_cmd (char *args, int from_tty) static void dwarf2_per_objfile_free (struct objfile *objfile, void *d) { - struct dwarf2_per_objfile *data = d; + struct dwarf2_per_objfile *data = (struct dwarf2_per_objfile *) d; int ix; /* Make sure we don't accidentally use dwarf2_per_objfile while @@ -22347,7 +22589,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); } @@ -22356,8 +22598,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); } @@ -22383,7 +22625,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); @@ -22420,7 +22662,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), @@ -22432,8 +22675,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; @@ -22447,7 +22690,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); } @@ -22478,7 +22721,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); @@ -22655,7 +22898,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; } @@ -22723,7 +22967,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); } @@ -22731,8 +22976,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; } @@ -22779,8 +23026,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, @@ -22792,7 +23039,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; @@ -22922,7 +23170,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); } @@ -22943,7 +23191,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]; @@ -23018,8 +23267,6 @@ write_psymtabs_to_index (struct objfile *objfile, const char *dir) struct mapped_symtab *symtab; offset_type val, size_of_contents, total_len; struct stat st; - htab_t psyms_seen; - htab_t cu_index_htab; struct psymtab_cu_index_map *psymtab_cu_index_map; if (dwarf2_per_objfile->using_index) @@ -23057,22 +23304,20 @@ write_psymtabs_to_index (struct objfile *objfile, const char *dir) obstack_init (&types_cu_list); make_cleanup_obstack_free (&types_cu_list); - psyms_seen = htab_create_alloc (100, htab_hash_pointer, htab_eq_pointer, - NULL, xcalloc, xfree); - make_cleanup_htab_delete (psyms_seen); + htab_up psyms_seen (htab_create_alloc (100, htab_hash_pointer, + htab_eq_pointer, + NULL, xcalloc, xfree)); /* While we're scanning CU's create a table that maps a psymtab pointer (which is what addrmap records) to its index (which is what is recorded in the index file). This will later be needed to write the address table. */ - cu_index_htab = htab_create_alloc (100, - hash_psymtab_cu_index, - 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); + htab_up cu_index_htab (htab_create_alloc (100, + hash_psymtab_cu_index, + eq_psymtab_cu_index, + NULL, xcalloc, xfree)); + 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 @@ -23094,12 +23339,13 @@ write_psymtabs_to_index (struct objfile *objfile, const char *dir) continue; if (psymtab->user == NULL) - recursively_write_psymbols (objfile, psymtab, symtab, psyms_seen, i); + recursively_write_psymbols (objfile, psymtab, symtab, + psyms_seen.get (), i); map = &psymtab_cu_index_map[i]; map->psymtab = psymtab; map->cu_index = i; - slot = htab_find_slot (cu_index_htab, map, INSERT); + slot = htab_find_slot (cu_index_htab.get (), map, INSERT); gdb_assert (slot != NULL); gdb_assert (*slot == NULL); *slot = map; @@ -23112,7 +23358,7 @@ write_psymtabs_to_index (struct objfile *objfile, const char *dir) } /* Dump the address map. */ - write_address_map (objfile, &addr_obstack, cu_index_htab); + write_address_map (objfile, &addr_obstack, cu_index_htab.get ()); /* Write out the .debug_type entries, if any. */ if (dwarf2_per_objfile->signatured_types) @@ -23122,7 +23368,7 @@ write_psymtabs_to_index (struct objfile *objfile, const char *dir) sig_data.objfile = objfile; sig_data.symtab = symtab; sig_data.types_list = &types_cu_list; - sig_data.psyms_seen = psyms_seen; + sig_data.psyms_seen = psyms_seen.get (); sig_data.cu_index = dwarf2_per_objfile->n_comp_units; htab_traverse_noresize (dwarf2_per_objfile->signatured_types, write_one_signatured_type, &sig_data); @@ -23211,7 +23457,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) { @@ -23232,11 +23480,11 @@ save_gdb_index_command (char *arg, int from_tty) -int dwarf2_always_disassemble; +int dwarf_always_disassemble; static void -show_dwarf2_always_disassemble (struct ui_file *file, int from_tty, - struct cmd_list_element *c, const char *value) +show_dwarf_always_disassemble (struct ui_file *file, int from_tty, + struct cmd_list_element *c, const char *value) { fprintf_filtered (file, _("Whether to always disassemble " @@ -23263,61 +23511,71 @@ _initialize_dwarf2_read (void) dwarf2_objfile_data_key = register_objfile_data_with_cleanup (NULL, dwarf2_per_objfile_free); - add_prefix_cmd ("dwarf2", class_maintenance, set_dwarf2_cmd, _("\ -Set DWARF 2 specific variables.\n\ -Configure DWARF 2 variables such as the cache size"), - &set_dwarf2_cmdlist, "maintenance set dwarf2 ", + add_prefix_cmd ("dwarf", class_maintenance, set_dwarf_cmd, _("\ +Set DWARF specific variables.\n\ +Configure DWARF variables such as the cache size"), + &set_dwarf_cmdlist, "maintenance set dwarf ", 0/*allow-unknown*/, &maintenance_set_cmdlist); - add_prefix_cmd ("dwarf2", class_maintenance, show_dwarf2_cmd, _("\ -Show DWARF 2 specific variables\n\ -Show DWARF 2 variables such as the cache size"), - &show_dwarf2_cmdlist, "maintenance show dwarf2 ", + add_prefix_cmd ("dwarf", class_maintenance, show_dwarf_cmd, _("\ +Show DWARF specific variables\n\ +Show DWARF variables such as the cache size"), + &show_dwarf_cmdlist, "maintenance show dwarf ", 0/*allow-unknown*/, &maintenance_show_cmdlist); add_setshow_zinteger_cmd ("max-cache-age", class_obscure, - &dwarf2_max_cache_age, _("\ -Set the upper bound on the age of cached dwarf2 compilation units."), _("\ -Show the upper bound on the age of cached dwarf2 compilation units."), _("\ + &dwarf_max_cache_age, _("\ +Set the upper bound on the age of cached DWARF compilation units."), _("\ +Show the upper bound on the age of cached DWARF compilation units."), _("\ A higher limit means that cached compilation units will be stored\n\ in memory longer, and more total memory will be used. Zero disables\n\ caching, which can slow down startup."), NULL, - show_dwarf2_max_cache_age, - &set_dwarf2_cmdlist, - &show_dwarf2_cmdlist); + show_dwarf_max_cache_age, + &set_dwarf_cmdlist, + &show_dwarf_cmdlist); add_setshow_boolean_cmd ("always-disassemble", class_obscure, - &dwarf2_always_disassemble, _("\ + &dwarf_always_disassemble, _("\ Set whether `info address' always disassembles DWARF expressions."), _("\ Show whether `info address' always disassembles DWARF expressions."), _("\ When enabled, DWARF expressions are always printed in an assembly-like\n\ syntax. When disabled, expressions will be printed in a more\n\ conversational style, when possible."), NULL, - show_dwarf2_always_disassemble, - &set_dwarf2_cmdlist, - &show_dwarf2_cmdlist); - - add_setshow_zuinteger_cmd ("dwarf2-read", no_class, &dwarf2_read_debug, _("\ -Set debugging of the dwarf2 reader."), _("\ -Show debugging of the dwarf2 reader."), _("\ -When enabled (non-zero), debugging messages are printed during dwarf2\n\ + show_dwarf_always_disassemble, + &set_dwarf_cmdlist, + &show_dwarf_cmdlist); + + add_setshow_zuinteger_cmd ("dwarf-read", no_class, &dwarf_read_debug, _("\ +Set debugging of the DWARF reader."), _("\ +Show debugging of the DWARF reader."), _("\ +When enabled (non-zero), debugging messages are printed during DWARF\n\ reading and symtab expansion. A value of 1 (one) provides basic\n\ information. A value greater than 1 provides more verbose information."), NULL, NULL, &setdebuglist, &showdebuglist); - add_setshow_zuinteger_cmd ("dwarf2-die", no_class, &dwarf2_die_debug, _("\ -Set debugging of the dwarf2 DIE reader."), _("\ -Show debugging of the dwarf2 DIE reader."), _("\ + add_setshow_zuinteger_cmd ("dwarf-die", no_class, &dwarf_die_debug, _("\ +Set debugging of the DWARF DIE reader."), _("\ +Show debugging of the DWARF DIE reader."), _("\ When enabled (non-zero), DIEs are dumped after they are read in.\n\ The value is the maximum depth to print."), NULL, NULL, &setdebuglist, &showdebuglist); + add_setshow_zuinteger_cmd ("dwarf-line", no_class, &dwarf_line_debug, _("\ +Set debugging of the dwarf line reader."), _("\ +Show debugging of the dwarf line reader."), _("\ +When enabled (non-zero), line number entries are dumped as they are read in.\n\ +A value of 1 (one) provides basic information.\n\ +A value greater than 1 provides more verbose information."), + NULL, + NULL, + &setdebuglist, &showdebuglist); + add_setshow_boolean_cmd ("check-physname", no_class, &check_physname, _("\ Set cross-checking of \"physname\" code against demangler."), _("\ Show cross-checking of \"physname\" code against demangler."), _("\