diff options
Diffstat (limited to 'gdb/dwarf2read.c')
-rw-r--r-- | gdb/dwarf2read.c | 106 |
1 files changed, 68 insertions, 38 deletions
diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c index 0c25726..8ac062a 100644 --- a/gdb/dwarf2read.c +++ b/gdb/dwarf2read.c @@ -566,19 +566,29 @@ struct dwarf2_per_cu_data struct dwarf2_per_cu_quick_data *quick; } v; - union - { - /* The CUs we import using DW_TAG_imported_unit. This is filled in - while reading psymtabs, used to compute the psymtab dependencies, - and then cleared. Then it is filled in again while reading full - symbols, and only deleted when the objfile is destroyed. */ - VEC (dwarf2_per_cu_ptr) *imported_symtabs; - - /* Type units are grouped by their DW_AT_stmt_list entry so that they - can share them. If this is a TU, this points to the containing - symtab. */ - struct type_unit_group *type_unit_group; - } s; + /* The CUs we import using DW_TAG_imported_unit. This is filled in + while reading psymtabs, used to compute the psymtab dependencies, + and then cleared. Then it is filled in again while reading full + symbols, and only deleted when the objfile is destroyed. + + This is also used to work around a difference between the way gold + generates .gdb_index version <=7 and the way gdb does. Arguably this + is a gold bug. For symbols coming from TUs, gold records in the index + the CU that includes the TU instead of the TU itself. This breaks + dw2_lookup_symbol: It assumes that if the index says symbol X lives + in CU/TU Y, then one need only expand Y and a subsequent lookup in Y + will find X. Alas TUs live in their own symtab, so after expanding CU Y + we need to look in TU Z to find X. Fortunately, this is akin to + DW_TAG_imported_unit, so we just use the same mechanism: For + .gdb_index version <=7 this also records the TUs that the CU referred + to. Concurrently with this change gdb was modified to emit version 8 + indices so we only pay a price for gold generated indices. */ + VEC (dwarf2_per_cu_ptr) *imported_symtabs; + + /* Type units are grouped by their DW_AT_stmt_list entry so that they + can share them. If this is a TU, this points to the containing + symtab. */ + struct type_unit_group *type_unit_group; }; /* Entry in the signatured_types hash table. */ @@ -2690,9 +2700,14 @@ to use the section anyway."), } return 0; } + /* Version 7 indices generated by gold refer to the CU for a symbol instead + of the TU (for symbols coming from TUs). It's just a performance bug, and + we can't distinguish gdb-generated indices from gold-generated ones, so + nothing to do here. */ + /* Indexes with higher version than the one supported by GDB may be no longer backward compatible. */ - if (version > 7) + if (version > 8) return 0; map->version = version; @@ -2929,7 +2944,7 @@ dw2_get_file_names (struct objfile *objfile, DWO file. */ if (this_cu->is_debug_types) { - struct type_unit_group *tu_group = this_cu->s.type_unit_group; + struct type_unit_group *tu_group = this_cu->type_unit_group; init_cutu_and_read_dies (tu_group->t.first_tu, NULL, 0, 0, dw2_get_file_names_reader, tu_group); @@ -4959,10 +4974,10 @@ process_psymtab_comp_unit_reader (const struct die_reader_specs *reader, (objfile->static_psymbols.list + pst->statics_offset); sort_pst_symbols (objfile, pst); - if (!VEC_empty (dwarf2_per_cu_ptr, cu->per_cu->s.imported_symtabs)) + if (!VEC_empty (dwarf2_per_cu_ptr, cu->per_cu->imported_symtabs)) { int i; - int len = VEC_length (dwarf2_per_cu_ptr, cu->per_cu->s.imported_symtabs); + int len = VEC_length (dwarf2_per_cu_ptr, cu->per_cu->imported_symtabs); struct dwarf2_per_cu_data *iter; /* Fill in 'dependencies' here; we fill in 'users' in a @@ -4971,12 +4986,12 @@ process_psymtab_comp_unit_reader (const struct die_reader_specs *reader, pst->dependencies = obstack_alloc (&objfile->objfile_obstack, len * sizeof (struct symtab *)); for (i = 0; - VEC_iterate (dwarf2_per_cu_ptr, cu->per_cu->s.imported_symtabs, + VEC_iterate (dwarf2_per_cu_ptr, cu->per_cu->imported_symtabs, i, iter); ++i) pst->dependencies[i] = iter->v.psymtab; - VEC_free (dwarf2_per_cu_ptr, cu->per_cu->s.imported_symtabs); + VEC_free (dwarf2_per_cu_ptr, cu->per_cu->imported_symtabs); } /* Get the list of files included in the current compilation unit, @@ -5074,7 +5089,7 @@ create_type_unit_group (struct dwarf2_cu *cu, sect_offset line_offset_struct) per_cu = &tu_group->per_cu; per_cu->objfile = objfile; per_cu->is_debug_types = 1; - per_cu->s.type_unit_group = tu_group; + per_cu->type_unit_group = tu_group; if (dwarf2_per_objfile->using_index) { @@ -5411,7 +5426,7 @@ build_type_psymtab_dependencies (void **slot, void *info) ++i) { pst->dependencies[i] = iter->v.psymtab; - iter->s.type_unit_group = tu_group; + iter->type_unit_group = tu_group; } VEC_free (dwarf2_per_cu_ptr, tu_group->t.tus); @@ -5732,7 +5747,7 @@ scan_partial_symbols (struct partial_die_info *first_die, CORE_ADDR *lowpc, process_psymtab_comp_unit (per_cu, 1); VEC_safe_push (dwarf2_per_cu_ptr, - cu->per_cu->s.imported_symtabs, per_cu); + cu->per_cu->imported_symtabs, per_cu); } break; default: @@ -6866,7 +6881,7 @@ recursively_compute_inclusions (VEC (dwarf2_per_cu_ptr) **result, VEC_safe_push (dwarf2_per_cu_ptr, *result, per_cu); for (ix = 0; - VEC_iterate (dwarf2_per_cu_ptr, per_cu->s.imported_symtabs, ix, iter); + VEC_iterate (dwarf2_per_cu_ptr, per_cu->imported_symtabs, ix, iter); ++ix) recursively_compute_inclusions (result, all_children, iter); } @@ -6879,7 +6894,7 @@ compute_symtab_includes (struct dwarf2_per_cu_data *per_cu) { gdb_assert (! per_cu->is_debug_types); - if (!VEC_empty (dwarf2_per_cu_ptr, per_cu->s.imported_symtabs)) + if (!VEC_empty (dwarf2_per_cu_ptr, per_cu->imported_symtabs)) { int ix, len; struct dwarf2_per_cu_data *iter; @@ -6895,13 +6910,14 @@ compute_symtab_includes (struct dwarf2_per_cu_data *per_cu) NULL, xcalloc, xfree); for (ix = 0; - VEC_iterate (dwarf2_per_cu_ptr, per_cu->s.imported_symtabs, + VEC_iterate (dwarf2_per_cu_ptr, per_cu->imported_symtabs, ix, iter); ++ix) recursively_compute_inclusions (&result_children, all_children, iter); - /* Now we have a transitive closure of all the included CUs, so - we can convert it to a list of symtabs. */ + /* Now we have a transitive closure of all the included CUs, and + for .gdb_index version 7 the included TUs, so we can convert it + to a list of symtabs. */ len = VEC_length (dwarf2_per_cu_ptr, result_children); symtab->includes = obstack_alloc (&dwarf2_per_objfile->objfile->objfile_obstack, @@ -6984,7 +7000,7 @@ process_full_comp_unit (struct dwarf2_per_cu_data *per_cu, static_block = end_symtab_get_static_block (highpc + baseaddr, objfile, 0, - per_cu->s.imported_symtabs != NULL); + per_cu->imported_symtabs != NULL); /* If the comp unit has DW_AT_ranges, it may have discontiguous ranges. Also, DW_AT_ranges may record ranges not belonging to any child DIEs @@ -7080,10 +7096,10 @@ process_full_type_unit (struct dwarf2_per_cu_data *per_cu, If this is the first TU to use this symtab, complete the construction of it with end_expandable_symtab. Otherwise, complete the addition of this TU's symbols to the existing symtab. */ - if (per_cu->s.type_unit_group->primary_symtab == NULL) + if (per_cu->type_unit_group->primary_symtab == NULL) { symtab = end_expandable_symtab (0, objfile, SECT_OFF_TEXT (objfile)); - per_cu->s.type_unit_group->primary_symtab = symtab; + per_cu->type_unit_group->primary_symtab = symtab; if (symtab != NULL) { @@ -7098,8 +7114,8 @@ process_full_type_unit (struct dwarf2_per_cu_data *per_cu, else { augment_type_symtab (objfile, - per_cu->s.type_unit_group->primary_symtab); - symtab = per_cu->s.type_unit_group->primary_symtab; + per_cu->type_unit_group->primary_symtab); + symtab = per_cu->type_unit_group->primary_symtab; } if (dwarf2_per_objfile->using_index) @@ -7145,7 +7161,7 @@ process_imported_unit_die (struct die_info *die, struct dwarf2_cu *cu) if (maybe_queue_comp_unit (cu, per_cu, cu->language)) load_full_comp_unit (per_cu, cu->language); - VEC_safe_push (dwarf2_per_cu_ptr, cu->per_cu->s.imported_symtabs, + VEC_safe_push (dwarf2_per_cu_ptr, cu->per_cu->imported_symtabs, per_cu); } } @@ -8036,9 +8052,9 @@ setup_type_unit_groups (struct die_info *die, struct dwarf2_cu *cu) /* If we're using .gdb_index (includes -readnow) then per_cu->s.type_unit_group may not have been set up yet. */ - if (per_cu->s.type_unit_group == NULL) - per_cu->s.type_unit_group = get_type_unit_group (cu, attr); - tu_group = per_cu->s.type_unit_group; + if (per_cu->type_unit_group == NULL) + per_cu->type_unit_group = get_type_unit_group (cu, attr); + tu_group = per_cu->type_unit_group; /* If we've already processed this stmt_list there's no real need to do it again, we could fake it and just recreate the part we need @@ -17588,6 +17604,16 @@ follow_die_sig (struct die_info *src_die, struct attribute *attr, temp_die.offset.sect_off); if (die) { + /* For .gdb_index version 7 keep track of included TUs. + http://sourceware.org/bugzilla/show_bug.cgi?id=15021. */ + if (dwarf2_per_objfile->index_table != NULL + && dwarf2_per_objfile->index_table->version <= 7) + { + VEC_safe_push (dwarf2_per_cu_ptr, + (*ref_cu)->per_cu->imported_symtabs, + sig_cu->per_cu); + } + *ref_cu = sig_cu; return die; } @@ -19638,7 +19664,11 @@ dwarf2_per_objfile_free (struct objfile *objfile, void *d) for (ix = 0; ix < dwarf2_per_objfile->n_comp_units; ++ix) VEC_free (dwarf2_per_cu_ptr, - dwarf2_per_objfile->all_comp_units[ix]->s.imported_symtabs); + dwarf2_per_objfile->all_comp_units[ix]->imported_symtabs); + + for (ix = 0; ix < dwarf2_per_objfile->n_type_units; ++ix) + VEC_free (dwarf2_per_cu_ptr, + dwarf2_per_objfile->all_type_units[ix]->per_cu.imported_symtabs); VEC_free (dwarf2_section_info_def, data->types); @@ -20460,7 +20490,7 @@ write_psymtabs_to_index (struct objfile *objfile, const char *dir) total_len = size_of_contents; /* The version number. */ - val = MAYBE_SWAP (7); + val = MAYBE_SWAP (8); obstack_grow (&contents, &val, sizeof (val)); /* The offset of the CU list from the start of the file. */ |