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/objfiles.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/objfiles.c')
-rw-r--r-- | gdb/objfiles.c | 65 |
1 files changed, 24 insertions, 41 deletions
diff --git a/gdb/objfiles.c b/gdb/objfiles.c index ff408b6..3138049 100644 --- a/gdb/objfiles.c +++ b/gdb/objfiles.c @@ -391,9 +391,9 @@ entry_point_address_query (CORE_ADDR *entry_p) if (symfile_objfile == NULL || !symfile_objfile->per_bfd->ei.entry_point_p) return 0; + int idx = symfile_objfile->per_bfd->ei.the_bfd_section_index; *entry_p = (symfile_objfile->per_bfd->ei.entry_point - + ANOFFSET (symfile_objfile->section_offsets, - symfile_objfile->per_bfd->ei.the_bfd_section_index)); + + symfile_objfile->section_offsets[idx]); return 1; } @@ -626,7 +626,7 @@ objfile::~objfile () static void relocate_one_symbol (struct symbol *sym, struct objfile *objfile, - struct section_offsets *delta) + const section_offsets &delta) { fixup_symbol_section (sym, objfile); @@ -640,7 +640,7 @@ relocate_one_symbol (struct symbol *sym, struct objfile *objfile, { SET_SYMBOL_VALUE_ADDRESS (sym, SYMBOL_VALUE_ADDRESS (sym) - + ANOFFSET (delta, SYMBOL_SECTION (sym))); + + delta[SYMBOL_SECTION (sym)]); } } @@ -650,19 +650,16 @@ relocate_one_symbol (struct symbol *sym, struct objfile *objfile, static int objfile_relocate1 (struct objfile *objfile, - const struct section_offsets *new_offsets) + const section_offsets &new_offsets) { - struct section_offsets *delta = - ((struct section_offsets *) - alloca (SIZEOF_N_SECTION_OFFSETS (objfile->num_sections))); + section_offsets delta (objfile->section_offsets.size ()); int something_changed = 0; - for (int i = 0; i < objfile->num_sections; ++i) + for (int i = 0; i < objfile->section_offsets.size (); ++i) { - delta->offsets[i] = - ANOFFSET (new_offsets, i) - ANOFFSET (objfile->section_offsets, i); - if (ANOFFSET (delta, i) != 0) + delta[i] = new_offsets[i] - objfile->section_offsets[i]; + if (delta[i] != 0) something_changed = 1; } if (!something_changed) @@ -681,9 +678,7 @@ objfile_relocate1 (struct objfile *objfile, if (l) { for (int i = 0; i < l->nitems; ++i) - l->item[i].pc += ANOFFSET (delta, - COMPUNIT_BLOCK_LINE_SECTION - (cust)); + l->item[i].pc += delta[COMPUNIT_BLOCK_LINE_SECTION (cust)]; } } } @@ -694,8 +689,7 @@ objfile_relocate1 (struct objfile *objfile, int block_line_section = COMPUNIT_BLOCK_LINE_SECTION (cust); if (BLOCKVECTOR_MAP (bv)) - addrmap_relocate (BLOCKVECTOR_MAP (bv), - ANOFFSET (delta, block_line_section)); + addrmap_relocate (BLOCKVECTOR_MAP (bv), delta[block_line_section]); for (int i = 0; i < BLOCKVECTOR_NBLOCKS (bv); ++i) { @@ -704,16 +698,14 @@ objfile_relocate1 (struct objfile *objfile, struct mdict_iterator miter; b = BLOCKVECTOR_BLOCK (bv, i); - BLOCK_START (b) += ANOFFSET (delta, block_line_section); - BLOCK_END (b) += ANOFFSET (delta, block_line_section); + BLOCK_START (b) += delta[block_line_section]; + BLOCK_END (b) += delta[block_line_section]; if (BLOCK_RANGES (b) != nullptr) for (int j = 0; j < BLOCK_NRANGES (b); j++) { - BLOCK_RANGE_START (b, j) - += ANOFFSET (delta, block_line_section); - BLOCK_RANGE_END (b, j) += ANOFFSET (delta, - block_line_section); + BLOCK_RANGE_START (b, j) += delta[block_line_section]; + BLOCK_RANGE_END (b, j) += delta[block_line_section]; } /* We only want to iterate over the local symbols, not any @@ -741,8 +733,8 @@ objfile_relocate1 (struct objfile *objfile, { int i; - for (i = 0; i < objfile->num_sections; ++i) - (objfile->section_offsets)->offsets[i] = ANOFFSET (new_offsets, i); + for (i = 0; i < objfile->section_offsets.size (); ++i) + objfile->section_offsets[i] = new_offsets[i]; } /* Rebuild section map next time we need it. */ @@ -773,7 +765,7 @@ objfile_relocate1 (struct objfile *objfile, void objfile_relocate (struct objfile *objfile, - const struct section_offsets *new_offsets) + const section_offsets &new_offsets) { int changed = 0; @@ -792,15 +784,13 @@ objfile_relocate (struct objfile *objfile, addr_info_make_relative (&objfile_addrs, debug_objfile->obfd); - gdb_assert (debug_objfile->num_sections + gdb_assert (debug_objfile->section_offsets.size () == gdb_bfd_count_sections (debug_objfile->obfd)); - std::vector<struct section_offsets> - new_debug_offsets (SIZEOF_N_SECTION_OFFSETS (debug_objfile->num_sections)); - relative_addr_info_to_section_offsets (new_debug_offsets.data (), - debug_objfile->num_sections, - objfile_addrs); + section_offsets new_debug_offsets + (debug_objfile->section_offsets.size ()); + relative_addr_info_to_section_offsets (new_debug_offsets, objfile_addrs); - changed |= objfile_relocate1 (debug_objfile, new_debug_offsets.data ()); + changed |= objfile_relocate1 (debug_objfile, new_debug_offsets); } /* Relocate breakpoints as necessary, after things are relocated. */ @@ -815,14 +805,7 @@ objfile_relocate (struct objfile *objfile, static int objfile_rebase1 (struct objfile *objfile, CORE_ADDR slide) { - struct section_offsets *new_offsets = - ((struct section_offsets *) - alloca (SIZEOF_N_SECTION_OFFSETS (objfile->num_sections))); - int i; - - for (i = 0; i < objfile->num_sections; ++i) - new_offsets->offsets[i] = slide; - + section_offsets new_offsets (objfile->section_offsets.size (), slide); return objfile_relocate1 (objfile, new_offsets); } |