From b76e467de35d6b107edff1d4b9de15fb7ebacbbd Mon Sep 17 00:00:00 2001 From: Simon Marchi Date: Sat, 7 Apr 2018 13:53:43 -0400 Subject: [PATCH] Make dwarf2_per_objfile::all_comp_units an std::vector Make all_comp_units an std::vector, remove n_comp_units and some manual memory management. gdb/ChangeLog: * dwarf2read.h (struct dwarf2_per_objfile) : Likewise. Make an std::vector. : Remove. * dwarf2read.c (dwarf2_per_objfile::~dwarf2_per_objfile): Adjust to std::vector change. (dwarf2_per_objfile::get_cutu): Likewise. (dwarf2_per_objfile::get_cu): Likewise. (create_cus_from_index): Likewise. (create_addrmap_from_index): Likewise. (create_addrmap_from_aranges): Likewise. (dwarf2_read_index): Likewise. (dw2_find_last_source_symtab): Likewise. (dw2_map_symtabs_matching_filename): Likewise. (dw2_symtab_iter_next): Likewise. (dw2_print_stats): Likewise. (dw2_expand_all_symtabs): Likewise. (dw2_expand_symtabs_with_fullname): Likewise. (dw2_expand_marked_cus): Likewise. (dw2_map_symbol_filenames): Likewise. (create_cus_from_debug_names): Likewise. (dwarf2_read_debug_names): Likewise. (dw2_debug_names_iterator::next): Likewise. (dwarf2_initialize_objfile): Likewise. (set_partial_user): Likewise. (dwarf2_build_psymtabs_hard): Likewise. (read_comp_units_from_section): Remove arguments, adjust to std::vector change. (create_all_comp_units): Adjust to std::vector and read_comp_units_from_section changes. (dwarf2_find_containing_comp_unit): Adjust to std::vector change. * dwarf-index-write.c (check_dwarf64_offsets): Likewise. (psyms_seen_size): Likewise. (write_gdbindex): Likewise. (write_debug_names): Likewise. --- gdb/ChangeLog | 38 ++++++++ gdb/dwarf-index-write.c | 21 ++--- gdb/dwarf2read.c | 197 +++++++++++++--------------------------- gdb/dwarf2read.h | 5 +- 4 files changed, 113 insertions(+), 148 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 434a2eb4ed..03dae6a3f3 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,41 @@ +2018-04-07 Simon Marchi + + * dwarf2read.h (struct dwarf2_per_objfile) : Likewise. + Make an std::vector. + : Remove. + * dwarf2read.c (dwarf2_per_objfile::~dwarf2_per_objfile): Adjust + to std::vector change. + (dwarf2_per_objfile::get_cutu): Likewise. + (dwarf2_per_objfile::get_cu): Likewise. + (create_cus_from_index): Likewise. + (create_addrmap_from_index): Likewise. + (create_addrmap_from_aranges): Likewise. + (dwarf2_read_index): Likewise. + (dw2_find_last_source_symtab): Likewise. + (dw2_map_symtabs_matching_filename): Likewise. + (dw2_symtab_iter_next): Likewise. + (dw2_print_stats): Likewise. + (dw2_expand_all_symtabs): Likewise. + (dw2_expand_symtabs_with_fullname): Likewise. + (dw2_expand_marked_cus): Likewise. + (dw2_map_symbol_filenames): Likewise. + (create_cus_from_debug_names): Likewise. + (dwarf2_read_debug_names): Likewise. + (dw2_debug_names_iterator::next): Likewise. + (dwarf2_initialize_objfile): Likewise. + (set_partial_user): Likewise. + (dwarf2_build_psymtabs_hard): Likewise. + (read_comp_units_from_section): Remove arguments, adjust to + std::vector change. + (create_all_comp_units): Adjust to std::vector and + read_comp_units_from_section changes. + (dwarf2_find_containing_comp_unit): Adjust to std::vector + change. + * dwarf-index-write.c (check_dwarf64_offsets): Likewise. + (psyms_seen_size): Likewise. + (write_gdbindex): Likewise. + (write_debug_names): Likewise. + 2018-04-07 Simon Marchi * dwarf2read.c (create_cus_from_index_list): Replace objfile arg diff --git a/gdb/dwarf-index-write.c b/gdb/dwarf-index-write.c index 058712d9e2..c49f084d61 100644 --- a/gdb/dwarf-index-write.c +++ b/gdb/dwarf-index-write.c @@ -1251,11 +1251,9 @@ private: static bool check_dwarf64_offsets (struct dwarf2_per_objfile *dwarf2_per_objfile) { - for (int i = 0; i < dwarf2_per_objfile->n_comp_units; ++i) + for (dwarf2_per_cu_data *per_cu : dwarf2_per_objfile->all_comp_units) { - const dwarf2_per_cu_data &per_cu = *dwarf2_per_objfile->all_comp_units[i]; - - if (to_underlying (per_cu.sect_off) >= (static_cast (1) << 32)) + if (to_underlying (per_cu->sect_off) >= (static_cast (1) << 32)) return true; } for (int i = 0; i < dwarf2_per_objfile->n_type_units; ++i) @@ -1279,10 +1277,8 @@ static size_t psyms_seen_size (struct dwarf2_per_objfile *dwarf2_per_objfile) { size_t psyms_count = 0; - for (int i = 0; i < dwarf2_per_objfile->n_comp_units; ++i) + for (dwarf2_per_cu_data *per_cu : dwarf2_per_objfile->all_comp_units) { - struct dwarf2_per_cu_data *per_cu - = dwarf2_per_objfile->all_comp_units[i]; struct partial_symtab *psymtab = per_cu->v.psymtab; if (psymtab != NULL && psymtab->user == NULL) @@ -1308,7 +1304,7 @@ write_gdbindex (struct dwarf2_per_objfile *dwarf2_per_objfile, FILE *out_file) in the index file). This will later be needed to write the address table. */ psym_index_map cu_index_htab; - cu_index_htab.reserve (dwarf2_per_objfile->n_comp_units); + cu_index_htab.reserve (dwarf2_per_objfile->all_comp_units.size ()); /* The CU list is already sorted, so we don't need to do additional work here. Also, the debug_types entries do not appear in @@ -1316,7 +1312,7 @@ write_gdbindex (struct dwarf2_per_objfile *dwarf2_per_objfile, FILE *out_file) std::unordered_set psyms_seen (psyms_seen_size (dwarf2_per_objfile)); - for (int i = 0; i < dwarf2_per_objfile->n_comp_units; ++i) + for (int i = 0; i < dwarf2_per_objfile->all_comp_units.size (); ++i) { struct dwarf2_per_cu_data *per_cu = dwarf2_per_objfile->all_comp_units[i]; @@ -1353,7 +1349,7 @@ write_gdbindex (struct dwarf2_per_objfile *dwarf2_per_objfile, FILE *out_file) sig_data.objfile = objfile; sig_data.symtab = &symtab; - sig_data.cu_index = dwarf2_per_objfile->n_comp_units; + sig_data.cu_index = dwarf2_per_objfile->all_comp_units.size (); htab_traverse_noresize (dwarf2_per_objfile->signatured_types, write_one_signatured_type, &sig_data); } @@ -1428,7 +1424,7 @@ write_debug_names (struct dwarf2_per_objfile *dwarf2_per_objfile, dwarf5_byte_order); std::unordered_set psyms_seen (psyms_seen_size (dwarf2_per_objfile)); - for (int i = 0; i < dwarf2_per_objfile->n_comp_units; ++i) + for (int i = 0; i < dwarf2_per_objfile->all_comp_units.size (); ++i) { const dwarf2_per_cu_data *per_cu = dwarf2_per_objfile->all_comp_units[i]; partial_symtab *psymtab = per_cu->v.psymtab; @@ -1496,7 +1492,8 @@ write_debug_names (struct dwarf2_per_objfile *dwarf2_per_objfile, header.append_uint (2, dwarf5_byte_order, 0); /* comp_unit_count - The number of CUs in the CU list. */ - header.append_uint (4, dwarf5_byte_order, dwarf2_per_objfile->n_comp_units); + header.append_uint (4, dwarf5_byte_order, + dwarf2_per_objfile->all_comp_units.size ()); /* local_type_unit_count - The number of TUs in the local TU list. */ diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c index c6dd8a7de9..842620afb8 100644 --- a/gdb/dwarf2read.c +++ b/gdb/dwarf2read.c @@ -2137,8 +2137,8 @@ dwarf2_per_objfile::~dwarf2_per_objfile () if (line_header_hash) htab_delete (line_header_hash); - for (int ix = 0; ix < n_comp_units; ++ix) - VEC_free (dwarf2_per_cu_ptr, all_comp_units[ix]->imported_symtabs); + for (dwarf2_per_cu_data *per_cu : all_comp_units) + VEC_free (dwarf2_per_cu_ptr, per_cu->imported_symtabs); for (int ix = 0; ix < n_type_units; ++ix) VEC_free (dwarf2_per_cu_ptr, @@ -2920,9 +2920,9 @@ dw2_instantiate_symtab (struct dwarf2_per_cu_data *per_cu) dwarf2_per_cu_data * dwarf2_per_objfile::get_cutu (int index) { - if (index >= this->n_comp_units) + if (index >= this->all_comp_units.size ()) { - index -= this->n_comp_units; + index -= this->all_comp_units.size (); gdb_assert (index < this->n_type_units); return &this->all_type_units[index]->per_cu; } @@ -2935,7 +2935,7 @@ dwarf2_per_objfile::get_cutu (int index) dwarf2_per_cu_data * dwarf2_per_objfile::get_cu (int index) { - gdb_assert (index >= 0 && index < this->n_comp_units); + gdb_assert (index >= 0 && index < this->all_comp_units.size ()); return this->all_comp_units[index]; } @@ -2981,8 +2981,7 @@ static void create_cus_from_index_list (struct dwarf2_per_objfile *dwarf2_per_objfile, const gdb_byte *cu_list, offset_type n_elements, struct dwarf2_section_info *section, - int is_dwz, - int base_offset) + int is_dwz) { for (offset_type i = 0; i < n_elements; i += 2) { @@ -2993,9 +2992,10 @@ create_cus_from_index_list (struct dwarf2_per_objfile *dwarf2_per_objfile, ULONGEST length = extract_unsigned_integer (cu_list + 8, 8, BFD_ENDIAN_LITTLE); cu_list += 2 * 8; - dwarf2_per_objfile->all_comp_units[base_offset + i / 2] + dwarf2_per_cu_data *per_cu = create_cu_from_index_list (dwarf2_per_objfile, section, is_dwz, sect_off, length); + dwarf2_per_objfile->all_comp_units.push_back (per_cu); } } @@ -3007,22 +3007,19 @@ create_cus_from_index (struct dwarf2_per_objfile *dwarf2_per_objfile, const gdb_byte *cu_list, offset_type cu_list_elements, const gdb_byte *dwz_list, offset_type dwz_elements) { - struct objfile *objfile = dwarf2_per_objfile->objfile; - - dwarf2_per_objfile->n_comp_units = (cu_list_elements + dwz_elements) / 2; - dwarf2_per_objfile->all_comp_units = - XOBNEWVEC (&objfile->objfile_obstack, struct dwarf2_per_cu_data *, - dwarf2_per_objfile->n_comp_units); + gdb_assert (dwarf2_per_objfile->all_comp_units.empty ()); + dwarf2_per_objfile->all_comp_units.reserve + ((cu_list_elements + dwz_elements) / 2); create_cus_from_index_list (dwarf2_per_objfile, cu_list, cu_list_elements, - &dwarf2_per_objfile->info, 0, 0); + &dwarf2_per_objfile->info, 0); if (dwz_elements == 0) return; dwz_file *dwz = dwarf2_get_dwz_file (dwarf2_per_objfile); create_cus_from_index_list (dwarf2_per_objfile, dwz_list, dwz_elements, - &dwz->info, 1, cu_list_elements / 2); + &dwz->info, 1); } /* Create the signatured type hash table from the index. */ @@ -3181,7 +3178,7 @@ create_addrmap_from_index (struct dwarf2_per_objfile *dwarf2_per_objfile, continue; } - if (cu_index >= dwarf2_per_objfile->n_comp_units) + if (cu_index >= dwarf2_per_objfile->all_comp_units.size ()) { complaint (&symfile_complaints, _(".gdb_index address table has invalid CU number %u"), @@ -3219,9 +3216,8 @@ create_addrmap_from_aranges (struct dwarf2_per_objfile *dwarf2_per_objfile, dwarf2_per_cu_data *, gdb::hash_enum> debug_info_offset_to_per_cu; - for (int cui = 0; cui < dwarf2_per_objfile->n_comp_units; ++cui) + for (dwarf2_per_cu_data *per_cu : dwarf2_per_objfile->all_comp_units) { - dwarf2_per_cu_data *per_cu = dwarf2_per_objfile->get_cu (cui); const auto insertpair = debug_info_offset_to_per_cu.emplace (per_cu->sect_off, per_cu); if (!insertpair.second) @@ -3620,7 +3616,7 @@ dwarf2_read_index (struct dwarf2_per_objfile *dwarf2_per_objfile) dwarf2_per_objfile->index_table = map; dwarf2_per_objfile->using_index = 1; dwarf2_per_objfile->quick_file_names_table = - create_quick_file_names_table (dwarf2_per_objfile->n_comp_units); + create_quick_file_names_table (dwarf2_per_objfile->all_comp_units.size ()); return 1; } @@ -3752,8 +3748,7 @@ dw2_find_last_source_symtab (struct objfile *objfile) { struct dwarf2_per_objfile *dwarf2_per_objfile = get_dwarf2_per_objfile (objfile); - int index = dwarf2_per_objfile->n_comp_units - 1; - dwarf2_per_cu_data *dwarf_cu = dwarf2_per_objfile->get_cu (index); + dwarf2_per_cu_data *dwarf_cu = dwarf2_per_objfile->all_comp_units.back (); compunit_symtab *cust = dw2_instantiate_symtab (dwarf_cu); if (cust == NULL) @@ -3830,21 +3825,17 @@ dw2_map_symtabs_matching_filename /* The rule is CUs specify all the files, including those used by any TU, so there's no need to scan TUs here. */ - for (int i = 0; i < dwarf2_per_objfile->n_comp_units; ++i) + for (dwarf2_per_cu_data *per_cu : dwarf2_per_objfile->all_comp_units) { - int j; - dwarf2_per_cu_data *per_cu = dwarf2_per_objfile->get_cu (i); - struct quick_file_names *file_data; - /* We only need to look at symtabs not already expanded. */ if (per_cu->v.quick->compunit_symtab) continue; - file_data = dw2_get_file_names (per_cu); + quick_file_names *file_data = dw2_get_file_names (per_cu); if (file_data == NULL) continue; - for (j = 0; j < file_data->num_file_names; ++j) + for (int j = 0; j < file_data->num_file_names; ++j) { const char *this_name = file_data->file_names[j]; const char *this_real_name; @@ -3975,7 +3966,7 @@ dw2_symtab_iter_next (struct dw2_symtab_iterator *iter) && symbol_kind != GDB_INDEX_SYMBOL_KIND_NONE); /* Don't crash on bad data. */ - if (cu_index >= (dwarf2_per_objfile->n_comp_units + if (cu_index >= (dwarf2_per_objfile->all_comp_units.size () + dwarf2_per_objfile->n_type_units)) { complaint (&symfile_complaints, @@ -4084,7 +4075,8 @@ dw2_print_stats (struct objfile *objfile) { struct dwarf2_per_objfile *dwarf2_per_objfile = get_dwarf2_per_objfile (objfile); - int total = dwarf2_per_objfile->n_comp_units + dwarf2_per_objfile->n_type_units; + int total = (dwarf2_per_objfile->all_comp_units.size () + + dwarf2_per_objfile->n_type_units); int count = 0; for (int i = 0; i < total; ++i) @@ -4153,7 +4145,7 @@ dw2_expand_all_symtabs (struct objfile *objfile) { struct dwarf2_per_objfile *dwarf2_per_objfile = get_dwarf2_per_objfile (objfile); - int total_units = (dwarf2_per_objfile->n_comp_units + int total_units = (dwarf2_per_objfile->all_comp_units.size () + dwarf2_per_objfile->n_type_units); for (int i = 0; i < total_units; ++i) @@ -4176,21 +4168,17 @@ dw2_expand_symtabs_with_fullname (struct objfile *objfile, There can be an order of magnitude (or more) more type units than comp units, and we avoid them if we can. */ - for (int i = 0; i < dwarf2_per_objfile->n_comp_units; ++i) + for (dwarf2_per_cu_data *per_cu : dwarf2_per_objfile->all_comp_units) { - int j; - dwarf2_per_cu_data *per_cu = dwarf2_per_objfile->get_cu (i); - struct quick_file_names *file_data; - /* We only need to look at symtabs not already expanded. */ if (per_cu->v.quick->compunit_symtab) continue; - file_data = dw2_get_file_names (per_cu); + quick_file_names *file_data = dw2_get_file_names (per_cu); if (file_data == NULL) continue; - for (j = 0; j < file_data->num_file_names; ++j) + for (int j = 0; j < file_data->num_file_names; ++j) { const char *this_fullname = file_data->file_names[j]; @@ -5095,7 +5083,7 @@ dw2_expand_marked_cus } /* Don't crash on bad data. */ - if (cu_index >= (dwarf2_per_objfile->n_comp_units + if (cu_index >= (dwarf2_per_objfile->all_comp_units.size () + dwarf2_per_objfile->n_type_units)) { complaint (&symfile_complaints, @@ -5135,13 +5123,8 @@ dw_expand_symtabs_matching_file_matcher /* The rule is CUs specify all the files, including those used by any TU, so there's no need to scan TUs here. */ - for (int i = 0; i < dwarf2_per_objfile->n_comp_units; ++i) + for (dwarf2_per_cu_data *per_cu : dwarf2_per_objfile->all_comp_units) { - int j; - dwarf2_per_cu_data *per_cu = dwarf2_per_objfile->get_cu (i); - struct quick_file_names *file_data; - void **slot; - QUIT; per_cu->v.quick->mark = 0; @@ -5150,7 +5133,7 @@ dw_expand_symtabs_matching_file_matcher if (per_cu->v.quick->compunit_symtab) continue; - file_data = dw2_get_file_names (per_cu); + quick_file_names *file_data = dw2_get_file_names (per_cu); if (file_data == NULL) continue; @@ -5162,7 +5145,7 @@ dw_expand_symtabs_matching_file_matcher continue; } - for (j = 0; j < file_data->num_file_names; ++j) + for (int j = 0; j < file_data->num_file_names; ++j) { const char *this_real_name; @@ -5187,10 +5170,10 @@ dw_expand_symtabs_matching_file_matcher } } - slot = htab_find_slot (per_cu->v.quick->mark - ? visited_found.get () - : visited_not_found.get (), - file_data, INSERT); + void **slot = htab_find_slot (per_cu->v.quick->mark + ? visited_found.get () + : visited_not_found.get (), + file_data, INSERT); *slot = file_data; } } @@ -5300,10 +5283,8 @@ dw2_map_symbol_filenames (struct objfile *objfile, symbol_filename_ftype *fun, by any TU, so there's no need to scan TUs here. We can ignore file names coming from already-expanded CUs. */ - for (int i = 0; i < dwarf2_per_objfile->n_comp_units; ++i) + for (dwarf2_per_cu_data *per_cu : dwarf2_per_objfile->all_comp_units) { - dwarf2_per_cu_data *per_cu = dwarf2_per_objfile->get_cu (i); - if (per_cu->v.quick->compunit_symtab) { void **slot = htab_find_slot (visited.get (), @@ -5314,21 +5295,17 @@ dw2_map_symbol_filenames (struct objfile *objfile, symbol_filename_ftype *fun, } } - for (int i = 0; i < dwarf2_per_objfile->n_comp_units; ++i) + for (dwarf2_per_cu_data *per_cu : dwarf2_per_objfile->all_comp_units) { - dwarf2_per_cu_data *per_cu = dwarf2_per_objfile->get_cu (i); - struct quick_file_names *file_data; - void **slot; - /* We only need to look at symtabs not already expanded. */ if (per_cu->v.quick->compunit_symtab) continue; - file_data = dw2_get_file_names (per_cu); + quick_file_names *file_data = dw2_get_file_names (per_cu); if (file_data == NULL) continue; - slot = htab_find_slot (visited.get (), file_data, INSERT); + void **slot = htab_find_slot (visited.get (), file_data, INSERT); if (*slot) { /* Already visited. */ @@ -5576,7 +5553,7 @@ static void create_cus_from_debug_names_list (struct dwarf2_per_objfile *dwarf2_per_objfile, const mapped_debug_names &map, dwarf2_section_info §ion, - bool is_dwz, int base_offset) + bool is_dwz) { sect_offset sect_off_prev; for (uint32_t i = 0; i <= map.cu_count; ++i) @@ -5595,9 +5572,10 @@ create_cus_from_debug_names_list (struct dwarf2_per_objfile *dwarf2_per_objfile, if (i >= 1) { const ULONGEST length = sect_off_next - sect_off_prev; - dwarf2_per_objfile->all_comp_units[base_offset + (i - 1)] + dwarf2_per_cu_data *per_cu = create_cu_from_index_list (dwarf2_per_objfile, §ion, is_dwz, sect_off_prev, length); + dwarf2_per_objfile->all_comp_units.push_back (per_cu); } sect_off_prev = sect_off_next; } @@ -5611,25 +5589,19 @@ create_cus_from_debug_names (struct dwarf2_per_objfile *dwarf2_per_objfile, const mapped_debug_names &map, const mapped_debug_names &dwz_map) { - struct objfile *objfile = dwarf2_per_objfile->objfile; - - dwarf2_per_objfile->n_comp_units = map.cu_count + dwz_map.cu_count; - dwarf2_per_objfile->all_comp_units - = XOBNEWVEC (&objfile->objfile_obstack, struct dwarf2_per_cu_data *, - dwarf2_per_objfile->n_comp_units); + gdb_assert (dwarf2_per_objfile->all_comp_units.empty ()); + dwarf2_per_objfile->all_comp_units.reserve (map.cu_count + dwz_map.cu_count); create_cus_from_debug_names_list (dwarf2_per_objfile, map, dwarf2_per_objfile->info, - false /* is_dwz */, - 0 /* base_offset */); + false /* is_dwz */); if (dwz_map.cu_count == 0) return; dwz_file *dwz = dwarf2_get_dwz_file (dwarf2_per_objfile); create_cus_from_debug_names_list (dwarf2_per_objfile, dwz_map, dwz->info, - true /* is_dwz */, - map.cu_count /* base_offset */); + true /* is_dwz */); } /* Read .debug_names. If everything went ok, initialize the "quick" @@ -5690,7 +5662,7 @@ dwarf2_read_debug_names (struct dwarf2_per_objfile *dwarf2_per_objfile) *dwarf2_per_objfile->debug_names_table = std::move (local_map); dwarf2_per_objfile->using_index = 1; dwarf2_per_objfile->quick_file_names_table = - create_quick_file_names_table (dwarf2_per_objfile->n_comp_units); + create_quick_file_names_table (dwarf2_per_objfile->all_comp_units.size ()); return true; } @@ -5930,7 +5902,7 @@ dw2_debug_names_iterator::next () { case DW_IDX_compile_unit: /* Don't crash on bad data. */ - if (ull >= dwarf2_per_objfile->n_comp_units) + if (ull >= dwarf2_per_objfile->all_comp_units.size ()) { complaint (&symfile_complaints, _(".debug_names entry has bad CU index %s" @@ -6220,16 +6192,15 @@ dwarf2_initialize_objfile (struct objfile *objfile, dw_index_kind *index_kind) expanded anyway. */ if ((objfile->flags & OBJF_READNOW)) { - int i; - dwarf2_per_objfile->using_index = 1; create_all_comp_units (dwarf2_per_objfile); create_all_type_units (dwarf2_per_objfile); - dwarf2_per_objfile->quick_file_names_table = - create_quick_file_names_table (dwarf2_per_objfile->n_comp_units); + dwarf2_per_objfile->quick_file_names_table + = create_quick_file_names_table + (dwarf2_per_objfile->all_comp_units.size ()); - for (i = 0; i < (dwarf2_per_objfile->n_comp_units - + dwarf2_per_objfile->n_type_units); ++i) + for (int i = 0; i < (dwarf2_per_objfile->all_comp_units.size () + + dwarf2_per_objfile->n_type_units); ++i) { dwarf2_per_cu_data *per_cu = dwarf2_per_objfile->get_cutu (i); @@ -8416,18 +8387,14 @@ process_skeletonless_type_units (struct dwarf2_per_objfile *dwarf2_per_objfile) static void set_partial_user (struct dwarf2_per_objfile *dwarf2_per_objfile) { - int i; - - for (i = 0; i < dwarf2_per_objfile->n_comp_units; ++i) + for (dwarf2_per_cu_data *per_cu : dwarf2_per_objfile->all_comp_units) { - dwarf2_per_cu_data *per_cu = dwarf2_per_objfile->get_cu (i); struct partial_symtab *pst = per_cu->v.psymtab; - int j; if (pst == NULL) continue; - for (j = 0; j < pst->number_of_dependencies; ++j) + for (int j = 0; j < pst->number_of_dependencies; ++j) { /* Set the 'user' field only if it is not already set. */ if (pst->dependencies[j]->user == NULL) @@ -8442,7 +8409,6 @@ set_partial_user (struct dwarf2_per_objfile *dwarf2_per_objfile) static void dwarf2_build_psymtabs_hard (struct dwarf2_per_objfile *dwarf2_per_objfile) { - int i; struct objfile *objfile = dwarf2_per_objfile->objfile; if (dwarf_read_debug) @@ -8471,12 +8437,8 @@ dwarf2_build_psymtabs_hard (struct dwarf2_per_objfile *dwarf2_per_objfile) = make_scoped_restore (&objfile->psymtabs_addrmap, addrmap_create_mutable (&temp_obstack)); - for (i = 0; i < dwarf2_per_objfile->n_comp_units; ++i) - { - dwarf2_per_cu_data *per_cu = dwarf2_per_objfile->get_cu (i); - - process_psymtab_comp_unit (per_cu, 0, language_minimal); - } + for (dwarf2_per_cu_data *per_cu : dwarf2_per_objfile->all_comp_units) + process_psymtab_comp_unit (per_cu, 0, language_minimal); /* This has to wait until we read the CUs, we need the list of DWOs. */ process_skeletonless_type_units (dwarf2_per_objfile); @@ -8537,10 +8499,7 @@ static void read_comp_units_from_section (struct dwarf2_per_objfile *dwarf2_per_objfile, struct dwarf2_section_info *section, struct dwarf2_section_info *abbrev_section, - unsigned int is_dwz, - int *n_allocated, - int *n_comp_units, - struct dwarf2_per_cu_data ***all_comp_units) + unsigned int is_dwz) { const gdb_byte *info_ptr; struct objfile *objfile = dwarf2_per_objfile->objfile; @@ -8588,14 +8547,7 @@ read_comp_units_from_section (struct dwarf2_per_objfile *dwarf2_per_objfile, this_cu->dwarf2_per_objfile = dwarf2_per_objfile; this_cu->section = section; - if (*n_comp_units == *n_allocated) - { - *n_allocated *= 2; - *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; + dwarf2_per_objfile->all_comp_units.push_back (this_cu); info_ptr = info_ptr + this_cu->length; } @@ -8607,33 +8559,14 @@ read_comp_units_from_section (struct dwarf2_per_objfile *dwarf2_per_objfile, static void create_all_comp_units (struct dwarf2_per_objfile *dwarf2_per_objfile) { - int n_allocated; - int n_comp_units; - struct dwarf2_per_cu_data **all_comp_units; - struct dwz_file *dwz; - struct objfile *objfile = dwarf2_per_objfile->objfile; - - n_comp_units = 0; - n_allocated = 10; - all_comp_units = XNEWVEC (struct dwarf2_per_cu_data *, n_allocated); - + gdb_assert (dwarf2_per_objfile->all_comp_units.empty ()); read_comp_units_from_section (dwarf2_per_objfile, &dwarf2_per_objfile->info, - &dwarf2_per_objfile->abbrev, 0, - &n_allocated, &n_comp_units, &all_comp_units); + &dwarf2_per_objfile->abbrev, 0); - dwz = dwarf2_get_dwz_file (dwarf2_per_objfile); + dwz_file *dwz = dwarf2_get_dwz_file (dwarf2_per_objfile); if (dwz != NULL) read_comp_units_from_section (dwarf2_per_objfile, &dwz->info, &dwz->abbrev, - 1, &n_allocated, &n_comp_units, - &all_comp_units); - - 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); - dwarf2_per_objfile->n_comp_units = n_comp_units; + 1); } /* Process all loaded DIEs for compilation unit CU, starting at @@ -24949,7 +24882,7 @@ dwarf2_find_containing_comp_unit (sect_offset sect_off, const sect_offset *cu_off; low = 0; - high = dwarf2_per_objfile->n_comp_units - 1; + high = dwarf2_per_objfile->all_comp_units.size () - 1; while (high > low) { struct dwarf2_per_cu_data *mid_cu; @@ -24981,7 +24914,7 @@ dwarf2_find_containing_comp_unit (sect_offset sect_off, else { this_cu = dwarf2_per_objfile->all_comp_units[low]; - if (low == dwarf2_per_objfile->n_comp_units - 1 + if (low == dwarf2_per_objfile->all_comp_units.size () - 1 && sect_off >= this_cu->sect_off + this_cu->length) error (_("invalid dwarf2 offset %s"), sect_offset_str (sect_off)); gdb_assert (sect_off < this_cu->sect_off + this_cu->length); diff --git a/gdb/dwarf2read.h b/gdb/dwarf2read.h index 24b5ff47e7..d0025324a5 100644 --- a/gdb/dwarf2read.h +++ b/gdb/dwarf2read.h @@ -165,10 +165,7 @@ public: /* Table of all the compilation units. This is used to locate the target compilation unit of a particular reference. */ - struct dwarf2_per_cu_data **all_comp_units = NULL; - - /* The number of compilation units in ALL_COMP_UNITS. */ - int n_comp_units = 0; + std::vector all_comp_units; /* The number of .debug_types-related CUs. */ int n_type_units = 0;