diff options
author | Tom Tromey <tromey@adacore.com> | 2020-01-06 14:34:52 -0700 |
---|---|---|
committer | Tom Tromey <tromey@adacore.com> | 2020-01-08 15:32:41 -0700 |
commit | 6a053cb1ff643cec3349d7f2f47ae5573f82d613 (patch) | |
tree | 0bbc77013f55e450d489318e6199a06a8e13e06d /gdb/symfile.c | |
parent | 456e800a63def18484f69a51f59c2338a5cc4568 (diff) | |
download | gdb-6a053cb1ff643cec3349d7f2f47ae5573f82d613.zip gdb-6a053cb1ff643cec3349d7f2f47ae5573f82d613.tar.gz gdb-6a053cb1ff643cec3349d7f2f47ae5573f82d613.tar.bz2 |
Change section_offsets to a std::vector
This changes section_offsets to be specialization of a std::vector and
updates all the users. It also removes the ANOFFSET and
SIZEOF_N_SECTION_OFFSETS macros.
Most of this is just a generic sort of cleanup, that reduces the
number of lines of code. However, a couple spots were doing weird
things.
objfile_relocate did:
- std::vector<struct section_offsets>
- new_debug_offsets (SIZEOF_N_SECTION_OFFSETS (debug_objfile->num_sections));
... which seems to greatly over-estimate the number of elements
needed.
This appeared in set_objfile_default_section_offset:
- std::vector<struct section_offsets> offsets (objf->num_sections,
- { { offset } });
... which makes sense due to type safety, but is also actively
confusing given that section_offsets was previously also a kind of
vector type.
Tested on x86-64 Fedora 30.
gdb/ChangeLog
2020-01-08 Tom Tromey <tromey@adacore.com>
* xcoffread.c (enter_line_range, read_xcoff_symtab)
(process_xcoff_symbol, xcoff_symfile_offsets): Update.
* symtab.h (MSYMBOL_VALUE_ADDRESS): Update.
(struct section_offsets, ANOFFSET, SIZEOF_N_SECTION_OFFSETS):
Remove.
(section_offsets): New typedef.
* symtab.c (fixup_section, get_msymbol_address): Update.
* symmisc.c (dump_msymbols): Update.
* symfile.h (relative_addr_info_to_section_offsets)
(symfile_map_offsets_to_segments): Update.
* symfile.c (build_section_addr_info_from_objfile)
(init_objfile_sect_indices): Update.
(struct place_section_arg): Change type of "offsets".
(place_section): Update.
(relative_addr_info_to_section_offsets): Change type of
"section_offsets". Remove "num_sections" parameter.
(default_symfile_offsets, syms_from_objfile_1)
(set_objfile_default_section_offset): Update.
(reread_symbols): No need to preserve section offsets by hand.
(symfile_map_offsets_to_segments): Change type of "offsets".
* stap-probe.c (relocate_address): Update.
* stabsread.h (process_one_symbol): Update.
* solib-target.c (struct lm_info_target) <offsets>: Change type.
(solib_target_relocate_section_addresses): Update.
* solib-svr4.c (enable_break, svr4_relocate_main_executable):
Update.
* solib-frv.c (frv_relocate_main_executable): Update.
* solib-dsbt.c (dsbt_relocate_main_executable): Update.
* solib-aix.c (solib_aix_get_section_offsets): Change return
type.
(solib_aix_solib_create_inferior_hook): Update.
* remote.c (remote_target::get_offsets): Update.
* psymtab.c (find_pc_sect_psymtab): Update.
* psympriv.h (struct partial_symbol) <address, text_low,
text_high>: Update.
* objfiles.h (obj_section_offset): Update.
(struct objfile) <section_offsets>: Change type.
<num_sections>: Remove.
(objfile_relocate): Update.
* objfiles.c (entry_point_address_query): Update
(relocate_one_symbol): Change type of "section_offsets".
(objfile_relocate1, objfile_relocate1): Change type of
"new_offsets".
(objfile_rebase1): Update.
* mipsread.c (mipscoff_symfile_read): Update.
(read_alphacoff_dynamic_symtab): Remove "section_offsets"
parameter.
* mdebugread.c (parse_symbol): Change type of "section_offsets".
(parse_external, psymtab_to_symtab_1): Update.
* machoread.c (macho_symfile_offsets): Update.
* ia64-tdep.c (ia64_find_unwind_table): Update.
* hppa-tdep.c (read_unwind_info): Update.
* hppa-bsd-tdep.c (hppabsd_find_global_pointer): Update.
* dwarf2read.c (create_addrmap_from_index)
(create_addrmap_from_aranges, dw2_find_pc_sect_compunit_symtab)
(process_psymtab_comp_unit_reader, add_partial_symbol)
(add_partial_subprogram, process_full_comp_unit)
(read_file_scope, read_func_scope, read_lexical_block_scope)
(read_call_site_scope, dwarf2_rnglists_process)
(dwarf2_ranges_process, dwarf2_ranges_read)
(dwarf_decode_lines_1, var_decode_location, new_symbol)
(dwarf2_fetch_die_loc_sect_off, dwarf2_per_cu_text_offset):
Update.
* dwarf2-frame.c (execute_cfa_program, dwarf2_frame_find_fde):
Update.
* dtrace-probe.c (dtrace_probe::get_relocated_address): Update.
* dbxread.c (read_dbx_symtab, read_ofile_symtab): Update.
(process_one_symbol): Change type of "section_offsets".
* ctfread.c (get_objfile_text_range): Update.
* coffread.c (coff_symtab_read, enter_linenos)
(process_coff_symbol): Update.
* coff-pe-read.c (add_pe_forwarded_sym): Update.
* amd64-windows-tdep.c (amd64_windows_find_unwind_info): Update.
Change-Id: I147eb967e9b44d82f4048039de7bb44b80cd72fb
Diffstat (limited to 'gdb/symfile.c')
-rw-r--r-- | gdb/symfile.c | 76 |
1 files changed, 22 insertions, 54 deletions
diff --git a/gdb/symfile.c b/gdb/symfile.c index 86d6174..0285f8f 100644 --- a/gdb/symfile.c +++ b/gdb/symfile.c @@ -269,7 +269,7 @@ build_section_addr_info_from_objfile (const struct objfile *objfile) { int sectindex = sap[i].sectindex; - sap[i].addr += objfile->section_offsets->offsets[sectindex]; + sap[i].addr += objfile->section_offsets[sectindex]; } return sap; } @@ -315,14 +315,14 @@ init_objfile_sect_indices (struct objfile *objfile) later, e.g. by the remote qOffsets packet, and then this will be wrong! That's why we try segments first. */ - for (i = 0; i < objfile->num_sections; i++) + for (i = 0; i < objfile->section_offsets.size (); i++) { - if (ANOFFSET (objfile->section_offsets, i) != 0) + if (objfile->section_offsets[i] != 0) { break; } } - if (i == objfile->num_sections) + if (i == objfile->section_offsets.size ()) { if (objfile->sect_index_text == -1) objfile->sect_index_text = 0; @@ -339,7 +339,7 @@ init_objfile_sect_indices (struct objfile *objfile) struct place_section_arg { - struct section_offsets *offsets; + section_offsets *offsets; CORE_ADDR lowest; }; @@ -350,7 +350,8 @@ static void place_section (bfd *abfd, asection *sect, void *obj) { struct place_section_arg *arg = (struct place_section_arg *) obj; - CORE_ADDR *offsets = arg->offsets->offsets, start_addr; + section_offsets &offsets = *arg->offsets; + CORE_ADDR start_addr; int done; ULONGEST align = ((ULONGEST) 1) << bfd_section_alignment (sect); @@ -408,17 +409,15 @@ place_section (bfd *abfd, asection *sect, void *obj) } /* Store section_addr_info as prepared (made relative and with SECTINDEX - filled-in) by addr_info_make_relative into SECTION_OFFSETS of NUM_SECTIONS - entries. */ + filled-in) by addr_info_make_relative into SECTION_OFFSETS. */ void -relative_addr_info_to_section_offsets (struct section_offsets *section_offsets, - int num_sections, +relative_addr_info_to_section_offsets (section_offsets §ion_offsets, const section_addr_info &addrs) { int i; - memset (section_offsets, 0, SIZEOF_N_SECTION_OFFSETS (num_sections)); + section_offsets.assign (section_offsets.size (), 0); /* Now calculate offsets for section that were specified by the caller. */ for (i = 0; i < addrs.size (); i++) @@ -432,7 +431,7 @@ relative_addr_info_to_section_offsets (struct section_offsets *section_offsets, /* Record all sections in offsets. */ /* The section_offsets in the objfile are here filled in using the BFD index. */ - section_offsets->offsets[osp->sectindex] = osp->addr; + section_offsets[osp->sectindex] = osp->addr; } } @@ -636,12 +635,8 @@ void default_symfile_offsets (struct objfile *objfile, const section_addr_info &addrs) { - objfile->num_sections = gdb_bfd_count_sections (objfile->obfd); - objfile->section_offsets = (struct section_offsets *) - obstack_alloc (&objfile->objfile_obstack, - SIZEOF_N_SECTION_OFFSETS (objfile->num_sections)); - relative_addr_info_to_section_offsets (objfile->section_offsets, - objfile->num_sections, addrs); + objfile->section_offsets.resize (gdb_bfd_count_sections (objfile->obfd)); + relative_addr_info_to_section_offsets (objfile->section_offsets, addrs); /* For relocatable files, all loadable sections will start at zero. The zero is meaningless, so try to pick arbitrary addresses such @@ -662,11 +657,11 @@ default_symfile_offsets (struct objfile *objfile, if (cur_sec == NULL) { - CORE_ADDR *offsets = objfile->section_offsets->offsets; + section_offsets &offsets = objfile->section_offsets; /* Pick non-overlapping offsets for sections the user did not place explicitly. */ - arg.offsets = objfile->section_offsets; + arg.offsets = &objfile->section_offsets; arg.lowest = 0; bfd_map_over_sections (objfile->obfd, place_section, &arg); @@ -902,7 +897,7 @@ init_entry_point_info (struct objfile *objfile) (as gleaned by GDB's shared library code). We convert each address into an offset from the section VMA's as it appears in the object file, and then call the file's sym_offsets function to convert this - into a format-specific offset table --- a `struct section_offsets'. + into a format-specific offset table --- a `section_offsets'. The sectindex field is used to control the ordering of sections with the same name. Upon return, it is updated to contain the corresponding BFD section index, or -1 if the section was not found. @@ -926,13 +921,8 @@ syms_from_objfile_1 (struct objfile *objfile, /* No symbols to load, but we still need to make sure that the section_offsets table is allocated. */ int num_sections = gdb_bfd_count_sections (objfile->obfd); - size_t size = SIZEOF_N_SECTION_OFFSETS (num_sections); - objfile->num_sections = num_sections; - objfile->section_offsets - = (struct section_offsets *) obstack_alloc (&objfile->objfile_obstack, - size); - memset (objfile->section_offsets, 0, size); + objfile->section_offsets.assign (num_sections, 0); return; } @@ -2164,8 +2154,7 @@ set_objfile_default_section_offset (struct objfile *objf, CORE_ADDR offset) { /* Add OFFSET to all sections by default. */ - std::vector<struct section_offsets> offsets (objf->num_sections, - { { offset } }); + section_offsets offsets (objf->section_offsets.size (), offset); /* Create sorted lists of all sections in ADDRS as well as all sections in OBJF. */ @@ -2203,11 +2192,11 @@ set_objfile_default_section_offset (struct objfile *objf, } if (cmp == 0) - offsets[objf_sect->sectindex].offsets[0] = 0; + offsets[objf_sect->sectindex] = 0; } /* Apply the new section offsets. */ - objfile_relocate (objf, offsets.data ()); + objfile_relocate (objf, offsets); } /* This function allows the addition of incrementally linked object files. @@ -2479,9 +2468,6 @@ reread_symbols (void) new_modtime = new_statbuf.st_mtime; if (new_modtime != objfile->mtime) { - struct section_offsets *offsets; - int num_offsets; - printf_filtered (_("`%s' has changed; re-reading symbols.\n"), objfile_name (objfile)); @@ -2556,14 +2542,6 @@ reread_symbols (void) error (_("Can't read symbols from %s: %s."), objfile_name (objfile), bfd_errmsg (bfd_get_error ())); - /* Save the offsets, we will nuke them with the rest of the - objfile_obstack. */ - num_offsets = objfile->num_sections; - offsets = ((struct section_offsets *) - alloca (SIZEOF_N_SECTION_OFFSETS (num_offsets))); - memcpy (offsets, objfile->section_offsets, - SIZEOF_N_SECTION_OFFSETS (num_offsets)); - objfile->reset_psymtabs (); /* NB: after this call to obstack_free, objfiles_changed @@ -2595,15 +2573,6 @@ reread_symbols (void) build_objfile_section_table (objfile); - /* We use the same section offsets as from last time. I'm not - sure whether that is always correct for shared libraries. */ - objfile->section_offsets = (struct section_offsets *) - obstack_alloc (&objfile->objfile_obstack, - SIZEOF_N_SECTION_OFFSETS (num_offsets)); - memcpy (objfile->section_offsets, offsets, - SIZEOF_N_SECTION_OFFSETS (num_offsets)); - objfile->num_sections = num_offsets; - /* What the hell is sym_new_init for, anyway? The concept of distinguishing between the main file and additional files in this way seems rather dubious. */ @@ -3705,7 +3674,7 @@ free_symfile_segment_data (struct symfile_segment_data *data) int symfile_map_offsets_to_segments (bfd *abfd, const struct symfile_segment_data *data, - struct section_offsets *offsets, + section_offsets &offsets, int num_segment_bases, const CORE_ADDR *segment_bases) { @@ -3737,8 +3706,7 @@ symfile_map_offsets_to_segments (bfd *abfd, if (which > num_segment_bases) which = num_segment_bases; - offsets->offsets[i] = (segment_bases[which - 1] - - data->segment_bases[which - 1]); + offsets[i] = segment_bases[which - 1] - data->segment_bases[which - 1]; } return 1; |