diff options
Diffstat (limited to 'gdb')
-rw-r--r-- | gdb/ChangeLog | 8 | ||||
-rw-r--r-- | gdb/dwarf2read.c | 138 |
2 files changed, 82 insertions, 64 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 0ffb7607468..2595f8d40cb 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,13 @@ 2013-04-15 Doug Evans <dje@google.com> + * dwarf2read.c (struct dwo_file): Replace member "cus" with "cu". + (struct create_dwo_cu_data): Renamed from create_dwo_info_table_data. + (create_dwo_cu_reader): Renamed from + create_dwo_debug_info_hash_table_reader. + (create_dwo_cu): Renamed from create_dwo_debug_info_hash_table. + Remove support for multiple CUs in a DWO file. + (open_and_init_dwo_file, lookup_dwo_cutu): Update. + * dwarf2read.c (create_debug_types_hash_table): Use hex_string instead of phex. (lookup_dwo_unit, create_dwo_debug_info_hash_table_reader): Ditto. diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c index 9c2af55d5d4..0542beae69a 100644 --- a/gdb/dwarf2read.c +++ b/gdb/dwarf2read.c @@ -742,9 +742,12 @@ struct dwo_file /* Section info for this file. */ struct dwo_sections sections; - /* Table of CUs in the file. - Each element is a struct dwo_unit. */ - htab_t cus; + /* The CU in the file. + We only support one because having more than one requires hacking the + dwo_name of each to match, which is highly unlikely to happen. + Doing this means all TUs can share comp_dir: We also assume that + DW_AT_comp_dir across all TUs in a DWO file will be identical. */ + struct dwo_unit *cu; /* Table of TUs in the file. Each element is a struct dwo_unit. */ @@ -8388,82 +8391,64 @@ allocate_dwo_unit_table (struct objfile *objfile) /* Structure used to pass data to create_dwo_debug_info_hash_table_reader. */ -struct create_dwo_info_table_data +struct create_dwo_cu_data { struct dwo_file *dwo_file; - htab_t cu_htab; + struct dwo_unit dwo_unit; }; -/* die_reader_func for create_dwo_debug_info_hash_table. */ +/* die_reader_func for create_dwo_cu. */ static void -create_dwo_debug_info_hash_table_reader (const struct die_reader_specs *reader, - const gdb_byte *info_ptr, - struct die_info *comp_unit_die, - int has_children, - void *datap) +create_dwo_cu_reader (const struct die_reader_specs *reader, + const gdb_byte *info_ptr, + struct die_info *comp_unit_die, + int has_children, + 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_info_table_data *data = datap; + struct create_dwo_cu_data *data = datap; struct dwo_file *dwo_file = data->dwo_file; - htab_t cu_htab = data->cu_htab; - void **slot; + struct dwo_unit *dwo_unit = &data->dwo_unit; struct attribute *attr; - struct dwo_unit *dwo_unit; attr = dwarf2_attr (comp_unit_die, DW_AT_GNU_dwo_id, cu); if (attr == NULL) { - error (_("Dwarf Error: debug entry at offset 0x%x is missing" - " its dwo_id [in module %s]"), - offset.sect_off, dwo_file->dwo_name); + complaint (&symfile_complaints, + _("Dwarf Error: debug entry at offset 0x%x is missing" + " its dwo_id [in module %s]"), + offset.sect_off, dwo_file->dwo_name); return; } - dwo_unit = OBSTACK_ZALLOC (&objfile->objfile_obstack, struct dwo_unit); dwo_unit->dwo_file = dwo_file; dwo_unit->signature = DW_UNSND (attr); dwo_unit->section = section; dwo_unit->offset = offset; dwo_unit->length = cu->per_cu->length; - slot = htab_find_slot (cu_htab, dwo_unit, INSERT); - gdb_assert (slot != NULL); - if (*slot != NULL) - { - const struct dwo_unit *dup_dwo_unit = *slot; - - complaint (&symfile_complaints, - _("debug entry at offset 0x%x is duplicate to the entry at" - " offset 0x%x, dwo_id %s [in module %s]"), - offset.sect_off, dup_dwo_unit->offset.sect_off, - hex_string (dwo_unit->signature), dwo_file->dwo_name); - } - else - *slot = dwo_unit; - if (dwarf2_read_debug) fprintf_unfiltered (gdb_stdlog, " offset 0x%x, dwo_id %s\n", offset.sect_off, hex_string (dwo_unit->signature)); } -/* Create a hash table to map DWO IDs to their CU entry in - .debug_info.dwo in DWO_FILE. - Note: This function processes DWO files only, not DWP files. - Note: A DWO file generally contains one CU, but we don't assume this. */ +/* Create the dwo_unit for the lone CU in DWO_FILE. + Note: This function processes DWO files only, not DWP files. */ -static htab_t -create_dwo_debug_info_hash_table (struct dwo_file *dwo_file) +static struct dwo_unit * +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_info_table_data create_dwo_info_table_data; + struct create_dwo_cu_data create_dwo_cu_data; + struct dwo_unit *dwo_unit; dwarf2_read_section (objfile, section); info_ptr = section->buffer; @@ -8476,19 +8461,22 @@ create_dwo_debug_info_hash_table (struct dwo_file *dwo_file) abfd = section->asection->owner; if (dwarf2_read_debug) - fprintf_unfiltered (gdb_stdlog, "Reading .debug_info.dwo for %s:\n", - bfd_get_filename (abfd)); - - cu_htab = allocate_dwo_unit_table (objfile); + { + fprintf_unfiltered (gdb_stdlog, "Reading %s for %s:\n", + bfd_section_name (abfd, section->asection), + bfd_get_filename (abfd)); + } - create_dwo_info_table_data.dwo_file = dwo_file; - create_dwo_info_table_data.cu_htab = cu_htab; + create_dwo_cu_data.dwo_file = dwo_file; + dwo_unit = NULL; end_ptr = info_ptr + section->size; while (info_ptr < end_ptr) { struct dwarf2_per_cu_data per_cu; + memset (&create_dwo_cu_data.dwo_unit, 0, + sizeof (create_dwo_cu_data.dwo_unit)); memset (&per_cu, 0, sizeof (per_cu)); per_cu.objfile = objfile; per_cu.is_debug_types = 0; @@ -8498,13 +8486,30 @@ create_dwo_debug_info_hash_table (struct dwo_file *dwo_file) init_cutu_and_read_dies_no_follow (&per_cu, &dwo_file->sections.abbrev, dwo_file, - create_dwo_debug_info_hash_table_reader, - &create_dwo_info_table_data); + create_dwo_cu_reader, + &create_dwo_cu_data); + + if (create_dwo_cu_data.dwo_unit.dwo_file != NULL) + { + /* If we've already found one, complain. We only support one + because having more than one requires hacking the dwo_name of + each to match, which is highly unlikely to happen. */ + if (dwo_unit != NULL) + { + complaint (&symfile_complaints, + _("Multiple CUs in DWO file %s [in module %s]"), + dwo_file->dwo_name, objfile->name); + break; + } + + dwo_unit = OBSTACK_ZALLOC (&objfile->objfile_obstack, struct dwo_unit); + *dwo_unit = create_dwo_cu_data.dwo_unit; + } info_ptr += per_cu.length; } - return cu_htab; + return dwo_unit; } /* DWP file .debug_{cu,tu}_index section format: @@ -9055,7 +9060,7 @@ dwarf2_locate_dwo_sections (bfd *abfd, asection *sectp, void *dwo_sections_ptr) } /* Initialize the use of the DWO file specified by DWO_NAME and referenced - by PER_CU. + by PER_CU. This is for the non-DWP case. The result is NULL if DWO_NAME can't be found. */ static struct dwo_file * @@ -9083,7 +9088,7 @@ open_and_init_dwo_file (struct dwarf2_per_cu_data *per_cu, bfd_map_over_sections (dbfd, dwarf2_locate_dwo_sections, &dwo_file->sections); - dwo_file->cus = create_dwo_debug_info_hash_table (dwo_file); + dwo_file->cu = create_dwo_cu (dwo_file); dwo_file->tus = create_debug_types_hash_table (dwo_file, dwo_file->sections.types); @@ -9314,26 +9319,31 @@ lookup_dwo_cutu (struct dwarf2_per_cu_data *this_unit, if (dwo_file != NULL) { - htab_t htab = is_debug_types ? dwo_file->tus : dwo_file->cus; + struct dwo_unit *dwo_cutu = NULL; - if (htab != NULL) + if (is_debug_types && dwo_file->tus) { - struct dwo_unit find_dwo_cutu, *dwo_cutu; + struct dwo_unit find_dwo_cutu; memset (&find_dwo_cutu, 0, sizeof (find_dwo_cutu)); find_dwo_cutu.signature = signature; - dwo_cutu = htab_find (htab, &find_dwo_cutu); + dwo_cutu = htab_find (dwo_file->tus, &find_dwo_cutu); + } + else if (!is_debug_types && dwo_file->cu) + { + if (signature == dwo_file->cu->signature) + dwo_cutu = dwo_file->cu; + } - if (dwo_cutu != NULL) + if (dwo_cutu != NULL) + { + if (dwarf2_read_debug) { - if (dwarf2_read_debug) - { - fprintf_unfiltered (gdb_stdlog, "DWO %s %s(%s) found: @%s\n", - kind, dwo_name, hex_string (signature), - host_address_to_string (dwo_cutu)); - } - return dwo_cutu; + fprintf_unfiltered (gdb_stdlog, "DWO %s %s(%s) found: @%s\n", + kind, dwo_name, hex_string (signature), + host_address_to_string (dwo_cutu)); } + return dwo_cutu; } } |