diff options
author | Tom Tromey <tromey@redhat.com> | 2013-08-15 08:46:35 -0600 |
---|---|---|
committer | Tom Tromey <tromey@redhat.com> | 2014-02-26 12:11:17 -0700 |
commit | 77e371c079408e265f1dfd2b0620dd8e76c23371 (patch) | |
tree | c2452c7328aae0fd2602f486e4e67b453144ebfa /gdb/minsyms.c | |
parent | 3b7344d5ab495cd82b6c72ec5e00d018549837fb (diff) | |
download | gdb-77e371c079408e265f1dfd2b0620dd8e76c23371.zip gdb-77e371c079408e265f1dfd2b0620dd8e76c23371.tar.gz gdb-77e371c079408e265f1dfd2b0620dd8e76c23371.tar.bz2 |
start change to progspace independence
This patch starts changing minimal symbols to be independent of the
program space.
Specifically, it adds a new objfile parameter to MSYMBOL_VALUE_ADDRESS
and changes all the code to use it. This is needed so we can change
gdb to apply the section offset when a minsym's address is computed,
as opposed to baking the offsets into the symbol itself.
A few spots still need the unrelocated address. For these, we
introduce MSYMBOL_VALUE_RAW_ADDRESS.
As a convenience, we also add the new macro BMSYMBOL_VALUE_ADDRESS,
which computes the address of a bound minimal symbol. This just does
the obvious thing with the fields.
Note that this change does not actually enable program space
independence. That requires more changes to gdb. However, to ensure
that these changes compile properly, this patch does add the needed
section lookup code to MSYMBOL_VALUE_ADDRESS -- it just ensures it has
no effect at runtime by multiplying the offset by 0.
2014-02-26 Tom Tromey <tromey@redhat.com>
* ada-lang.c (ada_main_name): Update.
(ada_add_standard_exceptions): Update.
* ada-tasks.c (ada_tasks_inferior_data_sniffer): Update.
* aix-thread.c (pdc_symbol_addrs, pd_enable): Update.
* arm-tdep.c (skip_prologue_function, arm_skip_stub): Update.
* auxv.c (ld_so_xfer_auxv): Update.
* avr-tdep.c (avr_scan_prologue): Update.
* ax-gdb.c (gen_var_ref): Update.
* blockframe.c (get_pc_function_start)
(find_pc_partial_function_gnu_ifunc): Update.
* breakpoint.c (create_overlay_event_breakpoint)
(create_longjmp_master_breakpoint)
(create_std_terminate_master_breakpoint)
(create_exception_master_breakpoint): Update.
* bsd-uthread.c (bsd_uthread_lookup_address): Update.
* c-valprint.c (c_val_print): Update.
* coff-pe-read.c (add_pe_forwarded_sym): Update.
* common/agent.c (agent_look_up_symbols): Update.
* dbxread.c (find_stab_function_addr, end_psymtab): Update.
* dwarf2loc.c (call_site_to_target_addr): Update.
* dwarf2read.c (dw2_find_pc_sect_symtab): Update.
* elfread.c (elf_gnu_ifunc_record_cache)
(elf_gnu_ifunc_resolve_by_got): Update.
* findvar.c (default_read_var_value): Update.
* frame.c (inside_main_func): Update.
* frv-tdep.c (frv_frame_this_id): Update.
* glibc-tdep.c (glibc_skip_solib_resolver): Update.
* gnu-v3-abi.c (gnuv3_get_typeid, gnuv3_skip_trampoline):
Update.
* hppa-hpux-tdep.c (hppa64_hpux_search_dummy_call_sequence)
(hppa_hpux_find_dummy_bpaddr): Update.
* hppa-tdep.c (hppa_symbol_address): Update.
* infcmd.c (until_next_command): Update.
* jit.c (jit_read_descriptor, jit_breakpoint_re_set_internal):
Update.
* linespec.c (minsym_found, add_minsym): Update.
* linux-nat.c (get_signo): Update.
* linux-thread-db.c (inferior_has_bug): Update.
* m32c-tdep.c (m32c_return_value)
(m32c_m16c_address_to_pointer): Update.
* m32r-tdep.c (m32r_frame_this_id): Update.
* m68hc11-tdep.c (m68hc11_get_register_info): Update.
* machoread.c (macho_resolve_oso_sym_with_minsym): Update.
* maint.c (maintenance_translate_address): Update.
* minsyms.c (lookup_minimal_symbol_by_pc_name): Update.
(frob_address): New function.
(lookup_minimal_symbol_by_pc_section_1): Use raw addresses,
frob_address. Rename parameter to "pc_in".
(compare_minimal_symbols, compact_minimal_symbols): Use raw
addresses.
(find_solib_trampoline_target, minimal_symbol_upper_bound):
Update.
* mips-linux-tdep.c (mips_linux_skip_resolver): Update.
* mips-tdep.c (mips_skip_pic_trampoline_code): Update.
* objc-lang.c (find_objc_msgsend): Update.
* objfiles.c (objfile_relocate1): Update.
* obsd-tdep.c (obsd_skip_solib_resolver): Update.
* p-valprint.c (pascal_val_print): Update.
* parse.c (write_exp_msymbol): Update.
* ppc-linux-tdep.c (ppc_linux_spe_context_lookup)
(ppc_elfv2_skip_entrypoint): Update.
* ppc-sysv-tdep.c (convert_code_addr_to_desc_addr): Update.
* printcmd.c (build_address_symbolic, msym_info)
(address_info): Update.
* proc-service.c (ps_pglobal_lookup): Update.
* psymtab.c (find_pc_sect_psymtab_closer)
(find_pc_sect_psymtab, find_pc_sect_symtab_from_partial):
Change msymbol parameter to bound_minimal_symbol.
* ravenscar-thread.c (get_running_thread_id): Update.
* remote.c (remote_check_symbols): Update.
* sh64-tdep.c (sh64_elf_make_msymbol_special): Use raw
address.
* sol2-tdep.c (sol2_skip_solib_resolver): Update.
* solib-dsbt.c (lm_base): Update.
* solib-frv.c (lm_base, main_got): Update.
* solib-irix.c (locate_base): Update.
* solib-som.c (som_solib_create_inferior_hook)
(link_map_start): Update.
* solib-spu.c (spu_enable_break, ocl_enable_break): Update.
* solib-svr4.c (elf_locate_base, enable_break): Update.
* spu-tdep.c (spu_get_overlay_table, spu_catch_start)
(flush_ea_cache): Update.
* stabsread.c (define_symbol, scan_file_globals): Update.
* stack.c (find_frame_funname): Update.
* symfile-debug.c (debug_qf_expand_symtabs_matching)
(debug_qf_find_pc_sect_symtab): Update.
* symfile.c (simple_read_overlay_table)
(simple_overlay_update): Update.
* symfile.h (struct quick_symbol_functions)
<find_pc_sect_symtab>: Change type of msymbol to
bound_minimal_symbol.
* symmisc.c (dump_msymbols): Update.
* symtab.c (find_pc_sect_symtab_via_partial)
(find_pc_sect_psymtab, find_pc_sect_line, skip_prologue_sal)
(search_symbols, print_msymbol_info): Update.
* symtab.h (MSYMBOL_VALUE_RAW_ADDRESS): New macro.
(MSYMBOL_VALUE_ADDRESS): Redefine.
(BMSYMBOL_VALUE_ADDRESS): New macro.
* tracepoint.c (scope_info): Update.
* tui/tui-disasm.c (tui_find_disassembly_address)
(tui_get_begin_asm_address): Update.
* valops.c (find_function_in_inferior): Update.
* value.c (value_static_field, value_fn_field): Update.
Diffstat (limited to 'gdb/minsyms.c')
-rw-r--r-- | gdb/minsyms.c | 80 |
1 files changed, 53 insertions, 27 deletions
diff --git a/gdb/minsyms.c b/gdb/minsyms.c index 8335d51..aa6df11 100644 --- a/gdb/minsyms.c +++ b/gdb/minsyms.c @@ -407,7 +407,7 @@ lookup_minimal_symbol_by_pc_name (CORE_ADDR pc, const char *name, msymbol != NULL; msymbol = msymbol->hash_next) { - if (MSYMBOL_VALUE_ADDRESS (msymbol) == pc + if (MSYMBOL_VALUE_ADDRESS (objfile, msymbol) == pc && strcmp (MSYMBOL_LINKAGE_NAME (msymbol), name) == 0) return msymbol; } @@ -454,6 +454,28 @@ lookup_minimal_symbol_solib_trampoline (const char *name, return found_symbol; } +/* A helper function that makes *PC section-relative. This searches + the sections of OBJFILE and if *PC is in a section, it subtracts + the section offset and returns true. Otherwise it returns + false. */ + +static int +frob_address (struct objfile *objfile, CORE_ADDR *pc) +{ + struct obj_section *iter; + + ALL_OBJFILE_OSECTIONS (objfile, iter) + { + if (*pc >= obj_section_addr (iter) && *pc < obj_section_endaddr (iter)) + { + *pc -= obj_section_offset (iter); + return 1; + } + } + + return 0; +} + /* Search through the minimal symbol table for each objfile and find the symbol whose address is the largest address that is still less than or equal to PC, and matches SECTION (which is not NULL). @@ -470,7 +492,7 @@ lookup_minimal_symbol_solib_trampoline (const char *name, Otherwise prefer mst_text symbols. */ static struct bound_minimal_symbol -lookup_minimal_symbol_by_pc_section_1 (CORE_ADDR pc, +lookup_minimal_symbol_by_pc_section_1 (CORE_ADDR pc_in, struct obj_section *section, int want_trampoline) { @@ -502,6 +524,8 @@ lookup_minimal_symbol_by_pc_section_1 (CORE_ADDR pc, objfile != NULL; objfile = objfile_separate_debug_iterate (section->objfile, objfile)) { + CORE_ADDR pc = pc_in; + /* If this objfile has a minimal symbol table, go search it using a binary search. Note that a minimal symbol table always consists of at least two symbols, a "real" symbol and the terminating @@ -534,16 +558,16 @@ lookup_minimal_symbol_by_pc_section_1 (CORE_ADDR pc, Warning: this code is trickier than it would appear at first. */ - /* Should also require that pc is <= end of objfile. FIXME! */ - if (pc >= MSYMBOL_VALUE_ADDRESS (&msymbol[lo])) + if (frob_address (objfile, &pc) + && pc >= MSYMBOL_VALUE_RAW_ADDRESS (&msymbol[lo])) { - while (MSYMBOL_VALUE_ADDRESS (&msymbol[hi]) > pc) + while (MSYMBOL_VALUE_RAW_ADDRESS (&msymbol[hi]) > pc) { /* pc is still strictly less than highest address. */ /* Note "new" will always be >= lo. */ new = (lo + hi) / 2; - if ((MSYMBOL_VALUE_ADDRESS (&msymbol[new]) >= pc) || - (lo == new)) + if ((MSYMBOL_VALUE_RAW_ADDRESS (&msymbol[new]) >= pc) + || (lo == new)) { hi = new; } @@ -557,8 +581,8 @@ lookup_minimal_symbol_by_pc_section_1 (CORE_ADDR pc, hi to point to the last one. That way we can find the right symbol if it has an index greater than hi. */ while (hi < objfile->minimal_symbol_count - 1 - && (MSYMBOL_VALUE_ADDRESS (&msymbol[hi]) - == MSYMBOL_VALUE_ADDRESS (&msymbol[hi + 1]))) + && (MSYMBOL_VALUE_RAW_ADDRESS (&msymbol[hi]) + == MSYMBOL_VALUE_RAW_ADDRESS (&msymbol[hi + 1]))) hi++; /* Skip various undesirable symbols. */ @@ -606,8 +630,8 @@ lookup_minimal_symbol_by_pc_section_1 (CORE_ADDR pc, && MSYMBOL_TYPE (&msymbol[hi - 1]) == want_type && (MSYMBOL_SIZE (&msymbol[hi]) == MSYMBOL_SIZE (&msymbol[hi - 1])) - && (MSYMBOL_VALUE_ADDRESS (&msymbol[hi]) - == MSYMBOL_VALUE_ADDRESS (&msymbol[hi - 1])) + && (MSYMBOL_VALUE_RAW_ADDRESS (&msymbol[hi]) + == MSYMBOL_VALUE_RAW_ADDRESS (&msymbol[hi - 1])) && (MSYMBOL_OBJ_SECTION (objfile, &msymbol[hi]) == MSYMBOL_OBJ_SECTION (objfile, &msymbol[hi - 1]))) { @@ -636,9 +660,9 @@ lookup_minimal_symbol_by_pc_section_1 (CORE_ADDR pc, the cancellable variants, but both have sizes. */ if (hi > 0 && MSYMBOL_SIZE (&msymbol[hi]) != 0 - && pc >= (MSYMBOL_VALUE_ADDRESS (&msymbol[hi]) + && pc >= (MSYMBOL_VALUE_RAW_ADDRESS (&msymbol[hi]) + MSYMBOL_SIZE (&msymbol[hi])) - && pc < (MSYMBOL_VALUE_ADDRESS (&msymbol[hi - 1]) + && pc < (MSYMBOL_VALUE_RAW_ADDRESS (&msymbol[hi - 1]) + MSYMBOL_SIZE (&msymbol[hi - 1]))) { hi--; @@ -668,7 +692,7 @@ lookup_minimal_symbol_by_pc_section_1 (CORE_ADDR pc, if (hi >= 0 && MSYMBOL_SIZE (&msymbol[hi]) != 0 - && pc >= (MSYMBOL_VALUE_ADDRESS (&msymbol[hi]) + && pc >= (MSYMBOL_VALUE_RAW_ADDRESS (&msymbol[hi]) + MSYMBOL_SIZE (&msymbol[hi]))) { if (best_zero_sized != -1) @@ -684,8 +708,8 @@ lookup_minimal_symbol_by_pc_section_1 (CORE_ADDR pc, if (hi >= 0 && ((best_symbol == NULL) || - (MSYMBOL_VALUE_ADDRESS (best_symbol) < - MSYMBOL_VALUE_ADDRESS (&msymbol[hi])))) + (MSYMBOL_VALUE_RAW_ADDRESS (best_symbol) < + MSYMBOL_VALUE_RAW_ADDRESS (&msymbol[hi])))) { best_symbol = &msymbol[hi]; best_objfile = objfile; @@ -981,11 +1005,11 @@ compare_minimal_symbols (const void *fn1p, const void *fn2p) fn1 = (const struct minimal_symbol *) fn1p; fn2 = (const struct minimal_symbol *) fn2p; - if (MSYMBOL_VALUE_ADDRESS (fn1) < MSYMBOL_VALUE_ADDRESS (fn2)) + if (MSYMBOL_VALUE_RAW_ADDRESS (fn1) < MSYMBOL_VALUE_RAW_ADDRESS (fn2)) { return (-1); /* addr 1 is less than addr 2. */ } - else if (MSYMBOL_VALUE_ADDRESS (fn1) > MSYMBOL_VALUE_ADDRESS (fn2)) + else if (MSYMBOL_VALUE_RAW_ADDRESS (fn1) > MSYMBOL_VALUE_RAW_ADDRESS (fn2)) { return (1); /* addr 1 is greater than addr 2. */ } @@ -1085,8 +1109,9 @@ compact_minimal_symbols (struct minimal_symbol *msymbol, int mcount, copyfrom = copyto = msymbol; while (copyfrom < msymbol + mcount - 1) { - if (MSYMBOL_VALUE_ADDRESS (copyfrom) - == MSYMBOL_VALUE_ADDRESS ((copyfrom + 1)) + if (MSYMBOL_VALUE_RAW_ADDRESS (copyfrom) + == MSYMBOL_VALUE_RAW_ADDRESS ((copyfrom + 1)) + && MSYMBOL_SECTION (copyfrom) == MSYMBOL_SECTION (copyfrom + 1) && strcmp (MSYMBOL_LINKAGE_NAME (copyfrom), MSYMBOL_LINKAGE_NAME ((copyfrom + 1))) == 0) { @@ -1326,7 +1351,7 @@ find_solib_trampoline_target (struct frame_info *frame, CORE_ADDR pc) || MSYMBOL_TYPE (msymbol) == mst_text_gnu_ifunc) && strcmp (MSYMBOL_LINKAGE_NAME (msymbol), MSYMBOL_LINKAGE_NAME (tsymbol)) == 0) - return MSYMBOL_VALUE_ADDRESS (msymbol); + return MSYMBOL_VALUE_ADDRESS (objfile, msymbol); /* Also handle minimal symbols pointing to function descriptors. */ if (MSYMBOL_TYPE (msymbol) == mst_data @@ -1337,11 +1362,11 @@ find_solib_trampoline_target (struct frame_info *frame, CORE_ADDR pc) func = gdbarch_convert_from_func_ptr_addr (get_objfile_arch (objfile), - MSYMBOL_VALUE_ADDRESS (msymbol), + MSYMBOL_VALUE_ADDRESS (objfile, msymbol), ¤t_target); /* Ignore data symbols that are not function descriptors. */ - if (func != MSYMBOL_VALUE_ADDRESS (msymbol)) + if (func != MSYMBOL_VALUE_ADDRESS (objfile, msymbol)) return func; } } @@ -1367,7 +1392,7 @@ minimal_symbol_upper_bound (struct bound_minimal_symbol minsym) of the section, as the end of the function. */ if (MSYMBOL_SIZE (minsym.minsym) != 0) - return MSYMBOL_VALUE_ADDRESS (minsym.minsym) + MSYMBOL_SIZE (minsym.minsym); + return BMSYMBOL_VALUE_ADDRESS (minsym) + MSYMBOL_SIZE (minsym.minsym); /* Step over other symbols at this same address, and symbols in other sections, to find the next symbol in this section with a @@ -1377,16 +1402,17 @@ minimal_symbol_upper_bound (struct bound_minimal_symbol minsym) section = MSYMBOL_SECTION (msymbol); for (i = 1; MSYMBOL_LINKAGE_NAME (msymbol + i) != NULL; i++) { - if (MSYMBOL_VALUE_ADDRESS (msymbol + i) != MSYMBOL_VALUE_ADDRESS (msymbol) + if ((MSYMBOL_VALUE_RAW_ADDRESS (msymbol + i) + != MSYMBOL_VALUE_RAW_ADDRESS (msymbol)) && MSYMBOL_SECTION (msymbol + i) == section) break; } obj_section = MSYMBOL_OBJ_SECTION (minsym.objfile, minsym.minsym); if (MSYMBOL_LINKAGE_NAME (msymbol + i) != NULL - && (MSYMBOL_VALUE_ADDRESS (msymbol + i) + && (MSYMBOL_VALUE_ADDRESS (minsym.objfile, msymbol + i) < obj_section_endaddr (obj_section))) - result = MSYMBOL_VALUE_ADDRESS (msymbol + i); + result = MSYMBOL_VALUE_ADDRESS (minsym.objfile, msymbol + i); else /* We got the start address from the last msymbol in the objfile. So the end address is the end of the section. */ |