public inbox for gdb-patches@sourceware.org
 help / color / mirror / Atom feed
* [FYI v3 04/10] use bound_minsym as result for lookup_minimal_symbol et al
  2014-02-26 20:23 [FYI v3 00/10] share minimal symbols across objfiles Tom Tromey
                   ` (3 preceding siblings ...)
  2014-02-26 19:01 ` [FYI v3 02/10] change minsym representation Tom Tromey
@ 2014-02-26 19:01 ` Tom Tromey
  2014-02-26 19:07 ` [FYI v3 06/10] change minsyms not to be relocated at read-time Tom Tromey
                   ` (4 subsequent siblings)
  9 siblings, 0 replies; 11+ messages in thread
From: Tom Tromey @ 2014-02-26 19:01 UTC (permalink / raw)
  To: gdb-patches; +Cc: Tom Tromey

This patch changes a few minimal symbol lookup functions to return a
bound_minimal_symbol rather than a pointer to the minsym.  This change
helps prepare gdb for computing a minimal symbol's address at the
point of use.

Note that this changes even those functions that ostensibly search a
single objfile.  That was necessary because, in fact, those functions
can search an objfile and its separate debug objfiles; and it is
important for the caller to know in which objfile the minimal symbol
was actually found.

The bulk of this patch is mechanical.

2014-02-26  Tom Tromey  <tromey@redhat.com>

	* ada-lang.c (ada_update_initial_language): Update.
	(ada_main_name, ada_has_this_exception_support): Update.
	* ada-tasks.c (ada_tasks_inferior_data_sniffer): Update.
	* aix-thread.c (pdc_symbol_addrs, pd_enable): Update.
	* arm-tdep.c (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.
	* breakpoint.c (struct breakpoint_objfile_data)
	<overlay_msym, longjmp_msym, terminate_msym, exception_msym>: Change
	type to bound_minimal_symbol.
	(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-exp.y (classify_name): Update.
	* coffread.c (coff_symfile_read): Update.
	* common/agent.c (agent_look_up_symbols): Update.
	* d-lang.c (d_main_name): Update.
	* dbxread.c (find_stab_function_addr, end_psymtab): Update.
	* dec-thread.c (enable_dec_thread): Update.
	* dwarf2loc.c (call_site_to_target_addr): Update.
	* elfread.c (elf_gnu_ifunc_resolve_by_got): Update.
	* eval.c (evaluate_subexp_standard): Update.
	* findvar.c (struct minsym_lookup_data) <result>: Change type
	to bound_minimal_symbol.
	<objfile>: Remove.
	(minsym_lookup_iterator_cb, default_read_var_value): Update.
	* frame.c (inside_main_func): Update.
	* frv-tdep.c (frv_frame_this_id): Update.
	* gcore.c (call_target_sbrk): Update.
	* glibc-tdep.c (glibc_skip_solib_resolver): Update.
	* gnu-v3-abi.c (gnuv3_get_typeid, gnuv3_skip_trampoline):
	Update.
	* go-lang.c (go_main_name): Update.
	* hppa-hpux-tdep.c (hppa_hpux_skip_trampoline_code)
	(hppa_hpux_find_import_stub_for_addr): Update.
	* hppa-tdep.c (hppa_extract_17,	hppa_lookup_stub_minimal_symbol):
	Update.  Change return type.
	* hppa-tdep.h (hppa_lookup_stub_minimal_symbol): Change return
	type.
	* jit.c (jit_breakpoint_re_set_internal): Update.
	* linux-fork.c (inferior_call_waitpid, checkpoint_command):
	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.
	* minsyms.c (lookup_minimal_symbol_internal): Rename to
	lookup_minimal_symbol.  Change return type.
	(lookup_minimal_symbol): Remove.
	(lookup_bound_minimal_symbol): Update.
	(lookup_minimal_symbol_text): Change return type.
	(lookup_minimal_symbol_solib_trampoline): Change return type.
	* minsyms.h (lookup_minimal_symbol, lookup_minimal_symbol_text)
	(lookup_minimal_symbol_solib_trampoline): Change return type.
	* mips-linux-tdep.c (mips_linux_skip_resolver): Update.
	* objc-lang.c (lookup_objc_class, lookup_child_selector)
	(value_nsstring, find_imps): Update.
	* obsd-tdep.c (obsd_skip_solib_resolver): Update.
	* p-lang.c (pascal_main_name): Update.
	* ppc-linux-tdep.c (ppc_linux_spe_context_lookup): Update.
	* ppc-sysv-tdep.c (convert_code_addr_to_desc_addr): Update.
	* proc-service.c (ps_pglobal_lookup): Update.
	* ravenscar-thread.c (get_running_thread_msymbol): Change
	return type.
	(has_ravenscar_runtime, get_running_thread_id): Update.
	* remote.c (remote_check_symbols): Update.
	* sol-thread.c (ps_pglobal_lookup): Update.
	* sol2-tdep.c (sol2_skip_solib_resolver): Update.
	* solib-dsbt.c (lm_base): Update.
	* solib-frv.c (lm_base, frv_relocate_section_addresses):
	Update.
	* solib-irix.c (locate_base): Update.
	* solib-som.c (som_solib_create_inferior_hook)
	(som_solib_desire_dynamic_linker_symbols, link_map_start):
	Update.
	* solib-spu.c (spu_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): Update.
	* symfile.c (simple_read_overlay_table): Update.
	* symtab.c (find_pc_sect_line): Update.
	* tracepoint.c (scope_info): Update.
	* tui-disasm.c (tui_get_begin_asm_address): Update.
	* value.c (value_static_field): Update.
---
 gdb/ChangeLog          | 94 ++++++++++++++++++++++++++++++++++++++++++++++++++
 gdb/ada-lang.c         | 12 +++----
 gdb/ada-tasks.c        | 10 +++---
 gdb/aix-thread.c       | 14 ++++----
 gdb/arm-tdep.c         |  6 ++--
 gdb/auxv.c             |  8 ++---
 gdb/avr-tdep.c         |  7 ++--
 gdb/ax-gdb.c           |  6 ++--
 gdb/breakpoint.c       | 58 +++++++++++++++----------------
 gdb/bsd-uthread.c      |  6 ++--
 gdb/c-exp.y            |  2 +-
 gdb/coffread.c         |  7 ++--
 gdb/common/agent.c     |  6 ++--
 gdb/d-lang.c           |  4 +--
 gdb/dbxread.c          | 19 +++++-----
 gdb/dec-thread.c       |  6 ++--
 gdb/dwarf2loc.c        | 11 +++---
 gdb/elfread.c          | 10 +++---
 gdb/eval.c             |  2 +-
 gdb/findvar.c          | 16 ++++-----
 gdb/frame.c            |  6 ++--
 gdb/frv-tdep.c         |  5 +--
 gdb/gcore.c            |  4 +--
 gdb/glibc-tdep.c       |  6 ++--
 gdb/gnu-v3-abi.c       | 19 +++++-----
 gdb/go-lang.c          |  4 +--
 gdb/hppa-hpux-tdep.c   | 14 ++++----
 gdb/hppa-tdep.c        | 17 +++++----
 gdb/hppa-tdep.h        |  2 +-
 gdb/jit.c              |  7 ++--
 gdb/linux-fork.c       |  9 ++---
 gdb/linux-nat.c        |  7 ++--
 gdb/linux-thread-db.c  |  6 ++--
 gdb/m32c-tdep.c        | 26 +++++++-------
 gdb/m32r-tdep.c        |  5 +--
 gdb/m68hc11-tdep.c     |  6 ++--
 gdb/machoread.c        |  6 ++--
 gdb/minsyms.c          | 60 ++++++++++++++------------------
 gdb/minsyms.h          | 29 ++++++++--------
 gdb/mips-linux-tdep.c  |  4 +--
 gdb/objc-lang.c        | 21 +++++------
 gdb/obsd-tdep.c        |  4 +--
 gdb/p-lang.c           |  8 ++---
 gdb/ppc-linux-tdep.c   |  6 ++--
 gdb/ppc-sysv-tdep.c    |  6 ++--
 gdb/proc-service.c     |  6 ++--
 gdb/ravenscar-thread.c | 27 ++++++++-------
 gdb/remote.c           |  6 ++--
 gdb/sol-thread.c       |  6 ++--
 gdb/sol2-tdep.c        |  4 +--
 gdb/solib-dsbt.c       |  6 ++--
 gdb/solib-frv.c        | 12 +++----
 gdb/solib-irix.c       |  6 ++--
 gdb/solib-som.c        | 79 ++++++++++++++++++++++--------------------
 gdb/solib-spu.c        | 16 ++++-----
 gdb/solib-svr4.c       | 18 +++++-----
 gdb/spu-tdep.c         | 29 ++++++++--------
 gdb/stabsread.c        | 12 +++----
 gdb/symfile.c          | 15 ++++----
 gdb/symtab.c           |  2 +-
 gdb/tracepoint.c       |  6 ++--
 gdb/tui/tui-disasm.c   | 10 +++---
 gdb/value.c            |  8 ++---
 63 files changed, 484 insertions(+), 375 deletions(-)

diff --git a/gdb/ada-lang.c b/gdb/ada-lang.c
index 3751869..baa5d8c 100644
--- a/gdb/ada-lang.c
+++ b/gdb/ada-lang.c
@@ -894,7 +894,7 @@ enum language
 ada_update_initial_language (enum language lang)
 {
   if (lookup_minimal_symbol ("adainit", (const char *) NULL,
-                             (struct objfile *) NULL) != NULL)
+                             (struct objfile *) NULL).minsym != NULL)
     return language_ada;
 
   return lang;
@@ -907,7 +907,7 @@ ada_update_initial_language (enum language lang)
 char *
 ada_main_name (void)
 {
-  struct minimal_symbol *msym;
+  struct bound_minimal_symbol msym;
   static char *main_program_name = NULL;
 
   /* For Ada, the name of the main procedure is stored in a specific
@@ -917,12 +917,12 @@ ada_main_name (void)
      in Ada.  */
   msym = lookup_minimal_symbol (ADA_MAIN_PROGRAM_SYMBOL_NAME, NULL, NULL);
 
-  if (msym != NULL)
+  if (msym.minsym != NULL)
     {
       CORE_ADDR main_program_name_addr;
       int err_code;
 
-      main_program_name_addr = MSYMBOL_VALUE_ADDRESS (msym);
+      main_program_name_addr = MSYMBOL_VALUE_ADDRESS (msym.minsym);
       if (main_program_name_addr == 0)
         error (_("Invalid address for Ada main program name."));
 
@@ -11317,10 +11317,10 @@ ada_has_this_exception_support (const struct exception_support_info *einfo)
 	 the name of the exception being raised (this name is printed in
 	 the catchpoint message, and is also used when trying to catch
 	 a specific exception).  We do not handle this case for now.  */
-      struct minimal_symbol *msym
+      struct bound_minimal_symbol msym
 	= lookup_minimal_symbol (einfo->catch_exception_sym, NULL, NULL);
 
-      if (msym && MSYMBOL_TYPE (msym) != mst_solib_trampoline)
+      if (msym.minsym && MSYMBOL_TYPE (msym.minsym) != mst_solib_trampoline)
 	error (_("Your Ada runtime appears to be missing some debugging "
 		 "information.\nCannot insert Ada exception catchpoint "
 		 "in this configuration."));
diff --git a/gdb/ada-tasks.c b/gdb/ada-tasks.c
index fc562e7..89bdac8 100644
--- a/gdb/ada-tasks.c
+++ b/gdb/ada-tasks.c
@@ -846,7 +846,7 @@ read_known_tasks_list (struct ada_tasks_inferior_data *data)
 static void
 ada_tasks_inferior_data_sniffer (struct ada_tasks_inferior_data *data)
 {
-  struct minimal_symbol *msym;
+  struct bound_minimal_symbol msym;
   struct symbol *sym;
 
   /* Return now if already set.  */
@@ -856,10 +856,10 @@ ada_tasks_inferior_data_sniffer (struct ada_tasks_inferior_data *data)
   /* Try array.  */
 
   msym = lookup_minimal_symbol (KNOWN_TASKS_NAME, NULL, NULL);
-  if (msym != NULL)
+  if (msym.minsym != NULL)
     {
       data->known_tasks_kind = ADA_TASKS_ARRAY;
-      data->known_tasks_addr = MSYMBOL_VALUE_ADDRESS (msym);
+      data->known_tasks_addr = MSYMBOL_VALUE_ADDRESS (msym.minsym);
 
       /* Try to get pointer type and array length from the symtab.  */
       sym = lookup_symbol_in_language (KNOWN_TASKS_NAME, NULL, VAR_DOMAIN,
@@ -901,10 +901,10 @@ ada_tasks_inferior_data_sniffer (struct ada_tasks_inferior_data *data)
   /* Try list.  */
 
   msym = lookup_minimal_symbol (KNOWN_TASKS_LIST, NULL, NULL);
-  if (msym != NULL)
+  if (msym.minsym != NULL)
     {
       data->known_tasks_kind = ADA_TASKS_LIST;
-      data->known_tasks_addr = MSYMBOL_VALUE_ADDRESS (msym);
+      data->known_tasks_addr = MSYMBOL_VALUE_ADDRESS (msym.minsym);
       data->known_tasks_length = 1;
 
       sym = lookup_symbol_in_language (KNOWN_TASKS_LIST, NULL, VAR_DOMAIN,
diff --git a/gdb/aix-thread.c b/gdb/aix-thread.c
index d1194bc..0202a24 100644
--- a/gdb/aix-thread.c
+++ b/gdb/aix-thread.c
@@ -286,7 +286,7 @@ pid_to_prc (ptid_t *ptidp)
 static int
 pdc_symbol_addrs (pthdb_user_t user, pthdb_symbol_t *symbols, int count)
 {
-  struct minimal_symbol *ms;
+  struct bound_minimal_symbol ms;
   int i;
   char *name;
 
@@ -306,13 +306,14 @@ pdc_symbol_addrs (pthdb_user_t user, pthdb_symbol_t *symbols, int count)
 	symbols[i].addr = 0;
       else
 	{
-	  if (!(ms = lookup_minimal_symbol (name, NULL, NULL)))
+	  ms = lookup_minimal_symbol (name, NULL, NULL);
+	  if (ms.minsym == NULL)
 	    {
 	      if (debug_aix_thread)
 		fprintf_unfiltered (gdb_stdlog, " returning PDC_FAILURE\n");
 	      return PDC_FAILURE;
 	    }
-	  symbols[i].addr = MSYMBOL_VALUE_ADDRESS (ms);
+	  symbols[i].addr = MSYMBOL_VALUE_ADDRESS (ms.minsym);
 	}
       if (debug_aix_thread)
 	fprintf_unfiltered (gdb_stdlog, "  symbols[%d].addr = %s\n",
@@ -890,7 +891,7 @@ pd_enable (void)
 {
   int status;
   char *stub_name;
-  struct minimal_symbol *ms;
+  struct bound_minimal_symbol ms;
 
   /* Don't initialize twice.  */
   if (pd_able)
@@ -908,9 +909,10 @@ pd_enable (void)
     return;
 
   /* Set a breakpoint on the returned stub function.  */
-  if (!(ms = lookup_minimal_symbol (stub_name, NULL, NULL)))
+  ms = lookup_minimal_symbol (stub_name, NULL, NULL);
+  if (ms.minsym == NULL)
     return;
-  pd_brk_addr = MSYMBOL_VALUE_ADDRESS (ms);
+  pd_brk_addr = MSYMBOL_VALUE_ADDRESS (ms.minsym);
   if (!create_thread_event_breakpoint (target_gdbarch (), pd_brk_addr))
     return;
 
diff --git a/gdb/arm-tdep.c b/gdb/arm-tdep.c
index 558388d..4df2846 100644
--- a/gdb/arm-tdep.c
+++ b/gdb/arm-tdep.c
@@ -9263,7 +9263,7 @@ arm_skip_stub (struct frame_info *frame, CORE_ADDR pc)
     {
       char *target_name;
       int target_len = namelen - 2;
-      struct minimal_symbol *minsym;
+      struct bound_minimal_symbol minsym;
       struct objfile *objfile;
       struct obj_section *sec;
 
@@ -9279,8 +9279,8 @@ arm_skip_stub (struct frame_info *frame, CORE_ADDR pc)
       sec = find_pc_section (pc);
       objfile = (sec == NULL) ? NULL : sec->objfile;
       minsym = lookup_minimal_symbol (target_name, NULL, objfile);
-      if (minsym != NULL)
-	return MSYMBOL_VALUE_ADDRESS (minsym);
+      if (minsym.minsym != NULL)
+	return MSYMBOL_VALUE_ADDRESS (minsym.minsym);
       else
 	return 0;
     }
diff --git a/gdb/auxv.c b/gdb/auxv.c
index 0278705..2396627 100644
--- a/gdb/auxv.c
+++ b/gdb/auxv.c
@@ -85,7 +85,7 @@ ld_so_xfer_auxv (gdb_byte *readbuf,
 		 ULONGEST offset,
 		 ULONGEST len, ULONGEST *xfered_len)
 {
-  struct minimal_symbol *msym;
+  struct bound_minimal_symbol msym;
   CORE_ADDR data_address, pointer_address;
   struct type *ptr_type = builtin_type (target_gdbarch ())->builtin_data_ptr;
   size_t ptr_size = TYPE_LENGTH (ptr_type);
@@ -95,17 +95,17 @@ ld_so_xfer_auxv (gdb_byte *readbuf,
   size_t block;
 
   msym = lookup_minimal_symbol ("_dl_auxv", NULL, NULL);
-  if (msym == NULL)
+  if (msym.minsym == NULL)
     return TARGET_XFER_E_IO;
 
-  if (MSYMBOL_SIZE (msym) != ptr_size)
+  if (MSYMBOL_SIZE (msym.minsym) != ptr_size)
     return TARGET_XFER_E_IO;
 
   /* POINTER_ADDRESS is a location where the `_dl_auxv' variable
      resides.  DATA_ADDRESS is the inferior value present in
      `_dl_auxv', therefore the real inferior AUXV address.  */
 
-  pointer_address = MSYMBOL_VALUE_ADDRESS (msym);
+  pointer_address = MSYMBOL_VALUE_ADDRESS (msym.minsym);
 
   /* The location of the _dl_auxv symbol may no longer be correct if
      ld.so runs at a different address than the one present in the
diff --git a/gdb/avr-tdep.c b/gdb/avr-tdep.c
index da6b765..a637cf8 100644
--- a/gdb/avr-tdep.c
+++ b/gdb/avr-tdep.c
@@ -492,7 +492,7 @@ avr_scan_prologue (struct gdbarch *gdbarch, CORE_ADDR pc_beg, CORE_ADDR pc_end,
   int i;
   unsigned short insn;
   int scan_stage = 0;
-  struct minimal_symbol *msymbol;
+  struct bound_minimal_symbol msymbol;
   unsigned char prologue[AVR_MAX_PROLOGUE_SIZE];
   int vpc = 0;
   int len;
@@ -586,7 +586,7 @@ avr_scan_prologue (struct gdbarch *gdbarch, CORE_ADDR pc_beg, CORE_ADDR pc_end,
       pc_offset += 2;
 
       msymbol = lookup_minimal_symbol ("__prologue_saves__", NULL, NULL);
-      if (!msymbol)
+      if (!msymbol.minsym)
 	break;
 
       insn = extract_unsigned_integer (&prologue[vpc + 8], 2, byte_order);
@@ -624,7 +624,8 @@ avr_scan_prologue (struct gdbarch *gdbarch, CORE_ADDR pc_beg, CORE_ADDR pc_end,
 
       /* Resolve offset (in words) from __prologue_saves__ symbol.
          Which is a pushes count in `-mcall-prologues' mode */
-      num_pushes = AVR_MAX_PUSHES - (i - MSYMBOL_VALUE_ADDRESS (msymbol)) / 2;
+      num_pushes = (AVR_MAX_PUSHES
+		    - (i - MSYMBOL_VALUE_ADDRESS (msymbol.minsym)) / 2);
 
       if (num_pushes > AVR_MAX_PUSHES)
         {
diff --git a/gdb/ax-gdb.c b/gdb/ax-gdb.c
index a57d573..f2bcefa 100644
--- a/gdb/ax-gdb.c
+++ b/gdb/ax-gdb.c
@@ -712,14 +712,14 @@ gen_var_ref (struct gdbarch *gdbarch, struct agent_expr *ax,
 
     case LOC_UNRESOLVED:
       {
-	struct minimal_symbol *msym
+	struct bound_minimal_symbol msym
 	  = lookup_minimal_symbol (SYMBOL_LINKAGE_NAME (var), NULL, NULL);
 
-	if (!msym)
+	if (!msym.minsym)
 	  error (_("Couldn't resolve symbol `%s'."), SYMBOL_PRINT_NAME (var));
 
 	/* Push the address of the variable.  */
-	ax_const_l (ax, MSYMBOL_VALUE_ADDRESS (msym));
+	ax_const_l (ax, MSYMBOL_VALUE_ADDRESS (msym.minsym));
 	value->kind = axs_lvalue_memory;
       }
       break;
diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c
index 51309b0..7006beb 100644
--- a/gdb/breakpoint.c
+++ b/gdb/breakpoint.c
@@ -3146,10 +3146,10 @@ static const char *const longjmp_names[] =
 struct breakpoint_objfile_data
 {
   /* Minimal symbol for "_ovly_debug_event" (if any).  */
-  struct minimal_symbol *overlay_msym;
+  struct bound_minimal_symbol overlay_msym;
 
   /* Minimal symbol(s) for "longjmp", "siglongjmp", etc. (if any).  */
-  struct minimal_symbol *longjmp_msym[NUM_LONGJMP_NAMES];
+  struct bound_minimal_symbol longjmp_msym[NUM_LONGJMP_NAMES];
 
   /* True if we have looked for longjmp probes.  */
   int longjmp_searched;
@@ -3158,10 +3158,10 @@ struct breakpoint_objfile_data
   VEC (probe_p) *longjmp_probes;
 
   /* Minimal symbol for "std::terminate()" (if any).  */
-  struct minimal_symbol *terminate_msym;
+  struct bound_minimal_symbol terminate_msym;
 
   /* Minimal symbol for "_Unwind_DebugHook" (if any).  */
-  struct minimal_symbol *exception_msym;
+  struct bound_minimal_symbol exception_msym;
 
   /* True if we have looked for exception probes.  */
   int exception_searched;
@@ -3226,24 +3226,24 @@ create_overlay_event_breakpoint (void)
 
       bp_objfile_data = get_breakpoint_objfile_data (objfile);
 
-      if (msym_not_found_p (bp_objfile_data->overlay_msym))
+      if (msym_not_found_p (bp_objfile_data->overlay_msym.minsym))
 	continue;
 
-      if (bp_objfile_data->overlay_msym == NULL)
+      if (bp_objfile_data->overlay_msym.minsym == NULL)
 	{
-	  struct minimal_symbol *m;
+	  struct bound_minimal_symbol m;
 
 	  m = lookup_minimal_symbol_text (func_name, objfile);
-	  if (m == NULL)
+	  if (m.minsym == NULL)
 	    {
 	      /* Avoid future lookups in this objfile.  */
-	      bp_objfile_data->overlay_msym = &msym_not_found;
+	      bp_objfile_data->overlay_msym.minsym = &msym_not_found;
 	      continue;
 	    }
 	  bp_objfile_data->overlay_msym = m;
 	}
 
-      addr = MSYMBOL_VALUE_ADDRESS (bp_objfile_data->overlay_msym);
+      addr = MSYMBOL_VALUE_ADDRESS (bp_objfile_data->overlay_msym.minsym);
       b = create_internal_breakpoint (get_objfile_arch (objfile), addr,
                                       bp_overlay_event,
 				      &internal_breakpoint_ops);
@@ -3342,25 +3342,25 @@ create_longjmp_master_breakpoint (void)
 	  const char *func_name;
 	  CORE_ADDR addr;
 
-	  if (msym_not_found_p (bp_objfile_data->longjmp_msym[i]))
+	  if (msym_not_found_p (bp_objfile_data->longjmp_msym[i].minsym))
 	    continue;
 
 	  func_name = longjmp_names[i];
-	  if (bp_objfile_data->longjmp_msym[i] == NULL)
+	  if (bp_objfile_data->longjmp_msym[i].minsym == NULL)
 	    {
-	      struct minimal_symbol *m;
+	      struct bound_minimal_symbol m;
 
 	      m = lookup_minimal_symbol_text (func_name, objfile);
-	      if (m == NULL)
+	      if (m.minsym == NULL)
 		{
 		  /* Prevent future lookups in this objfile.  */
-		  bp_objfile_data->longjmp_msym[i] = &msym_not_found;
+		  bp_objfile_data->longjmp_msym[i].minsym = &msym_not_found;
 		  continue;
 		}
 	      bp_objfile_data->longjmp_msym[i] = m;
 	    }
 
-	  addr = MSYMBOL_VALUE_ADDRESS (bp_objfile_data->longjmp_msym[i]);
+	  addr = MSYMBOL_VALUE_ADDRESS (bp_objfile_data->longjmp_msym[i].minsym);
 	  b = create_internal_breakpoint (gdbarch, addr, bp_longjmp_master,
 					  &internal_breakpoint_ops);
 	  b->addr_string = xstrdup (func_name);
@@ -3397,25 +3397,25 @@ create_std_terminate_master_breakpoint (void)
 
       bp_objfile_data = get_breakpoint_objfile_data (objfile);
 
-      if (msym_not_found_p (bp_objfile_data->terminate_msym))
+      if (msym_not_found_p (bp_objfile_data->terminate_msym.minsym))
 	continue;
 
-      if (bp_objfile_data->terminate_msym == NULL)
+      if (bp_objfile_data->terminate_msym.minsym == NULL)
 	{
-	  struct minimal_symbol *m;
+	  struct bound_minimal_symbol m;
 
 	  m = lookup_minimal_symbol (func_name, NULL, objfile);
-	  if (m == NULL || (MSYMBOL_TYPE (m) != mst_text
-			    && MSYMBOL_TYPE (m) != mst_file_text))
+	  if (m.minsym == NULL || (MSYMBOL_TYPE (m.minsym) != mst_text
+				   && MSYMBOL_TYPE (m.minsym) != mst_file_text))
 	    {
 	      /* Prevent future lookups in this objfile.  */
-	      bp_objfile_data->terminate_msym = &msym_not_found;
+	      bp_objfile_data->terminate_msym.minsym = &msym_not_found;
 	      continue;
 	    }
 	  bp_objfile_data->terminate_msym = m;
 	}
 
-      addr = MSYMBOL_VALUE_ADDRESS (bp_objfile_data->terminate_msym);
+      addr = MSYMBOL_VALUE_ADDRESS (bp_objfile_data->terminate_msym.minsym);
       b = create_internal_breakpoint (get_objfile_arch (objfile), addr,
                                       bp_std_terminate_master,
 				      &internal_breakpoint_ops);
@@ -3496,26 +3496,26 @@ create_exception_master_breakpoint (void)
 
       /* Otherwise, try the hook function.  */
 
-      if (msym_not_found_p (bp_objfile_data->exception_msym))
+      if (msym_not_found_p (bp_objfile_data->exception_msym.minsym))
 	continue;
 
       gdbarch = get_objfile_arch (objfile);
 
-      if (bp_objfile_data->exception_msym == NULL)
+      if (bp_objfile_data->exception_msym.minsym == NULL)
 	{
-	  struct minimal_symbol *debug_hook;
+	  struct bound_minimal_symbol debug_hook;
 
 	  debug_hook = lookup_minimal_symbol (func_name, NULL, objfile);
-	  if (debug_hook == NULL)
+	  if (debug_hook.minsym == NULL)
 	    {
-	      bp_objfile_data->exception_msym = &msym_not_found;
+	      bp_objfile_data->exception_msym.minsym = &msym_not_found;
 	      continue;
 	    }
 
 	  bp_objfile_data->exception_msym = debug_hook;
 	}
 
-      addr = MSYMBOL_VALUE_ADDRESS (bp_objfile_data->exception_msym);
+      addr = MSYMBOL_VALUE_ADDRESS (bp_objfile_data->exception_msym.minsym);
       addr = gdbarch_convert_from_func_ptr_addr (gdbarch, addr,
 						 &current_target);
       b = create_internal_breakpoint (gdbarch, addr, bp_exception_master,
diff --git a/gdb/bsd-uthread.c b/gdb/bsd-uthread.c
index d10c5d4..473acba 100644
--- a/gdb/bsd-uthread.c
+++ b/gdb/bsd-uthread.c
@@ -125,11 +125,11 @@ static int bsd_uthread_active;
 static CORE_ADDR
 bsd_uthread_lookup_address (const char *name, struct objfile *objfile)
 {
-  struct minimal_symbol *sym;
+  struct bound_minimal_symbol sym;
 
   sym = lookup_minimal_symbol (name, NULL, objfile);
-  if (sym)
-    return MSYMBOL_VALUE_ADDRESS (sym);
+  if (sym.minsym)
+    return MSYMBOL_VALUE_ADDRESS (sym.minsym);
 
   return 0;
 }
diff --git a/gdb/c-exp.y b/gdb/c-exp.y
index 4704845..11631ba 100644
--- a/gdb/c-exp.y
+++ b/gdb/c-exp.y
@@ -2935,7 +2935,7 @@ classify_name (const struct block *block, int is_quoted_name)
   if (sym == NULL
       && parse_language->la_language == language_cplus
       && is_a_field_of_this.type == NULL
-      && !lookup_minimal_symbol (copy, NULL, NULL))
+      && lookup_minimal_symbol (copy, NULL, NULL).minsym == NULL)
     return UNKNOWN_CPP_NAME;
 
   return NAME;
diff --git a/gdb/coffread.c b/gdb/coffread.c
index d2891c3..c5ad60c 100644
--- a/gdb/coffread.c
+++ b/gdb/coffread.c
@@ -680,14 +680,15 @@ coff_symfile_read (struct objfile *objfile, int symfile_flags)
 		  || strncmp (name, "_imp_", 5) == 0))
 	    {
 	      const char *name1 = (name[1] == '_' ? &name[7] : &name[6]);
-	      struct minimal_symbol *found;
+	      struct bound_minimal_symbol found;
 
 	      found = lookup_minimal_symbol (name1, NULL, objfile);
 	      /* If found, there are symbols named "_imp_foo" and "foo"
 		 respectively in OBJFILE.  Set the type of symbol "foo"
 		 as 'mst_solib_trampoline'.  */
-	      if (found != NULL && MSYMBOL_TYPE (found) == mst_text)
-		MSYMBOL_TYPE (found) = mst_solib_trampoline;
+	      if (found.minsym != NULL
+		  && MSYMBOL_TYPE (found.minsym) == mst_text)
+		MSYMBOL_TYPE (found.minsym) = mst_solib_trampoline;
 	    }
 	}
     }
diff --git a/gdb/common/agent.c b/gdb/common/agent.c
index c23d7dd..fdede74 100644
--- a/gdb/common/agent.c
+++ b/gdb/common/agent.c
@@ -98,12 +98,12 @@ agent_look_up_symbols (void *arg)
 
       if (look_up_one_symbol (symbol_list[i].name, addrp, 1) == 0)
 #else
-      struct minimal_symbol *sym =
+      struct bound_minimal_symbol sym =
 	lookup_minimal_symbol (symbol_list[i].name, NULL,
 			       (struct objfile *) arg);
 
-      if (sym != NULL)
-	*addrp = MSYMBOL_VALUE_ADDRESS (sym);
+      if (sym.minsym != NULL)
+	*addrp = MSYMBOL_VALUE_ADDRESS (sym.minsym);
       else
 #endif
 	{
diff --git a/gdb/d-lang.c b/gdb/d-lang.c
index b724b96..434f30a 100644
--- a/gdb/d-lang.c
+++ b/gdb/d-lang.c
@@ -37,10 +37,10 @@ static const char D_MAIN[] = "D main";
 const char *
 d_main_name (void)
 {
-  struct minimal_symbol *msym;
+  struct bound_minimal_symbol msym;
 
   msym = lookup_minimal_symbol (D_MAIN, NULL, NULL);
-  if (msym != NULL)
+  if (msym.minsym != NULL)
     return D_MAIN;
 
   /* No known entry procedure found, the main program is probably not D.  */
diff --git a/gdb/dbxread.c b/gdb/dbxread.c
index 60cf0a8..ba8616f 100644
--- a/gdb/dbxread.c
+++ b/gdb/dbxread.c
@@ -1133,7 +1133,7 @@ static CORE_ADDR
 find_stab_function_addr (char *namestring, const char *filename,
 			 struct objfile *objfile)
 {
-  struct minimal_symbol *msym;
+  struct bound_minimal_symbol msym;
   char *p;
   int n;
 
@@ -1146,7 +1146,7 @@ find_stab_function_addr (char *namestring, const char *filename,
   p[n] = 0;
 
   msym = lookup_minimal_symbol (p, filename, objfile);
-  if (msym == NULL)
+  if (msym.minsym == NULL)
     {
       /* Sun Fortran appends an underscore to the minimal symbol name,
          try again with an appended underscore if the minimal symbol
@@ -1156,13 +1156,13 @@ find_stab_function_addr (char *namestring, const char *filename,
       msym = lookup_minimal_symbol (p, filename, objfile);
     }
 
-  if (msym == NULL && filename != NULL)
+  if (msym.minsym == NULL && filename != NULL)
     {
       /* Try again without the filename.  */
       p[n] = 0;
       msym = lookup_minimal_symbol (p, NULL, objfile);
     }
-  if (msym == NULL && filename != NULL)
+  if (msym.minsym == NULL && filename != NULL)
     {
       /* And try again for Sun Fortran, but without the filename.  */
       p[n] = '_';
@@ -1170,7 +1170,7 @@ find_stab_function_addr (char *namestring, const char *filename,
       msym = lookup_minimal_symbol (p, NULL, objfile);
     }
 
-  return msym == NULL ? 0 : MSYMBOL_VALUE_ADDRESS (msym);
+  return msym.minsym == NULL ? 0 : MSYMBOL_VALUE_ADDRESS (msym.minsym);
 }
 
 static void
@@ -2256,7 +2256,7 @@ end_psymtab (struct objfile *objfile, struct partial_symtab *pst,
     {
       char *p;
       int n;
-      struct minimal_symbol *minsym;
+      struct bound_minimal_symbol minsym;
 
       p = strchr (last_function_name, ':');
       if (p == NULL)
@@ -2267,7 +2267,7 @@ end_psymtab (struct objfile *objfile, struct partial_symtab *pst,
       p[n] = 0;
 
       minsym = lookup_minimal_symbol (p, pst->filename, objfile);
-      if (minsym == NULL)
+      if (minsym.minsym == NULL)
 	{
 	  /* Sun Fortran appends an underscore to the minimal symbol name,
 	     try again with an appended underscore if the minimal symbol
@@ -2277,8 +2277,9 @@ end_psymtab (struct objfile *objfile, struct partial_symtab *pst,
 	  minsym = lookup_minimal_symbol (p, pst->filename, objfile);
 	}
 
-      if (minsym)
-	pst->texthigh = MSYMBOL_VALUE_ADDRESS (minsym) + MSYMBOL_SIZE (minsym);
+      if (minsym.minsym)
+	pst->texthigh = (MSYMBOL_VALUE_ADDRESS (minsym.minsym)
+			 + MSYMBOL_SIZE (minsym.minsym));
 
       last_function_name = NULL;
     }
diff --git a/gdb/dec-thread.c b/gdb/dec-thread.c
index 1057cfb..080640d 100644
--- a/gdb/dec-thread.c
+++ b/gdb/dec-thread.c
@@ -225,7 +225,7 @@ static pthreadDebugCallbacks_t debug_callbacks =
 static void
 enable_dec_thread (void)
 {
-  struct minimal_symbol *msym;
+  struct bound_minimal_symbol msym;
   void* caller_context;
   int status;
 
@@ -234,14 +234,14 @@ enable_dec_thread (void)
     return;
 
   msym = lookup_minimal_symbol ("__pthread_dbg_symtable", NULL, NULL);
-  if (msym == NULL)
+  if (msym.minsym == NULL)
     {
       debug ("enable_dec_thread: No __pthread_dbg_symtable");
       return;
     }
 
   status = pthreadDebugContextInit (&caller_context, &debug_callbacks,
-                                    (void *) SYMBOL_VALUE_ADDRESS (msym),
+                                    (void *) SYMBOL_VALUE_ADDRESS (msym.minsym),
                                     &debug_context);
   if (status != ESUCCESS)
     {
diff --git a/gdb/dwarf2loc.c b/gdb/dwarf2loc.c
index 430e749..e109ff6 100644
--- a/gdb/dwarf2loc.c
+++ b/gdb/dwarf2loc.c
@@ -588,23 +588,24 @@ call_site_to_target_addr (struct gdbarch *call_site_gdbarch,
     case FIELD_LOC_KIND_PHYSNAME:
       {
 	const char *physname;
-	struct minimal_symbol *msym;
+	struct bound_minimal_symbol msym;
 
 	physname = FIELD_STATIC_PHYSNAME (call_site->target);
 
 	/* Handle both the mangled and demangled PHYSNAME.  */
 	msym = lookup_minimal_symbol (physname, NULL, NULL);
-	if (msym == NULL)
+	if (msym.minsym == NULL)
 	  {
-	    msym = lookup_minimal_symbol_by_pc (call_site->pc - 1).minsym;
+	    msym = lookup_minimal_symbol_by_pc (call_site->pc - 1);
 	    throw_error (NO_ENTRY_VALUE_ERROR,
 			 _("Cannot find function \"%s\" for a call site target "
 			   "at %s in %s"),
 			 physname, paddress (call_site_gdbarch, call_site->pc),
-			 msym == NULL ? "???" : MSYMBOL_PRINT_NAME (msym));
+			 (msym.minsym == NULL ? "???"
+			  : MSYMBOL_PRINT_NAME (msym.minsym)));
 			
 	  }
-	return MSYMBOL_VALUE_ADDRESS (msym);
+	return MSYMBOL_VALUE_ADDRESS (msym.minsym);
       }
 
     case FIELD_LOC_KIND_PHYSADDR:
diff --git a/gdb/elfread.c b/gdb/elfread.c
index 9ecd328..4d2e290 100644
--- a/gdb/elfread.c
+++ b/gdb/elfread.c
@@ -884,20 +884,20 @@ elf_gnu_ifunc_resolve_by_got (const char *name, CORE_ADDR *addr_p)
       CORE_ADDR pointer_address, addr;
       asection *plt;
       gdb_byte *buf = alloca (ptr_size);
-      struct minimal_symbol *msym;
+      struct bound_minimal_symbol msym;
 
       msym = lookup_minimal_symbol (name_got_plt, NULL, objfile);
-      if (msym == NULL)
+      if (msym.minsym == NULL)
 	continue;
-      if (MSYMBOL_TYPE (msym) != mst_slot_got_plt)
+      if (MSYMBOL_TYPE (msym.minsym) != mst_slot_got_plt)
 	continue;
-      pointer_address = MSYMBOL_VALUE_ADDRESS (msym);
+      pointer_address = MSYMBOL_VALUE_ADDRESS (msym.minsym);
 
       plt = bfd_get_section_by_name (obfd, ".plt");
       if (plt == NULL)
 	continue;
 
-      if (MSYMBOL_SIZE (msym) != ptr_size)
+      if (MSYMBOL_SIZE (msym.minsym) != ptr_size)
 	continue;
       if (target_read_memory (pointer_address, buf, ptr_size) != 0)
 	continue;
diff --git a/gdb/eval.c b/gdb/eval.c
index cd0c20e..36615e1 100644
--- a/gdb/eval.c
+++ b/gdb/eval.c
@@ -1113,7 +1113,7 @@ evaluate_subexp_standard (struct type *expect_type,
 	if (value_as_long (target) == 0)
  	  return value_from_longest (long_type, 0);
 	
-	if (lookup_minimal_symbol ("objc_msg_lookup", 0, 0))
+	if (lookup_minimal_symbol ("objc_msg_lookup", 0, 0).minsym)
 	  gnu_runtime = 1;
 	
 	/* Find the method dispatch (Apple runtime) or method lookup
diff --git a/gdb/findvar.c b/gdb/findvar.c
index 3e8bd08..56cbb2c 100644
--- a/gdb/findvar.c
+++ b/gdb/findvar.c
@@ -390,10 +390,7 @@ struct minsym_lookup_data
   /* The field where the callback should store the minimal symbol
      if found.  It should be initialized to NULL before the search
      is started.  */
-  struct minimal_symbol *result;
-
-  /* The objfile in which the symbol was found.  */
-  struct objfile *objfile;
+  struct bound_minimal_symbol result;
 };
 
 /* A callback function for gdbarch_iterate_over_objfiles_in_search_order.
@@ -406,13 +403,12 @@ minsym_lookup_iterator_cb (struct objfile *objfile, void *cb_data)
 {
   struct minsym_lookup_data *data = (struct minsym_lookup_data *) cb_data;
 
-  gdb_assert (data->result == NULL);
+  gdb_assert (data->result.minsym == NULL);
 
   data->result = lookup_minimal_symbol (data->name, NULL, objfile);
-  data->objfile = objfile;
 
   /* The iterator should stop iff a match was found.  */
-  return (data->result != NULL);
+  return (data->result.minsym != NULL);
 }
 
 /* A default implementation for the "la_read_var_value" hook in
@@ -572,18 +568,18 @@ default_read_var_value (struct symbol *var, struct frame_info *frame)
 	  (get_objfile_arch (SYMBOL_SYMTAB (var)->objfile),
 	   minsym_lookup_iterator_cb, &lookup_data,
 	   SYMBOL_SYMTAB (var)->objfile);
-	msym = lookup_data.result;
+	msym = lookup_data.result.minsym;
 
 	if (msym == NULL)
 	  error (_("No global symbol \"%s\"."), SYMBOL_LINKAGE_NAME (var));
 	if (overlay_debugging)
 	  addr = symbol_overlayed_address (MSYMBOL_VALUE_ADDRESS (msym),
-					   MSYMBOL_OBJ_SECTION (lookup_data.objfile,
+					   MSYMBOL_OBJ_SECTION (lookup_data.result.objfile,
 								msym));
 	else
 	  addr = MSYMBOL_VALUE_ADDRESS (msym);
 
-	obj_section = MSYMBOL_OBJ_SECTION (lookup_data.objfile, msym);
+	obj_section = MSYMBOL_OBJ_SECTION (lookup_data.result.objfile, msym);
 	if (obj_section
 	    && (obj_section->the_bfd_section->flags & SEC_THREAD_LOCAL) != 0)
 	  addr = target_translate_tls_address (obj_section->objfile, addr);
diff --git a/gdb/frame.c b/gdb/frame.c
index a2645b5..40dc1d5 100644
--- a/gdb/frame.c
+++ b/gdb/frame.c
@@ -2007,18 +2007,18 @@ frame_debug_got_null_frame (struct frame_info *this_frame,
 static int
 inside_main_func (struct frame_info *this_frame)
 {
-  struct minimal_symbol *msymbol;
+  struct bound_minimal_symbol msymbol;
   CORE_ADDR maddr;
 
   if (symfile_objfile == 0)
     return 0;
   msymbol = lookup_minimal_symbol (main_name (), NULL, symfile_objfile);
-  if (msymbol == NULL)
+  if (msymbol.minsym == NULL)
     return 0;
   /* Make certain that the code, and not descriptor, address is
      returned.  */
   maddr = gdbarch_convert_from_func_ptr_addr (get_frame_arch (this_frame),
-					      MSYMBOL_VALUE_ADDRESS (msymbol),
+					      MSYMBOL_VALUE_ADDRESS (msymbol.minsym),
 					      &current_target);
   return maddr == get_frame_func (this_frame);
 }
diff --git a/gdb/frv-tdep.c b/gdb/frv-tdep.c
index 2437c9d..acb0ba3 100644
--- a/gdb/frv-tdep.c
+++ b/gdb/frv-tdep.c
@@ -1391,7 +1391,7 @@ frv_frame_this_id (struct frame_info *this_frame,
     = frv_frame_unwind_cache (this_frame, this_prologue_cache);
   CORE_ADDR base;
   CORE_ADDR func;
-  struct minimal_symbol *msym_stack;
+  struct bound_minimal_symbol msym_stack;
   struct frame_id id;
 
   /* The FUNC is easy.  */
@@ -1399,7 +1399,8 @@ frv_frame_this_id (struct frame_info *this_frame,
 
   /* Check if the stack is empty.  */
   msym_stack = lookup_minimal_symbol ("_stack", NULL, NULL);
-  if (msym_stack && info->base == MSYMBOL_VALUE_ADDRESS (msym_stack))
+  if (msym_stack.minsym
+      && info->base == MSYMBOL_VALUE_ADDRESS (msym_stack.minsym))
     return;
 
   /* Hopefully the prologue analysis either correctly determined the
diff --git a/gdb/gcore.c b/gdb/gcore.c
index b80a97b..e225080 100644
--- a/gdb/gcore.c
+++ b/gdb/gcore.c
@@ -268,13 +268,13 @@ call_target_sbrk (int sbrk_arg)
   struct value *sbrk_fn, *ret;
   bfd_vma tmp;
 
-  if (lookup_minimal_symbol ("sbrk", NULL, NULL) != NULL)
+  if (lookup_minimal_symbol ("sbrk", NULL, NULL).minsym != NULL)
     {
       sbrk_fn = find_function_in_inferior ("sbrk", &sbrk_objf);
       if (sbrk_fn == NULL)
 	return (bfd_vma) 0;
     }
-  else if (lookup_minimal_symbol ("_sbrk", NULL, NULL) != NULL)
+  else if (lookup_minimal_symbol ("_sbrk", NULL, NULL).minsym != NULL)
     {
       sbrk_fn = find_function_in_inferior ("_sbrk", &sbrk_objf);
       if (sbrk_fn == NULL)
diff --git a/gdb/glibc-tdep.c b/gdb/glibc-tdep.c
index 4dd2415..99b504f 100644
--- a/gdb/glibc-tdep.c
+++ b/gdb/glibc-tdep.c
@@ -59,14 +59,14 @@ glibc_skip_solib_resolver (struct gdbarch *gdbarch, CORE_ADDR pc)
   if (resolver.minsym)
     {
       /* The dynamic linker began using this name in early 2005.  */
-      struct minimal_symbol *fixup
+      struct bound_minimal_symbol fixup
 	= lookup_minimal_symbol ("_dl_fixup", NULL, resolver.objfile);
       
       /* This is the name used in older versions.  */
-      if (! fixup)
+      if (! fixup.minsym)
         fixup = lookup_minimal_symbol ("fixup", NULL, resolver.objfile);
 
-      if (fixup && MSYMBOL_VALUE_ADDRESS (fixup) == pc)
+      if (fixup.minsym && MSYMBOL_VALUE_ADDRESS (fixup.minsym) == pc)
 	return frame_unwind_caller_pc (get_current_frame ());
     }
 
diff --git a/gdb/gnu-v3-abi.c b/gdb/gnu-v3-abi.c
index 6311f92..35f8e7b 100644
--- a/gdb/gnu-v3-abi.c
+++ b/gdb/gnu-v3-abi.c
@@ -1122,16 +1122,17 @@ gnuv3_get_typeid (struct value *value)
   else
     {
       char *sym_name;
-      struct minimal_symbol *minsym;
+      struct bound_minimal_symbol minsym;
 
       sym_name = concat ("typeinfo for ", typename, (char *) NULL);
       make_cleanup (xfree, sym_name);
       minsym = lookup_minimal_symbol (sym_name, NULL, NULL);
 
-      if (minsym == NULL)
+      if (minsym.minsym == NULL)
 	error (_("could not find typeinfo symbol for '%s'"), typename);
 
-      result = value_at_lazy (typeinfo_type, MSYMBOL_VALUE_ADDRESS (minsym));
+      result = value_at_lazy (typeinfo_type,
+			      MSYMBOL_VALUE_ADDRESS (minsym.minsym));
     }
 
   do_cleanups (cleanup);
@@ -1209,7 +1210,7 @@ gnuv3_skip_trampoline (struct frame_info *frame, CORE_ADDR stop_pc)
 {
   CORE_ADDR real_stop_pc, method_stop_pc, func_addr;
   struct gdbarch *gdbarch = get_frame_arch (frame);
-  struct minimal_symbol *thunk_sym, *fn_sym;
+  struct bound_minimal_symbol thunk_sym, fn_sym;
   struct obj_section *section;
   const char *thunk_name, *fn_name;
   
@@ -1218,24 +1219,24 @@ gnuv3_skip_trampoline (struct frame_info *frame, CORE_ADDR stop_pc)
     real_stop_pc = stop_pc;
 
   /* Find the linker symbol for this potential thunk.  */
-  thunk_sym = lookup_minimal_symbol_by_pc (real_stop_pc).minsym;
+  thunk_sym = lookup_minimal_symbol_by_pc (real_stop_pc);
   section = find_pc_section (real_stop_pc);
-  if (thunk_sym == NULL || section == NULL)
+  if (thunk_sym.minsym == NULL || section == NULL)
     return 0;
 
   /* The symbol's demangled name should be something like "virtual
      thunk to FUNCTION", where FUNCTION is the name of the function
      being thunked to.  */
-  thunk_name = MSYMBOL_DEMANGLED_NAME (thunk_sym);
+  thunk_name = MSYMBOL_DEMANGLED_NAME (thunk_sym.minsym);
   if (thunk_name == NULL || strstr (thunk_name, " thunk to ") == NULL)
     return 0;
 
   fn_name = strstr (thunk_name, " thunk to ") + strlen (" thunk to ");
   fn_sym = lookup_minimal_symbol (fn_name, NULL, section->objfile);
-  if (fn_sym == NULL)
+  if (fn_sym.minsym == NULL)
     return 0;
 
-  method_stop_pc = MSYMBOL_VALUE_ADDRESS (fn_sym);
+  method_stop_pc = MSYMBOL_VALUE_ADDRESS (fn_sym.minsym);
 
   /* Some targets have minimal symbols pointing to function descriptors
      (powerpc 64 for example).  Make sure to retrieve the address
diff --git a/gdb/go-lang.c b/gdb/go-lang.c
index cbb0505..42535df 100644
--- a/gdb/go-lang.c
+++ b/gdb/go-lang.c
@@ -56,10 +56,10 @@ static const char GO_MAIN_MAIN[] = "main.main";
 const char *
 go_main_name (void)
 {
-  struct minimal_symbol *msym;
+  struct bound_minimal_symbol msym;
 
   msym = lookup_minimal_symbol (GO_MAIN_MAIN, NULL, NULL);
-  if (msym != NULL)
+  if (msym.minsym != NULL)
     return GO_MAIN_MAIN;
 
   /* No known entry procedure found, the main program is probably not Go.  */
diff --git a/gdb/hppa-hpux-tdep.c b/gdb/hppa-hpux-tdep.c
index 31b557dc..e9f067d 100644
--- a/gdb/hppa-hpux-tdep.c
+++ b/gdb/hppa-hpux-tdep.c
@@ -460,7 +460,7 @@ hppa_hpux_skip_trampoline_code (struct frame_info *frame, CORE_ADDR pc)
 	  (curr_inst == 0xeaa0d002))
 	{
 	  struct bound_minimal_symbol stubsym;
-	  struct minimal_symbol *libsym;
+	  struct bound_minimal_symbol libsym;
 
 	  stubsym = lookup_minimal_symbol_by_pc (loc);
 	  if (stubsym.minsym == NULL)
@@ -471,14 +471,14 @@ hppa_hpux_skip_trampoline_code (struct frame_info *frame, CORE_ADDR pc)
 
 	  libsym = lookup_minimal_symbol (MSYMBOL_LINKAGE_NAME (stubsym.minsym),
 					  NULL, NULL);
-	  if (libsym == NULL)
+	  if (libsym.minsym == NULL)
 	    {
 	      warning (_("Unable to find library symbol for %s."),
 		       MSYMBOL_PRINT_NAME (stubsym.minsym));
 	      return orig_pc == pc ? 0 : pc & ~0x3;
 	    }
 
-	  return MSYMBOL_VALUE (libsym);
+	  return MSYMBOL_VALUE (libsym.minsym);
 	}
 
       /* Does it look like bl X,%rp or bl X,%r0?  Another way to do a
@@ -1014,7 +1014,7 @@ hppa_hpux_find_import_stub_for_addr (CORE_ADDR funcaddr)
 {
   struct objfile *objfile;
   struct bound_minimal_symbol funsym;
-  struct minimal_symbol *stubsym;
+  struct bound_minimal_symbol stubsym;
   CORE_ADDR stubaddr;
 
   funsym = lookup_minimal_symbol_by_pc (funcaddr);
@@ -1025,17 +1025,17 @@ hppa_hpux_find_import_stub_for_addr (CORE_ADDR funcaddr)
       stubsym = lookup_minimal_symbol_solib_trampoline
 	(MSYMBOL_LINKAGE_NAME (funsym.minsym), objfile);
 
-      if (stubsym)
+      if (stubsym.minsym)
 	{
 	  struct unwind_table_entry *u;
 
-	  u = find_unwind_entry (MSYMBOL_VALUE (stubsym));
+	  u = find_unwind_entry (MSYMBOL_VALUE (stubsym.minsym));
 	  if (u == NULL 
 	      || (u->stub_unwind.stub_type != IMPORT
 		  && u->stub_unwind.stub_type != IMPORT_SHLIB))
 	    continue;
 
-          stubaddr = MSYMBOL_VALUE (stubsym);
+          stubaddr = MSYMBOL_VALUE (stubsym.minsym);
 
 	  /* If we found an IMPORT stub, then we can stop searching;
 	     if we found an IMPORT_SHLIB, we want to continue the search
diff --git a/gdb/hppa-tdep.c b/gdb/hppa-tdep.c
index aaef5a1..05ca007 100644
--- a/gdb/hppa-tdep.c
+++ b/gdb/hppa-tdep.c
@@ -162,11 +162,11 @@ hppa_extract_17 (unsigned word)
 CORE_ADDR 
 hppa_symbol_address(const char *sym)
 {
-  struct minimal_symbol *minsym;
+  struct bound_minimal_symbol minsym;
 
   minsym = lookup_minimal_symbol (sym, NULL, NULL);
-  if (minsym)
-    return MSYMBOL_VALUE_ADDRESS (minsym);
+  if (minsym.minsym)
+    return MSYMBOL_VALUE_ADDRESS (minsym.minsym);
   else
     return (CORE_ADDR)-1;
 }
@@ -2463,12 +2463,13 @@ hppa_unwind_pc (struct gdbarch *gdbarch, struct frame_info *next_frame)
 /* Return the minimal symbol whose name is NAME and stub type is STUB_TYPE.
    Return NULL if no such symbol was found.  */
 
-struct minimal_symbol *
+struct bound_minimal_symbol
 hppa_lookup_stub_minimal_symbol (const char *name,
                                  enum unwind_stub_types stub_type)
 {
   struct objfile *objfile;
   struct minimal_symbol *msym;
+  struct bound_minimal_symbol result = { NULL, NULL };
 
   ALL_MSYMBOLS (objfile, msym)
     {
@@ -2478,11 +2479,15 @@ hppa_lookup_stub_minimal_symbol (const char *name,
 
           u = find_unwind_entry (MSYMBOL_VALUE (msym));
           if (u != NULL && u->stub_unwind.stub_type == stub_type)
-            return msym;
+	    {
+	      result.objfile = objfile;
+	      result.minsym = msym;
+	      return result;
+	    }
         }
     }
 
-  return NULL;
+  return result;
 }
 
 static void
diff --git a/gdb/hppa-tdep.h b/gdb/hppa-tdep.h
index 7c45ea8..0669ce3 100644
--- a/gdb/hppa-tdep.h
+++ b/gdb/hppa-tdep.h
@@ -240,7 +240,7 @@ extern void hppa_write_pc (struct regcache *regcache, CORE_ADDR pc);
 extern CORE_ADDR hppa_unwind_pc (struct gdbarch *gdbarch,
 				 struct frame_info *next_frame);
 
-extern struct minimal_symbol *
+extern struct bound_minimal_symbol
   hppa_lookup_stub_minimal_symbol (const char *name,
                                    enum unwind_stub_types stub_type);
 
diff --git a/gdb/jit.c b/gdb/jit.c
index 0100253..53394c4 100644
--- a/gdb/jit.c
+++ b/gdb/jit.c
@@ -1016,7 +1016,7 @@ jit_breakpoint_re_set_internal (struct gdbarch *gdbarch,
 				struct jit_program_space_data *ps_data)
 {
   struct bound_minimal_symbol reg_symbol;
-  struct minimal_symbol *desc_symbol;
+  struct bound_minimal_symbol desc_symbol;
   struct jit_objfile_data *objf_data;
   CORE_ADDR addr;
 
@@ -1031,12 +1031,13 @@ jit_breakpoint_re_set_internal (struct gdbarch *gdbarch,
 
       desc_symbol = lookup_minimal_symbol (jit_descriptor_name, NULL,
 					   reg_symbol.objfile);
-      if (desc_symbol == NULL || MSYMBOL_VALUE_ADDRESS (desc_symbol) == 0)
+      if (desc_symbol.minsym == NULL
+	  || MSYMBOL_VALUE_ADDRESS (desc_symbol.minsym) == 0)
 	return 1;
 
       objf_data = get_jit_objfile_data (reg_symbol.objfile);
       objf_data->register_code = reg_symbol.minsym;
-      objf_data->descriptor = desc_symbol;
+      objf_data->descriptor = desc_symbol.minsym;
 
       ps_data->objfile = reg_symbol.objfile;
     }
diff --git a/gdb/linux-fork.c b/gdb/linux-fork.c
index ed695d2..9aece37 100644
--- a/gdb/linux-fork.c
+++ b/gdb/linux-fork.c
@@ -455,9 +455,10 @@ inferior_call_waitpid (ptid_t pptid, int pid)
   old_cleanup = make_cleanup (inferior_call_waitpid_cleanup, oldfp);
 
   /* Get the waitpid_fn.  */
-  if (lookup_minimal_symbol ("waitpid", NULL, NULL) != NULL)
+  if (lookup_minimal_symbol ("waitpid", NULL, NULL).minsym != NULL)
     waitpid_fn = find_function_in_inferior ("waitpid", &waitpid_objf);
-  if (!waitpid_fn && lookup_minimal_symbol ("_waitpid", NULL, NULL) != NULL)
+  if (!waitpid_fn
+      && lookup_minimal_symbol ("_waitpid", NULL, NULL).minsym != NULL)
     waitpid_fn = find_function_in_inferior ("_waitpid", &waitpid_objf);
   if (!waitpid_fn)
     goto out;
@@ -668,10 +669,10 @@ checkpoint_command (char *args, int from_tty)
   
   /* Make the inferior fork, record its (and gdb's) state.  */
 
-  if (lookup_minimal_symbol ("fork", NULL, NULL) != NULL)
+  if (lookup_minimal_symbol ("fork", NULL, NULL).minsym != NULL)
     fork_fn = find_function_in_inferior ("fork", &fork_objf);
   if (!fork_fn)
-    if (lookup_minimal_symbol ("_fork", NULL, NULL) != NULL)
+    if (lookup_minimal_symbol ("_fork", NULL, NULL).minsym != NULL)
       fork_fn = find_function_in_inferior ("fork", &fork_objf);
   if (!fork_fn)
     error (_("checkpoint: can't find fork function in inferior."));
diff --git a/gdb/linux-nat.c b/gdb/linux-nat.c
index aeb5582..4702bf5 100644
--- a/gdb/linux-nat.c
+++ b/gdb/linux-nat.c
@@ -5031,14 +5031,15 @@ Enables printf debugging output."),
 static int
 get_signo (const char *name)
 {
-  struct minimal_symbol *ms;
+  struct bound_minimal_symbol ms;
   int signo;
 
   ms = lookup_minimal_symbol (name, NULL, NULL);
-  if (ms == NULL)
+  if (ms.minsym == NULL)
     return 0;
 
-  if (target_read_memory (MSYMBOL_VALUE_ADDRESS (ms), (gdb_byte *) &signo,
+  if (target_read_memory (MSYMBOL_VALUE_ADDRESS (ms.minsym),
+			  (gdb_byte *) &signo,
 			  sizeof (signo)) != 0)
     return 0;
 
diff --git a/gdb/linux-thread-db.c b/gdb/linux-thread-db.c
index 7f23722..e1c5bce 100644
--- a/gdb/linux-thread-db.c
+++ b/gdb/linux-thread-db.c
@@ -565,16 +565,16 @@ enable_thread_event (int event, CORE_ADDR *bp)
 static int
 inferior_has_bug (const char *ver_symbol, int ver_major_min, int ver_minor_min)
 {
-  struct minimal_symbol *version_msym;
+  struct bound_minimal_symbol version_msym;
   CORE_ADDR version_addr;
   char *version;
   int err, got, retval = 0;
 
   version_msym = lookup_minimal_symbol (ver_symbol, NULL, NULL);
-  if (version_msym == NULL)
+  if (version_msym.minsym == NULL)
     return 0;
 
-  version_addr = MSYMBOL_VALUE_ADDRESS (version_msym);
+  version_addr = MSYMBOL_VALUE_ADDRESS (version_msym.minsym);
   got = target_read_string (version_addr, &version, 32, &err);
   if (err == 0 && memchr (version, 0, got) == &version[got -1])
     {
diff --git a/gdb/m32c-tdep.c b/gdb/m32c-tdep.c
index 899e45f..d6bc482 100644
--- a/gdb/m32c-tdep.c
+++ b/gdb/m32c-tdep.c
@@ -2240,14 +2240,15 @@ m32c_return_value (struct gdbarch *gdbarch,
 	  /* Everything else is passed in mem0, using as many bytes as
 	     needed.  This is not what the Renesas tools do, but it's
 	     what GCC does at the moment.  */
-	  struct minimal_symbol *mem0
+	  struct bound_minimal_symbol mem0
 	    = lookup_minimal_symbol ("mem0", NULL, NULL);
 
-	  if (! mem0)
+	  if (! mem0.minsym)
 	    error (_("The return value is stored in memory at 'mem0', "
 		     "but GDB cannot find\n"
 		     "its address."));
-	  read_memory (MSYMBOL_VALUE_ADDRESS (mem0), readbuf, valtype_len);
+	  read_memory (MSYMBOL_VALUE_ADDRESS (mem0.minsym), readbuf,
+		       valtype_len);
 	}
     }
 
@@ -2272,14 +2273,15 @@ m32c_return_value (struct gdbarch *gdbarch,
 	  /* Everything else is passed in mem0, using as many bytes as
 	     needed.  This is not what the Renesas tools do, but it's
 	     what GCC does at the moment.  */
-	  struct minimal_symbol *mem0
+	  struct bound_minimal_symbol mem0
 	    = lookup_minimal_symbol ("mem0", NULL, NULL);
 
-	  if (! mem0)
+	  if (! mem0.minsym)
 	    error (_("The return value is stored in memory at 'mem0', "
 		     "but GDB cannot find\n"
 		     " its address."));
-	  write_memory (MSYMBOL_VALUE_ADDRESS (mem0), writebuf, valtype_len);
+	  write_memory (MSYMBOL_VALUE_ADDRESS (mem0.minsym), writebuf,
+			valtype_len);
 	}
     }
 
@@ -2450,7 +2452,7 @@ m32c_m16c_address_to_pointer (struct gdbarch *gdbarch,
     {
       const char *func_name;
       char *tramp_name;
-      struct minimal_symbol *tramp_msym;
+      struct bound_minimal_symbol tramp_msym;
 
       /* Try to find a linker symbol at this address.  */
       struct bound_minimal_symbol func_msym
@@ -2473,7 +2475,7 @@ m32c_m16c_address_to_pointer (struct gdbarch *gdbarch,
          the name any more.  */
       xfree (tramp_name);
 
-      if (! tramp_msym)
+      if (! tramp_msym.minsym)
 	{
 	  CORE_ADDR ptrval;
 
@@ -2505,7 +2507,7 @@ m32c_m16c_address_to_pointer (struct gdbarch *gdbarch,
       else
 	{
 	  /* The trampoline's address is our pointer.  */
-	  addr = MSYMBOL_VALUE_ADDRESS (tramp_msym);
+	  addr = MSYMBOL_VALUE_ADDRESS (tramp_msym.minsym);
 	}
     }
 
@@ -2542,7 +2544,7 @@ m32c_m16c_pointer_to_address (struct gdbarch *gdbarch,
           if (len > 4
               && strcmp (ptr_msym_name + len - 4, ".plt") == 0)
             {
-	      struct minimal_symbol *func_msym;
+	      struct bound_minimal_symbol func_msym;
               /* We have a .plt symbol; try to find the symbol for the
                  corresponding function.
 
@@ -2557,8 +2559,8 @@ m32c_m16c_pointer_to_address (struct gdbarch *gdbarch,
 
               /* If we do have such a symbol, return its value as the
                  function's true address.  */
-              if (func_msym)
-                ptr = MSYMBOL_VALUE_ADDRESS (func_msym);
+              if (func_msym.minsym)
+                ptr = MSYMBOL_VALUE_ADDRESS (func_msym.minsym);
             }
         }
       else
diff --git a/gdb/m32r-tdep.c b/gdb/m32r-tdep.c
index 52a3170..2af5774 100644
--- a/gdb/m32r-tdep.c
+++ b/gdb/m32r-tdep.c
@@ -836,7 +836,7 @@ m32r_frame_this_id (struct frame_info *this_frame,
     = m32r_frame_unwind_cache (this_frame, this_prologue_cache);
   CORE_ADDR base;
   CORE_ADDR func;
-  struct minimal_symbol *msym_stack;
+  struct bound_minimal_symbol msym_stack;
   struct frame_id id;
 
   /* The FUNC is easy.  */
@@ -844,7 +844,8 @@ m32r_frame_this_id (struct frame_info *this_frame,
 
   /* Check if the stack is empty.  */
   msym_stack = lookup_minimal_symbol ("_stack", NULL, NULL);
-  if (msym_stack && info->base == MSYMBOL_VALUE_ADDRESS (msym_stack))
+  if (msym_stack.minsym
+      && info->base == MSYMBOL_VALUE_ADDRESS (msym_stack.minsym))
     return;
 
   /* Hopefully the prologue analysis either correctly determined the
diff --git a/gdb/m68hc11-tdep.c b/gdb/m68hc11-tdep.c
index e23747d..6f0092b 100644
--- a/gdb/m68hc11-tdep.c
+++ b/gdb/m68hc11-tdep.c
@@ -199,12 +199,12 @@ static int soft_reg_initialized = 0;
 static void
 m68hc11_get_register_info (struct m68hc11_soft_reg *reg, const char *name)
 {
-  struct minimal_symbol *msymbol;
+  struct bound_minimal_symbol msymbol;
 
   msymbol = lookup_minimal_symbol (name, NULL, NULL);
-  if (msymbol)
+  if (msymbol.minsym)
     {
-      reg->addr = MSYMBOL_VALUE_ADDRESS (msymbol);
+      reg->addr = MSYMBOL_VALUE_ADDRESS (msymbol.minsym);
       reg->name = xstrdup (name);
 
       /* Keep track of the address range for soft registers.  */
diff --git a/gdb/machoread.c b/gdb/machoread.c
index cb8f053..f189e99 100644
--- a/gdb/machoread.c
+++ b/gdb/machoread.c
@@ -429,19 +429,19 @@ static CORE_ADDR
 macho_resolve_oso_sym_with_minsym (struct objfile *main_objfile, asymbol *sym)
 {
   /* For common symbol and global symbols, use the min symtab.  */
-  struct minimal_symbol *msym;
+  struct bound_minimal_symbol msym;
   const char *name = sym->name;
 
   if (name[0] == bfd_get_symbol_leading_char (main_objfile->obfd))
     ++name;
   msym = lookup_minimal_symbol (name, NULL, main_objfile);
-  if (msym == NULL)
+  if (msym.minsym == NULL)
     {
       warning (_("can't find symbol '%s' in minsymtab"), name);
       return 0;
     }
   else
-    return MSYMBOL_VALUE_ADDRESS (msym);
+    return MSYMBOL_VALUE_ADDRESS (msym.minsym);
 }
 
 /* Add oso file OSO/ABFD as a symbol file.  */
diff --git a/gdb/minsyms.c b/gdb/minsyms.c
index dde7d90..8335d51 100644
--- a/gdb/minsyms.c
+++ b/gdb/minsyms.c
@@ -159,9 +159,9 @@ add_minsym_to_demangled_hash_table (struct minimal_symbol *sym,
    Obviously, there must be distinct mangled names for each of these,
    but the demangled names are all the same: S::S or S::~S.  */
 
-static struct bound_minimal_symbol
-lookup_minimal_symbol_internal (const char *name, const char *sfile,
-				struct objfile *objf)
+struct bound_minimal_symbol
+lookup_minimal_symbol (const char *name, const char *sfile,
+		       struct objfile *objf)
 {
   struct objfile *objfile;
   struct bound_minimal_symbol found_symbol = { NULL, NULL };
@@ -294,23 +294,10 @@ lookup_minimal_symbol_internal (const char *name, const char *sfile,
 
 /* See minsyms.h.  */
 
-struct minimal_symbol *
-lookup_minimal_symbol (const char *name, const char *sfile,
-		       struct objfile *objf)
-{
-  struct bound_minimal_symbol bms = lookup_minimal_symbol_internal (name,
-								    sfile,
-								    objf);
-
-  return bms.minsym;
-}
-
-/* See minsyms.h.  */
-
 struct bound_minimal_symbol
 lookup_bound_minimal_symbol (const char *name)
 {
-  return lookup_minimal_symbol_internal (name, NULL, NULL);
+  return lookup_minimal_symbol (name, NULL, NULL);
 }
 
 /* See minsyms.h.  */
@@ -349,25 +336,25 @@ iterate_over_minimal_symbols (struct objfile *objf, const char *name,
 
 /* See minsyms.h.  */
 
-struct minimal_symbol *
+struct bound_minimal_symbol
 lookup_minimal_symbol_text (const char *name, struct objfile *objf)
 {
   struct objfile *objfile;
   struct minimal_symbol *msymbol;
-  struct minimal_symbol *found_symbol = NULL;
-  struct minimal_symbol *found_file_symbol = NULL;
+  struct bound_minimal_symbol found_symbol = { NULL, NULL };
+  struct bound_minimal_symbol found_file_symbol = { NULL, NULL };
 
   unsigned int hash = msymbol_hash (name) % MINIMAL_SYMBOL_HASH_SIZE;
 
   for (objfile = object_files;
-       objfile != NULL && found_symbol == NULL;
+       objfile != NULL && found_symbol.minsym == NULL;
        objfile = objfile->next)
     {
       if (objf == NULL || objf == objfile
 	  || objf == objfile->separate_debug_objfile_backlink)
 	{
 	  for (msymbol = objfile->msymbol_hash[hash];
-	       msymbol != NULL && found_symbol == NULL;
+	       msymbol != NULL && found_symbol.minsym == NULL;
 	       msymbol = msymbol->hash_next)
 	    {
 	      if (strcmp (MSYMBOL_LINKAGE_NAME (msymbol), name) == 0 &&
@@ -378,10 +365,12 @@ lookup_minimal_symbol_text (const char *name, struct objfile *objf)
 		  switch (MSYMBOL_TYPE (msymbol))
 		    {
 		    case mst_file_text:
-		      found_file_symbol = msymbol;
+		      found_file_symbol.minsym = msymbol;
+		      found_file_symbol.objfile = objfile;
 		      break;
 		    default:
-		      found_symbol = msymbol;
+		      found_symbol.minsym = msymbol;
+		      found_symbol.objfile = objfile;
 		      break;
 		    }
 		}
@@ -389,14 +378,11 @@ lookup_minimal_symbol_text (const char *name, struct objfile *objf)
 	}
     }
   /* External symbols are best.  */
-  if (found_symbol)
+  if (found_symbol.minsym)
     return found_symbol;
 
   /* File-local symbols are next best.  */
-  if (found_file_symbol)
-    return found_file_symbol;
-
-  return NULL;
+  return found_file_symbol;
 }
 
 /* See minsyms.h.  */
@@ -433,35 +419,39 @@ lookup_minimal_symbol_by_pc_name (CORE_ADDR pc, const char *name,
 
 /* See minsyms.h.  */
 
-struct minimal_symbol *
+struct bound_minimal_symbol
 lookup_minimal_symbol_solib_trampoline (const char *name,
 					struct objfile *objf)
 {
   struct objfile *objfile;
   struct minimal_symbol *msymbol;
-  struct minimal_symbol *found_symbol = NULL;
+  struct bound_minimal_symbol found_symbol = { NULL, NULL };
 
   unsigned int hash = msymbol_hash (name) % MINIMAL_SYMBOL_HASH_SIZE;
 
   for (objfile = object_files;
-       objfile != NULL && found_symbol == NULL;
+       objfile != NULL;
        objfile = objfile->next)
     {
       if (objf == NULL || objf == objfile
 	  || objf == objfile->separate_debug_objfile_backlink)
 	{
 	  for (msymbol = objfile->msymbol_hash[hash];
-	       msymbol != NULL && found_symbol == NULL;
+	       msymbol != NULL;
 	       msymbol = msymbol->hash_next)
 	    {
 	      if (strcmp (MSYMBOL_LINKAGE_NAME (msymbol), name) == 0 &&
 		  MSYMBOL_TYPE (msymbol) == mst_solib_trampoline)
-		return msymbol;
+		{
+		  found_symbol.objfile = objfile;
+		  found_symbol.minsym = msymbol;
+		  return found_symbol;
+		}
 	    }
 	}
     }
 
-  return NULL;
+  return found_symbol;
 }
 
 /* Search through the minimal symbol table for each objfile and find
diff --git a/gdb/minsyms.h b/gdb/minsyms.h
index f201a73..a11b5e8 100644
--- a/gdb/minsyms.h
+++ b/gdb/minsyms.h
@@ -164,17 +164,17 @@ unsigned int msymbol_hash_iw (const char *);
 
 /* Look through all the current minimal symbol tables and find the
    first minimal symbol that matches NAME.  If OBJF is non-NULL, limit
-   the search to that objfile.  If SFILE is non-NULL, the only file-scope
-   symbols considered will be from that source file (global symbols are
-   still preferred).  Returns a pointer to the minimal symbol that
-   matches, or NULL if no match is found.  */
+   the search to that objfile.  If SFILE is non-NULL, the only
+   file-scope symbols considered will be from that source file (global
+   symbols are still preferred).  Returns a bound minimal symbol that
+   matches, or an empty bound minimal symbol if no match is found.  */
 
-struct minimal_symbol *lookup_minimal_symbol (const char *,
-					      const char *,
-					      struct objfile *);
+struct bound_minimal_symbol lookup_minimal_symbol (const char *,
+						   const char *,
+						   struct objfile *);
 
-/* Like lookup_minimal_symbol, but searches all files and objfiles
-   and returns a bound minimal symbol.  */
+/* Like lookup_minimal_symbol, but searches all files and
+   objfiles.  */
 
 struct bound_minimal_symbol lookup_bound_minimal_symbol (const char *);
 
@@ -185,13 +185,14 @@ struct bound_minimal_symbol lookup_minimal_symbol_and_objfile (const char *);
 
 /* Look through all the current minimal symbol tables and find the
    first minimal symbol that matches NAME and has text type.  If OBJF
-   is non-NULL, limit the search to that objfile.  Returns a pointer
-   to the minimal symbol that matches, or NULL if no match is found.
+   is non-NULL, limit the search to that objfile.  Returns a bound
+   minimal symbol that matches, or an "empty" bound minimal symbol
+   otherwise.
 
    This function only searches the mangled (linkage) names.  */
 
-struct minimal_symbol *lookup_minimal_symbol_text (const char *,
-						   struct objfile *);
+struct bound_minimal_symbol lookup_minimal_symbol_text (const char *,
+							struct objfile *);
 
 /* Look through all the current minimal symbol tables and find the
    first minimal symbol that matches NAME and is a solib trampoline.
@@ -201,7 +202,7 @@ struct minimal_symbol *lookup_minimal_symbol_text (const char *,
 
    This function only searches the mangled (linkage) names.  */
 
-struct minimal_symbol *lookup_minimal_symbol_solib_trampoline
+struct bound_minimal_symbol lookup_minimal_symbol_solib_trampoline
     (const char *,
      struct objfile *);
 
diff --git a/gdb/mips-linux-tdep.c b/gdb/mips-linux-tdep.c
index 91ef012..89c578e 100644
--- a/gdb/mips-linux-tdep.c
+++ b/gdb/mips-linux-tdep.c
@@ -822,11 +822,11 @@ mips_linux_in_dynsym_resolve_code (CORE_ADDR pc)
 static CORE_ADDR
 mips_linux_skip_resolver (struct gdbarch *gdbarch, CORE_ADDR pc)
 {
-  struct minimal_symbol *resolver;
+  struct bound_minimal_symbol resolver;
 
   resolver = lookup_minimal_symbol ("__dl_runtime_resolve", NULL, NULL);
 
-  if (resolver && MSYMBOL_VALUE_ADDRESS (resolver) == pc)
+  if (resolver.minsym && MSYMBOL_VALUE_ADDRESS (resolver.minsym) == pc)
     return frame_unwind_caller_pc (get_current_frame ());
 
   return glibc_skip_solib_resolver (gdbarch, pc);
diff --git a/gdb/objc-lang.c b/gdb/objc-lang.c
index e1f2b14..54a5acf 100644
--- a/gdb/objc-lang.c
+++ b/gdb/objc-lang.c
@@ -120,9 +120,9 @@ lookup_objc_class (struct gdbarch *gdbarch, char *classname)
       return 0;
     }
 
-  if (lookup_minimal_symbol("objc_lookUpClass", 0, 0))
+  if (lookup_minimal_symbol("objc_lookUpClass", 0, 0).minsym)
     function = find_function_in_inferior("objc_lookUpClass", NULL);
-  else if (lookup_minimal_symbol ("objc_lookup_class", 0, 0))
+  else if (lookup_minimal_symbol ("objc_lookup_class", 0, 0).minsym)
     function = find_function_in_inferior("objc_lookup_class", NULL);
   else
     {
@@ -149,9 +149,9 @@ lookup_child_selector (struct gdbarch *gdbarch, char *selname)
       return 0;
     }
 
-  if (lookup_minimal_symbol("sel_getUid", 0, 0))
+  if (lookup_minimal_symbol("sel_getUid", 0, 0).minsym)
     function = find_function_in_inferior("sel_getUid", NULL);
-  else if (lookup_minimal_symbol ("sel_get_any_uid", 0, 0))
+  else if (lookup_minimal_symbol ("sel_get_any_uid", 0, 0).minsym)
     function = find_function_in_inferior("sel_get_any_uid", NULL);
   else
     {
@@ -181,17 +181,17 @@ value_nsstring (struct gdbarch *gdbarch, char *ptr, int len)
   stringValue[2] = value_string(ptr, len, char_type);
   stringValue[2] = value_coerce_array(stringValue[2]);
   /* _NSNewStringFromCString replaces "istr" after Lantern2A.  */
-  if (lookup_minimal_symbol("_NSNewStringFromCString", 0, 0))
+  if (lookup_minimal_symbol("_NSNewStringFromCString", 0, 0).minsym)
     {
       function = find_function_in_inferior("_NSNewStringFromCString", NULL);
       nsstringValue = call_function_by_hand(function, 1, &stringValue[2]);
     }
-  else if (lookup_minimal_symbol("istr", 0, 0))
+  else if (lookup_minimal_symbol("istr", 0, 0).minsym)
     {
       function = find_function_in_inferior("istr", NULL);
       nsstringValue = call_function_by_hand(function, 1, &stringValue[2]);
     }
-  else if (lookup_minimal_symbol("+[NSString stringWithCString:]", 0, 0))
+  else if (lookup_minimal_symbol("+[NSString stringWithCString:]", 0, 0).minsym)
     {
       function
 	= find_function_in_inferior("+[NSString stringWithCString:]", NULL);
@@ -1152,11 +1152,12 @@ find_imps (const char *method, VEC (const_char_ptr) **symbol_names)
 		       SYMBOL_NATURAL_NAME (sym));
       else
 	{
-	  struct minimal_symbol *msym = lookup_minimal_symbol (selector, 0, 0);
+	  struct bound_minimal_symbol msym
+	    = lookup_minimal_symbol (selector, 0, 0);
 
-	  if (msym != NULL) 
+	  if (msym.minsym != NULL) 
 	    VEC_safe_push (const_char_ptr, *symbol_names,
-			   MSYMBOL_NATURAL_NAME (msym));
+			   MSYMBOL_NATURAL_NAME (msym.minsym));
 	}
     }
 
diff --git a/gdb/obsd-tdep.c b/gdb/obsd-tdep.c
index a0bf462..fc100e2 100644
--- a/gdb/obsd-tdep.c
+++ b/gdb/obsd-tdep.c
@@ -26,10 +26,10 @@
 CORE_ADDR
 obsd_skip_solib_resolver (struct gdbarch *gdbarch, CORE_ADDR pc)
 {
-  struct minimal_symbol *msym;
+  struct bound_minimal_symbol msym;
 
   msym = lookup_minimal_symbol("_dl_bind", NULL, NULL);
-  if (msym && MSYMBOL_VALUE_ADDRESS (msym) == pc)
+  if (msym.minsym && MSYMBOL_VALUE_ADDRESS (msym.minsym) == pc)
     return frame_unwind_caller_pc (get_current_frame ());
   else
     return find_solib_trampoline_target (get_current_frame (), pc);
diff --git a/gdb/p-lang.c b/gdb/p-lang.c
index 27ea4ce..856beb3 100644
--- a/gdb/p-lang.c
+++ b/gdb/p-lang.c
@@ -59,23 +59,23 @@ static const char GPC_MAIN_PROGRAM_NAME_2[] = "pascal_main_program";
 const char *
 pascal_main_name (void)
 {
-  struct minimal_symbol *msym;
+  struct bound_minimal_symbol msym;
 
   msym = lookup_minimal_symbol (GPC_P_INITIALIZE, NULL, NULL);
 
   /*  If '_p_initialize' was not found, the main program is likely not
      written in Pascal.  */
-  if (msym == NULL)
+  if (msym.minsym == NULL)
     return NULL;
 
   msym = lookup_minimal_symbol (GPC_MAIN_PROGRAM_NAME_1, NULL, NULL);
-  if (msym != NULL)
+  if (msym.minsym != NULL)
     {
       return GPC_MAIN_PROGRAM_NAME_1;
     }
 
   msym = lookup_minimal_symbol (GPC_MAIN_PROGRAM_NAME_2, NULL, NULL);
-  if (msym != NULL)
+  if (msym.minsym != NULL)
     {
       return GPC_MAIN_PROGRAM_NAME_2;
     }
diff --git a/gdb/ppc-linux-tdep.c b/gdb/ppc-linux-tdep.c
index 66cbba3..dee6938 100644
--- a/gdb/ppc-linux-tdep.c
+++ b/gdb/ppc-linux-tdep.c
@@ -1011,7 +1011,7 @@ static CORE_ADDR spe_context_cache_address;
 static void
 ppc_linux_spe_context_lookup (struct objfile *objfile)
 {
-  struct minimal_symbol *sym;
+  struct bound_minimal_symbol sym;
 
   if (!objfile)
     {
@@ -1024,11 +1024,11 @@ ppc_linux_spe_context_lookup (struct objfile *objfile)
     }
 
   sym = lookup_minimal_symbol ("__spe_current_active_context", NULL, objfile);
-  if (sym)
+  if (sym.minsym)
     {
       spe_context_objfile = objfile;
       spe_context_lm_addr = svr4_fetch_objfile_link_map (objfile);
-      spe_context_offset = MSYMBOL_VALUE_ADDRESS (sym);
+      spe_context_offset = MSYMBOL_VALUE_ADDRESS (sym.minsym);
       spe_context_cache_ptid = minus_one_ptid;
       spe_context_cache_address = 0;
       return;
diff --git a/gdb/ppc-sysv-tdep.c b/gdb/ppc-sysv-tdep.c
index 9cc9a43..124e4fa 100644
--- a/gdb/ppc-sysv-tdep.c
+++ b/gdb/ppc-sysv-tdep.c
@@ -1076,7 +1076,7 @@ convert_code_addr_to_desc_addr (CORE_ADDR code_addr, CORE_ADDR *desc_addr)
 {
   struct obj_section *dot_fn_section;
   struct bound_minimal_symbol dot_fn;
-  struct minimal_symbol *fn;
+  struct bound_minimal_symbol fn;
 
   /* Find the minimal symbol that corresponds to CODE_ADDR (should
      have a name of the form ".FN").  */
@@ -1094,10 +1094,10 @@ convert_code_addr_to_desc_addr (CORE_ADDR code_addr, CORE_ADDR *desc_addr)
      contain a minimal symbol with the same name.  */
   fn = lookup_minimal_symbol (MSYMBOL_LINKAGE_NAME (dot_fn.minsym) + 1, NULL,
 			      dot_fn_section->objfile);
-  if (fn == NULL)
+  if (fn.minsym == NULL)
     return 0;
   /* Found a descriptor.  */
-  (*desc_addr) = MSYMBOL_VALUE_ADDRESS (fn);
+  (*desc_addr) = MSYMBOL_VALUE_ADDRESS (fn.minsym);
   return 1;
 }
 
diff --git a/gdb/proc-service.c b/gdb/proc-service.c
index 2a21e78..96e4fe0 100644
--- a/gdb/proc-service.c
+++ b/gdb/proc-service.c
@@ -194,7 +194,7 @@ ps_err_e
 ps_pglobal_lookup (gdb_ps_prochandle_t ph, const char *obj,
 		   const char *name, psaddr_t *sym_addr)
 {
-  struct minimal_symbol *ms;
+  struct bound_minimal_symbol ms;
   struct cleanup *old_chain = save_current_program_space ();
   struct inferior *inf = find_inferior_pid (ptid_get_pid (ph->ptid));
   ps_err_e result;
@@ -203,11 +203,11 @@ ps_pglobal_lookup (gdb_ps_prochandle_t ph, const char *obj,
 
   /* FIXME: kettenis/2000-09-03: What should we do with OBJ?  */
   ms = lookup_minimal_symbol (name, NULL, NULL);
-  if (ms == NULL)
+  if (ms.minsym == NULL)
     result = PS_NOSYM;
   else
     {
-      *sym_addr = core_addr_to_ps_addr (MSYMBOL_VALUE_ADDRESS (ms));
+      *sym_addr = core_addr_to_ps_addr (MSYMBOL_VALUE_ADDRESS (ms.minsym));
       result = PS_OK;
     }
 
diff --git a/gdb/ravenscar-thread.c b/gdb/ravenscar-thread.c
index 4ed007d..d150412 100644
--- a/gdb/ravenscar-thread.c
+++ b/gdb/ravenscar-thread.c
@@ -102,13 +102,13 @@ ravenscar_update_inferior_ptid (void)
    and return its associated minimal symbol.
    Return NULL if not found.  */
 
-static struct minimal_symbol *
+static struct bound_minimal_symbol
 get_running_thread_msymbol (void)
 {
-  struct minimal_symbol *msym;
+  struct bound_minimal_symbol msym;
 
   msym = lookup_minimal_symbol (running_thread_name, NULL, NULL);
-  if (!msym)
+  if (!msym.minsym)
     /* Older versions of the GNAT runtime were using a different
        (less ideal) name for the symbol where the active thread ID
        is stored.  If we couldn't find the symbol using the latest
@@ -124,17 +124,18 @@ get_running_thread_msymbol (void)
 static int
 has_ravenscar_runtime (void)
 {
-  struct minimal_symbol *msym_ravenscar_runtime_initializer =
+  struct bound_minimal_symbol msym_ravenscar_runtime_initializer =
     lookup_minimal_symbol (ravenscar_runtime_initializer, NULL, NULL);
-  struct minimal_symbol *msym_known_tasks =
+  struct bound_minimal_symbol msym_known_tasks =
     lookup_minimal_symbol (known_tasks_name, NULL, NULL);
-  struct minimal_symbol *msym_first_task =
+  struct bound_minimal_symbol msym_first_task =
     lookup_minimal_symbol (first_task_name, NULL, NULL);
-  struct minimal_symbol *msym_running_thread = get_running_thread_msymbol ();
+  struct bound_minimal_symbol msym_running_thread
+    = get_running_thread_msymbol ();
 
-  return (msym_ravenscar_runtime_initializer
-	  && (msym_known_tasks || msym_first_task)
-	  && msym_running_thread);
+  return (msym_ravenscar_runtime_initializer.minsym
+	  && (msym_known_tasks.minsym || msym_first_task.minsym)
+	  && msym_running_thread.minsym);
 }
 
 /* Return True if the Ada Ravenscar run-time can be found in the
@@ -152,7 +153,7 @@ ravenscar_runtime_initialized (void)
 static CORE_ADDR
 get_running_thread_id (void)
 {
-  const struct minimal_symbol *object_msym = get_running_thread_msymbol ();
+  struct bound_minimal_symbol object_msym = get_running_thread_msymbol ();
   int object_size;
   int buf_size;
   gdb_byte *buf;
@@ -160,10 +161,10 @@ get_running_thread_id (void)
   struct type *builtin_type_void_data_ptr =
     builtin_type (target_gdbarch ())->builtin_data_ptr;
 
-  if (!object_msym)
+  if (!object_msym.minsym)
     return 0;
 
-  object_addr = MSYMBOL_VALUE_ADDRESS (object_msym);
+  object_addr = MSYMBOL_VALUE_ADDRESS (object_msym.minsym);
   object_size = TYPE_LENGTH (builtin_type_void_data_ptr);
   buf_size = object_size;
   buf = alloca (buf_size);
diff --git a/gdb/remote.c b/gdb/remote.c
index 9f9a1e4..8e9ef64 100644
--- a/gdb/remote.c
+++ b/gdb/remote.c
@@ -3670,7 +3670,7 @@ remote_check_symbols (void)
 {
   struct remote_state *rs = get_remote_state ();
   char *msg, *reply, *tmp;
-  struct minimal_symbol *sym;
+  struct bound_minimal_symbol sym;
   int end;
 
   /* The remote side has no concept of inferiors that aren't running
@@ -3705,12 +3705,12 @@ remote_check_symbols (void)
       end = hex2bin (tmp, (gdb_byte *) msg, strlen (tmp) / 2);
       msg[end] = '\0';
       sym = lookup_minimal_symbol (msg, NULL, NULL);
-      if (sym == NULL)
+      if (sym.minsym == NULL)
 	xsnprintf (msg, get_remote_packet_size (), "qSymbol::%s", &reply[8]);
       else
 	{
 	  int addr_size = gdbarch_addr_bit (target_gdbarch ()) / 8;
-	  CORE_ADDR sym_addr = MSYMBOL_VALUE_ADDRESS (sym);
+	  CORE_ADDR sym_addr = MSYMBOL_VALUE_ADDRESS (sym.minsym);
 
 	  /* If this is a function address, return the start of code
 	     instead of any data function descriptor.  */
diff --git a/gdb/sol-thread.c b/gdb/sol-thread.c
index 56d023b..599ef64 100644
--- a/gdb/sol-thread.c
+++ b/gdb/sol-thread.c
@@ -762,13 +762,13 @@ ps_err_e
 ps_pglobal_lookup (gdb_ps_prochandle_t ph, const char *ld_object_name,
 		   const char *ld_symbol_name, gdb_ps_addr_t *ld_symbol_addr)
 {
-  struct minimal_symbol *ms;
+  struct bound_minimal_symbol ms;
 
   ms = lookup_minimal_symbol (ld_symbol_name, NULL, NULL);
-  if (!ms)
+  if (!ms.minsym)
     return PS_NOSYM;
 
-  *ld_symbol_addr = SYMBOL_VALUE_ADDRESS (ms);
+  *ld_symbol_addr = SYMBOL_VALUE_ADDRESS (ms.minsym);
   return PS_OK;
 }
 
diff --git a/gdb/sol2-tdep.c b/gdb/sol2-tdep.c
index 27108a5..a4efd42 100644
--- a/gdb/sol2-tdep.c
+++ b/gdb/sol2-tdep.c
@@ -27,10 +27,10 @@
 CORE_ADDR
 sol2_skip_solib_resolver (struct gdbarch *gdbarch, CORE_ADDR pc)
 {
-  struct minimal_symbol *msym;
+  struct bound_minimal_symbol msym;
 
   msym = lookup_minimal_symbol("elf_bndr", NULL, NULL);
-  if (msym && MSYMBOL_VALUE_ADDRESS (msym) == pc)
+  if (msym.minsym && MSYMBOL_VALUE_ADDRESS (msym.minsym) == pc)
     return frame_unwind_caller_pc (get_current_frame ());
 
   return 0;
diff --git a/gdb/solib-dsbt.c b/gdb/solib-dsbt.c
index a5ceb95..61ccc4a 100644
--- a/gdb/solib-dsbt.c
+++ b/gdb/solib-dsbt.c
@@ -550,7 +550,7 @@ static CORE_ADDR
 lm_base (void)
 {
   enum bfd_endian byte_order = gdbarch_byte_order (target_gdbarch ());
-  struct minimal_symbol *got_sym;
+  struct bound_minimal_symbol got_sym;
   CORE_ADDR addr;
   gdb_byte buf[TIC6X_PTR_SIZE];
   struct dsbt_info *info = get_dsbt_info ();
@@ -570,9 +570,9 @@ lm_base (void)
   got_sym = lookup_minimal_symbol ("_GLOBAL_OFFSET_TABLE_", NULL,
 				   symfile_objfile);
 
-  if (got_sym != 0)
+  if (got_sym.minsym != 0)
     {
-      addr = MSYMBOL_VALUE_ADDRESS (got_sym);
+      addr = MSYMBOL_VALUE_ADDRESS (got_sym.minsym);
       if (solib_dsbt_debug)
 	fprintf_unfiltered (gdb_stdlog,
 			    "lm_base: get addr %x by _GLOBAL_OFFSET_TABLE_.\n",
diff --git a/gdb/solib-frv.c b/gdb/solib-frv.c
index acd46da..0b111bc 100644
--- a/gdb/solib-frv.c
+++ b/gdb/solib-frv.c
@@ -266,7 +266,7 @@ static CORE_ADDR
 lm_base (void)
 {
   enum bfd_endian byte_order = gdbarch_byte_order (target_gdbarch ());
-  struct minimal_symbol *got_sym;
+  struct bound_minimal_symbol got_sym;
   CORE_ADDR addr;
   gdb_byte buf[FRV_PTR_SIZE];
 
@@ -284,7 +284,7 @@ lm_base (void)
 
   got_sym = lookup_minimal_symbol ("_GLOBAL_OFFSET_TABLE_", NULL,
                                    symfile_objfile);
-  if (got_sym == 0)
+  if (got_sym.minsym == 0)
     {
       if (solib_frv_debug)
 	fprintf_unfiltered (gdb_stdlog,
@@ -292,7 +292,7 @@ lm_base (void)
       return 0;
     }
 
-  addr = MSYMBOL_VALUE_ADDRESS (got_sym) + 8;
+  addr = MSYMBOL_VALUE_ADDRESS (got_sym.minsym) + 8;
 
   if (solib_frv_debug)
     fprintf_unfiltered (gdb_stdlog,
@@ -919,14 +919,14 @@ frv_relocate_section_addresses (struct so_list *so,
 static CORE_ADDR
 main_got (void)
 {
-  struct minimal_symbol *got_sym;
+  struct bound_minimal_symbol got_sym;
 
   got_sym = lookup_minimal_symbol ("_GLOBAL_OFFSET_TABLE_",
 				   NULL, symfile_objfile);
-  if (got_sym == 0)
+  if (got_sym.minsym == 0)
     return 0;
 
-  return MSYMBOL_VALUE_ADDRESS (got_sym);
+  return MSYMBOL_VALUE_ADDRESS (got_sym.minsym);
 }
 
 /* Find the global pointer for the given function address ADDR.  */
diff --git a/gdb/solib-irix.c b/gdb/solib-irix.c
index 8eda4d4..d6a4c69 100644
--- a/gdb/solib-irix.c
+++ b/gdb/solib-irix.c
@@ -281,13 +281,13 @@ static CORE_ADDR debug_base;	/* Base of dynamic linker structures.  */
 static CORE_ADDR
 locate_base (void)
 {
-  struct minimal_symbol *msymbol;
+  struct bound_minimal_symbol msymbol;
   CORE_ADDR address = 0;
 
   msymbol = lookup_minimal_symbol (DEBUG_BASE, NULL, symfile_objfile);
-  if ((msymbol != NULL) && (MSYMBOL_VALUE_ADDRESS (msymbol) != 0))
+  if ((msymbol.minsym != NULL) && (MSYMBOL_VALUE_ADDRESS (msymbol.minsym) != 0))
     {
-      address = MSYMBOL_VALUE_ADDRESS (msymbol);
+      address = MSYMBOL_VALUE_ADDRESS (msymbol.minsym);
     }
   return (address);
 }
diff --git a/gdb/solib-som.c b/gdb/solib-som.c
index dd2d8f7..d9e4119 100644
--- a/gdb/solib-som.c
+++ b/gdb/solib-som.c
@@ -186,7 +186,7 @@ static void
 som_solib_create_inferior_hook (int from_tty)
 {
   enum bfd_endian byte_order = gdbarch_byte_order (target_gdbarch ());
-  struct minimal_symbol *msymbol;
+  struct bound_minimal_symbol msymbol;
   unsigned int dld_flags, status, have_endo;
   asection *shlib_info;
   gdb_byte buf[4];
@@ -216,10 +216,10 @@ som_solib_create_inferior_hook (int from_tty)
      annoyance to users of modern systems and foul up the testsuite as
      well.  As a result, the warnings have been disabled.  */
   msymbol = lookup_minimal_symbol ("__d_pid", NULL, symfile_objfile);
-  if (msymbol == NULL)
+  if (msymbol.minsym == NULL)
     goto keep_going;
 
-  anaddr = MSYMBOL_VALUE_ADDRESS (msymbol);
+  anaddr = MSYMBOL_VALUE_ADDRESS (msymbol.minsym);
   store_unsigned_integer (buf, 4, byte_order, ptid_get_pid (inferior_ptid));
   status = target_write_memory (anaddr, buf, 4);
   if (status != 0)
@@ -241,9 +241,9 @@ GDB will be unable to track shl_load/shl_unload calls"));
      We'll look first for the old flavor and then the new.  */
 
   msymbol = lookup_minimal_symbol ("_DLD_HOOK", NULL, symfile_objfile);
-  if (msymbol == NULL)
+  if (msymbol.minsym == NULL)
     msymbol = lookup_minimal_symbol ("__d_trap", NULL, symfile_objfile);
-  if (msymbol == NULL)
+  if (msymbol.minsym == NULL)
     {
       warning (_("\
 Unable to find _DLD_HOOK symbol in object file.\n\
@@ -251,22 +251,23 @@ Suggest linking with /opt/langtools/lib/end.o.\n\
 GDB will be unable to track shl_load/shl_unload calls"));
       goto keep_going;
     }
-  anaddr = MSYMBOL_VALUE_ADDRESS (msymbol);
+  anaddr = MSYMBOL_VALUE_ADDRESS (msymbol.minsym);
   dld_cache.hook.address = anaddr;
 
   /* Grrr, this might not be an export symbol!  We have to find the
      export stub.  */
-  msymbol = hppa_lookup_stub_minimal_symbol (MSYMBOL_LINKAGE_NAME (msymbol),
-                                             EXPORT);
-  if (msymbol != NULL)
+  msymbol
+    = hppa_lookup_stub_minimal_symbol (MSYMBOL_LINKAGE_NAME (msymbol.minsym),
+				       EXPORT);
+  if (msymbol.minsym != NULL)
     {
-      anaddr = MSYMBOL_VALUE (msymbol);
+      anaddr = MSYMBOL_VALUE (msymbol.minsym);
       dld_cache.hook_stub.address = anaddr;
     }
   store_unsigned_integer (buf, 4, byte_order, anaddr);
 
   msymbol = lookup_minimal_symbol ("__dld_hook", NULL, symfile_objfile);
-  if (msymbol == NULL)
+  if (msymbol.minsym == NULL)
     {
       warning (_("\
 Unable to find __dld_hook symbol in object file.\n\
@@ -274,13 +275,13 @@ Suggest linking with /opt/langtools/lib/end.o.\n\
 GDB will be unable to track shl_load/shl_unload calls"));
       goto keep_going;
     }
-  anaddr = MSYMBOL_VALUE_ADDRESS (msymbol);
+  anaddr = MSYMBOL_VALUE_ADDRESS (msymbol.minsym);
   status = target_write_memory (anaddr, buf, 4);
 
   /* Now set a shlib_event breakpoint at __d_trap so we can track
      significant shared library events.  */
   msymbol = lookup_minimal_symbol ("__d_trap", NULL, symfile_objfile);
-  if (msymbol == NULL)
+  if (msymbol.minsym == NULL)
     {
       warning (_("\
 Unable to find __dld_d_trap symbol in object file.\n\
@@ -289,7 +290,7 @@ GDB will be unable to track shl_load/shl_unload calls"));
       goto keep_going;
     }
   create_solib_event_breakpoint (target_gdbarch (),
-				 MSYMBOL_VALUE_ADDRESS (msymbol));
+				 MSYMBOL_VALUE_ADDRESS (msymbol.minsym));
 
   /* We have all the support usually found in end.o, so we can track
      shl_load and shl_unload calls.  */
@@ -300,12 +301,12 @@ keep_going:
   /* Get the address of __dld_flags, if no such symbol exists, then we can
      not debug the shared code.  */
   msymbol = lookup_minimal_symbol ("__dld_flags", NULL, NULL);
-  if (msymbol == NULL)
+  if (msymbol.minsym == NULL)
     {
       error (_("Unable to find __dld_flags symbol in object file."));
     }
 
-  anaddr = MSYMBOL_VALUE_ADDRESS (msymbol);
+  anaddr = MSYMBOL_VALUE_ADDRESS (msymbol.minsym);
 
   /* Read the current contents.  */
   status = target_read_memory (anaddr, buf, 4);
@@ -347,10 +348,10 @@ manpage for methods to privately map shared library text."));
      loaded at startup time (what a crock).  */
 
   msymbol = lookup_minimal_symbol ("_start", NULL, symfile_objfile);
-  if (msymbol == NULL)
+  if (msymbol.minsym == NULL)
     error (_("Unable to find _start symbol in object file."));
 
-  anaddr = MSYMBOL_VALUE_ADDRESS (msymbol);
+  anaddr = MSYMBOL_VALUE_ADDRESS (msymbol.minsym);
 
   /* Make the breakpoint at "_start" a shared library event breakpoint.  */
   create_solib_event_breakpoint (target_gdbarch (), anaddr);
@@ -368,7 +369,7 @@ som_solib_desire_dynamic_linker_symbols (void)
 {
   struct objfile *objfile;
   struct unwind_table_entry *u;
-  struct minimal_symbol *dld_msymbol;
+  struct bound_minimal_symbol dld_msymbol;
 
   /* Do we already know the value of these symbols?  If so, then
      we've no work to do.
@@ -382,31 +383,32 @@ som_solib_desire_dynamic_linker_symbols (void)
   ALL_OBJFILES (objfile)
   {
     dld_msymbol = lookup_minimal_symbol ("shl_load", NULL, objfile);
-    if (dld_msymbol != NULL)
+    if (dld_msymbol.minsym != NULL)
       {
-	dld_cache.load.address = MSYMBOL_VALUE (dld_msymbol);
+	dld_cache.load.address = MSYMBOL_VALUE (dld_msymbol.minsym);
 	dld_cache.load.unwind = find_unwind_entry (dld_cache.load.address);
       }
 
     dld_msymbol = lookup_minimal_symbol_solib_trampoline ("shl_load",
 							  objfile);
-    if (dld_msymbol != NULL)
+    if (dld_msymbol.minsym != NULL)
       {
-	if (MSYMBOL_TYPE (dld_msymbol) == mst_solib_trampoline)
+	if (MSYMBOL_TYPE (dld_msymbol.minsym) == mst_solib_trampoline)
 	  {
-	    u = find_unwind_entry (MSYMBOL_VALUE (dld_msymbol));
+	    u = find_unwind_entry (MSYMBOL_VALUE (dld_msymbol.minsym));
 	    if ((u != NULL) && (u->stub_unwind.stub_type == EXPORT))
 	      {
-		dld_cache.load_stub.address = MSYMBOL_VALUE (dld_msymbol);
+		dld_cache.load_stub.address
+		  = MSYMBOL_VALUE (dld_msymbol.minsym);
 		dld_cache.load_stub.unwind = u;
 	      }
 	  }
       }
 
     dld_msymbol = lookup_minimal_symbol ("shl_unload", NULL, objfile);
-    if (dld_msymbol != NULL)
+    if (dld_msymbol.minsym != NULL)
       {
-	dld_cache.unload.address = MSYMBOL_VALUE (dld_msymbol);
+	dld_cache.unload.address = MSYMBOL_VALUE (dld_msymbol.minsym);
 	dld_cache.unload.unwind = find_unwind_entry (dld_cache.unload.address);
 
 	/* ??rehrauer: I'm not sure exactly what this is, but it appears
@@ -429,14 +431,15 @@ som_solib_desire_dynamic_linker_symbols (void)
 
     dld_msymbol = lookup_minimal_symbol_solib_trampoline ("shl_unload",
 							  objfile);
-    if (dld_msymbol != NULL)
+    if (dld_msymbol.minsym != NULL)
       {
-	if (MSYMBOL_TYPE (dld_msymbol) == mst_solib_trampoline)
+	if (MSYMBOL_TYPE (dld_msymbol.minsym) == mst_solib_trampoline)
 	  {
-	    u = find_unwind_entry (MSYMBOL_VALUE (dld_msymbol));
+	    u = find_unwind_entry (MSYMBOL_VALUE (dld_msymbol.minsym));
 	    if ((u != NULL) && (u->stub_unwind.stub_type == EXPORT))
 	      {
-		dld_cache.unload_stub.address = MSYMBOL_VALUE (dld_msymbol);
+		dld_cache.unload_stub.address
+		  = MSYMBOL_VALUE (dld_msymbol.minsym);
 		dld_cache.unload_stub.unwind = u;
 	      }
 	  }
@@ -526,35 +529,35 @@ static CORE_ADDR
 link_map_start (void)
 {
   enum bfd_endian byte_order = gdbarch_byte_order (target_gdbarch ());
-  struct minimal_symbol *sym;
+  struct bound_minimal_symbol sym;
   CORE_ADDR addr;
   gdb_byte buf[4];
   unsigned int dld_flags;
 
   sym = lookup_minimal_symbol ("__dld_flags", NULL, NULL);
-  if (!sym)
+  if (!sym.minsym)
     error (_("Unable to find __dld_flags symbol in object file."));
-  addr = MSYMBOL_VALUE_ADDRESS (sym);
+  addr = MSYMBOL_VALUE_ADDRESS (sym.minsym);
   read_memory (addr, buf, 4);
   dld_flags = extract_unsigned_integer (buf, 4, byte_order);
   if ((dld_flags & DLD_FLAGS_LISTVALID) == 0)
     error (_("__dld_list is not valid according to __dld_flags."));
 
   sym = lookup_minimal_symbol ("__dld_list", NULL, NULL);
-  if (!sym)
+  if (!sym.minsym)
     {
       /* Older crt0.o files (hpux8) don't have __dld_list as a symbol,
          but the data is still available if you know where to look.  */
       sym = lookup_minimal_symbol ("__dld_flags", NULL, NULL);
-      if (!sym)
+      if (!sym.minsym)
 	{
 	  error (_("Unable to find dynamic library list."));
 	  return 0;
 	}
-      addr = MSYMBOL_VALUE_ADDRESS (sym) - 8;
+      addr = MSYMBOL_VALUE_ADDRESS (sym.minsym) - 8;
     }
   else
-    addr = MSYMBOL_VALUE_ADDRESS (sym);
+    addr = MSYMBOL_VALUE_ADDRESS (sym.minsym);
 
   read_memory (addr, buf, 4);
   addr = extract_unsigned_integer (buf, 4, byte_order);
diff --git a/gdb/solib-spu.c b/gdb/solib-spu.c
index b4aa7a4..a4cefad 100644
--- a/gdb/solib-spu.c
+++ b/gdb/solib-spu.c
@@ -408,7 +408,7 @@ spu_lookup_lib_symbol (const struct objfile *objfile,
 static int
 spu_enable_break (struct objfile *objfile)
 {
-  struct minimal_symbol *spe_event_sym = NULL;
+  struct bound_minimal_symbol spe_event_sym;
 
   /* The libspe library will call __spe_context_update_event whenever any
      SPE context is allocated or destroyed.  */
@@ -416,9 +416,9 @@ spu_enable_break (struct objfile *objfile)
 					 NULL, objfile);
 
   /* Place a solib_event breakpoint on the symbol.  */
-  if (spe_event_sym)
+  if (spe_event_sym.minsym)
     {
-      CORE_ADDR addr = MSYMBOL_VALUE_ADDRESS (spe_event_sym);
+      CORE_ADDR addr = MSYMBOL_VALUE_ADDRESS (spe_event_sym.minsym);
 
       addr = gdbarch_convert_from_func_ptr_addr (target_gdbarch (), addr,
                                                  &current_target);
@@ -434,8 +434,8 @@ spu_enable_break (struct objfile *objfile)
 static void
 ocl_enable_break (struct objfile *objfile)
 {
-  struct minimal_symbol *event_sym = NULL;
-  struct minimal_symbol *addr_sym = NULL;
+  struct bound_minimal_symbol event_sym;
+  struct bound_minimal_symbol addr_sym;
 
   /* The OpenCL runtime on the SPU will call __opencl_program_update_event
      whenever an OpenCL program is loaded.  */
@@ -445,10 +445,10 @@ ocl_enable_break (struct objfile *objfile)
      at opencl_elf_image_address.  */
   addr_sym = lookup_minimal_symbol ("opencl_elf_image_address", NULL, objfile);
 
-  if (event_sym && addr_sym)
+  if (event_sym.minsym && addr_sym.minsym)
     {
       /* Place a solib_event breakpoint on the symbol.  */
-      CORE_ADDR event_addr = MSYMBOL_VALUE_ADDRESS (event_sym);
+      CORE_ADDR event_addr = MSYMBOL_VALUE_ADDRESS (event_sym.minsym);
       create_solib_event_breakpoint (get_objfile_arch (objfile), event_addr);
 
       /* Store the address of the symbol that will point to OpenCL program
@@ -459,7 +459,7 @@ ocl_enable_break (struct objfile *objfile)
 		  &objfile->objfile_obstack,
 		  objfile->sections_end - objfile->sections,
 		  CORE_ADDR);
-	  *ocl_program_addr_base = MSYMBOL_VALUE_ADDRESS (addr_sym);
+	  *ocl_program_addr_base = MSYMBOL_VALUE_ADDRESS (addr_sym.minsym);
 	  set_objfile_data (objfile, ocl_program_data_key,
 			    ocl_program_addr_base);
         }
diff --git a/gdb/solib-svr4.c b/gdb/solib-svr4.c
index 3434e80..4be0807 100644
--- a/gdb/solib-svr4.c
+++ b/gdb/solib-svr4.c
@@ -787,7 +787,7 @@ scan_dyntag_auxv (int dyntag, CORE_ADDR *ptr)
 static CORE_ADDR
 elf_locate_base (void)
 {
-  struct minimal_symbol *msymbol;
+  struct bound_minimal_symbol msymbol;
   CORE_ADDR dyn_ptr;
 
   /* Look for DT_MIPS_RLD_MAP first.  MIPS executables use this
@@ -816,8 +816,8 @@ elf_locate_base (void)
   /* This may be a static executable.  Look for the symbol
      conventionally named _r_debug, as a last resort.  */
   msymbol = lookup_minimal_symbol ("_r_debug", NULL, symfile_objfile);
-  if (msymbol != NULL)
-    return MSYMBOL_VALUE_ADDRESS (msymbol);
+  if (msymbol.minsym != NULL)
+    return MSYMBOL_VALUE_ADDRESS (msymbol.minsym);
 
   /* DT_DEBUG entry not found.  */
   return 0;
@@ -2091,7 +2091,7 @@ cmp_name_and_sec_flags (asymbol *sym, void *data)
 static int
 enable_break (struct svr4_info *info, int from_tty)
 {
-  struct minimal_symbol *msymbol;
+  struct bound_minimal_symbol msymbol;
   const char * const *bkpt_namep;
   asection *interp_sect;
   char *interp_name;
@@ -2348,9 +2348,10 @@ enable_break (struct svr4_info *info, int from_tty)
   for (bkpt_namep = solib_break_names; *bkpt_namep != NULL; bkpt_namep++)
     {
       msymbol = lookup_minimal_symbol (*bkpt_namep, NULL, symfile_objfile);
-      if ((msymbol != NULL) && (MSYMBOL_VALUE_ADDRESS (msymbol) != 0))
+      if ((msymbol.minsym != NULL)
+	  && (MSYMBOL_VALUE_ADDRESS (msymbol.minsym) != 0))
 	{
-	  sym_addr = MSYMBOL_VALUE_ADDRESS (msymbol);
+	  sym_addr = MSYMBOL_VALUE_ADDRESS (msymbol.minsym);
 	  sym_addr = gdbarch_convert_from_func_ptr_addr (target_gdbarch (),
 							 sym_addr,
 							 &current_target);
@@ -2364,9 +2365,10 @@ enable_break (struct svr4_info *info, int from_tty)
       for (bkpt_namep = bkpt_names; *bkpt_namep != NULL; bkpt_namep++)
 	{
 	  msymbol = lookup_minimal_symbol (*bkpt_namep, NULL, symfile_objfile);
-	  if ((msymbol != NULL) && (MSYMBOL_VALUE_ADDRESS (msymbol) != 0))
+	  if ((msymbol.minsym != NULL)
+	      && (MSYMBOL_VALUE_ADDRESS (msymbol.minsym) != 0))
 	    {
-	      sym_addr = MSYMBOL_VALUE_ADDRESS (msymbol);
+	      sym_addr = MSYMBOL_VALUE_ADDRESS (msymbol.minsym);
 	      sym_addr = gdbarch_convert_from_func_ptr_addr (target_gdbarch (),
 							     sym_addr,
 							     &current_target);
diff --git a/gdb/spu-tdep.c b/gdb/spu-tdep.c
index e4244ee..157f37b 100644
--- a/gdb/spu-tdep.c
+++ b/gdb/spu-tdep.c
@@ -1747,7 +1747,7 @@ spu_get_overlay_table (struct objfile *objfile)
 {
   enum bfd_endian byte_order = bfd_big_endian (objfile->obfd)?
 		   BFD_ENDIAN_BIG : BFD_ENDIAN_LITTLE;
-  struct minimal_symbol *ovly_table_msym, *ovly_buf_table_msym;
+  struct bound_minimal_symbol ovly_table_msym, ovly_buf_table_msym;
   CORE_ADDR ovly_table_base, ovly_buf_table_base;
   unsigned ovly_table_size, ovly_buf_table_size;
   struct spu_overlay_table *tbl;
@@ -1760,19 +1760,19 @@ spu_get_overlay_table (struct objfile *objfile)
     return tbl;
 
   ovly_table_msym = lookup_minimal_symbol ("_ovly_table", NULL, objfile);
-  if (!ovly_table_msym)
+  if (!ovly_table_msym.minsym)
     return NULL;
 
   ovly_buf_table_msym = lookup_minimal_symbol ("_ovly_buf_table",
 					       NULL, objfile);
-  if (!ovly_buf_table_msym)
+  if (!ovly_buf_table_msym.minsym)
     return NULL;
 
-  ovly_table_base = MSYMBOL_VALUE_ADDRESS (ovly_table_msym);
-  ovly_table_size = MSYMBOL_SIZE (ovly_table_msym);
+  ovly_table_base = MSYMBOL_VALUE_ADDRESS (ovly_table_msym.minsym);
+  ovly_table_size = MSYMBOL_SIZE (ovly_table_msym.minsym);
 
-  ovly_buf_table_base = MSYMBOL_VALUE_ADDRESS (ovly_buf_table_msym);
-  ovly_buf_table_size = MSYMBOL_SIZE (ovly_buf_table_msym);
+  ovly_buf_table_base = MSYMBOL_VALUE_ADDRESS (ovly_buf_table_msym.minsym);
+  ovly_buf_table_size = MSYMBOL_SIZE (ovly_buf_table_msym.minsym);
 
   ovly_table = xmalloc (ovly_table_size);
   read_memory (ovly_table_base, ovly_table, ovly_table_size);
@@ -1898,7 +1898,7 @@ spu_overlay_new_objfile (struct objfile *objfile)
 static void
 spu_catch_start (struct objfile *objfile)
 {
-  struct minimal_symbol *minsym;
+  struct bound_minimal_symbol minsym;
   struct symtab *symtab;
   CORE_ADDR pc;
   char buf[32];
@@ -1918,13 +1918,14 @@ spu_catch_start (struct objfile *objfile)
   /* There can be multiple symbols named "main".  Search for the
      "main" in *this* objfile.  */
   minsym = lookup_minimal_symbol ("main", NULL, objfile);
-  if (!minsym)
+  if (!minsym.minsym)
     return;
 
   /* If we have debugging information, try to use it -- this
      will allow us to properly skip the prologue.  */
-  pc = MSYMBOL_VALUE_ADDRESS (minsym);
-  symtab = find_pc_sect_symtab (pc, MSYMBOL_OBJ_SECTION (objfile, minsym));
+  pc = MSYMBOL_VALUE_ADDRESS (minsym.minsym);
+  symtab = find_pc_sect_symtab (pc, MSYMBOL_OBJ_SECTION (minsym.objfile,
+							 minsym.minsym));
   if (symtab != NULL)
     {
       struct blockvector *bv = BLOCKVECTOR (symtab);
@@ -1981,7 +1982,7 @@ spu_objfile_from_frame (struct frame_info *frame)
 static void
 flush_ea_cache (void)
 {
-  struct minimal_symbol *msymbol;
+  struct bound_minimal_symbol msymbol;
   struct objfile *obj;
 
   if (!has_stack_frames ())
@@ -1993,7 +1994,7 @@ flush_ea_cache (void)
 
   /* Lookup inferior function __cache_flush.  */
   msymbol = lookup_minimal_symbol ("__cache_flush", NULL, obj);
-  if (msymbol != NULL)
+  if (msymbol.minsym != NULL)
     {
       struct type *type;
       CORE_ADDR addr;
@@ -2001,7 +2002,7 @@ flush_ea_cache (void)
       type = objfile_type (obj)->builtin_void;
       type = lookup_function_type (type);
       type = lookup_pointer_type (type);
-      addr = MSYMBOL_VALUE_ADDRESS (msymbol);
+      addr = MSYMBOL_VALUE_ADDRESS (msymbol.minsym);
 
       call_function_by_hand (value_from_pointer (type, addr), 0, NULL);
     }
diff --git a/gdb/stabsread.c b/gdb/stabsread.c
index 78766c0..b5bec10 100644
--- a/gdb/stabsread.c
+++ b/gdb/stabsread.c
@@ -1168,17 +1168,17 @@ define_symbol (CORE_ADDR valu, char *string, int desc, int type,
 					    SYMBOL_LINKAGE_NAME (sym))
 	     != SYMBOL_LINKAGE_NAME (sym))
 	{
-	  struct minimal_symbol *msym;
+	  struct bound_minimal_symbol msym;
 
 	  msym = lookup_minimal_symbol (SYMBOL_LINKAGE_NAME (sym),
 					NULL, objfile);
-	  if (msym != NULL)
+	  if (msym.minsym != NULL)
 	    {
 	      const char *new_name = gdbarch_static_transform_name
 		(gdbarch, SYMBOL_LINKAGE_NAME (sym));
 
 	      SYMBOL_SET_LINKAGE_NAME (sym, new_name);
-	      SYMBOL_VALUE_ADDRESS (sym) = MSYMBOL_VALUE_ADDRESS (msym);
+	      SYMBOL_VALUE_ADDRESS (sym) = MSYMBOL_VALUE_ADDRESS (msym.minsym);
 	    }
 	}
       SYMBOL_DOMAIN (sym) = VAR_DOMAIN;
@@ -1360,17 +1360,17 @@ define_symbol (CORE_ADDR valu, char *string, int desc, int type,
 					    SYMBOL_LINKAGE_NAME (sym))
 	     != SYMBOL_LINKAGE_NAME (sym))
 	{
-	  struct minimal_symbol *msym;
+	  struct bound_minimal_symbol msym;
 
 	  msym = lookup_minimal_symbol (SYMBOL_LINKAGE_NAME (sym), 
 					NULL, objfile);
-	  if (msym != NULL)
+	  if (msym.minsym != NULL)
 	    {
 	      const char *new_name = gdbarch_static_transform_name
 		(gdbarch, SYMBOL_LINKAGE_NAME (sym));
 
 	      SYMBOL_SET_LINKAGE_NAME (sym, new_name);
-	      SYMBOL_VALUE_ADDRESS (sym) = MSYMBOL_VALUE_ADDRESS (msym);
+	      SYMBOL_VALUE_ADDRESS (sym) = MSYMBOL_VALUE_ADDRESS (msym.minsym);
 	    }
 	}
       SYMBOL_DOMAIN (sym) = VAR_DOMAIN;
diff --git a/gdb/symfile.c b/gdb/symfile.c
index 7420643..b8d4479 100644
--- a/gdb/symfile.c
+++ b/gdb/symfile.c
@@ -3532,7 +3532,7 @@ read_target_long_array (CORE_ADDR memaddr, unsigned int *myaddr,
 static int
 simple_read_overlay_table (void)
 {
-  struct minimal_symbol *novlys_msym;
+  struct bound_minimal_symbol novlys_msym;
   struct bound_minimal_symbol ovly_table_msym;
   struct gdbarch *gdbarch;
   int word_size;
@@ -3540,7 +3540,7 @@ simple_read_overlay_table (void)
 
   simple_free_overlay_table ();
   novlys_msym = lookup_minimal_symbol ("_novlys", NULL, NULL);
-  if (! novlys_msym)
+  if (! novlys_msym.minsym)
     {
       error (_("Error reading inferior's overlay table: "
              "couldn't find `_novlys' variable\n"
@@ -3561,8 +3561,9 @@ simple_read_overlay_table (void)
   word_size = gdbarch_long_bit (gdbarch) / TARGET_CHAR_BIT;
   byte_order = gdbarch_byte_order (gdbarch);
 
-  cache_novlys = read_memory_integer (MSYMBOL_VALUE_ADDRESS (novlys_msym),
-				      4, byte_order);
+  cache_novlys
+    = read_memory_integer (MSYMBOL_VALUE_ADDRESS (novlys_msym.minsym),
+			   4, byte_order);
   cache_ovly_table
     = (void *) xmalloc (cache_novlys * sizeof (*cache_ovly_table));
   cache_ovly_table_base = MSYMBOL_VALUE_ADDRESS (ovly_table_msym.minsym);
@@ -3633,15 +3634,15 @@ simple_overlay_update (struct obj_section *osect)
       {
 	/* Does its cached location match what's currently in the
 	   symtab?  */
-	struct minimal_symbol *minsym
+	struct bound_minimal_symbol minsym
 	  = lookup_minimal_symbol ("_ovly_table", NULL, NULL);
 
-	if (minsym == NULL)
+	if (minsym.minsym == NULL)
 	  error (_("Error reading inferior's overlay table: couldn't "
 		   "find `_ovly_table' array\n"
 		   "in inferior.  Use `overlay manual' mode."));
 	
-	if (cache_ovly_table_base == MSYMBOL_VALUE_ADDRESS (minsym))
+	if (cache_ovly_table_base == MSYMBOL_VALUE_ADDRESS (minsym.minsym))
 	  /* Then go ahead and try to look up this single section in
 	     the cache.  */
 	  if (simple_overlay_update_1 (osect))
diff --git a/gdb/symtab.c b/gdb/symtab.c
index 326f4c9..65d7188 100644
--- a/gdb/symtab.c
+++ b/gdb/symtab.c
@@ -2379,7 +2379,7 @@ find_pc_sect_line (CORE_ADDR pc, struct obj_section *section, int notcurrent)
       {
 	mfunsym
 	  = lookup_minimal_symbol_text (MSYMBOL_LINKAGE_NAME (msymbol.minsym),
-					NULL);
+					NULL).minsym;
 	if (mfunsym == NULL)
 	  /* I eliminated this warning since it is coming out
 	   * in the following situation:
diff --git a/gdb/tracepoint.c b/gdb/tracepoint.c
index 13e132f..bd3e9d0 100644
--- a/gdb/tracepoint.c
+++ b/gdb/tracepoint.c
@@ -2701,7 +2701,7 @@ scope_info (char *args, int from_tty)
 {
   struct symtabs_and_lines sals;
   struct symbol *sym;
-  struct minimal_symbol *msym;
+  struct bound_minimal_symbol msym;
   struct block *block;
   const char *symname;
   char *save_args = args;
@@ -2824,14 +2824,14 @@ scope_info (char *args, int from_tty)
 		case LOC_UNRESOLVED:
 		  msym = lookup_minimal_symbol (SYMBOL_LINKAGE_NAME (sym),
 						NULL, NULL);
-		  if (msym == NULL)
+		  if (msym.minsym == NULL)
 		    printf_filtered ("Unresolved Static");
 		  else
 		    {
 		      printf_filtered ("static storage at address ");
 		      printf_filtered ("%s",
 				       paddress (gdbarch,
-						 MSYMBOL_VALUE_ADDRESS (msym)));
+						 MSYMBOL_VALUE_ADDRESS (msym.minsym)));
 		    }
 		  break;
 		case LOC_OPTIMIZED_OUT:
diff --git a/gdb/tui/tui-disasm.c b/gdb/tui/tui-disasm.c
index ee629f3..e0ea183 100644
--- a/gdb/tui/tui-disasm.c
+++ b/gdb/tui/tui-disasm.c
@@ -339,17 +339,17 @@ tui_get_begin_asm_address (struct gdbarch **gdbarch_p, CORE_ADDR *addr_p)
 
   if (element->addr == 0)
     {
-      struct minimal_symbol *main_symbol;
+      struct bound_minimal_symbol main_symbol;
 
       /* Find address of the start of program.
          Note: this should be language specific.  */
       main_symbol = lookup_minimal_symbol ("main", NULL, NULL);
-      if (main_symbol == 0)
+      if (main_symbol.minsym == 0)
         main_symbol = lookup_minimal_symbol ("MAIN", NULL, NULL);
-      if (main_symbol == 0)
+      if (main_symbol.minsym == 0)
         main_symbol = lookup_minimal_symbol ("_start", NULL, NULL);
-      if (main_symbol)
-        addr = MSYMBOL_VALUE_ADDRESS (main_symbol);
+      if (main_symbol.minsym)
+        addr = MSYMBOL_VALUE_ADDRESS (main_symbol.minsym);
       else
         addr = 0;
     }
diff --git a/gdb/value.c b/gdb/value.c
index 0ee29f5..1dfc6d5 100644
--- a/gdb/value.c
+++ b/gdb/value.c
@@ -2750,15 +2750,15 @@ value_static_field (struct type *type, int fieldno)
 	{
 	  /* With some compilers, e.g. HP aCC, static data members are
 	     reported as non-debuggable symbols.  */
-	  struct minimal_symbol *msym = lookup_minimal_symbol (phys_name,
-							       NULL, NULL);
+	  struct bound_minimal_symbol msym
+	    = lookup_minimal_symbol (phys_name, NULL, NULL);
 
-	  if (!msym)
+	  if (!msym.minsym)
 	    return allocate_optimized_out_value (type);
 	  else
 	    {
 	      retval = value_at_lazy (TYPE_FIELD_TYPE (type, fieldno),
-				      MSYMBOL_VALUE_ADDRESS (msym));
+				      MSYMBOL_VALUE_ADDRESS (msym.minsym));
 	    }
 	}
       else
-- 
1.8.1.4

^ permalink raw reply	[flat|nested] 11+ messages in thread

* [FYI v3 03/10] make MSYMBOL_VALUE_ADDRESS an rvalue
  2014-02-26 20:23 [FYI v3 00/10] share minimal symbols across objfiles Tom Tromey
@ 2014-02-26 19:01 ` Tom Tromey
  2014-02-26 19:01 ` [FYI v3 05/10] start change to progspace independence Tom Tromey
                   ` (8 subsequent siblings)
  9 siblings, 0 replies; 11+ messages in thread
From: Tom Tromey @ 2014-02-26 19:01 UTC (permalink / raw)
  To: gdb-patches; +Cc: Tom Tromey

This changes MSYMBOL_VALUE_ADDRESS to be an rvalue.  In a later patch
we change this macro to compute its value; this patch introduces a
setter to make the break a bit cleaner.

2014-02-26  Tom Tromey  <tromey@redhat.com>

	* minsyms.c (prim_record_minimal_symbol_full): Use
	SET_MSYMBOL_VALUE_ADDRESS.
	* objfiles.c (objfile_relocate1): Use SET_MSYMBOL_VALUE_ADDRESS.
	* sh64-tdep.c (sh64_elf_make_msymbol_special): Use
	SET_MSYMBOL_VALUE_ADDRESS.
	* symtab.h (MSYMBOL_VALUE_ADDRESS): Expand to an rvalue.
	(SET_MSYMBOL_VALUE_ADDRESS): New macro.
---
 gdb/ChangeLog   | 10 ++++++++++
 gdb/minsyms.c   |  2 +-
 gdb/objfiles.c  |  5 +++--
 gdb/sh64-tdep.c |  2 +-
 gdb/symtab.h    |  4 +++-
 5 files changed, 18 insertions(+), 5 deletions(-)

diff --git a/gdb/minsyms.c b/gdb/minsyms.c
index aad7685..dde7d90 100644
--- a/gdb/minsyms.c
+++ b/gdb/minsyms.c
@@ -944,7 +944,7 @@ prim_record_minimal_symbol_full (const char *name, int name_len, int copy_name,
   MSYMBOL_SET_LANGUAGE (msymbol, language_auto, &objfile->objfile_obstack);
   MSYMBOL_SET_NAMES (msymbol, name, name_len, copy_name, objfile);
 
-  MSYMBOL_VALUE_ADDRESS (msymbol) = address;
+  SET_MSYMBOL_VALUE_ADDRESS (msymbol, address);
   MSYMBOL_SECTION (msymbol) = section;
 
   MSYMBOL_TYPE (msymbol) = ms_type;
diff --git a/gdb/objfiles.c b/gdb/objfiles.c
index 89b8943..dba13fb 100644
--- a/gdb/objfiles.c
+++ b/gdb/objfiles.c
@@ -805,8 +805,9 @@ objfile_relocate1 (struct objfile *objfile,
 
     ALL_OBJFILE_MSYMBOLS (objfile, msym)
       if (MSYMBOL_SECTION (msym) >= 0)
-	MSYMBOL_VALUE_ADDRESS (msym) += ANOFFSET (delta,
-						  MSYMBOL_SECTION (msym));
+	SET_MSYMBOL_VALUE_ADDRESS (msym, (MSYMBOL_VALUE_ADDRESS (msym)
+					  + ANOFFSET (delta,
+						      MSYMBOL_SECTION (msym))));
   }
   /* Relocating different sections by different amounts may cause the symbols
      to be out of order.  */
diff --git a/gdb/sh64-tdep.c b/gdb/sh64-tdep.c
index ab1c96d..cf93d53 100644
--- a/gdb/sh64-tdep.c
+++ b/gdb/sh64-tdep.c
@@ -224,7 +224,7 @@ sh64_elf_make_msymbol_special (asymbol *sym, struct minimal_symbol *msym)
   if (((elf_symbol_type *)(sym))->internal_elf_sym.st_other == STO_SH5_ISA32)
     {
       MSYMBOL_TARGET_FLAG_1 (msym) = 1;
-      MSYMBOL_VALUE_ADDRESS (msym) |= 1;
+      SET_MSYMBOL_VALUE_ADDRESS (msym, MSYMBOL_VALUE_ADDRESS (msym) | 1);
     }
 }
 
diff --git a/gdb/symtab.h b/gdb/symtab.h
index 4bf3035..bf1ef74 100644
--- a/gdb/symtab.h
+++ b/gdb/symtab.h
@@ -391,7 +391,9 @@ struct minimal_symbol
 #define MSYMBOL_TYPE(msymbol)		(msymbol)->type
 
 #define MSYMBOL_VALUE(symbol)		(symbol)->mginfo.value.ivalue
-#define MSYMBOL_VALUE_ADDRESS(symbol)	(symbol)->mginfo.value.address
+#define MSYMBOL_VALUE_ADDRESS(symbol)	((symbol)->mginfo.value.address + 0)
+#define SET_MSYMBOL_VALUE_ADDRESS(symbol, new_value) \
+  ((symbol)->mginfo.value.address = (new_value))
 #define MSYMBOL_VALUE_BYTES(symbol)	(symbol)->mginfo.value.bytes
 #define MSYMBOL_BLOCK_VALUE(symbol)	(symbol)->mginfo.value.block
 #define MSYMBOL_VALUE_CHAIN(symbol)	(symbol)->mginfo.value.chain
-- 
1.8.1.4

^ permalink raw reply	[flat|nested] 11+ messages in thread

* [FYI v3 07/10] move minimal symbols to per-bfd
  2014-02-26 20:23 [FYI v3 00/10] share minimal symbols across objfiles Tom Tromey
  2014-02-26 19:01 ` [FYI v3 03/10] make MSYMBOL_VALUE_ADDRESS an rvalue Tom Tromey
  2014-02-26 19:01 ` [FYI v3 05/10] start change to progspace independence Tom Tromey
@ 2014-02-26 19:01 ` Tom Tromey
  2014-02-26 19:01 ` [FYI v3 02/10] change minsym representation Tom Tromey
                   ` (6 subsequent siblings)
  9 siblings, 0 replies; 11+ messages in thread
From: Tom Tromey @ 2014-02-26 19:01 UTC (permalink / raw)
  To: gdb-patches; +Cc: Tom Tromey

Now that minimal symbols are independent of the program space, we can
move them to the per-BFD object.  This lets us save memory in the
multi-inferior case; and, once the symbol readers are updated, time.

The other prerequisite for this move is that all the objects referred
to by the minimal symbols have a lifetime at least as long as the
per-BFD object.  I think this is satisfied partially by this patch
(moving the copied names there) and partially by earlier patches
moving the demangled name hash.

This patch contains a bit of logic to avoid creating new minimal
symbols if they have already been read for a given BFD.  This allows
us to avoid trying to update all the symbol readers for this
condition.  At first glance this may seem like a hack, but some symbol
readers mix psym and minsym reading, and would require logic just like
this regardless -- and it is simpler and less error-prone to just do
the work in a central spot.

2014-02-26  Tom Tromey  <tromey@redhat.com>

	* minsyms.c (lookup_minimal_symbol, iterate_over_minimal_symbols)
	(lookup_minimal_symbol_text, lookup_minimal_symbol_by_pc_name)
	(lookup_minimal_symbol_solib_trampoline)
	(lookup_minimal_symbol_by_pc_section_1)
	(lookup_minimal_symbol_and_objfile): Update.
	(prim_record_minimal_symbol_full): Use the per-BFD obstack.
	Don't allocate a minimal symbol if minsyms have already been read.
	(build_minimal_symbol_hash_tables): Update.
	(install_minimal_symbols): Do nothing if minsyms already read.
	Use the per-BFD obstack.
	(terminate_minimal_symbol_table): Use the per-BFD obstack.
	* objfiles.c (allocate_objfile): Call
	terminate_minimal_symbol_table later.
	(have_minimal_symbols): Update.
	* objfiles.h (struct objfile_per_bfd_storage) <msymbols,
	minimal_symbol_count, msymbol_hash, msymbol_demangled_hash>:
	Move from struct objfile.
	<minsyms_read>: New field.
	(struct objfile) <msymbols, minimal_symbol_count,
	msymbol_hash, msymbol_demangled_hash>: Move.
	(ALL_OBJFILE_MSYMBOLS): Update.
	* symfile.c (read_symbols): Set minsyms_read.
	(reread_symbols): Update.
	* symmisc.c (dump_objfile, dump_msymbols): Update.
---
 gdb/ChangeLog  | 27 ++++++++++++++++++
 gdb/minsyms.c  | 88 ++++++++++++++++++++++++++++++++--------------------------
 gdb/objfiles.c |  5 ++--
 gdb/objfiles.h | 60 +++++++++++++++++++++++----------------
 gdb/symfile.c  |  7 +----
 gdb/symmisc.c  |  8 +++---
 6 files changed, 120 insertions(+), 75 deletions(-)

diff --git a/gdb/minsyms.c b/gdb/minsyms.c
index df499a4..1dc86eb 100644
--- a/gdb/minsyms.c
+++ b/gdb/minsyms.c
@@ -54,7 +54,7 @@
 
 /* Accumulate the minimal symbols for each objfile in bunches of BUNCH_SIZE.
    At the end, copy them all into one newly allocated location on an objfile's
-   symbol obstack.  */
+   per-BFD storage obstack.  */
 
 #define BUNCH_SIZE 127
 
@@ -207,9 +207,9 @@ lookup_minimal_symbol (const char *name, const char *sfile,
 	    {
             /* Select hash list according to pass.  */
             if (pass == 1)
-              msymbol = objfile->msymbol_hash[hash];
+              msymbol = objfile->per_bfd->msymbol_hash[hash];
             else
-              msymbol = objfile->msymbol_demangled_hash[dem_hash];
+              msymbol = objfile->per_bfd->msymbol_demangled_hash[dem_hash];
 
             while (msymbol != NULL && found_symbol.minsym == NULL)
 		{
@@ -314,7 +314,7 @@ iterate_over_minimal_symbols (struct objfile *objf, const char *name,
 
   /* The first pass is over the ordinary hash table.  */
   hash = msymbol_hash (name) % MINIMAL_SYMBOL_HASH_SIZE;
-  iter = objf->msymbol_hash[hash];
+  iter = objf->per_bfd->msymbol_hash[hash];
   cmp = (case_sensitivity == case_sensitive_on ? strcmp : strcasecmp);
   while (iter)
     {
@@ -325,7 +325,7 @@ iterate_over_minimal_symbols (struct objfile *objf, const char *name,
 
   /* The second pass is over the demangled table.  */
   hash = msymbol_hash_iw (name) % MINIMAL_SYMBOL_HASH_SIZE;
-  iter = objf->msymbol_demangled_hash[hash];
+  iter = objf->per_bfd->msymbol_demangled_hash[hash];
   while (iter)
     {
       if (MSYMBOL_MATCHES_SEARCH_NAME (iter, name))
@@ -353,7 +353,7 @@ lookup_minimal_symbol_text (const char *name, struct objfile *objf)
       if (objf == NULL || objf == objfile
 	  || objf == objfile->separate_debug_objfile_backlink)
 	{
-	  for (msymbol = objfile->msymbol_hash[hash];
+	  for (msymbol = objfile->per_bfd->msymbol_hash[hash];
 	       msymbol != NULL && found_symbol.minsym == NULL;
 	       msymbol = msymbol->hash_next)
 	    {
@@ -403,7 +403,7 @@ lookup_minimal_symbol_by_pc_name (CORE_ADDR pc, const char *name,
       if (objf == NULL || objf == objfile
 	  || objf == objfile->separate_debug_objfile_backlink)
 	{
-	  for (msymbol = objfile->msymbol_hash[hash];
+	  for (msymbol = objfile->per_bfd->msymbol_hash[hash];
 	       msymbol != NULL;
 	       msymbol = msymbol->hash_next)
 	    {
@@ -436,7 +436,7 @@ lookup_minimal_symbol_solib_trampoline (const char *name,
       if (objf == NULL || objf == objfile
 	  || objf == objfile->separate_debug_objfile_backlink)
 	{
-	  for (msymbol = objfile->msymbol_hash[hash];
+	  for (msymbol = objfile->per_bfd->msymbol_hash[hash];
 	       msymbol != NULL;
 	       msymbol = msymbol->hash_next)
 	    {
@@ -532,13 +532,13 @@ lookup_minimal_symbol_by_pc_section_1 (CORE_ADDR pc_in,
          "null symbol".  If there are no real symbols, then there is no
          minimal symbol table at all.  */
 
-      if (objfile->minimal_symbol_count > 0)
+      if (objfile->per_bfd->minimal_symbol_count > 0)
 	{
 	  int best_zero_sized = -1;
 
-          msymbol = objfile->msymbols;
+          msymbol = objfile->per_bfd->msymbols;
 	  lo = 0;
-	  hi = objfile->minimal_symbol_count - 1;
+	  hi = objfile->per_bfd->minimal_symbol_count - 1;
 
 	  /* This code assumes that the minimal symbols are sorted by
 	     ascending address values.  If the pc value is greater than or
@@ -580,7 +580,7 @@ lookup_minimal_symbol_by_pc_section_1 (CORE_ADDR pc_in,
 	      /* If we have multiple symbols at the same address, we want
 	         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
+	      while (hi < objfile->per_bfd->minimal_symbol_count - 1
 		     && (MSYMBOL_VALUE_RAW_ADDRESS (&msymbol[hi])
 			 == MSYMBOL_VALUE_RAW_ADDRESS (&msymbol[hi + 1])))
 		hi++;
@@ -836,7 +836,7 @@ lookup_minimal_symbol_and_objfile (const char *name)
     {
       struct minimal_symbol *msym;
 
-      for (msym = objfile->msymbol_hash[hash];
+      for (msym = objfile->per_bfd->msymbol_hash[hash];
 	   msym != NULL;
 	   msym = msym->hash_next)
 	{
@@ -955,7 +955,8 @@ prim_record_minimal_symbol_full (const char *name, int name_len, int copy_name,
       msym_bunch = new;
     }
   msymbol = &msym_bunch->contents[msym_bunch_index];
-  MSYMBOL_SET_LANGUAGE (msymbol, language_auto, &objfile->objfile_obstack);
+  MSYMBOL_SET_LANGUAGE (msymbol, language_auto,
+			&objfile->per_bfd->storage_obstack);
   MSYMBOL_SET_NAMES (msymbol, name, name_len, copy_name, objfile);
 
   SET_MSYMBOL_VALUE_ADDRESS (msymbol, address);
@@ -973,7 +974,10 @@ prim_record_minimal_symbol_full (const char *name, int name_len, int copy_name,
   msymbol->hash_next = NULL;
   msymbol->demangled_hash_next = NULL;
 
-  msym_bunch_index++;
+  /* If we already read minimal symbols for this objfile, then don't
+     ever allocate a new one.  */
+  if (!objfile->per_bfd->minsyms_read)
+    msym_bunch_index++;
   msym_count++;
   OBJSTAT (objfile, n_minsyms++);
   return msymbol;
@@ -1084,7 +1088,7 @@ make_cleanup_discard_minimal_symbols (void)
 
    Note that we are not concerned here about recovering the space that
    is potentially freed up, because the strings themselves are allocated
-   on the objfile_obstack, and will get automatically freed when the symbol
+   on the storage_obstack, and will get automatically freed when the symbol
    table is freed.  The caller can free up the unused minimal symbols at
    the end of the compacted region if their allocation strategy allows it.
 
@@ -1143,22 +1147,23 @@ build_minimal_symbol_hash_tables (struct objfile *objfile)
   /* Clear the hash tables.  */
   for (i = 0; i < MINIMAL_SYMBOL_HASH_SIZE; i++)
     {
-      objfile->msymbol_hash[i] = 0;
-      objfile->msymbol_demangled_hash[i] = 0;
+      objfile->per_bfd->msymbol_hash[i] = 0;
+      objfile->per_bfd->msymbol_demangled_hash[i] = 0;
     }
 
   /* Now, (re)insert the actual entries.  */
-  for (i = objfile->minimal_symbol_count, msym = objfile->msymbols;
+  for ((i = objfile->per_bfd->minimal_symbol_count,
+	msym = objfile->per_bfd->msymbols);
        i > 0;
        i--, msym++)
     {
       msym->hash_next = 0;
-      add_minsym_to_hash_table (msym, objfile->msymbol_hash);
+      add_minsym_to_hash_table (msym, objfile->per_bfd->msymbol_hash);
 
       msym->demangled_hash_next = 0;
       if (MSYMBOL_SEARCH_NAME (msym) != MSYMBOL_LINKAGE_NAME (msym))
 	add_minsym_to_demangled_hash_table (msym,
-                                            objfile->msymbol_demangled_hash);
+                                            objfile->per_bfd->msymbol_demangled_hash);
     }
 }
 
@@ -1194,6 +1199,9 @@ install_minimal_symbols (struct objfile *objfile)
   struct minimal_symbol *msymbols;
   int alloc_count;
 
+  if (objfile->per_bfd->minsyms_read)
+    return;
+
   if (msym_count > 0)
     {
       if (symtab_create_debug)
@@ -1208,17 +1216,17 @@ install_minimal_symbols (struct objfile *objfile)
          compact out the duplicate entries.  Once we have a final table,
          we will give back the excess space.  */
 
-      alloc_count = msym_count + objfile->minimal_symbol_count + 1;
-      obstack_blank (&objfile->objfile_obstack,
+      alloc_count = msym_count + objfile->per_bfd->minimal_symbol_count + 1;
+      obstack_blank (&objfile->per_bfd->storage_obstack,
 		     alloc_count * sizeof (struct minimal_symbol));
       msymbols = (struct minimal_symbol *)
-	obstack_base (&objfile->objfile_obstack);
+	obstack_base (&objfile->per_bfd->storage_obstack);
 
       /* Copy in the existing minimal symbols, if there are any.  */
 
-      if (objfile->minimal_symbol_count)
-	memcpy ((char *) msymbols, (char *) objfile->msymbols,
-	    objfile->minimal_symbol_count * sizeof (struct minimal_symbol));
+      if (objfile->per_bfd->minimal_symbol_count)
+	memcpy ((char *) msymbols, (char *) objfile->per_bfd->msymbols,
+	    objfile->per_bfd->minimal_symbol_count * sizeof (struct minimal_symbol));
 
       /* Walk through the list of minimal symbol bunches, adding each symbol
          to the new contiguous array of symbols.  Note that we start with the
@@ -1226,7 +1234,7 @@ install_minimal_symbols (struct objfile *objfile)
          msym_bunch_index for the first bunch we copy over), and thereafter
          each bunch is full.  */
 
-      mcount = objfile->minimal_symbol_count;
+      mcount = objfile->per_bfd->minimal_symbol_count;
 
       for (bunch = msym_bunch; bunch != NULL; bunch = bunch->next)
 	{
@@ -1245,10 +1253,10 @@ install_minimal_symbols (struct objfile *objfile)
 
       mcount = compact_minimal_symbols (msymbols, mcount, objfile);
 
-      obstack_blank (&objfile->objfile_obstack,
+      obstack_blank (&objfile->per_bfd->storage_obstack,
 	       (mcount + 1 - alloc_count) * sizeof (struct minimal_symbol));
       msymbols = (struct minimal_symbol *)
-	obstack_finish (&objfile->objfile_obstack);
+	obstack_finish (&objfile->per_bfd->storage_obstack);
 
       /* We also terminate the minimal symbol table with a "null symbol",
          which is *not* included in the size of the table.  This makes it
@@ -1261,11 +1269,11 @@ install_minimal_symbols (struct objfile *objfile)
       memset (&msymbols[mcount], 0, sizeof (struct minimal_symbol));
 
       /* Attach the minimal symbol table to the specified objfile.
-         The strings themselves are also located in the objfile_obstack
+         The strings themselves are also located in the storage_obstack
          of this objfile.  */
 
-      objfile->minimal_symbol_count = mcount;
-      objfile->msymbols = msymbols;
+      objfile->per_bfd->minimal_symbol_count = mcount;
+      objfile->per_bfd->msymbols = msymbols;
 
       /* Now build the hash tables; we can't do this incrementally
          at an earlier point since we weren't finished with the obstack
@@ -1280,19 +1288,21 @@ install_minimal_symbols (struct objfile *objfile)
 void
 terminate_minimal_symbol_table (struct objfile *objfile)
 {
-  if (! objfile->msymbols)
-    objfile->msymbols = ((struct minimal_symbol *)
-                         obstack_alloc (&objfile->objfile_obstack,
-                                        sizeof (objfile->msymbols[0])));
+  if (! objfile->per_bfd->msymbols)
+    objfile->per_bfd->msymbols
+      = ((struct minimal_symbol *)
+	 obstack_alloc (&objfile->per_bfd->storage_obstack,
+			sizeof (struct minimal_symbol)));
 
   {
     struct minimal_symbol *m
-      = &objfile->msymbols[objfile->minimal_symbol_count];
+      = &objfile->per_bfd->msymbols[objfile->per_bfd->minimal_symbol_count];
 
     memset (m, 0, sizeof (*m));
     /* Don't rely on these enumeration values being 0's.  */
     MSYMBOL_TYPE (m) = mst_unknown;
-    MSYMBOL_SET_LANGUAGE (m, language_unknown, &objfile->objfile_obstack);
+    MSYMBOL_SET_LANGUAGE (m, language_unknown,
+			  &objfile->per_bfd->storage_obstack);
   }
 }
 
diff --git a/gdb/objfiles.c b/gdb/objfiles.c
index f456569..83b8961 100644
--- a/gdb/objfiles.c
+++ b/gdb/objfiles.c
@@ -294,7 +294,6 @@ allocate_objfile (bfd *abfd, const char *name, int flags)
   /* We could use obstack_specify_allocation here instead, but
      gdb_obstack.h specifies the alloc/dealloc functions.  */
   obstack_init (&objfile->objfile_obstack);
-  terminate_minimal_symbol_table (objfile);
 
   objfile_alloc_data (objfile);
 
@@ -334,6 +333,8 @@ allocate_objfile (bfd *abfd, const char *name, int flags)
   objfile->per_bfd = get_objfile_bfd_data (objfile, abfd);
   objfile->pspace = current_program_space;
 
+  terminate_minimal_symbol_table (objfile);
+
   /* Initialize the section indexes for this objfile, so that we can
      later detect if they are used w/o being properly assigned to.  */
 
@@ -1029,7 +1030,7 @@ have_minimal_symbols (void)
 
   ALL_OBJFILES (ofp)
   {
-    if (ofp->minimal_symbol_count > 0)
+    if (ofp->per_bfd->minimal_symbol_count > 0)
       {
 	return 1;
       }
diff --git a/gdb/objfiles.h b/gdb/objfiles.h
index 64a371d..d585bc4 100644
--- a/gdb/objfiles.h
+++ b/gdb/objfiles.h
@@ -210,6 +210,38 @@ struct objfile_per_bfd_storage
 
   const char *name_of_main;
   enum language language_of_main;
+
+  /* Each file contains a pointer to an array of minimal symbols for all
+     global symbols that are defined within the file.  The array is
+     terminated by a "null symbol", one that has a NULL pointer for the
+     name and a zero value for the address.  This makes it easy to walk
+     through the array when passed a pointer to somewhere in the middle
+     of it.  There is also a count of the number of symbols, which does
+     not include the terminating null symbol.  The array itself, as well
+     as all the data that it points to, should be allocated on the
+     objfile_obstack for this file.  */
+
+  struct minimal_symbol *msymbols;
+  int minimal_symbol_count;
+
+  /* This is true if minimal symbols have already been read.  Symbol
+     readers can use this to bypass minimal symbol reading.  Also, the
+     minimal symbol table management code in minsyms.c uses this to
+     suppress new minimal symbols.  You might think that MSYMBOLS or
+     MINIMAL_SYMBOL_COUNT could be used for this, but it is possible
+     for multiple readers to install minimal symbols into a given
+     per-BFD.  */
+
+  unsigned int minsyms_read : 1;
+
+  /* This is a hash table used to index the minimal symbols by name.  */
+
+  struct minimal_symbol *msymbol_hash[MINIMAL_SYMBOL_HASH_SIZE];
+
+  /* This hash table is used to index the minimal symbols by their
+     demangled names.  */
+
+  struct minimal_symbol *msymbol_demangled_hash[MINIMAL_SYMBOL_HASH_SIZE];
 };
 
 /* Master structure for keeping track of each file from which
@@ -303,28 +335,6 @@ struct objfile
     struct psymbol_allocation_list global_psymbols;
     struct psymbol_allocation_list static_psymbols;
 
-    /* Each file contains a pointer to an array of minimal symbols for all
-       global symbols that are defined within the file.  The array is
-       terminated by a "null symbol", one that has a NULL pointer for the
-       name and a zero value for the address.  This makes it easy to walk
-       through the array when passed a pointer to somewhere in the middle
-       of it.  There is also a count of the number of symbols, which does
-       not include the terminating null symbol.  The array itself, as well
-       as all the data that it points to, should be allocated on the
-       objfile_obstack for this file.  */
-
-    struct minimal_symbol *msymbols;
-    int minimal_symbol_count;
-
-    /* This is a hash table used to index the minimal symbols by name.  */
-
-    struct minimal_symbol *msymbol_hash[MINIMAL_SYMBOL_HASH_SIZE];
-
-    /* This hash table is used to index the minimal symbols by their
-       demangled names.  */
-
-    struct minimal_symbol *msymbol_demangled_hash[MINIMAL_SYMBOL_HASH_SIZE];
-
     /* Structure which keeps track of functions that manipulate objfile's
        of the same type as this objfile.  I.e. the function to read partial
        symbols for example.  Note that this structure is in statically
@@ -588,8 +598,10 @@ extern void default_iterate_over_objfiles_in_search_order
 
 /* Traverse all minimal symbols in one objfile.  */
 
-#define	ALL_OBJFILE_MSYMBOLS(objfile, m) \
-    for ((m) = (objfile) -> msymbols; MSYMBOL_LINKAGE_NAME(m) != NULL; (m)++)
+#define	ALL_OBJFILE_MSYMBOLS(objfile, m)	\
+    for ((m) = (objfile)->per_bfd->msymbols;	\
+	 MSYMBOL_LINKAGE_NAME (m) != NULL;	\
+	 (m)++)
 
 /* Traverse all symtabs in all objfiles in the current symbol
    space.  */
diff --git a/gdb/symfile.c b/gdb/symfile.c
index d5cb7cb..aee7ef5 100644
--- a/gdb/symfile.c
+++ b/gdb/symfile.c
@@ -836,6 +836,7 @@ static void
 read_symbols (struct objfile *objfile, int add_flags)
 {
   (*objfile->sf->sym_read) (objfile, add_flags);
+  objfile->per_bfd->minsyms_read = 1;
 
   /* find_separate_debug_file_in_section should be called only if there is
      single binary with no existing separate debug info file.  */
@@ -2608,12 +2609,6 @@ reread_symbols (void)
 	  objfile->psymtabs_addrmap = NULL;
 	  objfile->free_psymtabs = NULL;
 	  objfile->template_symbols = NULL;
-	  objfile->msymbols = NULL;
-	  objfile->minimal_symbol_count = 0;
-	  memset (&objfile->msymbol_hash, 0,
-		  sizeof (objfile->msymbol_hash));
-	  memset (&objfile->msymbol_demangled_hash, 0,
-		  sizeof (objfile->msymbol_demangled_hash));
 
 	  /* obstack_init also initializes the obstack so it is
 	     empty.  We could use obstack_specify_allocation but
diff --git a/gdb/symmisc.c b/gdb/symmisc.c
index 0fc78d5..eb15ecc 100644
--- a/gdb/symmisc.c
+++ b/gdb/symmisc.c
@@ -168,7 +168,7 @@ dump_objfile (struct objfile *objfile)
   printf_filtered (", bfd at ");
   gdb_print_host_address (objfile->obfd, gdb_stdout);
   printf_filtered (", %d minsyms\n\n",
-		   objfile->minimal_symbol_count);
+		   objfile->per_bfd->minimal_symbol_count);
 
   if (objfile->sf)
     objfile->sf->qf->dump (objfile);
@@ -204,7 +204,7 @@ dump_msymbols (struct objfile *objfile, struct ui_file *outfile)
   char ms_type;
 
   fprintf_filtered (outfile, "\nObject file %s:\n\n", objfile_name (objfile));
-  if (objfile->minimal_symbol_count == 0)
+  if (objfile->per_bfd->minimal_symbol_count == 0)
     {
       fprintf_filtered (outfile, "No minimal symbols found.\n");
       return;
@@ -274,10 +274,10 @@ dump_msymbols (struct objfile *objfile, struct ui_file *outfile)
       fputs_filtered ("\n", outfile);
       index++;
     }
-  if (objfile->minimal_symbol_count != index)
+  if (objfile->per_bfd->minimal_symbol_count != index)
     {
       warning (_("internal error:  minimal symbol count %d != %d"),
-	       objfile->minimal_symbol_count, index);
+	       objfile->per_bfd->minimal_symbol_count, index);
     }
   fprintf_filtered (outfile, "\n");
 }
-- 
1.8.1.4

^ permalink raw reply	[flat|nested] 11+ messages in thread

* [FYI v3 05/10] start change to progspace independence
  2014-02-26 20:23 [FYI v3 00/10] share minimal symbols across objfiles Tom Tromey
  2014-02-26 19:01 ` [FYI v3 03/10] make MSYMBOL_VALUE_ADDRESS an rvalue Tom Tromey
@ 2014-02-26 19:01 ` Tom Tromey
  2014-02-26 19:01 ` [FYI v3 07/10] move minimal symbols to per-bfd Tom Tromey
                   ` (7 subsequent siblings)
  9 siblings, 0 replies; 11+ messages in thread
From: Tom Tromey @ 2014-02-26 19:01 UTC (permalink / raw)
  To: gdb-patches; +Cc: Tom Tromey

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.
---
 gdb/ChangeLog          | 106 +++++++++++++++++++++++++++++++++++++++++++++++++
 gdb/ada-lang.c         |   4 +-
 gdb/ada-tasks.c        |   4 +-
 gdb/aix-thread.c       |   5 ++-
 gdb/arm-tdep.c         |   4 +-
 gdb/auxv.c             |   3 +-
 gdb/avr-tdep.c         |   4 +-
 gdb/ax-gdb.c           |   3 +-
 gdb/blockframe.c       |   8 ++--
 gdb/breakpoint.c       |   8 ++--
 gdb/bsd-uthread.c      |   2 +-
 gdb/c-valprint.c       |   3 +-
 gdb/coff-pe-read.c     |   2 +-
 gdb/common/agent.c     |   3 +-
 gdb/dbxread.c          |   4 +-
 gdb/dwarf2loc.c        |   2 +-
 gdb/dwarf2read.c       |   2 +-
 gdb/elfread.c          |   4 +-
 gdb/findvar.c          |   4 +-
 gdb/frame.c            |   2 +-
 gdb/frv-tdep.c         |   4 +-
 gdb/glibc-tdep.c       |   2 +-
 gdb/gnu-v3-abi.c       |   5 +--
 gdb/hppa-hpux-tdep.c   |   8 ++--
 gdb/hppa-tdep.c        |   2 +-
 gdb/infcmd.c           |   2 +-
 gdb/jit.c              |  12 +++---
 gdb/linespec.c         |  11 ++---
 gdb/linux-nat.c        |   4 +-
 gdb/linux-thread-db.c  |   2 +-
 gdb/m32c-tdep.c        |  11 +++--
 gdb/m32r-tdep.c        |   4 +-
 gdb/m68hc11-tdep.c     |   2 +-
 gdb/machoread.c        |   2 +-
 gdb/maint.c            |   2 +-
 gdb/minsyms.c          |  80 ++++++++++++++++++++++++-------------
 gdb/mips-linux-tdep.c  |   2 +-
 gdb/mips-tdep.c        |   2 +-
 gdb/objc-lang.c        |   2 +-
 gdb/objfiles.c         |   2 +-
 gdb/obsd-tdep.c        |   3 +-
 gdb/p-valprint.c       |   3 +-
 gdb/parse.c            |   4 +-
 gdb/ppc-linux-tdep.c   |   8 ++--
 gdb/ppc-sysv-tdep.c    |   2 +-
 gdb/printcmd.c         |  44 ++++++++++----------
 gdb/proc-service.c     |   3 +-
 gdb/psymtab.c          |  14 +++----
 gdb/ravenscar-thread.c |   3 +-
 gdb/remote.c           |   4 +-
 gdb/sh64-tdep.c        |   2 +-
 gdb/sol2-tdep.c        |   3 +-
 gdb/solib-dsbt.c       |   2 +-
 gdb/solib-frv.c        |   4 +-
 gdb/solib-irix.c       |   4 +-
 gdb/solib-som.c        |  18 ++++-----
 gdb/solib-spu.c        |   6 +--
 gdb/solib-svr4.c       |  10 ++---
 gdb/spu-tdep.c         |   8 ++--
 gdb/stabsread.c        |   9 +++--
 gdb/stack.c            |   3 +-
 gdb/symfile-debug.c    |   4 +-
 gdb/symfile.c          |   9 ++---
 gdb/symfile.h          |   2 +-
 gdb/symmisc.c          |   3 +-
 gdb/symtab.c           |  58 ++++++++++++++-------------
 gdb/symtab.h           |  14 ++++++-
 gdb/tracepoint.c       |   2 +-
 gdb/tui/tui-disasm.c   |  13 +++---
 gdb/valops.c           |   2 +-
 gdb/value.c            |   4 +-
 71 files changed, 383 insertions(+), 223 deletions(-)

diff --git a/gdb/ada-lang.c b/gdb/ada-lang.c
index baa5d8c..92f437f 100644
--- a/gdb/ada-lang.c
+++ b/gdb/ada-lang.c
@@ -922,7 +922,7 @@ ada_main_name (void)
       CORE_ADDR main_program_name_addr;
       int err_code;
 
-      main_program_name_addr = MSYMBOL_VALUE_ADDRESS (msym.minsym);
+      main_program_name_addr = BMSYMBOL_VALUE_ADDRESS (msym);
       if (main_program_name_addr == 0)
         error (_("Invalid address for Ada main program name."));
 
@@ -12673,7 +12673,7 @@ ada_add_standard_exceptions (regex_t *preg, VEC(ada_exc_info) **exceptions)
 	  if (msymbol.minsym != NULL)
 	    {
 	      struct ada_exc_info info
-		= {standard_exc[i], MSYMBOL_VALUE_ADDRESS (msymbol.minsym)};
+		= {standard_exc[i], BMSYMBOL_VALUE_ADDRESS (msymbol)};
 
 	      VEC_safe_push (ada_exc_info, *exceptions, &info);
 	    }
diff --git a/gdb/ada-tasks.c b/gdb/ada-tasks.c
index 89bdac8..8b37f51 100644
--- a/gdb/ada-tasks.c
+++ b/gdb/ada-tasks.c
@@ -859,7 +859,7 @@ ada_tasks_inferior_data_sniffer (struct ada_tasks_inferior_data *data)
   if (msym.minsym != NULL)
     {
       data->known_tasks_kind = ADA_TASKS_ARRAY;
-      data->known_tasks_addr = MSYMBOL_VALUE_ADDRESS (msym.minsym);
+      data->known_tasks_addr = BMSYMBOL_VALUE_ADDRESS (msym);
 
       /* Try to get pointer type and array length from the symtab.  */
       sym = lookup_symbol_in_language (KNOWN_TASKS_NAME, NULL, VAR_DOMAIN,
@@ -904,7 +904,7 @@ ada_tasks_inferior_data_sniffer (struct ada_tasks_inferior_data *data)
   if (msym.minsym != NULL)
     {
       data->known_tasks_kind = ADA_TASKS_LIST;
-      data->known_tasks_addr = MSYMBOL_VALUE_ADDRESS (msym.minsym);
+      data->known_tasks_addr = BMSYMBOL_VALUE_ADDRESS (msym);
       data->known_tasks_length = 1;
 
       sym = lookup_symbol_in_language (KNOWN_TASKS_LIST, NULL, VAR_DOMAIN,
diff --git a/gdb/aix-thread.c b/gdb/aix-thread.c
index 0202a24..444a025 100644
--- a/gdb/aix-thread.c
+++ b/gdb/aix-thread.c
@@ -49,6 +49,7 @@
 #include "ppc-tdep.h"
 #include <string.h>
 #include "observer.h"
+#include "objfiles.h"
 
 #include <procinfo.h>
 #include <sys/types.h>
@@ -313,7 +314,7 @@ pdc_symbol_addrs (pthdb_user_t user, pthdb_symbol_t *symbols, int count)
 		fprintf_unfiltered (gdb_stdlog, " returning PDC_FAILURE\n");
 	      return PDC_FAILURE;
 	    }
-	  symbols[i].addr = MSYMBOL_VALUE_ADDRESS (ms.minsym);
+	  symbols[i].addr = BMSYMBOL_VALUE_ADDRESS (ms);
 	}
       if (debug_aix_thread)
 	fprintf_unfiltered (gdb_stdlog, "  symbols[%d].addr = %s\n",
@@ -912,7 +913,7 @@ pd_enable (void)
   ms = lookup_minimal_symbol (stub_name, NULL, NULL);
   if (ms.minsym == NULL)
     return;
-  pd_brk_addr = MSYMBOL_VALUE_ADDRESS (ms.minsym);
+  pd_brk_addr = BMSYMBOL_VALUE_ADDRESS (ms);
   if (!create_thread_event_breakpoint (target_gdbarch (), pd_brk_addr))
     return;
 
diff --git a/gdb/arm-tdep.c b/gdb/arm-tdep.c
index 4df2846..e3b1c3d 100644
--- a/gdb/arm-tdep.c
+++ b/gdb/arm-tdep.c
@@ -472,7 +472,7 @@ skip_prologue_function (struct gdbarch *gdbarch, CORE_ADDR pc, int is_thumb)
 
   msym = lookup_minimal_symbol_by_pc (pc);
   if (msym.minsym != NULL
-      && MSYMBOL_VALUE_ADDRESS (msym.minsym) == pc
+      && BMSYMBOL_VALUE_ADDRESS (msym) == pc
       && MSYMBOL_LINKAGE_NAME (msym.minsym) != NULL)
     {
       const char *name = MSYMBOL_LINKAGE_NAME (msym.minsym);
@@ -9280,7 +9280,7 @@ arm_skip_stub (struct frame_info *frame, CORE_ADDR pc)
       objfile = (sec == NULL) ? NULL : sec->objfile;
       minsym = lookup_minimal_symbol (target_name, NULL, objfile);
       if (minsym.minsym != NULL)
-	return MSYMBOL_VALUE_ADDRESS (minsym.minsym);
+	return BMSYMBOL_VALUE_ADDRESS (minsym);
       else
 	return 0;
     }
diff --git a/gdb/auxv.c b/gdb/auxv.c
index 2396627..ce0a71c 100644
--- a/gdb/auxv.c
+++ b/gdb/auxv.c
@@ -27,6 +27,7 @@
 #include "gdbcore.h"
 #include "observer.h"
 #include "filestuff.h"
+#include "objfiles.h"
 
 #include "auxv.h"
 #include "elf/common.h"
@@ -105,7 +106,7 @@ ld_so_xfer_auxv (gdb_byte *readbuf,
      resides.  DATA_ADDRESS is the inferior value present in
      `_dl_auxv', therefore the real inferior AUXV address.  */
 
-  pointer_address = MSYMBOL_VALUE_ADDRESS (msym.minsym);
+  pointer_address = BMSYMBOL_VALUE_ADDRESS (msym);
 
   /* The location of the _dl_auxv symbol may no longer be correct if
      ld.so runs at a different address than the one present in the
diff --git a/gdb/avr-tdep.c b/gdb/avr-tdep.c
index a637cf8..6e58f04 100644
--- a/gdb/avr-tdep.c
+++ b/gdb/avr-tdep.c
@@ -36,6 +36,7 @@
 #include "regcache.h"
 #include <string.h>
 #include "dis-asm.h"
+#include "objfiles.h"
 
 /* AVR Background:
 
@@ -624,8 +625,7 @@ avr_scan_prologue (struct gdbarch *gdbarch, CORE_ADDR pc_beg, CORE_ADDR pc_end,
 
       /* Resolve offset (in words) from __prologue_saves__ symbol.
          Which is a pushes count in `-mcall-prologues' mode */
-      num_pushes = (AVR_MAX_PUSHES
-		    - (i - MSYMBOL_VALUE_ADDRESS (msymbol.minsym)) / 2);
+      num_pushes = AVR_MAX_PUSHES - (i - BMSYMBOL_VALUE_ADDRESS (msymbol)) / 2;
 
       if (num_pushes > AVR_MAX_PUSHES)
         {
diff --git a/gdb/ax-gdb.c b/gdb/ax-gdb.c
index f2bcefa..b77716d 100644
--- a/gdb/ax-gdb.c
+++ b/gdb/ax-gdb.c
@@ -41,6 +41,7 @@
 #include "arch-utils.h"
 #include "cli/cli-utils.h"
 #include "linespec.h"
+#include "objfiles.h"
 
 #include "valprint.h"
 #include "c-lang.h"
@@ -719,7 +720,7 @@ gen_var_ref (struct gdbarch *gdbarch, struct agent_expr *ax,
 	  error (_("Couldn't resolve symbol `%s'."), SYMBOL_PRINT_NAME (var));
 
 	/* Push the address of the variable.  */
-	ax_const_l (ax, MSYMBOL_VALUE_ADDRESS (msym.minsym));
+	ax_const_l (ax, BMSYMBOL_VALUE_ADDRESS (msym));
 	value->kind = axs_lvalue_memory;
       }
       break;
diff --git a/gdb/blockframe.c b/gdb/blockframe.c
index ddfc7d6..0a9381e 100644
--- a/gdb/blockframe.c
+++ b/gdb/blockframe.c
@@ -104,7 +104,7 @@ get_pc_function_start (CORE_ADDR pc)
   msymbol = lookup_minimal_symbol_by_pc (pc);
   if (msymbol.minsym)
     {
-      CORE_ADDR fstart = MSYMBOL_VALUE_ADDRESS (msymbol.minsym);
+      CORE_ADDR fstart = BMSYMBOL_VALUE_ADDRESS (msymbol);
 
       if (find_pc_section (fstart))
 	return fstart;
@@ -221,7 +221,7 @@ find_pc_partial_function_gnu_ifunc (CORE_ADDR pc, const char **name,
   ALL_OBJFILES (objfile)
   {
     if (objfile->sf)
-      symtab = objfile->sf->qf->find_pc_sect_symtab (objfile, msymbol.minsym,
+      symtab = objfile->sf->qf->find_pc_sect_symtab (objfile, msymbol,
 						     mapped_pc, section, 0);
     if (symtab)
       break;
@@ -235,7 +235,7 @@ find_pc_partial_function_gnu_ifunc (CORE_ADDR pc, const char **name,
       if (f != NULL
 	  && (msymbol.minsym == NULL
 	      || (BLOCK_START (SYMBOL_BLOCK_VALUE (f))
-		  >= MSYMBOL_VALUE_ADDRESS (msymbol.minsym))))
+		  >= BMSYMBOL_VALUE_ADDRESS (msymbol))))
 	{
 	  cache_pc_function_low = BLOCK_START (SYMBOL_BLOCK_VALUE (f));
 	  cache_pc_function_high = BLOCK_END (SYMBOL_BLOCK_VALUE (f));
@@ -269,7 +269,7 @@ find_pc_partial_function_gnu_ifunc (CORE_ADDR pc, const char **name,
       return 0;
     }
 
-  cache_pc_function_low = MSYMBOL_VALUE_ADDRESS (msymbol.minsym);
+  cache_pc_function_low = BMSYMBOL_VALUE_ADDRESS (msymbol);
   cache_pc_function_name = MSYMBOL_LINKAGE_NAME (msymbol.minsym);
   cache_pc_function_section = section;
   cache_pc_function_is_gnu_ifunc = (MSYMBOL_TYPE (msymbol.minsym)
diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c
index 7006beb..488064d 100644
--- a/gdb/breakpoint.c
+++ b/gdb/breakpoint.c
@@ -3243,7 +3243,7 @@ create_overlay_event_breakpoint (void)
 	  bp_objfile_data->overlay_msym = m;
 	}
 
-      addr = MSYMBOL_VALUE_ADDRESS (bp_objfile_data->overlay_msym.minsym);
+      addr = BMSYMBOL_VALUE_ADDRESS (bp_objfile_data->overlay_msym);
       b = create_internal_breakpoint (get_objfile_arch (objfile), addr,
                                       bp_overlay_event,
 				      &internal_breakpoint_ops);
@@ -3360,7 +3360,7 @@ create_longjmp_master_breakpoint (void)
 	      bp_objfile_data->longjmp_msym[i] = m;
 	    }
 
-	  addr = MSYMBOL_VALUE_ADDRESS (bp_objfile_data->longjmp_msym[i].minsym);
+	  addr = BMSYMBOL_VALUE_ADDRESS (bp_objfile_data->longjmp_msym[i]);
 	  b = create_internal_breakpoint (gdbarch, addr, bp_longjmp_master,
 					  &internal_breakpoint_ops);
 	  b->addr_string = xstrdup (func_name);
@@ -3415,7 +3415,7 @@ create_std_terminate_master_breakpoint (void)
 	  bp_objfile_data->terminate_msym = m;
 	}
 
-      addr = MSYMBOL_VALUE_ADDRESS (bp_objfile_data->terminate_msym.minsym);
+      addr = BMSYMBOL_VALUE_ADDRESS (bp_objfile_data->terminate_msym);
       b = create_internal_breakpoint (get_objfile_arch (objfile), addr,
                                       bp_std_terminate_master,
 				      &internal_breakpoint_ops);
@@ -3515,7 +3515,7 @@ create_exception_master_breakpoint (void)
 	  bp_objfile_data->exception_msym = debug_hook;
 	}
 
-      addr = MSYMBOL_VALUE_ADDRESS (bp_objfile_data->exception_msym.minsym);
+      addr = BMSYMBOL_VALUE_ADDRESS (bp_objfile_data->exception_msym);
       addr = gdbarch_convert_from_func_ptr_addr (gdbarch, addr,
 						 &current_target);
       b = create_internal_breakpoint (gdbarch, addr, bp_exception_master,
diff --git a/gdb/bsd-uthread.c b/gdb/bsd-uthread.c
index 473acba..c73932a 100644
--- a/gdb/bsd-uthread.c
+++ b/gdb/bsd-uthread.c
@@ -129,7 +129,7 @@ bsd_uthread_lookup_address (const char *name, struct objfile *objfile)
 
   sym = lookup_minimal_symbol (name, NULL, objfile);
   if (sym.minsym)
-    return MSYMBOL_VALUE_ADDRESS (sym.minsym);
+    return BMSYMBOL_VALUE_ADDRESS (sym);
 
   return 0;
 }
diff --git a/gdb/c-valprint.c b/gdb/c-valprint.c
index 5f950f8..f4694b0 100644
--- a/gdb/c-valprint.c
+++ b/gdb/c-valprint.c
@@ -28,6 +28,7 @@
 #include "c-lang.h"
 #include "cp-abi.h"
 #include "target.h"
+#include "objfiles.h"
 \f
 
 /* A helper for c_textual_element_type.  This checks the name of the
@@ -316,7 +317,7 @@ c_val_print (struct type *type, const gdb_byte *valaddr,
 	      /* If 'symbol_print' is set, we did the work above.  */
 	      if (!options->symbol_print
 		  && (msymbol.minsym != NULL)
-		  && (vt_address == MSYMBOL_VALUE_ADDRESS (msymbol.minsym)))
+		  && (vt_address == BMSYMBOL_VALUE_ADDRESS (msymbol)))
 		{
 		  if (want_space)
 		    fputs_filtered (" ", stream);
diff --git a/gdb/coff-pe-read.c b/gdb/coff-pe-read.c
index 7e46189..e1a61b7 100644
--- a/gdb/coff-pe-read.c
+++ b/gdb/coff-pe-read.c
@@ -244,7 +244,7 @@ add_pe_forwarded_sym (const char *sym_name, const char *forward_dll_name,
 			" \"%s\" in dll \"%s\", pointing to \"%s\"\n"),
 			sym_name, dll_name, forward_qualified_name);
 
-  vma = MSYMBOL_VALUE_ADDRESS (msymbol.minsym);
+  vma = BMSYMBOL_VALUE_ADDRESS (msymbol);
   msymtype = MSYMBOL_TYPE (msymbol.minsym);
   section = MSYMBOL_SECTION (msymbol.minsym);
 
diff --git a/gdb/common/agent.c b/gdb/common/agent.c
index fdede74..f553b94 100644
--- a/gdb/common/agent.c
+++ b/gdb/common/agent.c
@@ -23,6 +23,7 @@
 #include "defs.h"
 #include "target.h"
 #include "inferior.h" /* for non_stop */
+#include "objfiles.h"
 #endif
 
 #include <string.h>
@@ -103,7 +104,7 @@ agent_look_up_symbols (void *arg)
 			       (struct objfile *) arg);
 
       if (sym.minsym != NULL)
-	*addrp = MSYMBOL_VALUE_ADDRESS (sym.minsym);
+	*addrp = BMSYMBOL_VALUE_ADDRESS (sym);
       else
 #endif
 	{
diff --git a/gdb/dbxread.c b/gdb/dbxread.c
index ba8616f..e0e5c48 100644
--- a/gdb/dbxread.c
+++ b/gdb/dbxread.c
@@ -1170,7 +1170,7 @@ find_stab_function_addr (char *namestring, const char *filename,
       msym = lookup_minimal_symbol (p, NULL, objfile);
     }
 
-  return msym.minsym == NULL ? 0 : MSYMBOL_VALUE_ADDRESS (msym.minsym);
+  return msym.minsym == NULL ? 0 : BMSYMBOL_VALUE_ADDRESS (msym);
 }
 
 static void
@@ -2278,7 +2278,7 @@ end_psymtab (struct objfile *objfile, struct partial_symtab *pst,
 	}
 
       if (minsym.minsym)
-	pst->texthigh = (MSYMBOL_VALUE_ADDRESS (minsym.minsym)
+	pst->texthigh = (BMSYMBOL_VALUE_ADDRESS (minsym)
 			 + MSYMBOL_SIZE (minsym.minsym));
 
       last_function_name = NULL;
diff --git a/gdb/dwarf2loc.c b/gdb/dwarf2loc.c
index e109ff6..e91b764 100644
--- a/gdb/dwarf2loc.c
+++ b/gdb/dwarf2loc.c
@@ -605,7 +605,7 @@ call_site_to_target_addr (struct gdbarch *call_site_gdbarch,
 			  : MSYMBOL_PRINT_NAME (msym.minsym)));
 			
 	  }
-	return MSYMBOL_VALUE_ADDRESS (msym.minsym);
+	return BMSYMBOL_VALUE_ADDRESS (msym);
       }
 
     case FIELD_LOC_KIND_PHYSADDR:
diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c
index 00bba47..0faacf0 100644
--- a/gdb/dwarf2read.c
+++ b/gdb/dwarf2read.c
@@ -3981,7 +3981,7 @@ recursively_find_pc_sect_symtab (struct symtab *symtab, CORE_ADDR pc)
 
 static struct symtab *
 dw2_find_pc_sect_symtab (struct objfile *objfile,
-			 struct minimal_symbol *msymbol,
+			 struct bound_minimal_symbol msymbol,
 			 CORE_ADDR pc,
 			 struct obj_section *section,
 			 int warn_if_readin)
diff --git a/gdb/elfread.c b/gdb/elfread.c
index 4d2e290..7c4b175 100644
--- a/gdb/elfread.c
+++ b/gdb/elfread.c
@@ -765,7 +765,7 @@ elf_gnu_ifunc_record_cache (const char *name, CORE_ADDR addr)
   msym = lookup_minimal_symbol_by_pc (addr);
   if (msym.minsym == NULL)
     return 0;
-  if (MSYMBOL_VALUE_ADDRESS (msym.minsym) != addr)
+  if (BMSYMBOL_VALUE_ADDRESS (msym) != addr)
     return 0;
   /* minimal symbols have always SYMBOL_OBJ_SECTION non-NULL.  */
   sect = MSYMBOL_OBJ_SECTION (msym.objfile, msym.minsym)->the_bfd_section;
@@ -891,7 +891,7 @@ elf_gnu_ifunc_resolve_by_got (const char *name, CORE_ADDR *addr_p)
 	continue;
       if (MSYMBOL_TYPE (msym.minsym) != mst_slot_got_plt)
 	continue;
-      pointer_address = MSYMBOL_VALUE_ADDRESS (msym.minsym);
+      pointer_address = BMSYMBOL_VALUE_ADDRESS (msym);
 
       plt = bfd_get_section_by_name (obfd, ".plt");
       if (plt == NULL)
diff --git a/gdb/findvar.c b/gdb/findvar.c
index 56cbb2c..a2a7bb7 100644
--- a/gdb/findvar.c
+++ b/gdb/findvar.c
@@ -573,11 +573,11 @@ default_read_var_value (struct symbol *var, struct frame_info *frame)
 	if (msym == NULL)
 	  error (_("No global symbol \"%s\"."), SYMBOL_LINKAGE_NAME (var));
 	if (overlay_debugging)
-	  addr = symbol_overlayed_address (MSYMBOL_VALUE_ADDRESS (msym),
+	  addr = symbol_overlayed_address (BMSYMBOL_VALUE_ADDRESS (lookup_data.result),
 					   MSYMBOL_OBJ_SECTION (lookup_data.result.objfile,
 								msym));
 	else
-	  addr = MSYMBOL_VALUE_ADDRESS (msym);
+	  addr = BMSYMBOL_VALUE_ADDRESS (lookup_data.result);
 
 	obj_section = MSYMBOL_OBJ_SECTION (lookup_data.result.objfile, msym);
 	if (obj_section
diff --git a/gdb/frame.c b/gdb/frame.c
index 40dc1d5..97d54e9 100644
--- a/gdb/frame.c
+++ b/gdb/frame.c
@@ -2018,7 +2018,7 @@ inside_main_func (struct frame_info *this_frame)
   /* Make certain that the code, and not descriptor, address is
      returned.  */
   maddr = gdbarch_convert_from_func_ptr_addr (get_frame_arch (this_frame),
-					      MSYMBOL_VALUE_ADDRESS (msymbol.minsym),
+					      BMSYMBOL_VALUE_ADDRESS (msymbol),
 					      &current_target);
   return maddr == get_frame_func (this_frame);
 }
diff --git a/gdb/frv-tdep.c b/gdb/frv-tdep.c
index acb0ba3..bd4dbdb 100644
--- a/gdb/frv-tdep.c
+++ b/gdb/frv-tdep.c
@@ -39,6 +39,7 @@
 #include "infcall.h"
 #include "solib.h"
 #include "frv-tdep.h"
+#include "objfiles.h"
 
 extern void _initialize_frv_tdep (void);
 
@@ -1399,8 +1400,7 @@ frv_frame_this_id (struct frame_info *this_frame,
 
   /* Check if the stack is empty.  */
   msym_stack = lookup_minimal_symbol ("_stack", NULL, NULL);
-  if (msym_stack.minsym
-      && info->base == MSYMBOL_VALUE_ADDRESS (msym_stack.minsym))
+  if (msym_stack.minsym && info->base == BMSYMBOL_VALUE_ADDRESS (msym_stack))
     return;
 
   /* Hopefully the prologue analysis either correctly determined the
diff --git a/gdb/glibc-tdep.c b/gdb/glibc-tdep.c
index 99b504f..6d16c33 100644
--- a/gdb/glibc-tdep.c
+++ b/gdb/glibc-tdep.c
@@ -66,7 +66,7 @@ glibc_skip_solib_resolver (struct gdbarch *gdbarch, CORE_ADDR pc)
       if (! fixup.minsym)
         fixup = lookup_minimal_symbol ("fixup", NULL, resolver.objfile);
 
-      if (fixup.minsym && MSYMBOL_VALUE_ADDRESS (fixup.minsym) == pc)
+      if (fixup.minsym && BMSYMBOL_VALUE_ADDRESS (fixup) == pc)
 	return frame_unwind_caller_pc (get_current_frame ());
     }
 
diff --git a/gdb/gnu-v3-abi.c b/gdb/gnu-v3-abi.c
index 35f8e7b..e0be328 100644
--- a/gdb/gnu-v3-abi.c
+++ b/gdb/gnu-v3-abi.c
@@ -1131,8 +1131,7 @@ gnuv3_get_typeid (struct value *value)
       if (minsym.minsym == NULL)
 	error (_("could not find typeinfo symbol for '%s'"), typename);
 
-      result = value_at_lazy (typeinfo_type,
-			      MSYMBOL_VALUE_ADDRESS (minsym.minsym));
+      result = value_at_lazy (typeinfo_type, BMSYMBOL_VALUE_ADDRESS (minsym));
     }
 
   do_cleanups (cleanup);
@@ -1236,7 +1235,7 @@ gnuv3_skip_trampoline (struct frame_info *frame, CORE_ADDR stop_pc)
   if (fn_sym.minsym == NULL)
     return 0;
 
-  method_stop_pc = MSYMBOL_VALUE_ADDRESS (fn_sym.minsym);
+  method_stop_pc = BMSYMBOL_VALUE_ADDRESS (fn_sym);
 
   /* Some targets have minimal symbols pointing to function descriptors
      (powerpc 64 for example).  Make sure to retrieve the address
diff --git a/gdb/hppa-hpux-tdep.c b/gdb/hppa-hpux-tdep.c
index e9f067d..8d4686f 100644
--- a/gdb/hppa-hpux-tdep.c
+++ b/gdb/hppa-hpux-tdep.c
@@ -973,7 +973,7 @@ hppa64_hpux_search_dummy_call_sequence (struct gdbarch *gdbarch, CORE_ADDR pc,
       gdb_byte buf[2 * HPPA_INSN_SIZE];
       int offset;
 
-      find_pc_partial_function (MSYMBOL_VALUE_ADDRESS (msym), &name,
+      find_pc_partial_function (MSYMBOL_VALUE_ADDRESS (obj, msym), &name,
       				&begin, &end);
 
       if (name == NULL || begin == 0 || end == 0)
@@ -1096,10 +1096,10 @@ hppa_hpux_find_dummy_bpaddr (CORE_ADDR addr)
       find_pc_partial_function (addr, NULL, &func, NULL);
       ALL_OBJFILE_MSYMBOLS (sec->objfile, msym)
 	{
-	  u = find_unwind_entry (MSYMBOL_VALUE_ADDRESS (msym));
-	  if (func != MSYMBOL_VALUE_ADDRESS (msym) 
+	  u = find_unwind_entry (MSYMBOL_VALUE_ADDRESS (sec->objfile, msym));
+	  if (func != MSYMBOL_VALUE_ADDRESS (sec->objfile, msym) 
 	      && (!u || u->stub_unwind.stub_type == 0))
-	    return MSYMBOL_VALUE_ADDRESS (msym);
+	    return MSYMBOL_VALUE_ADDRESS (sec->objfile, msym);
 	}
     }
 
diff --git a/gdb/hppa-tdep.c b/gdb/hppa-tdep.c
index 05ca007..e302ebb 100644
--- a/gdb/hppa-tdep.c
+++ b/gdb/hppa-tdep.c
@@ -166,7 +166,7 @@ hppa_symbol_address(const char *sym)
 
   minsym = lookup_minimal_symbol (sym, NULL, NULL);
   if (minsym.minsym)
-    return MSYMBOL_VALUE_ADDRESS (minsym.minsym);
+    return BMSYMBOL_VALUE_ADDRESS (minsym);
   else
     return (CORE_ADDR)-1;
 }
diff --git a/gdb/infcmd.c b/gdb/infcmd.c
index 23b02a3..c59d0be 100644
--- a/gdb/infcmd.c
+++ b/gdb/infcmd.c
@@ -1335,7 +1335,7 @@ until_next_command (int from_tty)
       if (msymbol.minsym == NULL)
 	error (_("Execution is not within a known function."));
 
-      tp->control.step_range_start = MSYMBOL_VALUE_ADDRESS (msymbol.minsym);
+      tp->control.step_range_start = BMSYMBOL_VALUE_ADDRESS (msymbol);
       tp->control.step_range_end = pc;
     }
   else
diff --git a/gdb/jit.c b/gdb/jit.c
index 53394c4..db6c1b0 100644
--- a/gdb/jit.c
+++ b/gdb/jit.c
@@ -357,7 +357,8 @@ jit_read_descriptor (struct gdbarch *gdbarch,
   if (jit_debug)
     fprintf_unfiltered (gdb_stdlog,
 			"jit_read_descriptor, descriptor_addr = %s\n",
-			paddress (gdbarch, MSYMBOL_VALUE_ADDRESS (objf_data->descriptor)));
+			paddress (gdbarch, MSYMBOL_VALUE_ADDRESS (ps_data->objfile,
+								  objf_data->descriptor)));
 
   /* Figure out how big the descriptor is on the remote and how to read it.  */
   ptr_type = builtin_type (gdbarch)->builtin_data_ptr;
@@ -366,7 +367,8 @@ jit_read_descriptor (struct gdbarch *gdbarch,
   desc_buf = alloca (desc_size);
 
   /* Read the descriptor.  */
-  err = target_read_memory (MSYMBOL_VALUE_ADDRESS (objf_data->descriptor),
+  err = target_read_memory (MSYMBOL_VALUE_ADDRESS (ps_data->objfile,
+						   objf_data->descriptor),
 			    desc_buf, desc_size);
   if (err)
     {
@@ -1026,13 +1028,13 @@ jit_breakpoint_re_set_internal (struct gdbarch *gdbarch,
 	 assume we are not attached to a JIT.  */
       reg_symbol = lookup_minimal_symbol_and_objfile (jit_break_name);
       if (reg_symbol.minsym == NULL
-	  || MSYMBOL_VALUE_ADDRESS (reg_symbol.minsym) == 0)
+	  || BMSYMBOL_VALUE_ADDRESS (reg_symbol) == 0)
 	return 1;
 
       desc_symbol = lookup_minimal_symbol (jit_descriptor_name, NULL,
 					   reg_symbol.objfile);
       if (desc_symbol.minsym == NULL
-	  || MSYMBOL_VALUE_ADDRESS (desc_symbol.minsym) == 0)
+	  || BMSYMBOL_VALUE_ADDRESS (desc_symbol) == 0)
 	return 1;
 
       objf_data = get_jit_objfile_data (reg_symbol.objfile);
@@ -1044,7 +1046,7 @@ jit_breakpoint_re_set_internal (struct gdbarch *gdbarch,
   else
     objf_data = get_jit_objfile_data (ps_data->objfile);
 
-  addr = MSYMBOL_VALUE_ADDRESS (objf_data->register_code);
+  addr = MSYMBOL_VALUE_ADDRESS (ps_data->objfile, objf_data->register_code);
 
   if (jit_debug)
     fprintf_unfiltered (gdb_stdlog,
diff --git a/gdb/linespec.c b/gdb/linespec.c
index 70495c6..610809d 100644
--- a/gdb/linespec.c
+++ b/gdb/linespec.c
@@ -3417,7 +3417,7 @@ minsym_found (struct linespec_state *self, struct objfile *objfile,
   CORE_ADDR pc;
   struct symtab_and_line sal;
 
-  sal = find_pc_sect_line (MSYMBOL_VALUE_ADDRESS (msymbol),
+  sal = find_pc_sect_line (MSYMBOL_VALUE_ADDRESS (objfile, msymbol),
 			   (struct obj_section *) 0, 0);
   sal.section = MSYMBOL_OBJ_SECTION (objfile, msymbol);
 
@@ -3498,6 +3498,9 @@ add_minsym (struct minimal_symbol *minsym, void *d)
   struct collect_minsyms *info = d;
   bound_minimal_symbol_d mo;
 
+  mo.minsym = minsym;
+  mo.objfile = info->objfile;
+
   /* Exclude data symbols when looking for breakpoint locations.   */
   if (!info->list_mode)
     switch (minsym->type)
@@ -3513,16 +3516,14 @@ add_minsym (struct minimal_symbol *minsym, void *d)
 	       before we decide to discard it.  */
 	    struct gdbarch *gdbarch = get_objfile_arch (info->objfile);
 	    CORE_ADDR addr = gdbarch_convert_from_func_ptr_addr
-			       (gdbarch, MSYMBOL_VALUE_ADDRESS (minsym),
+			       (gdbarch, BMSYMBOL_VALUE_ADDRESS (mo),
 				&current_target);
 
-	    if (addr == MSYMBOL_VALUE_ADDRESS (minsym))
+	    if (addr == BMSYMBOL_VALUE_ADDRESS (mo))
 	      return;
 	  }
       }
 
-  mo.minsym = minsym;
-  mo.objfile = info->objfile;
   VEC_safe_push (bound_minimal_symbol_d, info->msyms, &mo);
 }
 
diff --git a/gdb/linux-nat.c b/gdb/linux-nat.c
index 4702bf5..0066141 100644
--- a/gdb/linux-nat.c
+++ b/gdb/linux-nat.c
@@ -67,6 +67,7 @@
 #include "buffer.h"
 #include "target-descriptions.h"
 #include "filestuff.h"
+#include "objfiles.h"
 
 #ifndef SPUFS_MAGIC
 #define SPUFS_MAGIC 0x23c9b64e
@@ -5038,8 +5039,7 @@ get_signo (const char *name)
   if (ms.minsym == NULL)
     return 0;
 
-  if (target_read_memory (MSYMBOL_VALUE_ADDRESS (ms.minsym),
-			  (gdb_byte *) &signo,
+  if (target_read_memory (BMSYMBOL_VALUE_ADDRESS (ms), (gdb_byte *) &signo,
 			  sizeof (signo)) != 0)
     return 0;
 
diff --git a/gdb/linux-thread-db.c b/gdb/linux-thread-db.c
index e1c5bce..ca614a3 100644
--- a/gdb/linux-thread-db.c
+++ b/gdb/linux-thread-db.c
@@ -574,7 +574,7 @@ inferior_has_bug (const char *ver_symbol, int ver_major_min, int ver_minor_min)
   if (version_msym.minsym == NULL)
     return 0;
 
-  version_addr = MSYMBOL_VALUE_ADDRESS (version_msym.minsym);
+  version_addr = BMSYMBOL_VALUE_ADDRESS (version_msym);
   got = target_read_string (version_addr, &version, 32, &err);
   if (err == 0 && memchr (version, 0, got) == &version[got -1])
     {
diff --git a/gdb/m32c-tdep.c b/gdb/m32c-tdep.c
index d6bc482..2c7dbb8 100644
--- a/gdb/m32c-tdep.c
+++ b/gdb/m32c-tdep.c
@@ -40,6 +40,7 @@
 #include "reggroups.h"
 #include "prologue-value.h"
 #include "target.h"
+#include "objfiles.h"
 
 \f
 /* The m32c tdep structure.  */
@@ -2247,8 +2248,7 @@ m32c_return_value (struct gdbarch *gdbarch,
 	    error (_("The return value is stored in memory at 'mem0', "
 		     "but GDB cannot find\n"
 		     "its address."));
-	  read_memory (MSYMBOL_VALUE_ADDRESS (mem0.minsym), readbuf,
-		       valtype_len);
+	  read_memory (BMSYMBOL_VALUE_ADDRESS (mem0), readbuf, valtype_len);
 	}
     }
 
@@ -2280,8 +2280,7 @@ m32c_return_value (struct gdbarch *gdbarch,
 	    error (_("The return value is stored in memory at 'mem0', "
 		     "but GDB cannot find\n"
 		     " its address."));
-	  write_memory (MSYMBOL_VALUE_ADDRESS (mem0.minsym), writebuf,
-			valtype_len);
+	  write_memory (BMSYMBOL_VALUE_ADDRESS (mem0), writebuf, valtype_len);
 	}
     }
 
@@ -2507,7 +2506,7 @@ m32c_m16c_address_to_pointer (struct gdbarch *gdbarch,
       else
 	{
 	  /* The trampoline's address is our pointer.  */
-	  addr = MSYMBOL_VALUE_ADDRESS (tramp_msym.minsym);
+	  addr = BMSYMBOL_VALUE_ADDRESS (tramp_msym);
 	}
     }
 
@@ -2560,7 +2559,7 @@ m32c_m16c_pointer_to_address (struct gdbarch *gdbarch,
               /* If we do have such a symbol, return its value as the
                  function's true address.  */
               if (func_msym.minsym)
-                ptr = MSYMBOL_VALUE_ADDRESS (func_msym.minsym);
+                ptr = BMSYMBOL_VALUE_ADDRESS (func_msym);
             }
         }
       else
diff --git a/gdb/m32r-tdep.c b/gdb/m32r-tdep.c
index 2af5774..838d3d9 100644
--- a/gdb/m32r-tdep.c
+++ b/gdb/m32r-tdep.c
@@ -36,6 +36,7 @@
 #include "regcache.h"
 #include "trad-frame.h"
 #include "dis-asm.h"
+#include "objfiles.h"
 
 #include "gdb_assert.h"
 
@@ -844,8 +845,7 @@ m32r_frame_this_id (struct frame_info *this_frame,
 
   /* Check if the stack is empty.  */
   msym_stack = lookup_minimal_symbol ("_stack", NULL, NULL);
-  if (msym_stack.minsym
-      && info->base == MSYMBOL_VALUE_ADDRESS (msym_stack.minsym))
+  if (msym_stack.minsym && info->base == BMSYMBOL_VALUE_ADDRESS (msym_stack))
     return;
 
   /* Hopefully the prologue analysis either correctly determined the
diff --git a/gdb/m68hc11-tdep.c b/gdb/m68hc11-tdep.c
index 6f0092b..9b7e1af 100644
--- a/gdb/m68hc11-tdep.c
+++ b/gdb/m68hc11-tdep.c
@@ -204,7 +204,7 @@ m68hc11_get_register_info (struct m68hc11_soft_reg *reg, const char *name)
   msymbol = lookup_minimal_symbol (name, NULL, NULL);
   if (msymbol.minsym)
     {
-      reg->addr = MSYMBOL_VALUE_ADDRESS (msymbol.minsym);
+      reg->addr = BMSYMBOL_VALUE_ADDRESS (msymbol);
       reg->name = xstrdup (name);
 
       /* Keep track of the address range for soft registers.  */
diff --git a/gdb/machoread.c b/gdb/machoread.c
index f189e99..f7194e2 100644
--- a/gdb/machoread.c
+++ b/gdb/machoread.c
@@ -441,7 +441,7 @@ macho_resolve_oso_sym_with_minsym (struct objfile *main_objfile, asymbol *sym)
       return 0;
     }
   else
-    return MSYMBOL_VALUE_ADDRESS (msym.minsym);
+    return BMSYMBOL_VALUE_ADDRESS (msym);
 }
 
 /* Add oso file OSO/ABFD as a symbol file.  */
diff --git a/gdb/maint.c b/gdb/maint.c
index b4225d9..873c33c 100644
--- a/gdb/maint.c
+++ b/gdb/maint.c
@@ -492,7 +492,7 @@ maintenance_translate_address (char *arg, int from_tty)
     {
       const char *symbol_name = MSYMBOL_PRINT_NAME (sym.minsym);
       const char *symbol_offset
-	= pulongest (address - MSYMBOL_VALUE_ADDRESS (sym.minsym));
+	= pulongest (address - BMSYMBOL_VALUE_ADDRESS (sym));
 
       sect = MSYMBOL_OBJ_SECTION(sym.objfile, sym.minsym);
       if (sect != NULL)
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),
 		     &current_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.  */
diff --git a/gdb/mips-linux-tdep.c b/gdb/mips-linux-tdep.c
index 89c578e..61bea6c 100644
--- a/gdb/mips-linux-tdep.c
+++ b/gdb/mips-linux-tdep.c
@@ -826,7 +826,7 @@ mips_linux_skip_resolver (struct gdbarch *gdbarch, CORE_ADDR pc)
 
   resolver = lookup_minimal_symbol ("__dl_runtime_resolve", NULL, NULL);
 
-  if (resolver.minsym && MSYMBOL_VALUE_ADDRESS (resolver.minsym) == pc)
+  if (resolver.minsym && BMSYMBOL_VALUE_ADDRESS (resolver) == pc)
     return frame_unwind_caller_pc (get_current_frame ());
 
   return glibc_skip_solib_resolver (gdbarch, pc);
diff --git a/gdb/mips-tdep.c b/gdb/mips-tdep.c
index 7380ee1..606b150 100644
--- a/gdb/mips-tdep.c
+++ b/gdb/mips-tdep.c
@@ -7635,7 +7635,7 @@ mips_skip_pic_trampoline_code (struct frame_info *frame, CORE_ADDR pc)
      which jumps to foo.  */
   msym = lookup_minimal_symbol_by_pc (pc);
   if (msym.minsym == NULL
-      || MSYMBOL_VALUE_ADDRESS (msym.minsym) != pc
+      || BMSYMBOL_VALUE_ADDRESS (msym) != pc
       || MSYMBOL_LINKAGE_NAME (msym.minsym) == NULL
       || strncmp (MSYMBOL_LINKAGE_NAME (msym.minsym), ".pic.", 5) != 0)
     return 0;
diff --git a/gdb/objc-lang.c b/gdb/objc-lang.c
index 54a5acf..4327895 100644
--- a/gdb/objc-lang.c
+++ b/gdb/objc-lang.c
@@ -1276,7 +1276,7 @@ find_objc_msgsend (void)
 	  continue; 
 	}
 
-      methcalls[i].begin = MSYMBOL_VALUE_ADDRESS (func.minsym);
+      methcalls[i].begin = BMSYMBOL_VALUE_ADDRESS (func);
       methcalls[i].end = minimal_symbol_upper_bound (func);
     }
 }
diff --git a/gdb/objfiles.c b/gdb/objfiles.c
index dba13fb..db0c720 100644
--- a/gdb/objfiles.c
+++ b/gdb/objfiles.c
@@ -805,7 +805,7 @@ objfile_relocate1 (struct objfile *objfile,
 
     ALL_OBJFILE_MSYMBOLS (objfile, msym)
       if (MSYMBOL_SECTION (msym) >= 0)
-	SET_MSYMBOL_VALUE_ADDRESS (msym, (MSYMBOL_VALUE_ADDRESS (msym)
+	SET_MSYMBOL_VALUE_ADDRESS (msym, (MSYMBOL_VALUE_ADDRESS (objfile, msym)
 					  + ANOFFSET (delta,
 						      MSYMBOL_SECTION (msym))));
   }
diff --git a/gdb/obsd-tdep.c b/gdb/obsd-tdep.c
index fc100e2..b94ee41 100644
--- a/gdb/obsd-tdep.c
+++ b/gdb/obsd-tdep.c
@@ -20,6 +20,7 @@
 #include "defs.h"
 #include "frame.h"
 #include "symtab.h"
+#include "objfiles.h"
 
 #include "obsd-tdep.h"
 
@@ -29,7 +30,7 @@ obsd_skip_solib_resolver (struct gdbarch *gdbarch, CORE_ADDR pc)
   struct bound_minimal_symbol msym;
 
   msym = lookup_minimal_symbol("_dl_bind", NULL, NULL);
-  if (msym.minsym && MSYMBOL_VALUE_ADDRESS (msym.minsym) == pc)
+  if (msym.minsym && BMSYMBOL_VALUE_ADDRESS (msym) == pc)
     return frame_unwind_caller_pc (get_current_frame ());
   else
     return find_solib_trampoline_target (get_current_frame (), pc);
diff --git a/gdb/p-valprint.c b/gdb/p-valprint.c
index 5300d6b..70eb3a8 100644
--- a/gdb/p-valprint.c
+++ b/gdb/p-valprint.c
@@ -38,6 +38,7 @@
 #include "cp-abi.h"
 #include "cp-support.h"
 #include "exceptions.h"
+#include "objfiles.h"
 \f
 
 /* Decorations for Pascal.  */
@@ -227,7 +228,7 @@ pascal_val_print (struct type *type, const gdb_byte *valaddr,
 	  /* If 'symbol_print' is set, we did the work above.  */
 	  if (!options->symbol_print
 	      && (msymbol.minsym != NULL)
-	      && (vt_address == MSYMBOL_VALUE_ADDRESS (msymbol.minsym)))
+	      && (vt_address == BMSYMBOL_VALUE_ADDRESS (msymbol)))
 	    {
 	      if (want_space)
 		fputs_filtered (" ", stream);
diff --git a/gdb/parse.c b/gdb/parse.c
index a40fae5..c6e25a9 100644
--- a/gdb/parse.c
+++ b/gdb/parse.c
@@ -502,7 +502,7 @@ write_exp_msymbol (struct bound_minimal_symbol bound_msym)
   struct objfile *objfile = bound_msym.objfile;
   struct gdbarch *gdbarch = get_objfile_arch (objfile);
 
-  CORE_ADDR addr = MSYMBOL_VALUE_ADDRESS (msymbol);
+  CORE_ADDR addr = BMSYMBOL_VALUE_ADDRESS (bound_msym);
   struct obj_section *section = MSYMBOL_OBJ_SECTION (objfile, msymbol);
   enum minimal_symbol_type type = MSYMBOL_TYPE (msymbol);
   CORE_ADDR pc;
@@ -519,7 +519,7 @@ write_exp_msymbol (struct bound_minimal_symbol bound_msym)
 
       if (ifunc_msym.minsym != NULL
 	  && MSYMBOL_TYPE (ifunc_msym.minsym) == mst_text_gnu_ifunc
-	  && MSYMBOL_VALUE_ADDRESS (ifunc_msym.minsym) == pc)
+	  && BMSYMBOL_VALUE_ADDRESS (ifunc_msym) == pc)
 	{
 	  /* A function descriptor has been resolved but PC is still in the
 	     STT_GNU_IFUNC resolver body (such as because inferior does not
diff --git a/gdb/ppc-linux-tdep.c b/gdb/ppc-linux-tdep.c
index dee6938..08c5342 100644
--- a/gdb/ppc-linux-tdep.c
+++ b/gdb/ppc-linux-tdep.c
@@ -919,9 +919,9 @@ ppc_elfv2_skip_entrypoint (struct gdbarch *gdbarch, CORE_ADDR pc)
   if (MSYMBOL_TARGET_FLAG_1 (fun.minsym))
     local_entry_offset = 8;
 
-  if (MSYMBOL_VALUE_ADDRESS (fun.minsym) <= pc
-      && pc < MSYMBOL_VALUE_ADDRESS (fun.minsym) + local_entry_offset)
-    return MSYMBOL_VALUE_ADDRESS (fun.minsym) + local_entry_offset;
+  if (BMSYMBOL_VALUE_ADDRESS (fun) <= pc
+      && pc < BMSYMBOL_VALUE_ADDRESS (fun) + local_entry_offset)
+    return BMSYMBOL_VALUE_ADDRESS (fun) + local_entry_offset;
 
   return pc;
 }
@@ -1028,7 +1028,7 @@ ppc_linux_spe_context_lookup (struct objfile *objfile)
     {
       spe_context_objfile = objfile;
       spe_context_lm_addr = svr4_fetch_objfile_link_map (objfile);
-      spe_context_offset = MSYMBOL_VALUE_ADDRESS (sym.minsym);
+      spe_context_offset = BMSYMBOL_VALUE_ADDRESS (sym);
       spe_context_cache_ptid = minus_one_ptid;
       spe_context_cache_address = 0;
       return;
diff --git a/gdb/ppc-sysv-tdep.c b/gdb/ppc-sysv-tdep.c
index 124e4fa..1a880a6 100644
--- a/gdb/ppc-sysv-tdep.c
+++ b/gdb/ppc-sysv-tdep.c
@@ -1097,7 +1097,7 @@ convert_code_addr_to_desc_addr (CORE_ADDR code_addr, CORE_ADDR *desc_addr)
   if (fn.minsym == NULL)
     return 0;
   /* Found a descriptor.  */
-  (*desc_addr) = MSYMBOL_VALUE_ADDRESS (fn.minsym);
+  (*desc_addr) = BMSYMBOL_VALUE_ADDRESS (fn);
   return 1;
 }
 
diff --git a/gdb/printcmd.c b/gdb/printcmd.c
index ec0d6c1..87b1448 100644
--- a/gdb/printcmd.c
+++ b/gdb/printcmd.c
@@ -631,7 +631,7 @@ build_address_symbolic (struct gdbarch *gdbarch,
 			int *line,       /* OUT */
 			int *unmapped)   /* OUT */
 {
-  struct minimal_symbol *msymbol;
+  struct bound_minimal_symbol msymbol;
   struct symbol *symbol;
   CORE_ADDR name_location = 0;
   struct obj_section *section = NULL;
@@ -661,7 +661,7 @@ build_address_symbolic (struct gdbarch *gdbarch,
      save some memory, but for many debug format--ELF/DWARF or
      anything/stabs--it would be inconvenient to eliminate those minimal
      symbols anyway).  */
-  msymbol = lookup_minimal_symbol_by_pc_section (addr, section).minsym;
+  msymbol = lookup_minimal_symbol_by_pc_section (addr, section);
   symbol = find_pc_sect_function (addr, section);
 
   if (symbol)
@@ -680,40 +680,40 @@ build_address_symbolic (struct gdbarch *gdbarch,
 	name_temp = SYMBOL_LINKAGE_NAME (symbol);
     }
 
-  if (msymbol != NULL
-      && MSYMBOL_HAS_SIZE (msymbol)
-      && MSYMBOL_SIZE (msymbol) == 0
-      && MSYMBOL_TYPE (msymbol) != mst_text
-      && MSYMBOL_TYPE (msymbol) != mst_text_gnu_ifunc
-      && MSYMBOL_TYPE (msymbol) != mst_file_text)
-    msymbol = NULL;
+  if (msymbol.minsym != NULL
+      && MSYMBOL_HAS_SIZE (msymbol.minsym)
+      && MSYMBOL_SIZE (msymbol.minsym) == 0
+      && MSYMBOL_TYPE (msymbol.minsym) != mst_text
+      && MSYMBOL_TYPE (msymbol.minsym) != mst_text_gnu_ifunc
+      && MSYMBOL_TYPE (msymbol.minsym) != mst_file_text)
+    msymbol.minsym = NULL;
 
-  if (msymbol != NULL)
+  if (msymbol.minsym != NULL)
     {
-      if (MSYMBOL_VALUE_ADDRESS (msymbol) > name_location || symbol == NULL)
+      if (BMSYMBOL_VALUE_ADDRESS (msymbol) > name_location || symbol == NULL)
 	{
 	  /* If this is a function (i.e. a code address), strip out any
 	     non-address bits.  For instance, display a pointer to the
 	     first instruction of a Thumb function as <function>; the
 	     second instruction will be <function+2>, even though the
 	     pointer is <function+3>.  This matches the ISA behavior.  */
-	  if (MSYMBOL_TYPE (msymbol) == mst_text
-	      || MSYMBOL_TYPE (msymbol) == mst_text_gnu_ifunc
-	      || MSYMBOL_TYPE (msymbol) == mst_file_text
-	      || MSYMBOL_TYPE (msymbol) == mst_solib_trampoline)
+	  if (MSYMBOL_TYPE (msymbol.minsym) == mst_text
+	      || MSYMBOL_TYPE (msymbol.minsym) == mst_text_gnu_ifunc
+	      || MSYMBOL_TYPE (msymbol.minsym) == mst_file_text
+	      || MSYMBOL_TYPE (msymbol.minsym) == mst_solib_trampoline)
 	    addr = gdbarch_addr_bits_remove (gdbarch, addr);
 
 	  /* The msymbol is closer to the address than the symbol;
 	     use the msymbol instead.  */
 	  symbol = 0;
-	  name_location = MSYMBOL_VALUE_ADDRESS (msymbol);
+	  name_location = BMSYMBOL_VALUE_ADDRESS (msymbol);
 	  if (do_demangle || asm_demangle)
-	    name_temp = MSYMBOL_PRINT_NAME (msymbol);
+	    name_temp = MSYMBOL_PRINT_NAME (msymbol.minsym);
 	  else
-	    name_temp = MSYMBOL_LINKAGE_NAME (msymbol);
+	    name_temp = MSYMBOL_LINKAGE_NAME (msymbol.minsym);
 	}
     }
-  if (symbol == NULL && msymbol == NULL)
+  if (symbol == NULL && msymbol.minsym == NULL)
     return 1;
 
   /* If the nearest symbol is too far away, don't print anything symbolic.  */
@@ -1126,7 +1126,7 @@ sym_info (char *arg, int from_tty)
 	struct cleanup *old_chain;
 
 	matches = 1;
-	offset = sect_addr - MSYMBOL_VALUE_ADDRESS (msymbol);
+	offset = sect_addr - MSYMBOL_VALUE_ADDRESS (objfile, msymbol);
 	mapped = section_is_mapped (osect) ? _("mapped") : _("unmapped");
 	sec_name = osect->the_bfd_section->name;
 	msym_name = MSYMBOL_PRINT_NAME (msymbol);
@@ -1225,7 +1225,7 @@ address_info (char *exp, int from_tty)
 	  struct objfile *objfile = msymbol.objfile;
 
 	  gdbarch = get_objfile_arch (objfile);
-	  load_addr = MSYMBOL_VALUE_ADDRESS (msymbol.minsym);
+	  load_addr = BMSYMBOL_VALUE_ADDRESS (msymbol);
 
 	  printf_filtered ("Symbol \"");
 	  fprintf_symbol_filtered (gdb_stdout, exp,
@@ -1367,7 +1367,7 @@ address_info (char *exp, int from_tty)
 	else
 	  {
 	    section = MSYMBOL_OBJ_SECTION (msym.objfile, msym.minsym);
-	    load_addr = MSYMBOL_VALUE_ADDRESS (msym.minsym);
+	    load_addr = BMSYMBOL_VALUE_ADDRESS (msym);
 
 	    if (section
 		&& (section->the_bfd_section->flags & SEC_THREAD_LOCAL) != 0)
diff --git a/gdb/proc-service.c b/gdb/proc-service.c
index 96e4fe0..09cfc79 100644
--- a/gdb/proc-service.c
+++ b/gdb/proc-service.c
@@ -24,6 +24,7 @@
 #include "symtab.h"
 #include "target.h"
 #include "regcache.h"
+#include "objfiles.h"
 
 #include "gdb_proc_service.h"
 
@@ -207,7 +208,7 @@ ps_pglobal_lookup (gdb_ps_prochandle_t ph, const char *obj,
     result = PS_NOSYM;
   else
     {
-      *sym_addr = core_addr_to_ps_addr (MSYMBOL_VALUE_ADDRESS (ms.minsym));
+      *sym_addr = core_addr_to_ps_addr (BMSYMBOL_VALUE_ADDRESS (ms));
       result = PS_OK;
     }
 
diff --git a/gdb/psymtab.c b/gdb/psymtab.c
index a1e584e..2787f4c 100644
--- a/gdb/psymtab.c
+++ b/gdb/psymtab.c
@@ -226,7 +226,7 @@ static struct partial_symtab *
 find_pc_sect_psymtab_closer (struct objfile *objfile,
 			     CORE_ADDR pc, struct obj_section *section,
 			     struct partial_symtab *pst,
-			     struct minimal_symbol *msymbol)
+			     struct bound_minimal_symbol msymbol)
 {
   struct partial_symtab *tpst;
   struct partial_symtab *best_pst = pst;
@@ -242,7 +242,7 @@ find_pc_sect_psymtab_closer (struct objfile *objfile,
       section == 0)	/* Can't validate section this way.  */
     return pst;
 
-  if (msymbol == NULL)
+  if (msymbol.minsym == NULL)
     return (pst);
 
   /* The code range of partial symtabs sometimes overlap, so, in
@@ -266,7 +266,7 @@ find_pc_sect_psymtab_closer (struct objfile *objfile,
 	  p = find_pc_sect_psymbol (objfile, tpst, pc, section);
 	  if (p != NULL
 	      && SYMBOL_VALUE_ADDRESS (p)
-	      == MSYMBOL_VALUE_ADDRESS (msymbol))
+	      == BMSYMBOL_VALUE_ADDRESS (msymbol))
 	    return tpst;
 
 	  /* Also accept the textlow value of a psymtab as a
@@ -305,7 +305,7 @@ find_pc_sect_psymtab_closer (struct objfile *objfile,
 static struct partial_symtab *
 find_pc_sect_psymtab (struct objfile *objfile, CORE_ADDR pc,
 		      struct obj_section *section,
-		      struct minimal_symbol *msymbol)
+		      struct bound_minimal_symbol msymbol)
 {
   struct partial_symtab *pst;
 
@@ -320,7 +320,7 @@ find_pc_sect_psymtab (struct objfile *objfile, CORE_ADDR pc,
 	  /* FIXME: addrmaps currently do not handle overlayed sections,
 	     so fall back to the non-addrmap case if we're debugging
 	     overlays and the addrmap returned the wrong section.  */
-	  if (overlay_debugging && msymbol && section)
+	  if (overlay_debugging && msymbol.minsym && section)
 	    {
 	      struct partial_symbol *p;
 
@@ -331,7 +331,7 @@ find_pc_sect_psymtab (struct objfile *objfile, CORE_ADDR pc,
 	      p = find_pc_sect_psymbol (objfile, pst, pc, section);
 	      if (!p
 		  || SYMBOL_VALUE_ADDRESS (p)
-		  != MSYMBOL_VALUE_ADDRESS (msymbol))
+		  != BMSYMBOL_VALUE_ADDRESS (msymbol))
 		goto next;
 	    }
 
@@ -373,7 +373,7 @@ find_pc_sect_psymtab (struct objfile *objfile, CORE_ADDR pc,
 
 static struct symtab *
 find_pc_sect_symtab_from_partial (struct objfile *objfile,
-				  struct minimal_symbol *msymbol,
+				  struct bound_minimal_symbol msymbol,
 				  CORE_ADDR pc, struct obj_section *section,
 				  int warn_if_readin)
 {
diff --git a/gdb/ravenscar-thread.c b/gdb/ravenscar-thread.c
index d150412..01b5d81 100644
--- a/gdb/ravenscar-thread.c
+++ b/gdb/ravenscar-thread.c
@@ -30,6 +30,7 @@
 #include "gdbcmd.h"
 #include "top.h"
 #include "regcache.h"
+#include "objfiles.h"
 
 /* If non-null, ravenscar task support is enabled.  */
 static int ravenscar_task_support = 1;
@@ -164,7 +165,7 @@ get_running_thread_id (void)
   if (!object_msym.minsym)
     return 0;
 
-  object_addr = MSYMBOL_VALUE_ADDRESS (object_msym.minsym);
+  object_addr = BMSYMBOL_VALUE_ADDRESS (object_msym);
   object_size = TYPE_LENGTH (builtin_type_void_data_ptr);
   buf_size = object_size;
   buf = alloca (buf_size);
diff --git a/gdb/remote.c b/gdb/remote.c
index 8e9ef64..e03d3bf 100644
--- a/gdb/remote.c
+++ b/gdb/remote.c
@@ -3701,6 +3701,8 @@ remote_check_symbols (void)
 
   while (strncmp (reply, "qSymbol:", 8) == 0)
     {
+      struct bound_minimal_symbol sym;
+
       tmp = &reply[8];
       end = hex2bin (tmp, (gdb_byte *) msg, strlen (tmp) / 2);
       msg[end] = '\0';
@@ -3710,7 +3712,7 @@ remote_check_symbols (void)
       else
 	{
 	  int addr_size = gdbarch_addr_bit (target_gdbarch ()) / 8;
-	  CORE_ADDR sym_addr = MSYMBOL_VALUE_ADDRESS (sym.minsym);
+	  CORE_ADDR sym_addr = BMSYMBOL_VALUE_ADDRESS (sym);
 
 	  /* If this is a function address, return the start of code
 	     instead of any data function descriptor.  */
diff --git a/gdb/sh64-tdep.c b/gdb/sh64-tdep.c
index cf93d53..9f115e0 100644
--- a/gdb/sh64-tdep.c
+++ b/gdb/sh64-tdep.c
@@ -224,7 +224,7 @@ sh64_elf_make_msymbol_special (asymbol *sym, struct minimal_symbol *msym)
   if (((elf_symbol_type *)(sym))->internal_elf_sym.st_other == STO_SH5_ISA32)
     {
       MSYMBOL_TARGET_FLAG_1 (msym) = 1;
-      SET_MSYMBOL_VALUE_ADDRESS (msym, MSYMBOL_VALUE_ADDRESS (msym) | 1);
+      SET_MSYMBOL_VALUE_ADDRESS (msym, MSYMBOL_VALUE_RAW_ADDRESS (msym) | 1);
     }
 }
 
diff --git a/gdb/sol2-tdep.c b/gdb/sol2-tdep.c
index a4efd42..bf7d6a1 100644
--- a/gdb/sol2-tdep.c
+++ b/gdb/sol2-tdep.c
@@ -21,6 +21,7 @@
 #include "frame.h"
 #include "symtab.h"
 #include "inferior.h"
+#include "objfiles.h"
 
 #include "sol2-tdep.h"
 
@@ -30,7 +31,7 @@ sol2_skip_solib_resolver (struct gdbarch *gdbarch, CORE_ADDR pc)
   struct bound_minimal_symbol msym;
 
   msym = lookup_minimal_symbol("elf_bndr", NULL, NULL);
-  if (msym.minsym && MSYMBOL_VALUE_ADDRESS (msym.minsym) == pc)
+  if (msym.minsym && BMSYMBOL_VALUE_ADDRESS (msym) == pc)
     return frame_unwind_caller_pc (get_current_frame ());
 
   return 0;
diff --git a/gdb/solib-dsbt.c b/gdb/solib-dsbt.c
index 61ccc4a..0217a94 100644
--- a/gdb/solib-dsbt.c
+++ b/gdb/solib-dsbt.c
@@ -572,7 +572,7 @@ lm_base (void)
 
   if (got_sym.minsym != 0)
     {
-      addr = MSYMBOL_VALUE_ADDRESS (got_sym.minsym);
+      addr = BMSYMBOL_VALUE_ADDRESS (got_sym);
       if (solib_dsbt_debug)
 	fprintf_unfiltered (gdb_stdlog,
 			    "lm_base: get addr %x by _GLOBAL_OFFSET_TABLE_.\n",
diff --git a/gdb/solib-frv.c b/gdb/solib-frv.c
index 0b111bc..9724a3c 100644
--- a/gdb/solib-frv.c
+++ b/gdb/solib-frv.c
@@ -292,7 +292,7 @@ lm_base (void)
       return 0;
     }
 
-  addr = MSYMBOL_VALUE_ADDRESS (got_sym.minsym) + 8;
+  addr = BMSYMBOL_VALUE_ADDRESS (got_sym) + 8;
 
   if (solib_frv_debug)
     fprintf_unfiltered (gdb_stdlog,
@@ -926,7 +926,7 @@ main_got (void)
   if (got_sym.minsym == 0)
     return 0;
 
-  return MSYMBOL_VALUE_ADDRESS (got_sym.minsym);
+  return BMSYMBOL_VALUE_ADDRESS (got_sym);
 }
 
 /* Find the global pointer for the given function address ADDR.  */
diff --git a/gdb/solib-irix.c b/gdb/solib-irix.c
index d6a4c69..6266ee0 100644
--- a/gdb/solib-irix.c
+++ b/gdb/solib-irix.c
@@ -285,9 +285,9 @@ locate_base (void)
   CORE_ADDR address = 0;
 
   msymbol = lookup_minimal_symbol (DEBUG_BASE, NULL, symfile_objfile);
-  if ((msymbol.minsym != NULL) && (MSYMBOL_VALUE_ADDRESS (msymbol.minsym) != 0))
+  if ((msymbol.minsym != NULL) && (BMSYMBOL_VALUE_ADDRESS (msymbol) != 0))
     {
-      address = MSYMBOL_VALUE_ADDRESS (msymbol.minsym);
+      address = BMSYMBOL_VALUE_ADDRESS (msymbol);
     }
   return (address);
 }
diff --git a/gdb/solib-som.c b/gdb/solib-som.c
index d9e4119..cba50d1 100644
--- a/gdb/solib-som.c
+++ b/gdb/solib-som.c
@@ -219,7 +219,7 @@ som_solib_create_inferior_hook (int from_tty)
   if (msymbol.minsym == NULL)
     goto keep_going;
 
-  anaddr = MSYMBOL_VALUE_ADDRESS (msymbol.minsym);
+  anaddr = BMSYMBOL_VALUE_ADDRESS (msymbol);
   store_unsigned_integer (buf, 4, byte_order, ptid_get_pid (inferior_ptid));
   status = target_write_memory (anaddr, buf, 4);
   if (status != 0)
@@ -251,7 +251,7 @@ Suggest linking with /opt/langtools/lib/end.o.\n\
 GDB will be unable to track shl_load/shl_unload calls"));
       goto keep_going;
     }
-  anaddr = MSYMBOL_VALUE_ADDRESS (msymbol.minsym);
+  anaddr = BMSYMBOL_VALUE_ADDRESS (msymbol);
   dld_cache.hook.address = anaddr;
 
   /* Grrr, this might not be an export symbol!  We have to find the
@@ -275,7 +275,7 @@ Suggest linking with /opt/langtools/lib/end.o.\n\
 GDB will be unable to track shl_load/shl_unload calls"));
       goto keep_going;
     }
-  anaddr = MSYMBOL_VALUE_ADDRESS (msymbol.minsym);
+  anaddr = BMSYMBOL_VALUE_ADDRESS (msymbol);
   status = target_write_memory (anaddr, buf, 4);
 
   /* Now set a shlib_event breakpoint at __d_trap so we can track
@@ -290,7 +290,7 @@ GDB will be unable to track shl_load/shl_unload calls"));
       goto keep_going;
     }
   create_solib_event_breakpoint (target_gdbarch (),
-				 MSYMBOL_VALUE_ADDRESS (msymbol.minsym));
+				 BMSYMBOL_VALUE_ADDRESS (msymbol));
 
   /* We have all the support usually found in end.o, so we can track
      shl_load and shl_unload calls.  */
@@ -306,7 +306,7 @@ keep_going:
       error (_("Unable to find __dld_flags symbol in object file."));
     }
 
-  anaddr = MSYMBOL_VALUE_ADDRESS (msymbol.minsym);
+  anaddr = BMSYMBOL_VALUE_ADDRESS (msymbol);
 
   /* Read the current contents.  */
   status = target_read_memory (anaddr, buf, 4);
@@ -351,7 +351,7 @@ manpage for methods to privately map shared library text."));
   if (msymbol.minsym == NULL)
     error (_("Unable to find _start symbol in object file."));
 
-  anaddr = MSYMBOL_VALUE_ADDRESS (msymbol.minsym);
+  anaddr = BMSYMBOL_VALUE_ADDRESS (msymbol);
 
   /* Make the breakpoint at "_start" a shared library event breakpoint.  */
   create_solib_event_breakpoint (target_gdbarch (), anaddr);
@@ -537,7 +537,7 @@ link_map_start (void)
   sym = lookup_minimal_symbol ("__dld_flags", NULL, NULL);
   if (!sym.minsym)
     error (_("Unable to find __dld_flags symbol in object file."));
-  addr = MSYMBOL_VALUE_ADDRESS (sym.minsym);
+  addr = BMSYMBOL_VALUE_ADDRESS (sym);
   read_memory (addr, buf, 4);
   dld_flags = extract_unsigned_integer (buf, 4, byte_order);
   if ((dld_flags & DLD_FLAGS_LISTVALID) == 0)
@@ -554,10 +554,10 @@ link_map_start (void)
 	  error (_("Unable to find dynamic library list."));
 	  return 0;
 	}
-      addr = MSYMBOL_VALUE_ADDRESS (sym.minsym) - 8;
+      addr = BMSYMBOL_VALUE_ADDRESS (sym) - 8;
     }
   else
-    addr = MSYMBOL_VALUE_ADDRESS (sym.minsym);
+    addr = BMSYMBOL_VALUE_ADDRESS (sym);
 
   read_memory (addr, buf, 4);
   addr = extract_unsigned_integer (buf, 4, byte_order);
diff --git a/gdb/solib-spu.c b/gdb/solib-spu.c
index a4cefad..1c574b5 100644
--- a/gdb/solib-spu.c
+++ b/gdb/solib-spu.c
@@ -418,7 +418,7 @@ spu_enable_break (struct objfile *objfile)
   /* Place a solib_event breakpoint on the symbol.  */
   if (spe_event_sym.minsym)
     {
-      CORE_ADDR addr = MSYMBOL_VALUE_ADDRESS (spe_event_sym.minsym);
+      CORE_ADDR addr = BMSYMBOL_VALUE_ADDRESS (spe_event_sym);
 
       addr = gdbarch_convert_from_func_ptr_addr (target_gdbarch (), addr,
                                                  &current_target);
@@ -448,7 +448,7 @@ ocl_enable_break (struct objfile *objfile)
   if (event_sym.minsym && addr_sym.minsym)
     {
       /* Place a solib_event breakpoint on the symbol.  */
-      CORE_ADDR event_addr = MSYMBOL_VALUE_ADDRESS (event_sym.minsym);
+      CORE_ADDR event_addr = BMSYMBOL_VALUE_ADDRESS (event_sym);
       create_solib_event_breakpoint (get_objfile_arch (objfile), event_addr);
 
       /* Store the address of the symbol that will point to OpenCL program
@@ -459,7 +459,7 @@ ocl_enable_break (struct objfile *objfile)
 		  &objfile->objfile_obstack,
 		  objfile->sections_end - objfile->sections,
 		  CORE_ADDR);
-	  *ocl_program_addr_base = MSYMBOL_VALUE_ADDRESS (addr_sym.minsym);
+	  *ocl_program_addr_base = BMSYMBOL_VALUE_ADDRESS (addr_sym);
 	  set_objfile_data (objfile, ocl_program_data_key,
 			    ocl_program_addr_base);
         }
diff --git a/gdb/solib-svr4.c b/gdb/solib-svr4.c
index 4be0807..e2e173a 100644
--- a/gdb/solib-svr4.c
+++ b/gdb/solib-svr4.c
@@ -817,7 +817,7 @@ elf_locate_base (void)
      conventionally named _r_debug, as a last resort.  */
   msymbol = lookup_minimal_symbol ("_r_debug", NULL, symfile_objfile);
   if (msymbol.minsym != NULL)
-    return MSYMBOL_VALUE_ADDRESS (msymbol.minsym);
+    return BMSYMBOL_VALUE_ADDRESS (msymbol);
 
   /* DT_DEBUG entry not found.  */
   return 0;
@@ -2349,9 +2349,9 @@ enable_break (struct svr4_info *info, int from_tty)
     {
       msymbol = lookup_minimal_symbol (*bkpt_namep, NULL, symfile_objfile);
       if ((msymbol.minsym != NULL)
-	  && (MSYMBOL_VALUE_ADDRESS (msymbol.minsym) != 0))
+	  && (BMSYMBOL_VALUE_ADDRESS (msymbol) != 0))
 	{
-	  sym_addr = MSYMBOL_VALUE_ADDRESS (msymbol.minsym);
+	  sym_addr = BMSYMBOL_VALUE_ADDRESS (msymbol);
 	  sym_addr = gdbarch_convert_from_func_ptr_addr (target_gdbarch (),
 							 sym_addr,
 							 &current_target);
@@ -2366,9 +2366,9 @@ enable_break (struct svr4_info *info, int from_tty)
 	{
 	  msymbol = lookup_minimal_symbol (*bkpt_namep, NULL, symfile_objfile);
 	  if ((msymbol.minsym != NULL)
-	      && (MSYMBOL_VALUE_ADDRESS (msymbol.minsym) != 0))
+	      && (BMSYMBOL_VALUE_ADDRESS (msymbol) != 0))
 	    {
-	      sym_addr = MSYMBOL_VALUE_ADDRESS (msymbol.minsym);
+	      sym_addr = BMSYMBOL_VALUE_ADDRESS (msymbol);
 	      sym_addr = gdbarch_convert_from_func_ptr_addr (target_gdbarch (),
 							     sym_addr,
 							     &current_target);
diff --git a/gdb/spu-tdep.c b/gdb/spu-tdep.c
index 157f37b..4967bcd 100644
--- a/gdb/spu-tdep.c
+++ b/gdb/spu-tdep.c
@@ -1768,10 +1768,10 @@ spu_get_overlay_table (struct objfile *objfile)
   if (!ovly_buf_table_msym.minsym)
     return NULL;
 
-  ovly_table_base = MSYMBOL_VALUE_ADDRESS (ovly_table_msym.minsym);
+  ovly_table_base = BMSYMBOL_VALUE_ADDRESS (ovly_table_msym);
   ovly_table_size = MSYMBOL_SIZE (ovly_table_msym.minsym);
 
-  ovly_buf_table_base = MSYMBOL_VALUE_ADDRESS (ovly_buf_table_msym.minsym);
+  ovly_buf_table_base = BMSYMBOL_VALUE_ADDRESS (ovly_buf_table_msym);
   ovly_buf_table_size = MSYMBOL_SIZE (ovly_buf_table_msym.minsym);
 
   ovly_table = xmalloc (ovly_table_size);
@@ -1923,7 +1923,7 @@ spu_catch_start (struct objfile *objfile)
 
   /* If we have debugging information, try to use it -- this
      will allow us to properly skip the prologue.  */
-  pc = MSYMBOL_VALUE_ADDRESS (minsym.minsym);
+  pc = BMSYMBOL_VALUE_ADDRESS (minsym);
   symtab = find_pc_sect_symtab (pc, MSYMBOL_OBJ_SECTION (minsym.objfile,
 							 minsym.minsym));
   if (symtab != NULL)
@@ -2002,7 +2002,7 @@ flush_ea_cache (void)
       type = objfile_type (obj)->builtin_void;
       type = lookup_function_type (type);
       type = lookup_pointer_type (type);
-      addr = MSYMBOL_VALUE_ADDRESS (msymbol.minsym);
+      addr = BMSYMBOL_VALUE_ADDRESS (msymbol);
 
       call_function_by_hand (value_from_pointer (type, addr), 0, NULL);
     }
diff --git a/gdb/stabsread.c b/gdb/stabsread.c
index b5bec10..b40cf78 100644
--- a/gdb/stabsread.c
+++ b/gdb/stabsread.c
@@ -1178,7 +1178,7 @@ define_symbol (CORE_ADDR valu, char *string, int desc, int type,
 		(gdbarch, SYMBOL_LINKAGE_NAME (sym));
 
 	      SYMBOL_SET_LINKAGE_NAME (sym, new_name);
-	      SYMBOL_VALUE_ADDRESS (sym) = MSYMBOL_VALUE_ADDRESS (msym.minsym);
+	      SYMBOL_VALUE_ADDRESS (sym) = BMSYMBOL_VALUE_ADDRESS (msym);
 	    }
 	}
       SYMBOL_DOMAIN (sym) = VAR_DOMAIN;
@@ -1370,7 +1370,7 @@ define_symbol (CORE_ADDR valu, char *string, int desc, int type,
 		(gdbarch, SYMBOL_LINKAGE_NAME (sym));
 
 	      SYMBOL_SET_LINKAGE_NAME (sym, new_name);
-	      SYMBOL_VALUE_ADDRESS (sym) = MSYMBOL_VALUE_ADDRESS (msym.minsym);
+	      SYMBOL_VALUE_ADDRESS (sym) = BMSYMBOL_VALUE_ADDRESS (msym);
 	    }
 	}
       SYMBOL_DOMAIN (sym) = VAR_DOMAIN;
@@ -4680,12 +4680,13 @@ scan_file_globals (struct objfile *objfile)
 		      if (SYMBOL_CLASS (sym) == LOC_BLOCK)
 			{
 			  fix_common_block (sym,
-					    MSYMBOL_VALUE_ADDRESS (msymbol));
+					    MSYMBOL_VALUE_ADDRESS (resolve_objfile,
+								   msymbol));
 			}
 		      else
 			{
 			  SYMBOL_VALUE_ADDRESS (sym)
-			    = MSYMBOL_VALUE_ADDRESS (msymbol);
+			    = MSYMBOL_VALUE_ADDRESS (resolve_objfile, msymbol);
 			}
 		      SYMBOL_SECTION (sym) = MSYMBOL_SECTION (msymbol);
 		    }
diff --git a/gdb/stack.c b/gdb/stack.c
index aec0e5d..da7d977 100644
--- a/gdb/stack.c
+++ b/gdb/stack.c
@@ -47,6 +47,7 @@
 #include "inline-frame.h"
 #include "linespec.h"
 #include "cli/cli-utils.h"
+#include "objfiles.h"
 
 #include "gdb_assert.h"
 #include <ctype.h>
@@ -1076,7 +1077,7 @@ find_frame_funname (struct frame_info *frame, char **funname,
 	memset (&msymbol, 0, sizeof (msymbol));
 
       if (msymbol.minsym != NULL
-	  && (MSYMBOL_VALUE_ADDRESS (msymbol.minsym)
+	  && (BMSYMBOL_VALUE_ADDRESS (msymbol)
 	      > BLOCK_START (SYMBOL_BLOCK_VALUE (func))))
 	{
 	  /* We also don't know anything about the function besides
diff --git a/gdb/symfile-debug.c b/gdb/symfile-debug.c
index c247bd7..e8491c8 100644
--- a/gdb/symfile-debug.c
+++ b/gdb/symfile-debug.c
@@ -308,7 +308,7 @@ debug_qf_expand_symtabs_matching
 
 static struct symtab *
 debug_qf_find_pc_sect_symtab (struct objfile *objfile,
-			      struct minimal_symbol *msymbol,
+			      struct bound_minimal_symbol msymbol,
 			      CORE_ADDR pc,
 			      struct obj_section *section,
 			      int warn_if_readin)
@@ -320,7 +320,7 @@ debug_qf_find_pc_sect_symtab (struct objfile *objfile,
   fprintf_filtered (gdb_stdlog,
 		    "qf->find_pc_sect_symtab (%s, %s, %s, %s, %d)\n",
 		    debug_objfile_name (objfile),
-		    host_address_to_string (msymbol),
+		    host_address_to_string (msymbol.minsym),
 		    hex_string (pc),
 		    host_address_to_string (section),
 		    warn_if_readin);
diff --git a/gdb/symfile.c b/gdb/symfile.c
index b8d4479..d5cb7cb 100644
--- a/gdb/symfile.c
+++ b/gdb/symfile.c
@@ -3561,12 +3561,11 @@ simple_read_overlay_table (void)
   word_size = gdbarch_long_bit (gdbarch) / TARGET_CHAR_BIT;
   byte_order = gdbarch_byte_order (gdbarch);
 
-  cache_novlys
-    = read_memory_integer (MSYMBOL_VALUE_ADDRESS (novlys_msym.minsym),
-			   4, byte_order);
+  cache_novlys = read_memory_integer (BMSYMBOL_VALUE_ADDRESS (novlys_msym),
+				      4, byte_order);
   cache_ovly_table
     = (void *) xmalloc (cache_novlys * sizeof (*cache_ovly_table));
-  cache_ovly_table_base = MSYMBOL_VALUE_ADDRESS (ovly_table_msym.minsym);
+  cache_ovly_table_base = BMSYMBOL_VALUE_ADDRESS (ovly_table_msym);
   read_target_long_array (cache_ovly_table_base,
                           (unsigned int *) cache_ovly_table,
                           cache_novlys * 4, word_size, byte_order);
@@ -3642,7 +3641,7 @@ simple_overlay_update (struct obj_section *osect)
 		   "find `_ovly_table' array\n"
 		   "in inferior.  Use `overlay manual' mode."));
 	
-	if (cache_ovly_table_base == MSYMBOL_VALUE_ADDRESS (minsym.minsym))
+	if (cache_ovly_table_base == BMSYMBOL_VALUE_ADDRESS (minsym))
 	  /* Then go ahead and try to look up this single section in
 	     the cache.  */
 	  if (simple_overlay_update_1 (osect))
diff --git a/gdb/symfile.h b/gdb/symfile.h
index 17599be..614af3c 100644
--- a/gdb/symfile.h
+++ b/gdb/symfile.h
@@ -292,7 +292,7 @@ struct quick_symbol_functions
      symbol table that contains a symbol whose address is closest to
      PC.  */
   struct symtab *(*find_pc_sect_symtab) (struct objfile *objfile,
-					 struct minimal_symbol *msymbol,
+					 struct bound_minimal_symbol msymbol,
 					 CORE_ADDR pc,
 					 struct obj_section *section,
 					 int warn_if_readin);
diff --git a/gdb/symmisc.c b/gdb/symmisc.c
index fe324a0..0fc78d5 100644
--- a/gdb/symmisc.c
+++ b/gdb/symmisc.c
@@ -251,7 +251,8 @@ dump_msymbols (struct objfile *objfile, struct ui_file *outfile)
 	  break;
 	}
       fprintf_filtered (outfile, "[%2d] %c ", index, ms_type);
-      fputs_filtered (paddress (gdbarch, MSYMBOL_VALUE_ADDRESS (msymbol)),
+      fputs_filtered (paddress (gdbarch, MSYMBOL_VALUE_ADDRESS (objfile,
+								msymbol)),
 		      outfile);
       fprintf_filtered (outfile, " %s", MSYMBOL_LINKAGE_NAME (msymbol));
       if (section)
diff --git a/gdb/symtab.c b/gdb/symtab.c
index 65d7188..e267823 100644
--- a/gdb/symtab.c
+++ b/gdb/symtab.c
@@ -1074,18 +1074,18 @@ struct symtab *
 find_pc_sect_symtab_via_partial (CORE_ADDR pc, struct obj_section *section)
 {
   struct objfile *objfile;
-  struct minimal_symbol *msymbol;
+  struct bound_minimal_symbol msymbol;
 
   /* If we know that this is not a text address, return failure.  This is
      necessary because we loop based on texthigh and textlow, which do
      not include the data ranges.  */
-  msymbol = lookup_minimal_symbol_by_pc_section (pc, section).minsym;
-  if (msymbol
-      && (MSYMBOL_TYPE (msymbol) == mst_data
-	  || MSYMBOL_TYPE (msymbol) == mst_bss
-	  || MSYMBOL_TYPE (msymbol) == mst_abs
-	  || MSYMBOL_TYPE (msymbol) == mst_file_data
-	  || MSYMBOL_TYPE (msymbol) == mst_file_bss))
+  msymbol = lookup_minimal_symbol_by_pc_section (pc, section);
+  if (msymbol.minsym
+      && (MSYMBOL_TYPE (msymbol.minsym) == mst_data
+	  || MSYMBOL_TYPE (msymbol.minsym) == mst_bss
+	  || MSYMBOL_TYPE (msymbol.minsym) == mst_abs
+	  || MSYMBOL_TYPE (msymbol.minsym) == mst_file_data
+	  || MSYMBOL_TYPE (msymbol.minsym) == mst_file_bss))
     return NULL;
 
   ALL_OBJFILES (objfile)
@@ -2149,20 +2149,20 @@ find_pc_sect_symtab (CORE_ADDR pc, struct obj_section *section)
   struct symtab *best_s = NULL;
   struct objfile *objfile;
   CORE_ADDR distance = 0;
-  struct minimal_symbol *msymbol;
+  struct bound_minimal_symbol msymbol;
 
   /* If we know that this is not a text address, return failure.  This is
      necessary because we loop based on the block's high and low code
      addresses, which do not include the data ranges, and because
      we call find_pc_sect_psymtab which has a similar restriction based
      on the partial_symtab's texthigh and textlow.  */
-  msymbol = lookup_minimal_symbol_by_pc_section (pc, section).minsym;
-  if (msymbol
-      && (MSYMBOL_TYPE (msymbol) == mst_data
-	  || MSYMBOL_TYPE (msymbol) == mst_bss
-	  || MSYMBOL_TYPE (msymbol) == mst_abs
-	  || MSYMBOL_TYPE (msymbol) == mst_file_data
-	  || MSYMBOL_TYPE (msymbol) == mst_file_bss))
+  msymbol = lookup_minimal_symbol_by_pc_section (pc, section);
+  if (msymbol.minsym
+      && (MSYMBOL_TYPE (msymbol.minsym) == mst_data
+	  || MSYMBOL_TYPE (msymbol.minsym) == mst_bss
+	  || MSYMBOL_TYPE (msymbol.minsym) == mst_abs
+	  || MSYMBOL_TYPE (msymbol.minsym) == mst_file_data
+	  || MSYMBOL_TYPE (msymbol.minsym) == mst_file_bss))
     return NULL;
 
   /* Search all symtabs for the one whose file contains our address, and which
@@ -2289,7 +2289,6 @@ find_pc_sect_line (CORE_ADDR pc, struct obj_section *section, int notcurrent)
   struct symtab_and_line val;
   struct blockvector *bv;
   struct bound_minimal_symbol msymbol;
-  struct minimal_symbol *mfunsym;
   struct objfile *objfile;
 
   /* Info on best line seen so far, and where it starts, and its file.  */
@@ -2377,10 +2376,11 @@ find_pc_sect_line (CORE_ADDR pc, struct obj_section *section, int notcurrent)
   if (msymbol.minsym != NULL)
     if (MSYMBOL_TYPE (msymbol.minsym) == mst_solib_trampoline)
       {
-	mfunsym
+	struct bound_minimal_symbol mfunsym
 	  = lookup_minimal_symbol_text (MSYMBOL_LINKAGE_NAME (msymbol.minsym),
-					NULL).minsym;
-	if (mfunsym == NULL)
+					NULL);
+
+	if (mfunsym.minsym == NULL)
 	  /* I eliminated this warning since it is coming out
 	   * in the following situation:
 	   * gdb shmain // test program with shared libraries
@@ -2394,8 +2394,8 @@ find_pc_sect_line (CORE_ADDR pc, struct obj_section *section, int notcurrent)
 	     SYMBOL_LINKAGE_NAME (msymbol)); */
 	  ;
 	/* fall through */
-	else if (MSYMBOL_VALUE_ADDRESS (mfunsym)
-		 == MSYMBOL_VALUE_ADDRESS (msymbol.minsym))
+	else if (BMSYMBOL_VALUE_ADDRESS (mfunsym)
+		 == BMSYMBOL_VALUE_ADDRESS (msymbol))
 	  /* Avoid infinite recursion */
 	  /* See above comment about why warning is commented out.  */
 	  /* warning ("In stub for %s; unable to find real function/line info",
@@ -2403,7 +2403,7 @@ find_pc_sect_line (CORE_ADDR pc, struct obj_section *section, int notcurrent)
 	  ;
 	/* fall through */
 	else
-	  return find_pc_line (MSYMBOL_VALUE_ADDRESS (mfunsym), 0);
+	  return find_pc_line (BMSYMBOL_VALUE_ADDRESS (mfunsym), 0);
       }
 
 
@@ -2917,7 +2917,7 @@ skip_prologue_sal (struct symtab_and_line *sal)
 	}
 
       objfile = msymbol.objfile;
-      pc = MSYMBOL_VALUE_ADDRESS (msymbol.minsym);
+      pc = BMSYMBOL_VALUE_ADDRESS (msymbol);
       section = MSYMBOL_OBJ_SECTION (objfile, msymbol.minsym);
       name = MSYMBOL_LINKAGE_NAME (msymbol.minsym);
     }
@@ -3665,7 +3665,8 @@ search_symbols (char *regexp, enum search_domain kind,
 		   is to expand the symbol table if msymbol is found, for the
 		   benefit of the next loop on ALL_PRIMARY_SYMTABS.  */
 		if (kind == FUNCTIONS_DOMAIN
-		    ? find_pc_symtab (MSYMBOL_VALUE_ADDRESS (msymbol)) == NULL
+		    ? find_pc_symtab (MSYMBOL_VALUE_ADDRESS (objfile,
+							     msymbol)) == NULL
 		    : (lookup_symbol_in_objfile_from_linkage_name
 		       (objfile, MSYMBOL_LINKAGE_NAME (msymbol), VAR_DOMAIN)
 		       == NULL))
@@ -3767,7 +3768,8 @@ search_symbols (char *regexp, enum search_domain kind,
 		/* For functions we can do a quick check of whether the
 		   symbol might be found via find_pc_symtab.  */
 		if (kind != FUNCTIONS_DOMAIN
-		    || find_pc_symtab (MSYMBOL_VALUE_ADDRESS (msymbol)) == NULL)
+		    || find_pc_symtab (MSYMBOL_VALUE_ADDRESS (objfile,
+							      msymbol)) == NULL)
 		  {
 		    if (lookup_symbol_in_objfile_from_linkage_name
 			(objfile, MSYMBOL_LINKAGE_NAME (msymbol), VAR_DOMAIN)
@@ -3848,11 +3850,11 @@ print_msymbol_info (struct bound_minimal_symbol msymbol)
   char *tmp;
 
   if (gdbarch_addr_bit (gdbarch) <= 32)
-    tmp = hex_string_custom (MSYMBOL_VALUE_ADDRESS (msymbol.minsym)
+    tmp = hex_string_custom (BMSYMBOL_VALUE_ADDRESS (msymbol)
 			     & (CORE_ADDR) 0xffffffff,
 			     8);
   else
-    tmp = hex_string_custom (MSYMBOL_VALUE_ADDRESS (msymbol.minsym),
+    tmp = hex_string_custom (BMSYMBOL_VALUE_ADDRESS (msymbol),
 			     16);
   printf_filtered ("%s  %s\n",
 		   tmp, MSYMBOL_PRINT_NAME (msymbol.minsym));
diff --git a/gdb/symtab.h b/gdb/symtab.h
index bf1ef74..d80222b5 100644
--- a/gdb/symtab.h
+++ b/gdb/symtab.h
@@ -391,8 +391,18 @@ struct minimal_symbol
 #define MSYMBOL_TYPE(msymbol)		(msymbol)->type
 
 #define MSYMBOL_VALUE(symbol)		(symbol)->mginfo.value.ivalue
-#define MSYMBOL_VALUE_ADDRESS(symbol)	((symbol)->mginfo.value.address + 0)
-#define SET_MSYMBOL_VALUE_ADDRESS(symbol, new_value) \
+/* The unrelocated address of the minimal symbol.  */
+#define MSYMBOL_VALUE_RAW_ADDRESS(symbol) ((symbol)->mginfo.value.address + 0)
+/* This weird definition lets us syntax-check without affecting the
+   results.  It is a temporary measure until a later patch.  */
+#define MSYMBOL_VALUE_ADDRESS(objfile, symbol)				\
+  ((symbol)->mginfo.value.address					\
+   + (0									\
+      * ANOFFSET ((objfile)->section_offsets, ((symbol)->mginfo.section))))
+/* For a bound minsym, we can easily compute the address directly.  */
+#define BMSYMBOL_VALUE_ADDRESS(symbol) \
+  MSYMBOL_VALUE_ADDRESS ((symbol).objfile, (symbol).minsym)
+#define SET_MSYMBOL_VALUE_ADDRESS(symbol, new_value)	\
   ((symbol)->mginfo.value.address = (new_value))
 #define MSYMBOL_VALUE_BYTES(symbol)	(symbol)->mginfo.value.bytes
 #define MSYMBOL_BLOCK_VALUE(symbol)	(symbol)->mginfo.value.block
diff --git a/gdb/tracepoint.c b/gdb/tracepoint.c
index bd3e9d0..08541c5 100644
--- a/gdb/tracepoint.c
+++ b/gdb/tracepoint.c
@@ -2831,7 +2831,7 @@ scope_info (char *args, int from_tty)
 		      printf_filtered ("static storage at address ");
 		      printf_filtered ("%s",
 				       paddress (gdbarch,
-						 MSYMBOL_VALUE_ADDRESS (msym.minsym)));
+						 BMSYMBOL_VALUE_ADDRESS (msym)));
 		    }
 		  break;
 		case LOC_OPTIMIZED_OUT:
diff --git a/gdb/tui/tui-disasm.c b/gdb/tui/tui-disasm.c
index e0ea183..8c48d66 100644
--- a/gdb/tui/tui-disasm.c
+++ b/gdb/tui/tui-disasm.c
@@ -37,6 +37,7 @@
 #include "tui/tui-file.h"
 #include "tui/tui-disasm.h"
 #include "progspace.h"
+#include "objfiles.h"
 
 #include "gdb_curses.h"
 
@@ -113,7 +114,7 @@ tui_find_disassembly_address (struct gdbarch *gdbarch, CORE_ADDR pc, int from)
     {
       CORE_ADDR last_addr;
       int pos;
-      struct minimal_symbol *msymbol;
+      struct bound_minimal_symbol msymbol;
               
       /* Find backward an address which is a symbol and for which
          disassembling from that address will fill completely the
@@ -121,16 +122,16 @@ tui_find_disassembly_address (struct gdbarch *gdbarch, CORE_ADDR pc, int from)
       pos = max_lines - 1;
       do {
          new_low -= 1 * max_lines;
-         msymbol = lookup_minimal_symbol_by_pc_section (new_low, 0).minsym;
+         msymbol = lookup_minimal_symbol_by_pc_section (new_low, 0);
 
-         if (msymbol)
-            new_low = MSYMBOL_VALUE_ADDRESS (msymbol);
+         if (msymbol.minsym)
+            new_low = BMSYMBOL_VALUE_ADDRESS (msymbol);
          else
             new_low += 1 * max_lines;
 
          tui_disassemble (gdbarch, asm_lines, new_low, max_lines);
          last_addr = asm_lines[pos].addr;
-      } while (last_addr > pc && msymbol);
+      } while (last_addr > pc && msymbol.minsym);
 
       /* Scan forward disassembling one instruction at a time until
          the last visible instruction of the window matches the pc.
@@ -349,7 +350,7 @@ tui_get_begin_asm_address (struct gdbarch **gdbarch_p, CORE_ADDR *addr_p)
       if (main_symbol.minsym == 0)
         main_symbol = lookup_minimal_symbol ("_start", NULL, NULL);
       if (main_symbol.minsym)
-        addr = MSYMBOL_VALUE_ADDRESS (main_symbol.minsym);
+        addr = BMSYMBOL_VALUE_ADDRESS (main_symbol);
       else
         addr = 0;
     }
diff --git a/gdb/valops.c b/gdb/valops.c
index cdbaeca..9d2218f 100644
--- a/gdb/valops.c
+++ b/gdb/valops.c
@@ -160,7 +160,7 @@ find_function_in_inferior (const char *name, struct objfile **objf_p)
 	  type = lookup_pointer_type (builtin_type (gdbarch)->builtin_char);
 	  type = lookup_function_type (type);
 	  type = lookup_pointer_type (type);
-	  maddr = MSYMBOL_VALUE_ADDRESS (msymbol.minsym);
+	  maddr = BMSYMBOL_VALUE_ADDRESS (msymbol);
 
 	  if (objf_p)
 	    *objf_p = objfile;
diff --git a/gdb/value.c b/gdb/value.c
index 1dfc6d5..4e8d1fe 100644
--- a/gdb/value.c
+++ b/gdb/value.c
@@ -2758,7 +2758,7 @@ value_static_field (struct type *type, int fieldno)
 	  else
 	    {
 	      retval = value_at_lazy (TYPE_FIELD_TYPE (type, fieldno),
-				      MSYMBOL_VALUE_ADDRESS (msym.minsym));
+				      BMSYMBOL_VALUE_ADDRESS (msym));
 	    }
 	}
       else
@@ -2974,7 +2974,7 @@ value_fn_field (struct value **arg1p, struct fn_field *f,
 
       set_value_address (v,
 	gdbarch_convert_from_func_ptr_addr
-	   (gdbarch, MSYMBOL_VALUE_ADDRESS (msym.minsym), &current_target));
+	   (gdbarch, BMSYMBOL_VALUE_ADDRESS (msym), &current_target));
     }
 
   if (arg1p)
-- 
1.8.1.4

^ permalink raw reply	[flat|nested] 11+ messages in thread

* [FYI v3 02/10] change minsym representation
  2014-02-26 20:23 [FYI v3 00/10] share minimal symbols across objfiles Tom Tromey
                   ` (2 preceding siblings ...)
  2014-02-26 19:01 ` [FYI v3 07/10] move minimal symbols to per-bfd Tom Tromey
@ 2014-02-26 19:01 ` Tom Tromey
  2014-02-26 19:01 ` [FYI v3 04/10] use bound_minsym as result for lookup_minimal_symbol et al Tom Tromey
                   ` (5 subsequent siblings)
  9 siblings, 0 replies; 11+ messages in thread
From: Tom Tromey @ 2014-02-26 19:01 UTC (permalink / raw)
  To: gdb-patches; +Cc: Tom Tromey

In a later patch we're going to change the minimal symbol address
calculation to apply section offsets at the point of use.  To make it
simpler to catch potential problem spots, this patch changes the
representation of minimal symbols and introduces new
minimal-symbol-specific variants of the various accessors.  This is
necessary because it would be excessively ambitious to try to convert
all the symbol types at once.

The core of this change is just renaming a field in minimal_symbol;
the rest is just a fairly mechanical rewording.

2014-02-26  Tom Tromey  <tromey@redhat.com>

	* symtab.h (struct minimal_symbol) <mginfo>: Rename from ginfo.
	(MSYMBOL_VALUE, MSYMBOL_VALUE_ADDRESS, MSYMBOL_VALUE_BYTES)
	(MSYMBOL_BLOCK_VALUE, MSYMBOL_VALUE_CHAIN, MSYMBOL_LANGUAGE)
	(MSYMBOL_SECTION, MSYMBOL_OBJ_SECTION, MSYMBOL_NATURAL_NAME)
	(MSYMBOL_LINKAGE_NAME, MSYMBOL_PRINT_NAME, MSYMBOL_DEMANGLED_NAME)
	(MSYMBOL_SET_LANGUAGE, MSYMBOL_SEARCH_NAME)
	(MSYMBOL_MATCHES_SEARCH_NAME, MSYMBOL_SET_NAMES): New macros.
	* ada-lang.c (ada_main_name): Update.
	(ada_lookup_simple_minsym): Update.
	(ada_make_symbol_completion_list): Update.
	(ada_add_standard_exceptions): Update.
	* ada-tasks.c (read_atcb, ada_tasks_inferior_data_sniffer): Update.
	* aix-thread.c (pdc_symbol_addrs, pd_enable): Update.
	* amd64-windows-tdep.c (amd64_skip_main_prologue): Update.
	* arm-tdep.c (skip_prologue_function): Update.
	(arm_skip_stack_protector, arm_skip_stub): Update.
	* arm-wince-tdep.c (arm_pe_skip_trampoline_code): Update.
	(arm_wince_skip_main_prologue): Update.
	* auxv.c (ld_so_xfer_auxv): Update.
	* avr-tdep.c (avr_scan_prologue): Update.
	* ax-gdb.c (gen_var_ref): Update.
	* block.c (call_site_for_pc): Update.
	* blockframe.c (get_pc_function_start): Update.
	(find_pc_partial_function_gnu_ifunc): Update.
	* breakpoint.c (create_overlay_event_breakpoint): Update.
	(create_longjmp_master_breakpoint): Update.
	(create_std_terminate_master_breakpoint): Update.
	(create_exception_master_breakpoint): Update.
	(resolve_sal_pc): Update.
	* bsd-uthread.c (bsd_uthread_lookup_address): Update.
	* btrace.c (ftrace_print_function_name, ftrace_function_switched):
	Update.
	* c-valprint.c (c_val_print): Update.
	* coff-pe-read.c (add_pe_forwarded_sym): Update.
	* coffread.c (coff_symfile_read): Update.
	* common/agent.c (agent_look_up_symbols): Update.
	* dbxread.c (find_stab_function_addr): Update.
	(end_psymtab): Update.
	* dwarf2loc.c (call_site_to_target_addr): Update.
	(func_verify_no_selftailcall): Update.
	(tailcall_dump): Update.
	(call_site_find_chain_1): Update.
	(dwarf_expr_reg_to_entry_parameter): Update.
	* elfread.c (elf_gnu_ifunc_record_cache): Update.
	(elf_gnu_ifunc_resolve_by_got): Update.
	* f-valprint.c (info_common_command): Update.
	* findvar.c (read_var_value): Update.
	* frame.c (get_prev_frame_1): Update.
	(inside_main_func): Update.
	* frv-tdep.c (frv_skip_main_prologue): Update.
	(frv_frame_this_id): Update.
	* glibc-tdep.c (glibc_skip_solib_resolver): Update.
	* gnu-v2-abi.c (gnuv2_value_rtti_type): Update.
	* gnu-v3-abi.c (gnuv3_rtti_type): Update.
	(gnuv3_skip_trampoline): Update.
	* hppa-hpux-tdep.c (hppa32_hpux_in_solib_call_trampoline): Update.
	(hppa64_hpux_in_solib_call_trampoline): Update.
	(hppa_hpux_skip_trampoline_code): Update.
	(hppa64_hpux_search_dummy_call_sequence): Update.
	(hppa_hpux_find_import_stub_for_addr): Update.
	(hppa_hpux_find_dummy_bpaddr): Update.
	* hppa-tdep.c (hppa_symbol_address)
	(hppa_lookup_stub_minimal_symbol): Update.
	* i386-tdep.c (i386_skip_main_prologue): Update.
	(i386_pe_skip_trampoline_code): Update.
	* ia64-tdep.c (ia64_convert_from_func_ptr_addr): Update.
	* infcall.c (get_function_name): Update.
	* infcmd.c (until_next_command): Update.
	* jit.c (jit_breakpoint_re_set_internal): Update.
	(jit_inferior_init): Update.
	* linespec.c (minsym_found): Update.
	(add_minsym): Update.
	* linux-fork.c (info_checkpoints_command): Update.
	* linux-nat.c (get_signo): Update.
	* linux-thread-db.c (inferior_has_bug): Update.
	* m32c-tdep.c (m32c_return_value): Update.
	(m32c_m16c_address_to_pointer): Update.
	(m32c_m16c_pointer_to_address): 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 (add_minsym_to_hash_table): Update.
	(add_minsym_to_demangled_hash_table): Update.
	(msymbol_objfile): Update.
	(lookup_minimal_symbol): Update.
	(iterate_over_minimal_symbols): Update.
	(lookup_minimal_symbol_text): Update.
	(lookup_minimal_symbol_by_pc_name): Update.
	(lookup_minimal_symbol_solib_trampoline): Update.
	(lookup_minimal_symbol_by_pc_section_1): Update.
	(lookup_minimal_symbol_and_objfile): Update.
	(prim_record_minimal_symbol_full): Update.
	(compare_minimal_symbols): Update.
	(compact_minimal_symbols): Update.
	(build_minimal_symbol_hash_tables): Update.
	(install_minimal_symbols): Update.
	(terminate_minimal_symbol_table): Update.
	(find_solib_trampoline_target): Update.
	(minimal_symbol_upper_bound): Update.
	* mips-linux-tdep.c (mips_linux_skip_resolver): Update.
	* mips-tdep.c (mips_stub_frame_sniffer): Update.
	(mips_skip_pic_trampoline_code): Update.
	* msp430-tdep.c (msp430_skip_trampoline_code): Update.
	* objc-lang.c (selectors_info): Update.
	(classes_info): Update.
	(find_methods): Update.
	(find_imps): Update.
	(find_objc_msgsend): Update.
	* objfiles.c (objfile_relocate1): Update.
	* objfiles.h (ALL_OBJFILE_MSYMBOLS): 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 (powerpc_linux_in_dynsym_resolve_code)
	(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): Update.
	(sym_info): Update.
	(address_info): Update.
	* proc-service.c (ps_pglobal_lookup): Update.
	* psymtab.c (find_pc_sect_psymtab_closer): Update.
	(find_pc_sect_psymtab): Update.
	* python/py-framefilter.c (py_print_frame): Update.
	* ravenscar-thread.c (get_running_thread_id): Update.
	* record-btrace.c (btrace_call_history, btrace_get_bfun_name):
	Update.
	* remote.c (remote_check_symbols): Update.
	* rs6000-tdep.c (rs6000_skip_main_prologue): Update.
	(rs6000_skip_trampoline_code): Update.
	* sh64-tdep.c (sh64_elf_make_msymbol_special): Update.
	* sol2-tdep.c (sol2_skip_solib_resolver): Update.
	* solib-dsbt.c (lm_base): Update.
	* solib-frv.c (lm_base): Update.
	(main_got): Update.
	* solib-irix.c (locate_base): Update.
	* solib-som.c (som_solib_create_inferior_hook): Update.
	(som_solib_desire_dynamic_linker_symbols): Update.
	(link_map_start): Update.
	* solib-spu.c (spu_enable_break): Update.
	(ocl_enable_break): Update.
	* solib-svr4.c (elf_locate_base): Update.
	(enable_break): Update.
	* spu-tdep.c (spu_get_overlay_table): Update.
	(spu_catch_start): Update.
	(flush_ea_cache): Update.
	* stabsread.c (define_symbol): Update.
	(scan_file_globals): Update.
	* stack.c (find_frame_funname): Update.
	(frame_info): Update.
	* symfile.c (simple_read_overlay_table): Update.
	(simple_overlay_update): Update.
	* symmisc.c (dump_msymbols): Update.
	* symtab.c (fixup_section): Update.
	(find_pc_sect_line): Update.
	(skip_prologue_sal): Update.
	(search_symbols): Update.
	(print_msymbol_info): Update.
	(rbreak_command): Update.
	(MCOMPLETION_LIST_ADD_SYMBOL): New macro.
	(completion_list_objc_symbol): Update.
	(default_make_symbol_completion_list_break_on): Update.
	* tracepoint.c (scope_info): Update.
	* tui/tui-disasm.c (tui_find_disassembly_address): Update.
	(tui_get_begin_asm_address): Update.
	* valops.c (find_function_in_inferior): Update.
	* value.c (value_static_field): Update.
	(value_fn_field): Update.
---
 gdb/ChangeLog               | 171 ++++++++++++++++++++++++++++++++++++++++++++
 gdb/ada-lang.c              |   8 +--
 gdb/ada-tasks.c             |   6 +-
 gdb/aix-thread.c            |   4 +-
 gdb/amd64-windows-tdep.c    |   6 +-
 gdb/arm-tdep.c              |  10 +--
 gdb/arm-wince-tdep.c        |   6 +-
 gdb/auxv.c                  |   2 +-
 gdb/avr-tdep.c              |   2 +-
 gdb/ax-gdb.c                |   2 +-
 gdb/block.c                 |   2 +-
 gdb/blockframe.c            |   8 +--
 gdb/breakpoint.c            |  10 +--
 gdb/bsd-uthread.c           |   2 +-
 gdb/btrace.c                |   4 +-
 gdb/c-valprint.c            |   6 +-
 gdb/coff-pe-read.c          |   4 +-
 gdb/coffread.c              |   2 +-
 gdb/common/agent.c          |   2 +-
 gdb/dbxread.c               |   4 +-
 gdb/dwarf2loc.c             |  26 +++----
 gdb/elfread.c               |   6 +-
 gdb/findvar.c               |  10 +--
 gdb/frame.c                 |   4 +-
 gdb/frv-tdep.c              |   6 +-
 gdb/glibc-tdep.c            |   2 +-
 gdb/gnu-v2-abi.c            |   2 +-
 gdb/gnu-v3-abi.c            |  12 ++--
 gdb/hppa-hpux-tdep.c        |  28 ++++----
 gdb/hppa-tdep.c             |   6 +-
 gdb/i386-tdep.c             |   6 +-
 gdb/ia64-tdep.c             |   3 +-
 gdb/infcall.c               |   2 +-
 gdb/infcmd.c                |   2 +-
 gdb/jit.c                   |  10 +--
 gdb/linespec.c              |  10 +--
 gdb/linux-fork.c            |   2 +-
 gdb/linux-nat.c             |   2 +-
 gdb/linux-thread-db.c       |   2 +-
 gdb/m32c-tdep.c             |  12 ++--
 gdb/m32r-tdep.c             |   2 +-
 gdb/m68hc11-tdep.c          |   2 +-
 gdb/machoread.c             |   2 +-
 gdb/maint.c                 |   6 +-
 gdb/minsyms.c               | 115 ++++++++++++++---------------
 gdb/mips-linux-tdep.c       |   2 +-
 gdb/mips-tdep.c             |  10 +--
 gdb/msp430-tdep.c           |   2 +-
 gdb/objc-lang.c             |  16 ++---
 gdb/objfiles.c              |   5 +-
 gdb/objfiles.h              |   2 +-
 gdb/obsd-tdep.c             |   2 +-
 gdb/p-valprint.c            |   6 +-
 gdb/parse.c                 |   6 +-
 gdb/ppc-linux-tdep.c        |  12 ++--
 gdb/ppc-sysv-tdep.c         |   6 +-
 gdb/printcmd.c              |  20 +++---
 gdb/proc-service.c          |   2 +-
 gdb/psymtab.c               |   4 +-
 gdb/python/py-framefilter.c |   2 +-
 gdb/ravenscar-thread.c      |   2 +-
 gdb/record-btrace.c         |   4 +-
 gdb/remote.c                |   2 +-
 gdb/rs6000-tdep.c           |   8 +--
 gdb/sh64-tdep.c             |   2 +-
 gdb/sol2-tdep.c             |   2 +-
 gdb/solib-dsbt.c            |   2 +-
 gdb/solib-frv.c             |   4 +-
 gdb/solib-irix.c            |   4 +-
 gdb/solib-som.c             |  34 ++++-----
 gdb/solib-spu.c             |   6 +-
 gdb/solib-svr4.c            |  10 +--
 gdb/spu-tdep.c              |  10 +--
 gdb/stabsread.c             |  14 ++--
 gdb/stack.c                 |  14 ++--
 gdb/symfile.c               |   6 +-
 gdb/symmisc.c               |  10 +--
 gdb/symtab.c                |  50 +++++++------
 gdb/symtab.h                |  34 ++++++++-
 gdb/tracepoint.c            |   2 +-
 gdb/tui/tui-disasm.c        |   4 +-
 gdb/valops.c                |   2 +-
 gdb/value.c                 |   4 +-
 83 files changed, 537 insertions(+), 331 deletions(-)

diff --git a/gdb/ada-lang.c b/gdb/ada-lang.c
index a10d800..3751869 100644
--- a/gdb/ada-lang.c
+++ b/gdb/ada-lang.c
@@ -922,7 +922,7 @@ ada_main_name (void)
       CORE_ADDR main_program_name_addr;
       int err_code;
 
-      main_program_name_addr = SYMBOL_VALUE_ADDRESS (msym);
+      main_program_name_addr = MSYMBOL_VALUE_ADDRESS (msym);
       if (main_program_name_addr == 0)
         error (_("Invalid address for Ada main program name."));
 
@@ -4661,7 +4661,7 @@ ada_lookup_simple_minsym (const char *name)
 
   ALL_MSYMBOLS (objfile, msymbol)
   {
-    if (match_name (SYMBOL_LINKAGE_NAME (msymbol), name, wild_match_p)
+    if (match_name (MSYMBOL_LINKAGE_NAME (msymbol), name, wild_match_p)
         && MSYMBOL_TYPE (msymbol) != mst_solib_trampoline)
       {
 	result.minsym = msymbol;
@@ -6182,7 +6182,7 @@ ada_make_symbol_completion_list (const char *text0, const char *word,
   ALL_MSYMBOLS (objfile, msymbol)
   {
     QUIT;
-    symbol_completion_add (&completions, SYMBOL_LINKAGE_NAME (msymbol),
+    symbol_completion_add (&completions, MSYMBOL_LINKAGE_NAME (msymbol),
 			   text, text_len, text0, word, wild_match_p,
 			   encoded_p);
   }
@@ -12673,7 +12673,7 @@ ada_add_standard_exceptions (regex_t *preg, VEC(ada_exc_info) **exceptions)
 	  if (msymbol.minsym != NULL)
 	    {
 	      struct ada_exc_info info
-		= {standard_exc[i], SYMBOL_VALUE_ADDRESS (msymbol.minsym)};
+		= {standard_exc[i], MSYMBOL_VALUE_ADDRESS (msymbol.minsym)};
 
 	      VEC_safe_push (ada_exc_info, *exceptions, &info);
 	    }
diff --git a/gdb/ada-tasks.c b/gdb/ada-tasks.c
index 8af6da1..fc562e7 100644
--- a/gdb/ada-tasks.c
+++ b/gdb/ada-tasks.c
@@ -640,7 +640,7 @@ read_atcb (CORE_ADDR task_id, struct ada_task_info *task_info)
 	  msym = lookup_minimal_symbol_by_pc (task_id);
 	  if (msym.minsym)
 	    {
-	      const char *full_name = SYMBOL_LINKAGE_NAME (msym.minsym);
+	      const char *full_name = MSYMBOL_LINKAGE_NAME (msym.minsym);
 	      const char *task_name = full_name;
 	      const char *p;
 
@@ -859,7 +859,7 @@ ada_tasks_inferior_data_sniffer (struct ada_tasks_inferior_data *data)
   if (msym != NULL)
     {
       data->known_tasks_kind = ADA_TASKS_ARRAY;
-      data->known_tasks_addr = SYMBOL_VALUE_ADDRESS (msym);
+      data->known_tasks_addr = MSYMBOL_VALUE_ADDRESS (msym);
 
       /* Try to get pointer type and array length from the symtab.  */
       sym = lookup_symbol_in_language (KNOWN_TASKS_NAME, NULL, VAR_DOMAIN,
@@ -904,7 +904,7 @@ ada_tasks_inferior_data_sniffer (struct ada_tasks_inferior_data *data)
   if (msym != NULL)
     {
       data->known_tasks_kind = ADA_TASKS_LIST;
-      data->known_tasks_addr = SYMBOL_VALUE_ADDRESS (msym);
+      data->known_tasks_addr = MSYMBOL_VALUE_ADDRESS (msym);
       data->known_tasks_length = 1;
 
       sym = lookup_symbol_in_language (KNOWN_TASKS_LIST, NULL, VAR_DOMAIN,
diff --git a/gdb/aix-thread.c b/gdb/aix-thread.c
index c01a7c5..d1194bc 100644
--- a/gdb/aix-thread.c
+++ b/gdb/aix-thread.c
@@ -312,7 +312,7 @@ pdc_symbol_addrs (pthdb_user_t user, pthdb_symbol_t *symbols, int count)
 		fprintf_unfiltered (gdb_stdlog, " returning PDC_FAILURE\n");
 	      return PDC_FAILURE;
 	    }
-	  symbols[i].addr = SYMBOL_VALUE_ADDRESS (ms);
+	  symbols[i].addr = MSYMBOL_VALUE_ADDRESS (ms);
 	}
       if (debug_aix_thread)
 	fprintf_unfiltered (gdb_stdlog, "  symbols[%d].addr = %s\n",
@@ -910,7 +910,7 @@ pd_enable (void)
   /* Set a breakpoint on the returned stub function.  */
   if (!(ms = lookup_minimal_symbol (stub_name, NULL, NULL)))
     return;
-  pd_brk_addr = SYMBOL_VALUE_ADDRESS (ms);
+  pd_brk_addr = MSYMBOL_VALUE_ADDRESS (ms);
   if (!create_thread_event_breakpoint (target_gdbarch (), pd_brk_addr))
     return;
 
diff --git a/gdb/amd64-windows-tdep.c b/gdb/amd64-windows-tdep.c
index 59a960a..331ce77 100644
--- a/gdb/amd64-windows-tdep.c
+++ b/gdb/amd64-windows-tdep.c
@@ -355,8 +355,8 @@ amd64_skip_main_prologue (struct gdbarch *gdbarch, CORE_ADDR pc)
 	  call_dest = pc + 5 + extract_signed_integer (buf, 4, byte_order);
  	  s = lookup_minimal_symbol_by_pc (call_dest);
  	  if (s.minsym != NULL
- 	      && SYMBOL_LINKAGE_NAME (s.minsym) != NULL
- 	      && strcmp (SYMBOL_LINKAGE_NAME (s.minsym), "__main") == 0)
+ 	      && MSYMBOL_LINKAGE_NAME (s.minsym) != NULL
+ 	      && strcmp (MSYMBOL_LINKAGE_NAME (s.minsym), "__main") == 0)
  	    pc += 5;
  	}
     }
@@ -1144,7 +1144,7 @@ amd64_windows_skip_trampoline_code (struct frame_info *frame, CORE_ADDR pc)
 	= (indirect_addr
 	   ? lookup_minimal_symbol_by_pc (indirect_addr).minsym
 	   : NULL);
-      const char *symname = indsym ? SYMBOL_LINKAGE_NAME (indsym) : NULL;
+      const char *symname = indsym ? MSYMBOL_LINKAGE_NAME (indsym) : NULL;
 
       if (symname)
 	{
diff --git a/gdb/arm-tdep.c b/gdb/arm-tdep.c
index 12254ec..558388d 100644
--- a/gdb/arm-tdep.c
+++ b/gdb/arm-tdep.c
@@ -472,10 +472,10 @@ skip_prologue_function (struct gdbarch *gdbarch, CORE_ADDR pc, int is_thumb)
 
   msym = lookup_minimal_symbol_by_pc (pc);
   if (msym.minsym != NULL
-      && SYMBOL_VALUE_ADDRESS (msym.minsym) == pc
-      && SYMBOL_LINKAGE_NAME (msym.minsym) != NULL)
+      && MSYMBOL_VALUE_ADDRESS (msym.minsym) == pc
+      && MSYMBOL_LINKAGE_NAME (msym.minsym) != NULL)
     {
-      const char *name = SYMBOL_LINKAGE_NAME (msym.minsym);
+      const char *name = MSYMBOL_LINKAGE_NAME (msym.minsym);
 
       /* The GNU linker's Thumb call stub to foo is named
 	 __foo_from_thumb.  */
@@ -1300,7 +1300,7 @@ arm_skip_stack_protector(CORE_ADDR pc, struct gdbarch *gdbarch)
      instruction sequence is not for stack protector.  If symbol is
      removed, we conservatively think this sequence is for stack protector.  */
   if (stack_chk_guard.minsym
-      && strncmp (SYMBOL_LINKAGE_NAME (stack_chk_guard.minsym),
+      && strncmp (MSYMBOL_LINKAGE_NAME (stack_chk_guard.minsym),
 		  "__stack_chk_guard",
 		  strlen ("__stack_chk_guard")) != 0)
    return pc;
@@ -9280,7 +9280,7 @@ arm_skip_stub (struct frame_info *frame, CORE_ADDR pc)
       objfile = (sec == NULL) ? NULL : sec->objfile;
       minsym = lookup_minimal_symbol (target_name, NULL, objfile);
       if (minsym != NULL)
-	return SYMBOL_VALUE_ADDRESS (minsym);
+	return MSYMBOL_VALUE_ADDRESS (minsym);
       else
 	return 0;
     }
diff --git a/gdb/arm-wince-tdep.c b/gdb/arm-wince-tdep.c
index 36f1a5d..a2a5372 100644
--- a/gdb/arm-wince-tdep.c
+++ b/gdb/arm-wince-tdep.c
@@ -64,7 +64,7 @@ arm_pe_skip_trampoline_code (struct frame_info *frame, CORE_ADDR pc)
   if (indsym.minsym == NULL)
     return 0;
 
-  symname = SYMBOL_LINKAGE_NAME (indsym.minsym);
+  symname = MSYMBOL_LINKAGE_NAME (indsym.minsym);
   if (symname == NULL || strncmp (symname, "__imp_", 6) != 0)
     return 0;
 
@@ -102,8 +102,8 @@ arm_wince_skip_main_prologue (struct gdbarch *gdbarch, CORE_ADDR pc)
       struct bound_minimal_symbol s = lookup_minimal_symbol_by_pc (call_dest);
 
       if (s.minsym != NULL
-	  && SYMBOL_LINKAGE_NAME (s.minsym) != NULL
-	  && strcmp (SYMBOL_LINKAGE_NAME (s.minsym), "__gccmain") == 0)
+	  && MSYMBOL_LINKAGE_NAME (s.minsym) != NULL
+	  && strcmp (MSYMBOL_LINKAGE_NAME (s.minsym), "__gccmain") == 0)
 	pc += 4;
     }
 
diff --git a/gdb/auxv.c b/gdb/auxv.c
index ee47446..0278705 100644
--- a/gdb/auxv.c
+++ b/gdb/auxv.c
@@ -105,7 +105,7 @@ ld_so_xfer_auxv (gdb_byte *readbuf,
      resides.  DATA_ADDRESS is the inferior value present in
      `_dl_auxv', therefore the real inferior AUXV address.  */
 
-  pointer_address = SYMBOL_VALUE_ADDRESS (msym);
+  pointer_address = MSYMBOL_VALUE_ADDRESS (msym);
 
   /* The location of the _dl_auxv symbol may no longer be correct if
      ld.so runs at a different address than the one present in the
diff --git a/gdb/avr-tdep.c b/gdb/avr-tdep.c
index e863678..da6b765 100644
--- a/gdb/avr-tdep.c
+++ b/gdb/avr-tdep.c
@@ -624,7 +624,7 @@ avr_scan_prologue (struct gdbarch *gdbarch, CORE_ADDR pc_beg, CORE_ADDR pc_end,
 
       /* Resolve offset (in words) from __prologue_saves__ symbol.
          Which is a pushes count in `-mcall-prologues' mode */
-      num_pushes = AVR_MAX_PUSHES - (i - SYMBOL_VALUE_ADDRESS (msymbol)) / 2;
+      num_pushes = AVR_MAX_PUSHES - (i - MSYMBOL_VALUE_ADDRESS (msymbol)) / 2;
 
       if (num_pushes > AVR_MAX_PUSHES)
         {
diff --git a/gdb/ax-gdb.c b/gdb/ax-gdb.c
index 9e27265..a57d573 100644
--- a/gdb/ax-gdb.c
+++ b/gdb/ax-gdb.c
@@ -719,7 +719,7 @@ gen_var_ref (struct gdbarch *gdbarch, struct agent_expr *ax,
 	  error (_("Couldn't resolve symbol `%s'."), SYMBOL_PRINT_NAME (var));
 
 	/* Push the address of the variable.  */
-	ax_const_l (ax, SYMBOL_VALUE_ADDRESS (msym));
+	ax_const_l (ax, MSYMBOL_VALUE_ADDRESS (msym));
 	value->kind = axs_lvalue_memory;
       }
       break;
diff --git a/gdb/block.c b/gdb/block.c
index 2ae6ee2..2eb0758 100644
--- a/gdb/block.c
+++ b/gdb/block.c
@@ -217,7 +217,7 @@ call_site_for_pc (struct gdbarch *gdbarch, CORE_ADDR pc)
 		     "DW_TAG_GNU_call_site %s in %s"),
 		   paddress (gdbarch, pc),
 		   (msym.minsym == NULL ? "???"
-		    : SYMBOL_PRINT_NAME (msym.minsym)));
+		    : MSYMBOL_PRINT_NAME (msym.minsym)));
     }
 
   return *slot;
diff --git a/gdb/blockframe.c b/gdb/blockframe.c
index 014c45b..ddfc7d6 100644
--- a/gdb/blockframe.c
+++ b/gdb/blockframe.c
@@ -104,7 +104,7 @@ get_pc_function_start (CORE_ADDR pc)
   msymbol = lookup_minimal_symbol_by_pc (pc);
   if (msymbol.minsym)
     {
-      CORE_ADDR fstart = SYMBOL_VALUE_ADDRESS (msymbol.minsym);
+      CORE_ADDR fstart = MSYMBOL_VALUE_ADDRESS (msymbol.minsym);
 
       if (find_pc_section (fstart))
 	return fstart;
@@ -235,7 +235,7 @@ find_pc_partial_function_gnu_ifunc (CORE_ADDR pc, const char **name,
       if (f != NULL
 	  && (msymbol.minsym == NULL
 	      || (BLOCK_START (SYMBOL_BLOCK_VALUE (f))
-		  >= SYMBOL_VALUE_ADDRESS (msymbol.minsym))))
+		  >= MSYMBOL_VALUE_ADDRESS (msymbol.minsym))))
 	{
 	  cache_pc_function_low = BLOCK_START (SYMBOL_BLOCK_VALUE (f));
 	  cache_pc_function_high = BLOCK_END (SYMBOL_BLOCK_VALUE (f));
@@ -269,8 +269,8 @@ find_pc_partial_function_gnu_ifunc (CORE_ADDR pc, const char **name,
       return 0;
     }
 
-  cache_pc_function_low = SYMBOL_VALUE_ADDRESS (msymbol.minsym);
-  cache_pc_function_name = SYMBOL_LINKAGE_NAME (msymbol.minsym);
+  cache_pc_function_low = MSYMBOL_VALUE_ADDRESS (msymbol.minsym);
+  cache_pc_function_name = MSYMBOL_LINKAGE_NAME (msymbol.minsym);
   cache_pc_function_section = section;
   cache_pc_function_is_gnu_ifunc = (MSYMBOL_TYPE (msymbol.minsym)
 				    == mst_text_gnu_ifunc);
diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c
index 45c3417..51309b0 100644
--- a/gdb/breakpoint.c
+++ b/gdb/breakpoint.c
@@ -3243,7 +3243,7 @@ create_overlay_event_breakpoint (void)
 	  bp_objfile_data->overlay_msym = m;
 	}
 
-      addr = SYMBOL_VALUE_ADDRESS (bp_objfile_data->overlay_msym);
+      addr = MSYMBOL_VALUE_ADDRESS (bp_objfile_data->overlay_msym);
       b = create_internal_breakpoint (get_objfile_arch (objfile), addr,
                                       bp_overlay_event,
 				      &internal_breakpoint_ops);
@@ -3360,7 +3360,7 @@ create_longjmp_master_breakpoint (void)
 	      bp_objfile_data->longjmp_msym[i] = m;
 	    }
 
-	  addr = SYMBOL_VALUE_ADDRESS (bp_objfile_data->longjmp_msym[i]);
+	  addr = MSYMBOL_VALUE_ADDRESS (bp_objfile_data->longjmp_msym[i]);
 	  b = create_internal_breakpoint (gdbarch, addr, bp_longjmp_master,
 					  &internal_breakpoint_ops);
 	  b->addr_string = xstrdup (func_name);
@@ -3415,7 +3415,7 @@ create_std_terminate_master_breakpoint (void)
 	  bp_objfile_data->terminate_msym = m;
 	}
 
-      addr = SYMBOL_VALUE_ADDRESS (bp_objfile_data->terminate_msym);
+      addr = MSYMBOL_VALUE_ADDRESS (bp_objfile_data->terminate_msym);
       b = create_internal_breakpoint (get_objfile_arch (objfile), addr,
                                       bp_std_terminate_master,
 				      &internal_breakpoint_ops);
@@ -3515,7 +3515,7 @@ create_exception_master_breakpoint (void)
 	  bp_objfile_data->exception_msym = debug_hook;
 	}
 
-      addr = SYMBOL_VALUE_ADDRESS (bp_objfile_data->exception_msym);
+      addr = MSYMBOL_VALUE_ADDRESS (bp_objfile_data->exception_msym);
       addr = gdbarch_convert_from_func_ptr_addr (gdbarch, addr,
 						 &current_target);
       b = create_internal_breakpoint (gdbarch, addr, bp_exception_master,
@@ -9992,7 +9992,7 @@ resolve_sal_pc (struct symtab_and_line *sal)
 
 	      msym = lookup_minimal_symbol_by_pc (sal->pc);
 	      if (msym.minsym)
-		sal->section = SYMBOL_OBJ_SECTION (msym.objfile, msym.minsym);
+		sal->section = MSYMBOL_OBJ_SECTION (msym.objfile, msym.minsym);
 
 	      do_cleanups (old_chain);
 	    }
diff --git a/gdb/bsd-uthread.c b/gdb/bsd-uthread.c
index 5f55763..d10c5d4 100644
--- a/gdb/bsd-uthread.c
+++ b/gdb/bsd-uthread.c
@@ -129,7 +129,7 @@ bsd_uthread_lookup_address (const char *name, struct objfile *objfile)
 
   sym = lookup_minimal_symbol (name, NULL, objfile);
   if (sym)
-    return SYMBOL_VALUE_ADDRESS (sym);
+    return MSYMBOL_VALUE_ADDRESS (sym);
 
   return 0;
 }
diff --git a/gdb/btrace.c b/gdb/btrace.c
index 32918ce..601eb41 100644
--- a/gdb/btrace.c
+++ b/gdb/btrace.c
@@ -62,7 +62,7 @@ ftrace_print_function_name (const struct btrace_function *bfun)
     return SYMBOL_PRINT_NAME (sym);
 
   if (msym != NULL)
-    return SYMBOL_PRINT_NAME (msym);
+    return MSYMBOL_PRINT_NAME (msym);
 
   return "<unknown>";
 }
@@ -138,7 +138,7 @@ ftrace_function_switched (const struct btrace_function *bfun,
 
   /* If the minimal symbol changed, we certainly switched functions.  */
   if (mfun != NULL && msym != NULL
-      && strcmp (SYMBOL_LINKAGE_NAME (mfun), SYMBOL_LINKAGE_NAME (msym)) != 0)
+      && strcmp (MSYMBOL_LINKAGE_NAME (mfun), MSYMBOL_LINKAGE_NAME (msym)) != 0)
     return 1;
 
   /* If the symbol changed, we certainly switched functions.  */
diff --git a/gdb/c-valprint.c b/gdb/c-valprint.c
index 9573105..5f950f8 100644
--- a/gdb/c-valprint.c
+++ b/gdb/c-valprint.c
@@ -316,12 +316,12 @@ c_val_print (struct type *type, const gdb_byte *valaddr,
 	      /* If 'symbol_print' is set, we did the work above.  */
 	      if (!options->symbol_print
 		  && (msymbol.minsym != NULL)
-		  && (vt_address == SYMBOL_VALUE_ADDRESS (msymbol.minsym)))
+		  && (vt_address == MSYMBOL_VALUE_ADDRESS (msymbol.minsym)))
 		{
 		  if (want_space)
 		    fputs_filtered (" ", stream);
 		  fputs_filtered (" <", stream);
-		  fputs_filtered (SYMBOL_PRINT_NAME (msymbol.minsym), stream);
+		  fputs_filtered (MSYMBOL_PRINT_NAME (msymbol.minsym), stream);
 		  fputs_filtered (">", stream);
 		  want_space = 1;
 		}
@@ -338,7 +338,7 @@ c_val_print (struct type *type, const gdb_byte *valaddr,
 		    fputs_filtered (" ", stream);
 
 		  if (msymbol.minsym != NULL)
-		    wsym = lookup_symbol (SYMBOL_LINKAGE_NAME (msymbol.minsym),
+		    wsym = lookup_symbol (MSYMBOL_LINKAGE_NAME (msymbol.minsym),
 					  block, VAR_DOMAIN,
 					  &is_this_fld);
 
diff --git a/gdb/coff-pe-read.c b/gdb/coff-pe-read.c
index 0fcd15f..7e46189 100644
--- a/gdb/coff-pe-read.c
+++ b/gdb/coff-pe-read.c
@@ -244,9 +244,9 @@ add_pe_forwarded_sym (const char *sym_name, const char *forward_dll_name,
 			" \"%s\" in dll \"%s\", pointing to \"%s\"\n"),
 			sym_name, dll_name, forward_qualified_name);
 
-  vma = SYMBOL_VALUE_ADDRESS (msymbol.minsym);
+  vma = MSYMBOL_VALUE_ADDRESS (msymbol.minsym);
   msymtype = MSYMBOL_TYPE (msymbol.minsym);
-  section = SYMBOL_SECTION (msymbol.minsym);
+  section = MSYMBOL_SECTION (msymbol.minsym);
 
   /* Generate a (hopefully unique) qualified name using the first part
      of the dll name, e.g. KERNEL32!AddAtomA.  This matches the style
diff --git a/gdb/coffread.c b/gdb/coffread.c
index d1895a6..d2891c3 100644
--- a/gdb/coffread.c
+++ b/gdb/coffread.c
@@ -669,7 +669,7 @@ coff_symfile_read (struct objfile *objfile, int symfile_flags)
 
       ALL_OBJFILE_MSYMBOLS (objfile, msym)
 	{
-	  const char *name = SYMBOL_LINKAGE_NAME (msym);
+	  const char *name = MSYMBOL_LINKAGE_NAME (msym);
 
 	  /* If the minimal symbols whose name are prefixed by "__imp_"
 	     or "_imp_", get rid of the prefix, and search the minimal
diff --git a/gdb/common/agent.c b/gdb/common/agent.c
index 9503592..c23d7dd 100644
--- a/gdb/common/agent.c
+++ b/gdb/common/agent.c
@@ -103,7 +103,7 @@ agent_look_up_symbols (void *arg)
 			       (struct objfile *) arg);
 
       if (sym != NULL)
-	*addrp = SYMBOL_VALUE_ADDRESS (sym);
+	*addrp = MSYMBOL_VALUE_ADDRESS (sym);
       else
 #endif
 	{
diff --git a/gdb/dbxread.c b/gdb/dbxread.c
index 0f70277..60cf0a8 100644
--- a/gdb/dbxread.c
+++ b/gdb/dbxread.c
@@ -1170,7 +1170,7 @@ find_stab_function_addr (char *namestring, const char *filename,
       msym = lookup_minimal_symbol (p, NULL, objfile);
     }
 
-  return msym == NULL ? 0 : SYMBOL_VALUE_ADDRESS (msym);
+  return msym == NULL ? 0 : MSYMBOL_VALUE_ADDRESS (msym);
 }
 
 static void
@@ -2278,7 +2278,7 @@ end_psymtab (struct objfile *objfile, struct partial_symtab *pst,
 	}
 
       if (minsym)
-	pst->texthigh = SYMBOL_VALUE_ADDRESS (minsym) + MSYMBOL_SIZE (minsym);
+	pst->texthigh = MSYMBOL_VALUE_ADDRESS (minsym) + MSYMBOL_SIZE (minsym);
 
       last_function_name = NULL;
     }
diff --git a/gdb/dwarf2loc.c b/gdb/dwarf2loc.c
index 99a18a9..430e749 100644
--- a/gdb/dwarf2loc.c
+++ b/gdb/dwarf2loc.c
@@ -555,7 +555,7 @@ call_site_to_target_addr (struct gdbarch *call_site_gdbarch,
 			   "at %s in %s"),
 			 paddress (call_site_gdbarch, call_site->pc),
 			 (msym.minsym == NULL ? "???"
-			  : SYMBOL_PRINT_NAME (msym.minsym)));
+			  : MSYMBOL_PRINT_NAME (msym.minsym)));
 			
 	  }
 	if (caller_frame == NULL)
@@ -569,7 +569,7 @@ call_site_to_target_addr (struct gdbarch *call_site_gdbarch,
 			   "available at %s in %s"),
 			 paddress (call_site_gdbarch, call_site->pc),
 			 (msym.minsym == NULL ? "???"
-			  : SYMBOL_PRINT_NAME (msym.minsym)));
+			  : MSYMBOL_PRINT_NAME (msym.minsym)));
 			
 	  }
 	caller_arch = get_frame_arch (caller_frame);
@@ -601,10 +601,10 @@ call_site_to_target_addr (struct gdbarch *call_site_gdbarch,
 			 _("Cannot find function \"%s\" for a call site target "
 			   "at %s in %s"),
 			 physname, paddress (call_site_gdbarch, call_site->pc),
-			 msym == NULL ? "???" : SYMBOL_PRINT_NAME (msym));
+			 msym == NULL ? "???" : MSYMBOL_PRINT_NAME (msym));
 			
 	  }
-	return SYMBOL_VALUE_ADDRESS (msym);
+	return MSYMBOL_VALUE_ADDRESS (msym);
       }
 
     case FIELD_LOC_KIND_PHYSADDR:
@@ -700,7 +700,7 @@ func_verify_no_selftailcall (struct gdbarch *gdbarch, CORE_ADDR verify_addr)
 			     "function \"%s\" at %s can call itself via tail "
 			     "calls"),
 			   (msym.minsym == NULL ? "???"
-			    : SYMBOL_PRINT_NAME (msym.minsym)),
+			    : MSYMBOL_PRINT_NAME (msym.minsym)),
 			   paddress (gdbarch, verify_addr));
 	    }
 
@@ -728,7 +728,7 @@ tailcall_dump (struct gdbarch *gdbarch, const struct call_site *call_site)
 
   fprintf_unfiltered (gdb_stdlog, " %s(%s)", paddress (gdbarch, addr),
 		      (msym.minsym == NULL ? "???"
-		       : SYMBOL_PRINT_NAME (msym.minsym)));
+		       : MSYMBOL_PRINT_NAME (msym.minsym)));
 
 }
 
@@ -968,10 +968,10 @@ call_site_find_chain_1 (struct gdbarch *gdbarch, CORE_ADDR caller_pc,
 		     "callers or callees between caller function \"%s\" at %s "
 		     "and callee function \"%s\" at %s"),
 		   (msym_caller.minsym == NULL
-		    ? "???" : SYMBOL_PRINT_NAME (msym_caller.minsym)),
+		    ? "???" : MSYMBOL_PRINT_NAME (msym_caller.minsym)),
 		   paddress (gdbarch, caller_pc),
 		   (msym_callee.minsym == NULL
-		    ? "???" : SYMBOL_PRINT_NAME (msym_callee.minsym)),
+		    ? "???" : MSYMBOL_PRINT_NAME (msym_callee.minsym)),
 		   paddress (gdbarch, callee_pc));
     }
 
@@ -1073,7 +1073,7 @@ dwarf_expr_reg_to_entry_parameter (struct frame_info *frame,
 		   gdbarch_bfd_arch_info (gdbarch)->printable_name,
 		   paddress (gdbarch, func_addr),
 		   (msym.minsym == NULL ? "???"
-		    : SYMBOL_PRINT_NAME (msym.minsym)),
+		    : MSYMBOL_PRINT_NAME (msym.minsym)),
 		   gdbarch_bfd_arch_info (caller_gdbarch)->printable_name);
     }
 
@@ -1086,7 +1086,7 @@ dwarf_expr_reg_to_entry_parameter (struct frame_info *frame,
 					   "requires caller of %s (%s)"),
 		   paddress (gdbarch, func_addr),
 		   (msym.minsym == NULL ? "???"
-		    : SYMBOL_PRINT_NAME (msym.minsym)));
+		    : MSYMBOL_PRINT_NAME (msym.minsym)));
     }
   caller_pc = get_frame_pc (caller_frame);
   call_site = call_site_for_pc (gdbarch, caller_pc);
@@ -1102,9 +1102,9 @@ dwarf_expr_reg_to_entry_parameter (struct frame_info *frame,
 		   _("DW_OP_GNU_entry_value resolving expects callee %s at %s "
 		     "but the called frame is for %s at %s"),
 		   (target_msym == NULL ? "???"
-					: SYMBOL_PRINT_NAME (target_msym)),
+					: MSYMBOL_PRINT_NAME (target_msym)),
 		   paddress (gdbarch, target_addr),
-		   func_msym == NULL ? "???" : SYMBOL_PRINT_NAME (func_msym),
+		   func_msym == NULL ? "???" : MSYMBOL_PRINT_NAME (func_msym),
 		   paddress (gdbarch, func_addr));
     }
 
@@ -1128,7 +1128,7 @@ dwarf_expr_reg_to_entry_parameter (struct frame_info *frame,
       throw_error (NO_ENTRY_VALUE_ERROR, _("Cannot find matching parameter "
 					   "at DW_TAG_GNU_call_site %s at %s"),
 		   paddress (gdbarch, caller_pc),
-		   msym == NULL ? "???" : SYMBOL_PRINT_NAME (msym)); 
+		   msym == NULL ? "???" : MSYMBOL_PRINT_NAME (msym)); 
     }
 
   *per_cu_return = call_site->per_cu;
diff --git a/gdb/elfread.c b/gdb/elfread.c
index a610012..9ecd328 100644
--- a/gdb/elfread.c
+++ b/gdb/elfread.c
@@ -765,10 +765,10 @@ elf_gnu_ifunc_record_cache (const char *name, CORE_ADDR addr)
   msym = lookup_minimal_symbol_by_pc (addr);
   if (msym.minsym == NULL)
     return 0;
-  if (SYMBOL_VALUE_ADDRESS (msym.minsym) != addr)
+  if (MSYMBOL_VALUE_ADDRESS (msym.minsym) != addr)
     return 0;
   /* minimal symbols have always SYMBOL_OBJ_SECTION non-NULL.  */
-  sect = SYMBOL_OBJ_SECTION (msym.objfile, msym.minsym)->the_bfd_section;
+  sect = MSYMBOL_OBJ_SECTION (msym.objfile, msym.minsym)->the_bfd_section;
   objfile = msym.objfile;
 
   /* If .plt jumps back to .plt the symbol is still deferred for later
@@ -891,7 +891,7 @@ elf_gnu_ifunc_resolve_by_got (const char *name, CORE_ADDR *addr_p)
 	continue;
       if (MSYMBOL_TYPE (msym) != mst_slot_got_plt)
 	continue;
-      pointer_address = SYMBOL_VALUE_ADDRESS (msym);
+      pointer_address = MSYMBOL_VALUE_ADDRESS (msym);
 
       plt = bfd_get_section_by_name (obfd, ".plt");
       if (plt == NULL)
diff --git a/gdb/findvar.c b/gdb/findvar.c
index 0647c0f..3e8bd08 100644
--- a/gdb/findvar.c
+++ b/gdb/findvar.c
@@ -577,13 +577,13 @@ default_read_var_value (struct symbol *var, struct frame_info *frame)
 	if (msym == NULL)
 	  error (_("No global symbol \"%s\"."), SYMBOL_LINKAGE_NAME (var));
 	if (overlay_debugging)
-	  addr = symbol_overlayed_address (SYMBOL_VALUE_ADDRESS (msym),
-					   SYMBOL_OBJ_SECTION (lookup_data.objfile,
-							       msym));
+	  addr = symbol_overlayed_address (MSYMBOL_VALUE_ADDRESS (msym),
+					   MSYMBOL_OBJ_SECTION (lookup_data.objfile,
+								msym));
 	else
-	  addr = SYMBOL_VALUE_ADDRESS (msym);
+	  addr = MSYMBOL_VALUE_ADDRESS (msym);
 
-	obj_section = SYMBOL_OBJ_SECTION (lookup_data.objfile, msym);
+	obj_section = MSYMBOL_OBJ_SECTION (lookup_data.objfile, msym);
 	if (obj_section
 	    && (obj_section->the_bfd_section->flags & SEC_THREAD_LOCAL) != 0)
 	  addr = target_translate_tls_address (obj_section->objfile, addr);
diff --git a/gdb/frame.c b/gdb/frame.c
index 8cd607b..a2645b5 100644
--- a/gdb/frame.c
+++ b/gdb/frame.c
@@ -1861,7 +1861,7 @@ get_prev_frame_1 (struct frame_info *this_frame)
       this_pc_in_block = get_frame_address_in_block (this_frame);
       morestack_msym = lookup_minimal_symbol_by_pc (this_pc_in_block).minsym;
       if (morestack_msym)
-	morestack_name = SYMBOL_LINKAGE_NAME (morestack_msym);
+	morestack_name = MSYMBOL_LINKAGE_NAME (morestack_msym);
       if (!morestack_name || strcmp (morestack_name, "__morestack") != 0)
 	{
 	  if (frame_debug)
@@ -2018,7 +2018,7 @@ inside_main_func (struct frame_info *this_frame)
   /* Make certain that the code, and not descriptor, address is
      returned.  */
   maddr = gdbarch_convert_from_func_ptr_addr (get_frame_arch (this_frame),
-					      SYMBOL_VALUE_ADDRESS (msymbol),
+					      MSYMBOL_VALUE_ADDRESS (msymbol),
 					      &current_target);
   return maddr == get_frame_func (this_frame);
 }
diff --git a/gdb/frv-tdep.c b/gdb/frv-tdep.c
index 3e41cfb..2437c9d 100644
--- a/gdb/frv-tdep.c
+++ b/gdb/frv-tdep.c
@@ -1082,8 +1082,8 @@ frv_skip_main_prologue (struct gdbarch *gdbarch, CORE_ADDR pc)
       s = lookup_minimal_symbol_by_pc (call_dest);
 
       if (s.minsym != NULL
-          && SYMBOL_LINKAGE_NAME (s.minsym) != NULL
-	  && strcmp (SYMBOL_LINKAGE_NAME (s.minsym), "__main") == 0)
+          && MSYMBOL_LINKAGE_NAME (s.minsym) != NULL
+	  && strcmp (MSYMBOL_LINKAGE_NAME (s.minsym), "__main") == 0)
 	{
 	  pc += 4;
 	  return pc;
@@ -1399,7 +1399,7 @@ frv_frame_this_id (struct frame_info *this_frame,
 
   /* Check if the stack is empty.  */
   msym_stack = lookup_minimal_symbol ("_stack", NULL, NULL);
-  if (msym_stack && info->base == SYMBOL_VALUE_ADDRESS (msym_stack))
+  if (msym_stack && info->base == MSYMBOL_VALUE_ADDRESS (msym_stack))
     return;
 
   /* Hopefully the prologue analysis either correctly determined the
diff --git a/gdb/glibc-tdep.c b/gdb/glibc-tdep.c
index 79b1622..4dd2415 100644
--- a/gdb/glibc-tdep.c
+++ b/gdb/glibc-tdep.c
@@ -66,7 +66,7 @@ glibc_skip_solib_resolver (struct gdbarch *gdbarch, CORE_ADDR pc)
       if (! fixup)
         fixup = lookup_minimal_symbol ("fixup", NULL, resolver.objfile);
 
-      if (fixup && SYMBOL_VALUE_ADDRESS (fixup) == pc)
+      if (fixup && MSYMBOL_VALUE_ADDRESS (fixup) == pc)
 	return frame_unwind_caller_pc (get_current_frame ());
     }
 
diff --git a/gdb/gnu-v2-abi.c b/gdb/gnu-v2-abi.c
index 5a3ecb3..4a488be 100644
--- a/gdb/gnu-v2-abi.c
+++ b/gdb/gnu-v2-abi.c
@@ -246,7 +246,7 @@ gnuv2_value_rtti_type (struct value *v, int *full, int *top, int *using_enc)
   /* Try to find a symbol that is the vtable.  */
   minsym=lookup_minimal_symbol_by_pc(vtbl);
   if (minsym.minsym==NULL
-      || (linkage_name=SYMBOL_LINKAGE_NAME (minsym.minsym))==NULL
+      || (linkage_name=MSYMBOL_LINKAGE_NAME (minsym.minsym))==NULL
       || !is_vtable_name (linkage_name))
     return NULL;
 
diff --git a/gdb/gnu-v3-abi.c b/gdb/gnu-v3-abi.c
index ceccbe5..6311f92 100644
--- a/gdb/gnu-v3-abi.c
+++ b/gdb/gnu-v3-abi.c
@@ -322,7 +322,7 @@ gnuv3_rtti_type (struct value *value,
      If we didn't like this approach, we could instead look in the
      type_info object itself to get the class name.  But this way
      should work just as well, and doesn't read target memory.  */
-  vtable_symbol_name = SYMBOL_DEMANGLED_NAME (vtable_symbol);
+  vtable_symbol_name = MSYMBOL_DEMANGLED_NAME (vtable_symbol);
   if (vtable_symbol_name == NULL
       || strncmp (vtable_symbol_name, "vtable for ", 11))
     {
@@ -1131,7 +1131,7 @@ gnuv3_get_typeid (struct value *value)
       if (minsym == NULL)
 	error (_("could not find typeinfo symbol for '%s'"), typename);
 
-      result = value_at_lazy (typeinfo_type, SYMBOL_VALUE_ADDRESS (minsym));
+      result = value_at_lazy (typeinfo_type, MSYMBOL_VALUE_ADDRESS (minsym));
     }
 
   do_cleanups (cleanup);
@@ -1158,11 +1158,11 @@ gnuv3_get_typename_from_type_info (struct value *type_info_ptr)
 
 #define TYPEINFO_PREFIX "typeinfo for "
 #define TYPEINFO_PREFIX_LEN (sizeof (TYPEINFO_PREFIX) - 1)
-  symname = SYMBOL_DEMANGLED_NAME (typeinfo_sym.minsym);
+  symname = MSYMBOL_DEMANGLED_NAME (typeinfo_sym.minsym);
   if (symname == NULL || strncmp (symname, TYPEINFO_PREFIX,
 				  TYPEINFO_PREFIX_LEN))
     error (_("typeinfo symbol '%s' has unexpected name"),
-	   SYMBOL_LINKAGE_NAME (typeinfo_sym.minsym));
+	   MSYMBOL_LINKAGE_NAME (typeinfo_sym.minsym));
   class_name = symname + TYPEINFO_PREFIX_LEN;
 
   /* Strip off @plt and version suffixes.  */
@@ -1226,7 +1226,7 @@ gnuv3_skip_trampoline (struct frame_info *frame, CORE_ADDR stop_pc)
   /* The symbol's demangled name should be something like "virtual
      thunk to FUNCTION", where FUNCTION is the name of the function
      being thunked to.  */
-  thunk_name = SYMBOL_DEMANGLED_NAME (thunk_sym);
+  thunk_name = MSYMBOL_DEMANGLED_NAME (thunk_sym);
   if (thunk_name == NULL || strstr (thunk_name, " thunk to ") == NULL)
     return 0;
 
@@ -1235,7 +1235,7 @@ gnuv3_skip_trampoline (struct frame_info *frame, CORE_ADDR stop_pc)
   if (fn_sym == NULL)
     return 0;
 
-  method_stop_pc = SYMBOL_VALUE_ADDRESS (fn_sym);
+  method_stop_pc = MSYMBOL_VALUE_ADDRESS (fn_sym);
 
   /* Some targets have minimal symbols pointing to function descriptors
      (powerpc 64 for example).  Make sure to retrieve the address
diff --git a/gdb/hppa-hpux-tdep.c b/gdb/hppa-hpux-tdep.c
index b0ce4df..31b557dc 100644
--- a/gdb/hppa-hpux-tdep.c
+++ b/gdb/hppa-hpux-tdep.c
@@ -84,7 +84,7 @@ hppa32_hpux_in_solib_call_trampoline (struct gdbarch *gdbarch, CORE_ADDR pc)
 
   minsym = lookup_minimal_symbol_by_pc (pc);
   if (minsym.minsym
-      && strcmp (SYMBOL_LINKAGE_NAME (minsym.minsym), ".stub") == 0)
+      && strcmp (MSYMBOL_LINKAGE_NAME (minsym.minsym), ".stub") == 0)
     return 1;
 
   /* Get the unwind descriptor corresponding to PC, return zero
@@ -168,7 +168,7 @@ hppa64_hpux_in_solib_call_trampoline (struct gdbarch *gdbarch, CORE_ADDR pc)
   if (! minsym.minsym)
     return 0;
 
-  sec = SYMBOL_OBJ_SECTION (minsym.objfile, minsym.minsym)->the_bfd_section;
+  sec = MSYMBOL_OBJ_SECTION (minsym.objfile, minsym.minsym)->the_bfd_section;
 
   if (bfd_get_section_vma (sec->owner, sec) <= pc
       && pc < (bfd_get_section_vma (sec->owner, sec)
@@ -370,8 +370,8 @@ hppa_hpux_skip_trampoline_code (struct frame_info *frame, CORE_ADDR pc)
 	  ALL_MSYMBOLS (objfile, msymbol)
 	  {
 	    if (MSYMBOL_TYPE (msymbol) == mst_text
-		&& strcmp (SYMBOL_LINKAGE_NAME (msymbol),
-			    SYMBOL_LINKAGE_NAME (msym.minsym)) == 0)
+		&& strcmp (MSYMBOL_LINKAGE_NAME (msymbol),
+			   MSYMBOL_LINKAGE_NAME (msym.minsym)) == 0)
 	      {
 		function_found = 1;
 		break;
@@ -469,16 +469,16 @@ hppa_hpux_skip_trampoline_code (struct frame_info *frame, CORE_ADDR pc)
 	      return orig_pc == pc ? 0 : pc & ~0x3;
 	    }
 
-	  libsym = lookup_minimal_symbol (SYMBOL_LINKAGE_NAME (stubsym.minsym),
+	  libsym = lookup_minimal_symbol (MSYMBOL_LINKAGE_NAME (stubsym.minsym),
 					  NULL, NULL);
 	  if (libsym == NULL)
 	    {
 	      warning (_("Unable to find library symbol for %s."),
-		       SYMBOL_PRINT_NAME (stubsym.minsym));
+		       MSYMBOL_PRINT_NAME (stubsym.minsym));
 	      return orig_pc == pc ? 0 : pc & ~0x3;
 	    }
 
-	  return SYMBOL_VALUE (libsym);
+	  return MSYMBOL_VALUE (libsym);
 	}
 
       /* Does it look like bl X,%rp or bl X,%r0?  Another way to do a
@@ -973,7 +973,7 @@ hppa64_hpux_search_dummy_call_sequence (struct gdbarch *gdbarch, CORE_ADDR pc,
       gdb_byte buf[2 * HPPA_INSN_SIZE];
       int offset;
 
-      find_pc_partial_function (SYMBOL_VALUE_ADDRESS (msym), &name,
+      find_pc_partial_function (MSYMBOL_VALUE_ADDRESS (msym), &name,
       				&begin, &end);
 
       if (name == NULL || begin == 0 || end == 0)
@@ -1023,19 +1023,19 @@ hppa_hpux_find_import_stub_for_addr (CORE_ADDR funcaddr)
   ALL_OBJFILES (objfile)
     {
       stubsym = lookup_minimal_symbol_solib_trampoline
-	(SYMBOL_LINKAGE_NAME (funsym.minsym), objfile);
+	(MSYMBOL_LINKAGE_NAME (funsym.minsym), objfile);
 
       if (stubsym)
 	{
 	  struct unwind_table_entry *u;
 
-	  u = find_unwind_entry (SYMBOL_VALUE (stubsym));
+	  u = find_unwind_entry (MSYMBOL_VALUE (stubsym));
 	  if (u == NULL 
 	      || (u->stub_unwind.stub_type != IMPORT
 		  && u->stub_unwind.stub_type != IMPORT_SHLIB))
 	    continue;
 
-          stubaddr = SYMBOL_VALUE (stubsym);
+          stubaddr = MSYMBOL_VALUE (stubsym);
 
 	  /* If we found an IMPORT stub, then we can stop searching;
 	     if we found an IMPORT_SHLIB, we want to continue the search
@@ -1096,10 +1096,10 @@ hppa_hpux_find_dummy_bpaddr (CORE_ADDR addr)
       find_pc_partial_function (addr, NULL, &func, NULL);
       ALL_OBJFILE_MSYMBOLS (sec->objfile, msym)
 	{
-	  u = find_unwind_entry (SYMBOL_VALUE_ADDRESS (msym));
-	  if (func != SYMBOL_VALUE_ADDRESS (msym) 
+	  u = find_unwind_entry (MSYMBOL_VALUE_ADDRESS (msym));
+	  if (func != MSYMBOL_VALUE_ADDRESS (msym) 
 	      && (!u || u->stub_unwind.stub_type == 0))
-	    return SYMBOL_VALUE_ADDRESS (msym);
+	    return MSYMBOL_VALUE_ADDRESS (msym);
 	}
     }
 
diff --git a/gdb/hppa-tdep.c b/gdb/hppa-tdep.c
index 1654529..aaef5a1 100644
--- a/gdb/hppa-tdep.c
+++ b/gdb/hppa-tdep.c
@@ -166,7 +166,7 @@ hppa_symbol_address(const char *sym)
 
   minsym = lookup_minimal_symbol (sym, NULL, NULL);
   if (minsym)
-    return SYMBOL_VALUE_ADDRESS (minsym);
+    return MSYMBOL_VALUE_ADDRESS (minsym);
   else
     return (CORE_ADDR)-1;
 }
@@ -2472,11 +2472,11 @@ hppa_lookup_stub_minimal_symbol (const char *name,
 
   ALL_MSYMBOLS (objfile, msym)
     {
-      if (strcmp (SYMBOL_LINKAGE_NAME (msym), name) == 0)
+      if (strcmp (MSYMBOL_LINKAGE_NAME (msym), name) == 0)
         {
           struct unwind_table_entry *u;
 
-          u = find_unwind_entry (SYMBOL_VALUE (msym));
+          u = find_unwind_entry (MSYMBOL_VALUE (msym));
           if (u != NULL && u->stub_unwind.stub_type == stub_type)
             return msym;
         }
diff --git a/gdb/i386-tdep.c b/gdb/i386-tdep.c
index bb414b6..be40b20 100644
--- a/gdb/i386-tdep.c
+++ b/gdb/i386-tdep.c
@@ -1808,8 +1808,8 @@ i386_skip_main_prologue (struct gdbarch *gdbarch, CORE_ADDR pc)
 	  call_dest = call_dest & 0xffffffffU;
  	  s = lookup_minimal_symbol_by_pc (call_dest);
  	  if (s.minsym != NULL
- 	      && SYMBOL_LINKAGE_NAME (s.minsym) != NULL
- 	      && strcmp (SYMBOL_LINKAGE_NAME (s.minsym), "__main") == 0)
+ 	      && MSYMBOL_LINKAGE_NAME (s.minsym) != NULL
+ 	      && strcmp (MSYMBOL_LINKAGE_NAME (s.minsym), "__main") == 0)
  	    pc += 5;
  	}
     }
@@ -3562,7 +3562,7 @@ i386_pe_skip_trampoline_code (struct frame_info *frame,
 	read_memory_unsigned_integer (pc + 2, 4, byte_order);
       struct minimal_symbol *indsym =
 	indirect ? lookup_minimal_symbol_by_pc (indirect).minsym : 0;
-      const char *symname = indsym ? SYMBOL_LINKAGE_NAME (indsym) : 0;
+      const char *symname = indsym ? MSYMBOL_LINKAGE_NAME (indsym) : 0;
 
       if (symname)
 	{
diff --git a/gdb/ia64-tdep.c b/gdb/ia64-tdep.c
index 7324a53..08eb79d 100644
--- a/gdb/ia64-tdep.c
+++ b/gdb/ia64-tdep.c
@@ -3655,7 +3655,8 @@ ia64_convert_from_func_ptr_addr (struct gdbarch *gdbarch, CORE_ADDR addr,
 
       minsym = lookup_minimal_symbol_by_pc (addr);
 
-      if (minsym.minsym && is_vtable_name (SYMBOL_LINKAGE_NAME (minsym.minsym)))
+      if (minsym.minsym
+	  && is_vtable_name (MSYMBOL_LINKAGE_NAME (minsym.minsym)))
 	return read_memory_unsigned_integer (addr, 8, byte_order);
     }
 
diff --git a/gdb/infcall.c b/gdb/infcall.c
index 8fa5253..ad18ff1 100644
--- a/gdb/infcall.c
+++ b/gdb/infcall.c
@@ -358,7 +358,7 @@ get_function_name (CORE_ADDR funaddr, char *buf, int buf_size)
     struct bound_minimal_symbol msymbol = lookup_minimal_symbol_by_pc (funaddr);
 
     if (msymbol.minsym)
-      return SYMBOL_PRINT_NAME (msymbol.minsym);
+      return MSYMBOL_PRINT_NAME (msymbol.minsym);
   }
 
   {
diff --git a/gdb/infcmd.c b/gdb/infcmd.c
index 2d50f41..23b02a3 100644
--- a/gdb/infcmd.c
+++ b/gdb/infcmd.c
@@ -1335,7 +1335,7 @@ until_next_command (int from_tty)
       if (msymbol.minsym == NULL)
 	error (_("Execution is not within a known function."));
 
-      tp->control.step_range_start = SYMBOL_VALUE_ADDRESS (msymbol.minsym);
+      tp->control.step_range_start = MSYMBOL_VALUE_ADDRESS (msymbol.minsym);
       tp->control.step_range_end = pc;
     }
   else
diff --git a/gdb/jit.c b/gdb/jit.c
index 546b3b6..0100253 100644
--- a/gdb/jit.c
+++ b/gdb/jit.c
@@ -357,7 +357,7 @@ jit_read_descriptor (struct gdbarch *gdbarch,
   if (jit_debug)
     fprintf_unfiltered (gdb_stdlog,
 			"jit_read_descriptor, descriptor_addr = %s\n",
-			paddress (gdbarch, SYMBOL_VALUE_ADDRESS (objf_data->descriptor)));
+			paddress (gdbarch, MSYMBOL_VALUE_ADDRESS (objf_data->descriptor)));
 
   /* Figure out how big the descriptor is on the remote and how to read it.  */
   ptr_type = builtin_type (gdbarch)->builtin_data_ptr;
@@ -366,7 +366,7 @@ jit_read_descriptor (struct gdbarch *gdbarch,
   desc_buf = alloca (desc_size);
 
   /* Read the descriptor.  */
-  err = target_read_memory (SYMBOL_VALUE_ADDRESS (objf_data->descriptor),
+  err = target_read_memory (MSYMBOL_VALUE_ADDRESS (objf_data->descriptor),
 			    desc_buf, desc_size);
   if (err)
     {
@@ -1026,12 +1026,12 @@ jit_breakpoint_re_set_internal (struct gdbarch *gdbarch,
 	 assume we are not attached to a JIT.  */
       reg_symbol = lookup_minimal_symbol_and_objfile (jit_break_name);
       if (reg_symbol.minsym == NULL
-	  || SYMBOL_VALUE_ADDRESS (reg_symbol.minsym) == 0)
+	  || MSYMBOL_VALUE_ADDRESS (reg_symbol.minsym) == 0)
 	return 1;
 
       desc_symbol = lookup_minimal_symbol (jit_descriptor_name, NULL,
 					   reg_symbol.objfile);
-      if (desc_symbol == NULL || SYMBOL_VALUE_ADDRESS (desc_symbol) == 0)
+      if (desc_symbol == NULL || MSYMBOL_VALUE_ADDRESS (desc_symbol) == 0)
 	return 1;
 
       objf_data = get_jit_objfile_data (reg_symbol.objfile);
@@ -1043,7 +1043,7 @@ jit_breakpoint_re_set_internal (struct gdbarch *gdbarch,
   else
     objf_data = get_jit_objfile_data (ps_data->objfile);
 
-  addr = SYMBOL_VALUE_ADDRESS (objf_data->register_code);
+  addr = MSYMBOL_VALUE_ADDRESS (objf_data->register_code);
 
   if (jit_debug)
     fprintf_unfiltered (gdb_stdlog,
diff --git a/gdb/linespec.c b/gdb/linespec.c
index 4b596fc..70495c6 100644
--- a/gdb/linespec.c
+++ b/gdb/linespec.c
@@ -3417,9 +3417,9 @@ minsym_found (struct linespec_state *self, struct objfile *objfile,
   CORE_ADDR pc;
   struct symtab_and_line sal;
 
-  sal = find_pc_sect_line (SYMBOL_VALUE_ADDRESS (msymbol),
+  sal = find_pc_sect_line (MSYMBOL_VALUE_ADDRESS (msymbol),
 			   (struct obj_section *) 0, 0);
-  sal.section = SYMBOL_OBJ_SECTION (objfile, msymbol);
+  sal.section = MSYMBOL_OBJ_SECTION (objfile, msymbol);
 
   /* The minimal symbol might point to a function descriptor;
      resolve it to the actual code address instead.  */
@@ -3431,7 +3431,7 @@ minsym_found (struct linespec_state *self, struct objfile *objfile,
     skip_prologue_sal (&sal);
 
   if (maybe_add_address (self->addr_set, objfile->pspace, sal.pc))
-    add_sal_to_sals (self, result, &sal, SYMBOL_NATURAL_NAME (msymbol), 0);
+    add_sal_to_sals (self, result, &sal, MSYMBOL_NATURAL_NAME (msymbol), 0);
 }
 
 /* A helper struct to pass some data through
@@ -3513,10 +3513,10 @@ add_minsym (struct minimal_symbol *minsym, void *d)
 	       before we decide to discard it.  */
 	    struct gdbarch *gdbarch = get_objfile_arch (info->objfile);
 	    CORE_ADDR addr = gdbarch_convert_from_func_ptr_addr
-			       (gdbarch, SYMBOL_VALUE_ADDRESS (minsym),
+			       (gdbarch, MSYMBOL_VALUE_ADDRESS (minsym),
 				&current_target);
 
-	    if (addr == SYMBOL_VALUE_ADDRESS (minsym))
+	    if (addr == MSYMBOL_VALUE_ADDRESS (minsym))
 	      return;
 	  }
       }
diff --git a/gdb/linux-fork.c b/gdb/linux-fork.c
index cfe1ce5..ed695d2 100644
--- a/gdb/linux-fork.c
+++ b/gdb/linux-fork.c
@@ -596,7 +596,7 @@ info_checkpoints_command (char *arg, int from_tty)
 
 	  msym = lookup_minimal_symbol_by_pc (pc);
 	  if (msym.minsym)
-	    printf_filtered (", <%s>", SYMBOL_LINKAGE_NAME (msym.minsym));
+	    printf_filtered (", <%s>", MSYMBOL_LINKAGE_NAME (msym.minsym));
 	}
 
       putchar_filtered ('\n');
diff --git a/gdb/linux-nat.c b/gdb/linux-nat.c
index 446bf09..aeb5582 100644
--- a/gdb/linux-nat.c
+++ b/gdb/linux-nat.c
@@ -5038,7 +5038,7 @@ get_signo (const char *name)
   if (ms == NULL)
     return 0;
 
-  if (target_read_memory (SYMBOL_VALUE_ADDRESS (ms), (gdb_byte *) &signo,
+  if (target_read_memory (MSYMBOL_VALUE_ADDRESS (ms), (gdb_byte *) &signo,
 			  sizeof (signo)) != 0)
     return 0;
 
diff --git a/gdb/linux-thread-db.c b/gdb/linux-thread-db.c
index cf7adc4..7f23722 100644
--- a/gdb/linux-thread-db.c
+++ b/gdb/linux-thread-db.c
@@ -574,7 +574,7 @@ inferior_has_bug (const char *ver_symbol, int ver_major_min, int ver_minor_min)
   if (version_msym == NULL)
     return 0;
 
-  version_addr = SYMBOL_VALUE_ADDRESS (version_msym);
+  version_addr = MSYMBOL_VALUE_ADDRESS (version_msym);
   got = target_read_string (version_addr, &version, 32, &err);
   if (err == 0 && memchr (version, 0, got) == &version[got -1])
     {
diff --git a/gdb/m32c-tdep.c b/gdb/m32c-tdep.c
index dd65a03..899e45f 100644
--- a/gdb/m32c-tdep.c
+++ b/gdb/m32c-tdep.c
@@ -2247,7 +2247,7 @@ m32c_return_value (struct gdbarch *gdbarch,
 	    error (_("The return value is stored in memory at 'mem0', "
 		     "but GDB cannot find\n"
 		     "its address."));
-	  read_memory (SYMBOL_VALUE_ADDRESS (mem0), readbuf, valtype_len);
+	  read_memory (MSYMBOL_VALUE_ADDRESS (mem0), readbuf, valtype_len);
 	}
     }
 
@@ -2279,7 +2279,7 @@ m32c_return_value (struct gdbarch *gdbarch,
 	    error (_("The return value is stored in memory at 'mem0', "
 		     "but GDB cannot find\n"
 		     " its address."));
-	  write_memory (SYMBOL_VALUE_ADDRESS (mem0), writebuf, valtype_len);
+	  write_memory (MSYMBOL_VALUE_ADDRESS (mem0), writebuf, valtype_len);
 	}
     }
 
@@ -2461,7 +2461,7 @@ m32c_m16c_address_to_pointer (struct gdbarch *gdbarch,
                "couldn't find a symbol at that address, to find trampoline."),
                paddress (gdbarch, addr));
 
-      func_name = SYMBOL_LINKAGE_NAME (func_msym.minsym);
+      func_name = MSYMBOL_LINKAGE_NAME (func_msym.minsym);
       tramp_name = xmalloc (strlen (func_name) + 5);
       strcpy (tramp_name, func_name);
       strcat (tramp_name, ".plt");
@@ -2505,7 +2505,7 @@ m32c_m16c_address_to_pointer (struct gdbarch *gdbarch,
       else
 	{
 	  /* The trampoline's address is our pointer.  */
-	  addr = SYMBOL_VALUE_ADDRESS (tramp_msym);
+	  addr = MSYMBOL_VALUE_ADDRESS (tramp_msym);
 	}
     }
 
@@ -2536,7 +2536,7 @@ m32c_m16c_pointer_to_address (struct gdbarch *gdbarch,
 
       if (ptr_msym.minsym)
         {
-          const char *ptr_msym_name = SYMBOL_LINKAGE_NAME (ptr_msym.minsym);
+          const char *ptr_msym_name = MSYMBOL_LINKAGE_NAME (ptr_msym.minsym);
           int len = strlen (ptr_msym_name);
 
           if (len > 4
@@ -2558,7 +2558,7 @@ m32c_m16c_pointer_to_address (struct gdbarch *gdbarch,
               /* If we do have such a symbol, return its value as the
                  function's true address.  */
               if (func_msym)
-                ptr = SYMBOL_VALUE_ADDRESS (func_msym);
+                ptr = MSYMBOL_VALUE_ADDRESS (func_msym);
             }
         }
       else
diff --git a/gdb/m32r-tdep.c b/gdb/m32r-tdep.c
index 0ba1276..52a3170 100644
--- a/gdb/m32r-tdep.c
+++ b/gdb/m32r-tdep.c
@@ -844,7 +844,7 @@ m32r_frame_this_id (struct frame_info *this_frame,
 
   /* Check if the stack is empty.  */
   msym_stack = lookup_minimal_symbol ("_stack", NULL, NULL);
-  if (msym_stack && info->base == SYMBOL_VALUE_ADDRESS (msym_stack))
+  if (msym_stack && info->base == MSYMBOL_VALUE_ADDRESS (msym_stack))
     return;
 
   /* Hopefully the prologue analysis either correctly determined the
diff --git a/gdb/m68hc11-tdep.c b/gdb/m68hc11-tdep.c
index 60cc2d4..e23747d 100644
--- a/gdb/m68hc11-tdep.c
+++ b/gdb/m68hc11-tdep.c
@@ -204,7 +204,7 @@ m68hc11_get_register_info (struct m68hc11_soft_reg *reg, const char *name)
   msymbol = lookup_minimal_symbol (name, NULL, NULL);
   if (msymbol)
     {
-      reg->addr = SYMBOL_VALUE_ADDRESS (msymbol);
+      reg->addr = MSYMBOL_VALUE_ADDRESS (msymbol);
       reg->name = xstrdup (name);
 
       /* Keep track of the address range for soft registers.  */
diff --git a/gdb/machoread.c b/gdb/machoread.c
index 3b19059..cb8f053 100644
--- a/gdb/machoread.c
+++ b/gdb/machoread.c
@@ -441,7 +441,7 @@ macho_resolve_oso_sym_with_minsym (struct objfile *main_objfile, asymbol *sym)
       return 0;
     }
   else
-    return SYMBOL_VALUE_ADDRESS (msym);
+    return MSYMBOL_VALUE_ADDRESS (msym);
 }
 
 /* Add oso file OSO/ABFD as a symbol file.  */
diff --git a/gdb/maint.c b/gdb/maint.c
index 2fa6add..b4225d9 100644
--- a/gdb/maint.c
+++ b/gdb/maint.c
@@ -490,11 +490,11 @@ maintenance_translate_address (char *arg, int from_tty)
 
   if (sym.minsym)
     {
-      const char *symbol_name = SYMBOL_PRINT_NAME (sym.minsym);
+      const char *symbol_name = MSYMBOL_PRINT_NAME (sym.minsym);
       const char *symbol_offset
-	= pulongest (address - SYMBOL_VALUE_ADDRESS (sym.minsym));
+	= pulongest (address - MSYMBOL_VALUE_ADDRESS (sym.minsym));
 
-      sect = SYMBOL_OBJ_SECTION(sym.objfile, sym.minsym);
+      sect = MSYMBOL_OBJ_SECTION(sym.objfile, sym.minsym);
       if (sect != NULL)
 	{
 	  const char *section_name;
diff --git a/gdb/minsyms.c b/gdb/minsyms.c
index 0981e3d..aad7685 100644
--- a/gdb/minsyms.c
+++ b/gdb/minsyms.c
@@ -116,7 +116,7 @@ add_minsym_to_hash_table (struct minimal_symbol *sym,
   if (sym->hash_next == NULL)
     {
       unsigned int hash
-	= msymbol_hash (SYMBOL_LINKAGE_NAME (sym)) % MINIMAL_SYMBOL_HASH_SIZE;
+	= msymbol_hash (MSYMBOL_LINKAGE_NAME (sym)) % MINIMAL_SYMBOL_HASH_SIZE;
 
       sym->hash_next = table[hash];
       table[hash] = sym;
@@ -131,7 +131,7 @@ add_minsym_to_demangled_hash_table (struct minimal_symbol *sym,
 {
   if (sym->demangled_hash_next == NULL)
     {
-      unsigned int hash = msymbol_hash_iw (SYMBOL_SEARCH_NAME (sym))
+      unsigned int hash = msymbol_hash_iw (MSYMBOL_SEARCH_NAME (sym))
 	% MINIMAL_SYMBOL_HASH_SIZE;
 
       sym->demangled_hash_next = table[hash];
@@ -221,13 +221,13 @@ lookup_minimal_symbol_internal (const char *name, const char *sfile,
 
 		      cmp = (case_sensitivity == case_sensitive_on
 		             ? strcmp : strcasecmp);
-		      match = cmp (SYMBOL_LINKAGE_NAME (msymbol),
+		      match = cmp (MSYMBOL_LINKAGE_NAME (msymbol),
 				   modified_name) == 0;
 		    }
 		  else
 		    {
 		      /* The function respects CASE_SENSITIVITY.  */
-		      match = SYMBOL_MATCHES_SEARCH_NAME (msymbol,
+		      match = MSYMBOL_MATCHES_SEARCH_NAME (msymbol,
 							  modified_name);
 		    }
 
@@ -331,7 +331,7 @@ iterate_over_minimal_symbols (struct objfile *objf, const char *name,
   cmp = (case_sensitivity == case_sensitive_on ? strcmp : strcasecmp);
   while (iter)
     {
-      if (cmp (SYMBOL_LINKAGE_NAME (iter), name) == 0)
+      if (cmp (MSYMBOL_LINKAGE_NAME (iter), name) == 0)
 	(*callback) (iter, user_data);
       iter = iter->hash_next;
     }
@@ -341,7 +341,7 @@ iterate_over_minimal_symbols (struct objfile *objf, const char *name,
   iter = objf->msymbol_demangled_hash[hash];
   while (iter)
     {
-      if (SYMBOL_MATCHES_SEARCH_NAME (iter, name))
+      if (MSYMBOL_MATCHES_SEARCH_NAME (iter, name))
 	(*callback) (iter, user_data);
       iter = iter->demangled_hash_next;
     }
@@ -370,7 +370,7 @@ lookup_minimal_symbol_text (const char *name, struct objfile *objf)
 	       msymbol != NULL && found_symbol == NULL;
 	       msymbol = msymbol->hash_next)
 	    {
-	      if (strcmp (SYMBOL_LINKAGE_NAME (msymbol), name) == 0 &&
+	      if (strcmp (MSYMBOL_LINKAGE_NAME (msymbol), name) == 0 &&
 		  (MSYMBOL_TYPE (msymbol) == mst_text
 		   || MSYMBOL_TYPE (msymbol) == mst_text_gnu_ifunc
 		   || MSYMBOL_TYPE (msymbol) == mst_file_text))
@@ -421,8 +421,8 @@ lookup_minimal_symbol_by_pc_name (CORE_ADDR pc, const char *name,
 	       msymbol != NULL;
 	       msymbol = msymbol->hash_next)
 	    {
-	      if (SYMBOL_VALUE_ADDRESS (msymbol) == pc
-		  && strcmp (SYMBOL_LINKAGE_NAME (msymbol), name) == 0)
+	      if (MSYMBOL_VALUE_ADDRESS (msymbol) == pc
+		  && strcmp (MSYMBOL_LINKAGE_NAME (msymbol), name) == 0)
 		return msymbol;
 	    }
 	}
@@ -454,7 +454,7 @@ lookup_minimal_symbol_solib_trampoline (const char *name,
 	       msymbol != NULL && found_symbol == NULL;
 	       msymbol = msymbol->hash_next)
 	    {
-	      if (strcmp (SYMBOL_LINKAGE_NAME (msymbol), name) == 0 &&
+	      if (strcmp (MSYMBOL_LINKAGE_NAME (msymbol), name) == 0 &&
 		  MSYMBOL_TYPE (msymbol) == mst_solib_trampoline)
 		return msymbol;
 	    }
@@ -545,14 +545,14 @@ 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 >= SYMBOL_VALUE_ADDRESS (&msymbol[lo]))
+	  if (pc >= MSYMBOL_VALUE_ADDRESS (&msymbol[lo]))
 	    {
-	      while (SYMBOL_VALUE_ADDRESS (&msymbol[hi]) > pc)
+	      while (MSYMBOL_VALUE_ADDRESS (&msymbol[hi]) > pc)
 		{
 		  /* pc is still strictly less than highest address.  */
 		  /* Note "new" will always be >= lo.  */
 		  new = (lo + hi) / 2;
-		  if ((SYMBOL_VALUE_ADDRESS (&msymbol[new]) >= pc) ||
+		  if ((MSYMBOL_VALUE_ADDRESS (&msymbol[new]) >= pc) ||
 		      (lo == new))
 		    {
 		      hi = new;
@@ -567,8 +567,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
-		     && (SYMBOL_VALUE_ADDRESS (&msymbol[hi])
-			 == SYMBOL_VALUE_ADDRESS (&msymbol[hi + 1])))
+		     && (MSYMBOL_VALUE_ADDRESS (&msymbol[hi])
+			 == MSYMBOL_VALUE_ADDRESS (&msymbol[hi + 1])))
 		hi++;
 
 	      /* Skip various undesirable symbols.  */
@@ -598,9 +598,9 @@ lookup_minimal_symbol_by_pc_section_1 (CORE_ADDR pc,
 		      /* Some types of debug info, such as COFF,
 			 don't fill the bfd_section member, so don't
 			 throw away symbols on those platforms.  */
-		      && SYMBOL_OBJ_SECTION (objfile, &msymbol[hi]) != NULL
+		      && MSYMBOL_OBJ_SECTION (objfile, &msymbol[hi]) != NULL
 		      && (!matching_obj_sections
-			  (SYMBOL_OBJ_SECTION (objfile, &msymbol[hi]),
+			  (MSYMBOL_OBJ_SECTION (objfile, &msymbol[hi]),
 			   section)))
 		    {
 		      hi--;
@@ -616,10 +616,10 @@ 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]))
-		      && (SYMBOL_VALUE_ADDRESS (&msymbol[hi])
-			  == SYMBOL_VALUE_ADDRESS (&msymbol[hi - 1]))
-		      && (SYMBOL_OBJ_SECTION (objfile, &msymbol[hi])
-			  == SYMBOL_OBJ_SECTION (objfile, &msymbol[hi - 1])))
+		      && (MSYMBOL_VALUE_ADDRESS (&msymbol[hi])
+			  == MSYMBOL_VALUE_ADDRESS (&msymbol[hi - 1]))
+		      && (MSYMBOL_OBJ_SECTION (objfile, &msymbol[hi])
+			  == MSYMBOL_OBJ_SECTION (objfile, &msymbol[hi - 1])))
 		    {
 		      hi--;
 		      continue;
@@ -646,9 +646,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 >= (SYMBOL_VALUE_ADDRESS (&msymbol[hi])
+		      && pc >= (MSYMBOL_VALUE_ADDRESS (&msymbol[hi])
 				+ MSYMBOL_SIZE (&msymbol[hi]))
-		      && pc < (SYMBOL_VALUE_ADDRESS (&msymbol[hi - 1])
+		      && pc < (MSYMBOL_VALUE_ADDRESS (&msymbol[hi - 1])
 			       + MSYMBOL_SIZE (&msymbol[hi - 1])))
 		    {
 		      hi--;
@@ -678,7 +678,7 @@ lookup_minimal_symbol_by_pc_section_1 (CORE_ADDR pc,
 
 	      if (hi >= 0
 		  && MSYMBOL_SIZE (&msymbol[hi]) != 0
-		  && pc >= (SYMBOL_VALUE_ADDRESS (&msymbol[hi])
+		  && pc >= (MSYMBOL_VALUE_ADDRESS (&msymbol[hi])
 			    + MSYMBOL_SIZE (&msymbol[hi])))
 		{
 		  if (best_zero_sized != -1)
@@ -694,8 +694,8 @@ lookup_minimal_symbol_by_pc_section_1 (CORE_ADDR pc,
 
 	      if (hi >= 0
 		  && ((best_symbol == NULL) ||
-		      (SYMBOL_VALUE_ADDRESS (best_symbol) <
-		       SYMBOL_VALUE_ADDRESS (&msymbol[hi]))))
+		      (MSYMBOL_VALUE_ADDRESS (best_symbol) <
+		       MSYMBOL_VALUE_ADDRESS (&msymbol[hi]))))
 		{
 		  best_symbol = &msymbol[hi];
 		  best_objfile = objfile;
@@ -826,7 +826,7 @@ lookup_minimal_symbol_and_objfile (const char *name)
 	   msym != NULL;
 	   msym = msym->hash_next)
 	{
-	  if (strcmp (SYMBOL_LINKAGE_NAME (msym), name) == 0)
+	  if (strcmp (MSYMBOL_LINKAGE_NAME (msym), name) == 0)
 	    {
 	      result.minsym = msym;
 	      result.objfile = objfile;
@@ -941,11 +941,11 @@ prim_record_minimal_symbol_full (const char *name, int name_len, int copy_name,
       msym_bunch = new;
     }
   msymbol = &msym_bunch->contents[msym_bunch_index];
-  SYMBOL_SET_LANGUAGE (msymbol, language_auto, &objfile->objfile_obstack);
-  SYMBOL_SET_NAMES (msymbol, name, name_len, copy_name, objfile);
+  MSYMBOL_SET_LANGUAGE (msymbol, language_auto, &objfile->objfile_obstack);
+  MSYMBOL_SET_NAMES (msymbol, name, name_len, copy_name, objfile);
 
-  SYMBOL_VALUE_ADDRESS (msymbol) = address;
-  SYMBOL_SECTION (msymbol) = section;
+  MSYMBOL_VALUE_ADDRESS (msymbol) = address;
+  MSYMBOL_SECTION (msymbol) = section;
 
   MSYMBOL_TYPE (msymbol) = ms_type;
   MSYMBOL_TARGET_FLAG_1 (msymbol) = 0;
@@ -991,19 +991,19 @@ compare_minimal_symbols (const void *fn1p, const void *fn2p)
   fn1 = (const struct minimal_symbol *) fn1p;
   fn2 = (const struct minimal_symbol *) fn2p;
 
-  if (SYMBOL_VALUE_ADDRESS (fn1) < SYMBOL_VALUE_ADDRESS (fn2))
+  if (MSYMBOL_VALUE_ADDRESS (fn1) < MSYMBOL_VALUE_ADDRESS (fn2))
     {
       return (-1);		/* addr 1 is less than addr 2.  */
     }
-  else if (SYMBOL_VALUE_ADDRESS (fn1) > SYMBOL_VALUE_ADDRESS (fn2))
+  else if (MSYMBOL_VALUE_ADDRESS (fn1) > MSYMBOL_VALUE_ADDRESS (fn2))
     {
       return (1);		/* addr 1 is greater than addr 2.  */
     }
   else
     /* addrs are equal: sort by name */
     {
-      const char *name1 = SYMBOL_LINKAGE_NAME (fn1);
-      const char *name2 = SYMBOL_LINKAGE_NAME (fn2);
+      const char *name1 = MSYMBOL_LINKAGE_NAME (fn1);
+      const char *name2 = MSYMBOL_LINKAGE_NAME (fn2);
 
       if (name1 && name2)	/* both have names */
 	return strcmp (name1, name2);
@@ -1095,10 +1095,10 @@ compact_minimal_symbols (struct minimal_symbol *msymbol, int mcount,
       copyfrom = copyto = msymbol;
       while (copyfrom < msymbol + mcount - 1)
 	{
-	  if (SYMBOL_VALUE_ADDRESS (copyfrom)
-	      == SYMBOL_VALUE_ADDRESS ((copyfrom + 1))
-	      && strcmp (SYMBOL_LINKAGE_NAME (copyfrom),
-			 SYMBOL_LINKAGE_NAME ((copyfrom + 1))) == 0)
+	  if (MSYMBOL_VALUE_ADDRESS (copyfrom)
+	      == MSYMBOL_VALUE_ADDRESS ((copyfrom + 1))
+	      && strcmp (MSYMBOL_LINKAGE_NAME (copyfrom),
+			 MSYMBOL_LINKAGE_NAME ((copyfrom + 1))) == 0)
 	    {
 	      if (MSYMBOL_TYPE ((copyfrom + 1)) == mst_unknown)
 		{
@@ -1141,7 +1141,7 @@ build_minimal_symbol_hash_tables (struct objfile *objfile)
       add_minsym_to_hash_table (msym, objfile->msymbol_hash);
 
       msym->demangled_hash_next = 0;
-      if (SYMBOL_SEARCH_NAME (msym) != SYMBOL_LINKAGE_NAME (msym))
+      if (MSYMBOL_SEARCH_NAME (msym) != MSYMBOL_LINKAGE_NAME (msym))
 	add_minsym_to_demangled_hash_table (msym,
                                             objfile->msymbol_demangled_hash);
     }
@@ -1277,7 +1277,7 @@ terminate_minimal_symbol_table (struct objfile *objfile)
     memset (m, 0, sizeof (*m));
     /* Don't rely on these enumeration values being 0's.  */
     MSYMBOL_TYPE (m) = mst_unknown;
-    SYMBOL_SET_LANGUAGE (m, language_unknown, &objfile->objfile_obstack);
+    MSYMBOL_SET_LANGUAGE (m, language_unknown, &objfile->objfile_obstack);
   }
 }
 
@@ -1334,24 +1334,24 @@ find_solib_trampoline_target (struct frame_info *frame, CORE_ADDR pc)
       {
 	if ((MSYMBOL_TYPE (msymbol) == mst_text
 	    || MSYMBOL_TYPE (msymbol) == mst_text_gnu_ifunc)
-	    && strcmp (SYMBOL_LINKAGE_NAME (msymbol),
-		       SYMBOL_LINKAGE_NAME (tsymbol)) == 0)
-	  return SYMBOL_VALUE_ADDRESS (msymbol);
+	    && strcmp (MSYMBOL_LINKAGE_NAME (msymbol),
+		       MSYMBOL_LINKAGE_NAME (tsymbol)) == 0)
+	  return MSYMBOL_VALUE_ADDRESS (msymbol);
 
 	/* Also handle minimal symbols pointing to function descriptors.  */
 	if (MSYMBOL_TYPE (msymbol) == mst_data
-	    && strcmp (SYMBOL_LINKAGE_NAME (msymbol),
-		       SYMBOL_LINKAGE_NAME (tsymbol)) == 0)
+	    && strcmp (MSYMBOL_LINKAGE_NAME (msymbol),
+		       MSYMBOL_LINKAGE_NAME (tsymbol)) == 0)
 	  {
 	    CORE_ADDR func;
 
 	    func = gdbarch_convert_from_func_ptr_addr
 		    (get_objfile_arch (objfile),
-		     SYMBOL_VALUE_ADDRESS (msymbol),
+		     MSYMBOL_VALUE_ADDRESS (msymbol),
 		     &current_target);
 
 	    /* Ignore data symbols that are not function descriptors.  */
-	    if (func != SYMBOL_VALUE_ADDRESS (msymbol))
+	    if (func != MSYMBOL_VALUE_ADDRESS (msymbol))
 	      return func;
 	  }
       }
@@ -1377,25 +1377,26 @@ 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 SYMBOL_VALUE_ADDRESS (minsym.minsym) + MSYMBOL_SIZE (minsym.minsym);
+    return MSYMBOL_VALUE_ADDRESS (minsym.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
      different address.  */
 
   msymbol = minsym.minsym;
-  section = SYMBOL_SECTION (msymbol);
-  for (i = 1; SYMBOL_LINKAGE_NAME (msymbol + i) != NULL; i++)
+  section = MSYMBOL_SECTION (msymbol);
+  for (i = 1; MSYMBOL_LINKAGE_NAME (msymbol + i) != NULL; i++)
     {
-      if (SYMBOL_VALUE_ADDRESS (msymbol + i) != SYMBOL_VALUE_ADDRESS (msymbol)
-	  && SYMBOL_SECTION (msymbol + i) == section)
+      if (MSYMBOL_VALUE_ADDRESS (msymbol + i) != MSYMBOL_VALUE_ADDRESS (msymbol)
+	  && MSYMBOL_SECTION (msymbol + i) == section)
 	break;
     }
 
-  obj_section = SYMBOL_OBJ_SECTION (minsym.objfile, minsym.minsym);
-  if (SYMBOL_LINKAGE_NAME (msymbol + i) != NULL
-      && SYMBOL_VALUE_ADDRESS (msymbol + i) < obj_section_endaddr (obj_section))
-    result = SYMBOL_VALUE_ADDRESS (msymbol + i);
+  obj_section = MSYMBOL_OBJ_SECTION (minsym.objfile, minsym.minsym);
+  if (MSYMBOL_LINKAGE_NAME (msymbol + i) != NULL
+      && (MSYMBOL_VALUE_ADDRESS (msymbol + i)
+	  < obj_section_endaddr (obj_section)))
+    result = MSYMBOL_VALUE_ADDRESS (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.  */
diff --git a/gdb/mips-linux-tdep.c b/gdb/mips-linux-tdep.c
index 6c0459d..91ef012 100644
--- a/gdb/mips-linux-tdep.c
+++ b/gdb/mips-linux-tdep.c
@@ -826,7 +826,7 @@ mips_linux_skip_resolver (struct gdbarch *gdbarch, CORE_ADDR pc)
 
   resolver = lookup_minimal_symbol ("__dl_runtime_resolve", NULL, NULL);
 
-  if (resolver && SYMBOL_VALUE_ADDRESS (resolver) == pc)
+  if (resolver && MSYMBOL_VALUE_ADDRESS (resolver) == pc)
     return frame_unwind_caller_pc (get_current_frame ());
 
   return glibc_skip_solib_resolver (gdbarch, pc);
diff --git a/gdb/mips-tdep.c b/gdb/mips-tdep.c
index 99fc313..7380ee1 100644
--- a/gdb/mips-tdep.c
+++ b/gdb/mips-tdep.c
@@ -3602,8 +3602,8 @@ mips_stub_frame_sniffer (const struct frame_unwind *self,
      stub.  The stub for foo is named ".pic.foo".  */
   msym = lookup_minimal_symbol_by_pc (pc);
   if (msym.minsym != NULL
-      && SYMBOL_LINKAGE_NAME (msym.minsym) != NULL
-      && strncmp (SYMBOL_LINKAGE_NAME (msym.minsym), ".pic.", 5) == 0)
+      && MSYMBOL_LINKAGE_NAME (msym.minsym) != NULL
+      && strncmp (MSYMBOL_LINKAGE_NAME (msym.minsym), ".pic.", 5) == 0)
     return 1;
 
   return 0;
@@ -7635,9 +7635,9 @@ mips_skip_pic_trampoline_code (struct frame_info *frame, CORE_ADDR pc)
      which jumps to foo.  */
   msym = lookup_minimal_symbol_by_pc (pc);
   if (msym.minsym == NULL
-      || SYMBOL_VALUE_ADDRESS (msym.minsym) != pc
-      || SYMBOL_LINKAGE_NAME (msym.minsym) == NULL
-      || strncmp (SYMBOL_LINKAGE_NAME (msym.minsym), ".pic.", 5) != 0)
+      || MSYMBOL_VALUE_ADDRESS (msym.minsym) != pc
+      || MSYMBOL_LINKAGE_NAME (msym.minsym) == NULL
+      || strncmp (MSYMBOL_LINKAGE_NAME (msym.minsym), ".pic.", 5) != 0)
     return 0;
 
   /* A two-instruction header.  */
diff --git a/gdb/msp430-tdep.c b/gdb/msp430-tdep.c
index 66ce9cb..6aad2b1 100644
--- a/gdb/msp430-tdep.c
+++ b/gdb/msp430-tdep.c
@@ -850,7 +850,7 @@ msp430_skip_trampoline_code (struct frame_info *frame, CORE_ADDR pc)
   if (!bms.minsym)
     return pc;
 
-  stub_name = SYMBOL_LINKAGE_NAME (bms.minsym);
+  stub_name = MSYMBOL_LINKAGE_NAME (bms.minsym);
 
   if (gdbarch_tdep (gdbarch)->code_model == MSP_SMALL_CODE_MODEL
       && msp430_in_return_stub (gdbarch, pc, stub_name))
diff --git a/gdb/objc-lang.c b/gdb/objc-lang.c
index 8717947..e1f2b14 100644
--- a/gdb/objc-lang.c
+++ b/gdb/objc-lang.c
@@ -594,7 +594,7 @@ selectors_info (char *regexp, int from_tty)
   ALL_MSYMBOLS (objfile, msymbol)
     {
       QUIT;
-      name = SYMBOL_NATURAL_NAME (msymbol);
+      name = MSYMBOL_NATURAL_NAME (msymbol);
       if (name
           && (name[0] == '-' || name[0] == '+')
 	  && name[1] == '[')		/* Got a method name.  */
@@ -608,7 +608,7 @@ selectors_info (char *regexp, int from_tty)
 	    {
 	      complaint (&symfile_complaints, 
 			 _("Bad method name '%s'"), 
-			 SYMBOL_NATURAL_NAME (msymbol));
+			 MSYMBOL_NATURAL_NAME (msymbol));
 	      continue;
 	    }
 	  if (regexp == NULL || re_exec(++name) != 0)
@@ -632,7 +632,7 @@ selectors_info (char *regexp, int from_tty)
       ALL_MSYMBOLS (objfile, msymbol)
 	{
 	  QUIT;
-	  name = SYMBOL_NATURAL_NAME (msymbol);
+	  name = MSYMBOL_NATURAL_NAME (msymbol);
 	  if (name &&
 	     (name[0] == '-' || name[0] == '+') &&
 	      name[1] == '[')		/* Got a method name.  */
@@ -745,7 +745,7 @@ classes_info (char *regexp, int from_tty)
   ALL_MSYMBOLS (objfile, msymbol)
     {
       QUIT;
-      name = SYMBOL_NATURAL_NAME (msymbol);
+      name = MSYMBOL_NATURAL_NAME (msymbol);
       if (name &&
 	 (name[0] == '-' || name[0] == '+') &&
 	  name[1] == '[')			/* Got a method name.  */
@@ -769,7 +769,7 @@ classes_info (char *regexp, int from_tty)
       ALL_MSYMBOLS (objfile, msymbol)
 	{
 	  QUIT;
-	  name = SYMBOL_NATURAL_NAME (msymbol);
+	  name = MSYMBOL_NATURAL_NAME (msymbol);
 	  if (name &&
 	     (name[0] == '-' || name[0] == '+') &&
 	      name[1] == '[')			/* Got a method name.  */
@@ -994,7 +994,7 @@ find_methods (char type, const char *class, const char *category,
 
 	  /* Check the symbol name first as this can be done entirely without
 	     sending any query to the target.  */
-	  symname = SYMBOL_NATURAL_NAME (msymbol);
+	  symname = MSYMBOL_NATURAL_NAME (msymbol);
 	  if (symname == NULL)
 	    continue;
 
@@ -1156,7 +1156,7 @@ find_imps (const char *method, VEC (const_char_ptr) **symbol_names)
 
 	  if (msym != NULL) 
 	    VEC_safe_push (const_char_ptr, *symbol_names,
-			   SYMBOL_NATURAL_NAME (msym));
+			   MSYMBOL_NATURAL_NAME (msym));
 	}
     }
 
@@ -1275,7 +1275,7 @@ find_objc_msgsend (void)
 	  continue; 
 	}
 
-      methcalls[i].begin = SYMBOL_VALUE_ADDRESS (func.minsym);
+      methcalls[i].begin = MSYMBOL_VALUE_ADDRESS (func.minsym);
       methcalls[i].end = minimal_symbol_upper_bound (func);
     }
 }
diff --git a/gdb/objfiles.c b/gdb/objfiles.c
index eccb44a..89b8943 100644
--- a/gdb/objfiles.c
+++ b/gdb/objfiles.c
@@ -804,8 +804,9 @@ objfile_relocate1 (struct objfile *objfile,
     struct minimal_symbol *msym;
 
     ALL_OBJFILE_MSYMBOLS (objfile, msym)
-      if (SYMBOL_SECTION (msym) >= 0)
-      SYMBOL_VALUE_ADDRESS (msym) += ANOFFSET (delta, SYMBOL_SECTION (msym));
+      if (MSYMBOL_SECTION (msym) >= 0)
+	MSYMBOL_VALUE_ADDRESS (msym) += ANOFFSET (delta,
+						  MSYMBOL_SECTION (msym));
   }
   /* Relocating different sections by different amounts may cause the symbols
      to be out of order.  */
diff --git a/gdb/objfiles.h b/gdb/objfiles.h
index 2de2f8d..64a371d 100644
--- a/gdb/objfiles.h
+++ b/gdb/objfiles.h
@@ -589,7 +589,7 @@ extern void default_iterate_over_objfiles_in_search_order
 /* Traverse all minimal symbols in one objfile.  */
 
 #define	ALL_OBJFILE_MSYMBOLS(objfile, m) \
-    for ((m) = (objfile) -> msymbols; SYMBOL_LINKAGE_NAME(m) != NULL; (m)++)
+    for ((m) = (objfile) -> msymbols; MSYMBOL_LINKAGE_NAME(m) != NULL; (m)++)
 
 /* Traverse all symtabs in all objfiles in the current symbol
    space.  */
diff --git a/gdb/obsd-tdep.c b/gdb/obsd-tdep.c
index 830dd75..a0bf462 100644
--- a/gdb/obsd-tdep.c
+++ b/gdb/obsd-tdep.c
@@ -29,7 +29,7 @@ obsd_skip_solib_resolver (struct gdbarch *gdbarch, CORE_ADDR pc)
   struct minimal_symbol *msym;
 
   msym = lookup_minimal_symbol("_dl_bind", NULL, NULL);
-  if (msym && SYMBOL_VALUE_ADDRESS (msym) == pc)
+  if (msym && MSYMBOL_VALUE_ADDRESS (msym) == pc)
     return frame_unwind_caller_pc (get_current_frame ());
   else
     return find_solib_trampoline_target (get_current_frame (), pc);
diff --git a/gdb/p-valprint.c b/gdb/p-valprint.c
index a87f1f4..5300d6b 100644
--- a/gdb/p-valprint.c
+++ b/gdb/p-valprint.c
@@ -227,12 +227,12 @@ pascal_val_print (struct type *type, const gdb_byte *valaddr,
 	  /* If 'symbol_print' is set, we did the work above.  */
 	  if (!options->symbol_print
 	      && (msymbol.minsym != NULL)
-	      && (vt_address == SYMBOL_VALUE_ADDRESS (msymbol.minsym)))
+	      && (vt_address == MSYMBOL_VALUE_ADDRESS (msymbol.minsym)))
 	    {
 	      if (want_space)
 		fputs_filtered (" ", stream);
 	      fputs_filtered ("<", stream);
-	      fputs_filtered (SYMBOL_PRINT_NAME (msymbol.minsym), stream);
+	      fputs_filtered (MSYMBOL_PRINT_NAME (msymbol.minsym), stream);
 	      fputs_filtered (">", stream);
 	      want_space = 1;
 	    }
@@ -248,7 +248,7 @@ pascal_val_print (struct type *type, const gdb_byte *valaddr,
 		fputs_filtered (" ", stream);
 
 	      if (msymbol.minsym != NULL)
-		wsym = lookup_symbol (SYMBOL_LINKAGE_NAME (msymbol.minsym),
+		wsym = lookup_symbol (MSYMBOL_LINKAGE_NAME (msymbol.minsym),
 				      block,
 				      VAR_DOMAIN, &is_this_fld);
 
diff --git a/gdb/parse.c b/gdb/parse.c
index 1171289..a40fae5 100644
--- a/gdb/parse.c
+++ b/gdb/parse.c
@@ -502,8 +502,8 @@ write_exp_msymbol (struct bound_minimal_symbol bound_msym)
   struct objfile *objfile = bound_msym.objfile;
   struct gdbarch *gdbarch = get_objfile_arch (objfile);
 
-  CORE_ADDR addr = SYMBOL_VALUE_ADDRESS (msymbol);
-  struct obj_section *section = SYMBOL_OBJ_SECTION (objfile, msymbol);
+  CORE_ADDR addr = MSYMBOL_VALUE_ADDRESS (msymbol);
+  struct obj_section *section = MSYMBOL_OBJ_SECTION (objfile, msymbol);
   enum minimal_symbol_type type = MSYMBOL_TYPE (msymbol);
   CORE_ADDR pc;
 
@@ -519,7 +519,7 @@ write_exp_msymbol (struct bound_minimal_symbol bound_msym)
 
       if (ifunc_msym.minsym != NULL
 	  && MSYMBOL_TYPE (ifunc_msym.minsym) == mst_text_gnu_ifunc
-	  && SYMBOL_VALUE_ADDRESS (ifunc_msym.minsym) == pc)
+	  && MSYMBOL_VALUE_ADDRESS (ifunc_msym.minsym) == pc)
 	{
 	  /* A function descriptor has been resolved but PC is still in the
 	     STT_GNU_IFUNC resolver body (such as because inferior does not
diff --git a/gdb/ppc-linux-tdep.c b/gdb/ppc-linux-tdep.c
index 6d3b2d8..66cbba3 100644
--- a/gdb/ppc-linux-tdep.c
+++ b/gdb/ppc-linux-tdep.c
@@ -343,8 +343,8 @@ powerpc_linux_in_dynsym_resolve_code (CORE_ADDR pc)
   /* Check if we are in the resolver.  */
   sym = lookup_minimal_symbol_by_pc (pc);
   if (sym.minsym != NULL
-      && (strcmp (SYMBOL_LINKAGE_NAME (sym.minsym), "__glink") == 0
-	  || strcmp (SYMBOL_LINKAGE_NAME (sym.minsym),
+      && (strcmp (MSYMBOL_LINKAGE_NAME (sym.minsym), "__glink") == 0
+	  || strcmp (MSYMBOL_LINKAGE_NAME (sym.minsym),
 		     "__glink_PLTresolve") == 0))
     return 1;
 
@@ -919,9 +919,9 @@ ppc_elfv2_skip_entrypoint (struct gdbarch *gdbarch, CORE_ADDR pc)
   if (MSYMBOL_TARGET_FLAG_1 (fun.minsym))
     local_entry_offset = 8;
 
-  if (SYMBOL_VALUE_ADDRESS (fun.minsym) <= pc
-      && pc < SYMBOL_VALUE_ADDRESS (fun.minsym) + local_entry_offset)
-    return SYMBOL_VALUE_ADDRESS (fun.minsym) + local_entry_offset;
+  if (MSYMBOL_VALUE_ADDRESS (fun.minsym) <= pc
+      && pc < MSYMBOL_VALUE_ADDRESS (fun.minsym) + local_entry_offset)
+    return MSYMBOL_VALUE_ADDRESS (fun.minsym) + local_entry_offset;
 
   return pc;
 }
@@ -1028,7 +1028,7 @@ ppc_linux_spe_context_lookup (struct objfile *objfile)
     {
       spe_context_objfile = objfile;
       spe_context_lm_addr = svr4_fetch_objfile_link_map (objfile);
-      spe_context_offset = SYMBOL_VALUE_ADDRESS (sym);
+      spe_context_offset = MSYMBOL_VALUE_ADDRESS (sym);
       spe_context_cache_ptid = minus_one_ptid;
       spe_context_cache_address = 0;
       return;
diff --git a/gdb/ppc-sysv-tdep.c b/gdb/ppc-sysv-tdep.c
index 254c8c2..9cc9a43 100644
--- a/gdb/ppc-sysv-tdep.c
+++ b/gdb/ppc-sysv-tdep.c
@@ -1081,7 +1081,7 @@ convert_code_addr_to_desc_addr (CORE_ADDR code_addr, CORE_ADDR *desc_addr)
   /* Find the minimal symbol that corresponds to CODE_ADDR (should
      have a name of the form ".FN").  */
   dot_fn = lookup_minimal_symbol_by_pc (code_addr);
-  if (dot_fn.minsym == NULL || SYMBOL_LINKAGE_NAME (dot_fn.minsym)[0] != '.')
+  if (dot_fn.minsym == NULL || MSYMBOL_LINKAGE_NAME (dot_fn.minsym)[0] != '.')
     return 0;
   /* Get the section that contains CODE_ADDR.  Need this for the
      "objfile" that it contains.  */
@@ -1092,12 +1092,12 @@ convert_code_addr_to_desc_addr (CORE_ADDR code_addr, CORE_ADDR *desc_addr)
      address.  Only look for the minimal symbol in ".FN"'s object file
      - avoids problems when two object files (i.e., shared libraries)
      contain a minimal symbol with the same name.  */
-  fn = lookup_minimal_symbol (SYMBOL_LINKAGE_NAME (dot_fn.minsym) + 1, NULL,
+  fn = lookup_minimal_symbol (MSYMBOL_LINKAGE_NAME (dot_fn.minsym) + 1, NULL,
 			      dot_fn_section->objfile);
   if (fn == NULL)
     return 0;
   /* Found a descriptor.  */
-  (*desc_addr) = SYMBOL_VALUE_ADDRESS (fn);
+  (*desc_addr) = MSYMBOL_VALUE_ADDRESS (fn);
   return 1;
 }
 
diff --git a/gdb/printcmd.c b/gdb/printcmd.c
index e5fea17..ec0d6c1 100644
--- a/gdb/printcmd.c
+++ b/gdb/printcmd.c
@@ -690,7 +690,7 @@ build_address_symbolic (struct gdbarch *gdbarch,
 
   if (msymbol != NULL)
     {
-      if (SYMBOL_VALUE_ADDRESS (msymbol) > name_location || symbol == NULL)
+      if (MSYMBOL_VALUE_ADDRESS (msymbol) > name_location || symbol == NULL)
 	{
 	  /* If this is a function (i.e. a code address), strip out any
 	     non-address bits.  For instance, display a pointer to the
@@ -706,11 +706,11 @@ build_address_symbolic (struct gdbarch *gdbarch,
 	  /* The msymbol is closer to the address than the symbol;
 	     use the msymbol instead.  */
 	  symbol = 0;
-	  name_location = SYMBOL_VALUE_ADDRESS (msymbol);
+	  name_location = MSYMBOL_VALUE_ADDRESS (msymbol);
 	  if (do_demangle || asm_demangle)
-	    name_temp = SYMBOL_PRINT_NAME (msymbol);
+	    name_temp = MSYMBOL_PRINT_NAME (msymbol);
 	  else
-	    name_temp = SYMBOL_LINKAGE_NAME (msymbol);
+	    name_temp = MSYMBOL_LINKAGE_NAME (msymbol);
 	}
     }
   if (symbol == NULL && msymbol == NULL)
@@ -1126,10 +1126,10 @@ sym_info (char *arg, int from_tty)
 	struct cleanup *old_chain;
 
 	matches = 1;
-	offset = sect_addr - SYMBOL_VALUE_ADDRESS (msymbol);
+	offset = sect_addr - MSYMBOL_VALUE_ADDRESS (msymbol);
 	mapped = section_is_mapped (osect) ? _("mapped") : _("unmapped");
 	sec_name = osect->the_bfd_section->name;
-	msym_name = SYMBOL_PRINT_NAME (msymbol);
+	msym_name = MSYMBOL_PRINT_NAME (msymbol);
 
 	/* Don't print the offset if it is zero.
 	   We assume there's no need to handle i18n of "sym + offset".  */
@@ -1225,7 +1225,7 @@ address_info (char *exp, int from_tty)
 	  struct objfile *objfile = msymbol.objfile;
 
 	  gdbarch = get_objfile_arch (objfile);
-	  load_addr = SYMBOL_VALUE_ADDRESS (msymbol.minsym);
+	  load_addr = MSYMBOL_VALUE_ADDRESS (msymbol.minsym);
 
 	  printf_filtered ("Symbol \"");
 	  fprintf_symbol_filtered (gdb_stdout, exp,
@@ -1233,7 +1233,7 @@ address_info (char *exp, int from_tty)
 	  printf_filtered ("\" is at ");
 	  fputs_filtered (paddress (gdbarch, load_addr), gdb_stdout);
 	  printf_filtered (" in a file compiled without debugging");
-	  section = SYMBOL_OBJ_SECTION (objfile, msymbol.minsym);
+	  section = MSYMBOL_OBJ_SECTION (objfile, msymbol.minsym);
 	  if (section_is_overlay (section))
 	    {
 	      load_addr = overlay_unmapped_address (load_addr, section);
@@ -1366,8 +1366,8 @@ address_info (char *exp, int from_tty)
 	  printf_filtered ("unresolved");
 	else
 	  {
-	    section = SYMBOL_OBJ_SECTION (msym.objfile, msym.minsym);
-	    load_addr = SYMBOL_VALUE_ADDRESS (msym.minsym);
+	    section = MSYMBOL_OBJ_SECTION (msym.objfile, msym.minsym);
+	    load_addr = MSYMBOL_VALUE_ADDRESS (msym.minsym);
 
 	    if (section
 		&& (section->the_bfd_section->flags & SEC_THREAD_LOCAL) != 0)
diff --git a/gdb/proc-service.c b/gdb/proc-service.c
index f4d9fe6..2a21e78 100644
--- a/gdb/proc-service.c
+++ b/gdb/proc-service.c
@@ -207,7 +207,7 @@ ps_pglobal_lookup (gdb_ps_prochandle_t ph, const char *obj,
     result = PS_NOSYM;
   else
     {
-      *sym_addr = core_addr_to_ps_addr (SYMBOL_VALUE_ADDRESS (ms));
+      *sym_addr = core_addr_to_ps_addr (MSYMBOL_VALUE_ADDRESS (ms));
       result = PS_OK;
     }
 
diff --git a/gdb/psymtab.c b/gdb/psymtab.c
index 457b91a..a1e584e 100644
--- a/gdb/psymtab.c
+++ b/gdb/psymtab.c
@@ -266,7 +266,7 @@ find_pc_sect_psymtab_closer (struct objfile *objfile,
 	  p = find_pc_sect_psymbol (objfile, tpst, pc, section);
 	  if (p != NULL
 	      && SYMBOL_VALUE_ADDRESS (p)
-	      == SYMBOL_VALUE_ADDRESS (msymbol))
+	      == MSYMBOL_VALUE_ADDRESS (msymbol))
 	    return tpst;
 
 	  /* Also accept the textlow value of a psymtab as a
@@ -331,7 +331,7 @@ find_pc_sect_psymtab (struct objfile *objfile, CORE_ADDR pc,
 	      p = find_pc_sect_psymbol (objfile, pst, pc, section);
 	      if (!p
 		  || SYMBOL_VALUE_ADDRESS (p)
-		  != SYMBOL_VALUE_ADDRESS (msymbol))
+		  != MSYMBOL_VALUE_ADDRESS (msymbol))
 		goto next;
 	    }
 
diff --git a/gdb/python/py-framefilter.c b/gdb/python/py-framefilter.c
index ec38225..9db83c7 100644
--- a/gdb/python/py-framefilter.c
+++ b/gdb/python/py-framefilter.c
@@ -1195,7 +1195,7 @@ py_print_frame (PyObject *filter, int flags,
 
 		  msymbol = lookup_minimal_symbol_by_pc (addr);
 		  if (msymbol.minsym != NULL)
-		    function = SYMBOL_PRINT_NAME (msymbol.minsym);
+		    function = MSYMBOL_PRINT_NAME (msymbol.minsym);
 		}
 	      else if (py_func != Py_None)
 		{
diff --git a/gdb/ravenscar-thread.c b/gdb/ravenscar-thread.c
index fdec52a..4ed007d 100644
--- a/gdb/ravenscar-thread.c
+++ b/gdb/ravenscar-thread.c
@@ -163,7 +163,7 @@ get_running_thread_id (void)
   if (!object_msym)
     return 0;
 
-  object_addr = SYMBOL_VALUE_ADDRESS (object_msym);
+  object_addr = MSYMBOL_VALUE_ADDRESS (object_msym);
   object_size = TYPE_LENGTH (builtin_type_void_data_ptr);
   buf_size = object_size;
   buf = alloca (buf_size);
diff --git a/gdb/record-btrace.c b/gdb/record-btrace.c
index 05e7713..d4c0d42 100644
--- a/gdb/record-btrace.c
+++ b/gdb/record-btrace.c
@@ -550,7 +550,7 @@ btrace_get_bfun_name (const struct btrace_function *bfun)
   if (sym != NULL)
     return SYMBOL_PRINT_NAME (sym);
   else if (msym != NULL)
-    return SYMBOL_PRINT_NAME (msym);
+    return MSYMBOL_PRINT_NAME (msym);
   else
     return "??";
 }
@@ -594,7 +594,7 @@ btrace_call_history (struct ui_out *uiout,
       if (sym != NULL)
 	ui_out_field_string (uiout, "function", SYMBOL_PRINT_NAME (sym));
       else if (msym != NULL)
-	ui_out_field_string (uiout, "function", SYMBOL_PRINT_NAME (msym));
+	ui_out_field_string (uiout, "function", MSYMBOL_PRINT_NAME (msym));
       else if (!ui_out_is_mi_like_p (uiout))
 	ui_out_field_string (uiout, "function", "??");
 
diff --git a/gdb/remote.c b/gdb/remote.c
index de9dad1..9f9a1e4 100644
--- a/gdb/remote.c
+++ b/gdb/remote.c
@@ -3710,7 +3710,7 @@ remote_check_symbols (void)
       else
 	{
 	  int addr_size = gdbarch_addr_bit (target_gdbarch ()) / 8;
-	  CORE_ADDR sym_addr = SYMBOL_VALUE_ADDRESS (sym);
+	  CORE_ADDR sym_addr = MSYMBOL_VALUE_ADDRESS (sym);
 
 	  /* If this is a function address, return the start of code
 	     instead of any data function descriptor.  */
diff --git a/gdb/rs6000-tdep.c b/gdb/rs6000-tdep.c
index bbaf459..bec06c7 100644
--- a/gdb/rs6000-tdep.c
+++ b/gdb/rs6000-tdep.c
@@ -2169,9 +2169,9 @@ rs6000_skip_main_prologue (struct gdbarch *gdbarch, CORE_ADDR pc)
          to __eabi in case the GCC option "-fleading-underscore" was
 	 used to compile the program.  */
       if (s.minsym != NULL
-          && SYMBOL_LINKAGE_NAME (s.minsym) != NULL
-	  && (strcmp (SYMBOL_LINKAGE_NAME (s.minsym), "__eabi") == 0
-	      || strcmp (SYMBOL_LINKAGE_NAME (s.minsym), "___eabi") == 0))
+          && MSYMBOL_LINKAGE_NAME (s.minsym) != NULL
+	  && (strcmp (MSYMBOL_LINKAGE_NAME (s.minsym), "__eabi") == 0
+	      || strcmp (MSYMBOL_LINKAGE_NAME (s.minsym), "___eabi") == 0))
 	pc += 4;
     }
   return pc;
@@ -2255,7 +2255,7 @@ rs6000_skip_trampoline_code (struct frame_info *frame, CORE_ADDR pc)
   msymbol = lookup_minimal_symbol_by_pc (pc);
   if (msymbol.minsym
       && rs6000_in_solib_return_trampoline (gdbarch, pc,
-					    SYMBOL_LINKAGE_NAME (msymbol.minsym)))
+					    MSYMBOL_LINKAGE_NAME (msymbol.minsym)))
     {
       /* Double-check that the third instruction from PC is relative "b".  */
       op = read_memory_integer (pc + 8, 4, byte_order);
diff --git a/gdb/sh64-tdep.c b/gdb/sh64-tdep.c
index 262de84..ab1c96d 100644
--- a/gdb/sh64-tdep.c
+++ b/gdb/sh64-tdep.c
@@ -224,7 +224,7 @@ sh64_elf_make_msymbol_special (asymbol *sym, struct minimal_symbol *msym)
   if (((elf_symbol_type *)(sym))->internal_elf_sym.st_other == STO_SH5_ISA32)
     {
       MSYMBOL_TARGET_FLAG_1 (msym) = 1;
-      SYMBOL_VALUE_ADDRESS (msym) |= 1;
+      MSYMBOL_VALUE_ADDRESS (msym) |= 1;
     }
 }
 
diff --git a/gdb/sol2-tdep.c b/gdb/sol2-tdep.c
index feafc70..27108a5 100644
--- a/gdb/sol2-tdep.c
+++ b/gdb/sol2-tdep.c
@@ -30,7 +30,7 @@ sol2_skip_solib_resolver (struct gdbarch *gdbarch, CORE_ADDR pc)
   struct minimal_symbol *msym;
 
   msym = lookup_minimal_symbol("elf_bndr", NULL, NULL);
-  if (msym && SYMBOL_VALUE_ADDRESS (msym) == pc)
+  if (msym && MSYMBOL_VALUE_ADDRESS (msym) == pc)
     return frame_unwind_caller_pc (get_current_frame ());
 
   return 0;
diff --git a/gdb/solib-dsbt.c b/gdb/solib-dsbt.c
index 713fa51..a5ceb95 100644
--- a/gdb/solib-dsbt.c
+++ b/gdb/solib-dsbt.c
@@ -572,7 +572,7 @@ lm_base (void)
 
   if (got_sym != 0)
     {
-      addr = SYMBOL_VALUE_ADDRESS (got_sym);
+      addr = MSYMBOL_VALUE_ADDRESS (got_sym);
       if (solib_dsbt_debug)
 	fprintf_unfiltered (gdb_stdlog,
 			    "lm_base: get addr %x by _GLOBAL_OFFSET_TABLE_.\n",
diff --git a/gdb/solib-frv.c b/gdb/solib-frv.c
index d257eea..acd46da 100644
--- a/gdb/solib-frv.c
+++ b/gdb/solib-frv.c
@@ -292,7 +292,7 @@ lm_base (void)
       return 0;
     }
 
-  addr = SYMBOL_VALUE_ADDRESS (got_sym) + 8;
+  addr = MSYMBOL_VALUE_ADDRESS (got_sym) + 8;
 
   if (solib_frv_debug)
     fprintf_unfiltered (gdb_stdlog,
@@ -926,7 +926,7 @@ main_got (void)
   if (got_sym == 0)
     return 0;
 
-  return SYMBOL_VALUE_ADDRESS (got_sym);
+  return MSYMBOL_VALUE_ADDRESS (got_sym);
 }
 
 /* Find the global pointer for the given function address ADDR.  */
diff --git a/gdb/solib-irix.c b/gdb/solib-irix.c
index f4c459d..8eda4d4 100644
--- a/gdb/solib-irix.c
+++ b/gdb/solib-irix.c
@@ -285,9 +285,9 @@ locate_base (void)
   CORE_ADDR address = 0;
 
   msymbol = lookup_minimal_symbol (DEBUG_BASE, NULL, symfile_objfile);
-  if ((msymbol != NULL) && (SYMBOL_VALUE_ADDRESS (msymbol) != 0))
+  if ((msymbol != NULL) && (MSYMBOL_VALUE_ADDRESS (msymbol) != 0))
     {
-      address = SYMBOL_VALUE_ADDRESS (msymbol);
+      address = MSYMBOL_VALUE_ADDRESS (msymbol);
     }
   return (address);
 }
diff --git a/gdb/solib-som.c b/gdb/solib-som.c
index 7a43cf8..dd2d8f7 100644
--- a/gdb/solib-som.c
+++ b/gdb/solib-som.c
@@ -219,7 +219,7 @@ som_solib_create_inferior_hook (int from_tty)
   if (msymbol == NULL)
     goto keep_going;
 
-  anaddr = SYMBOL_VALUE_ADDRESS (msymbol);
+  anaddr = MSYMBOL_VALUE_ADDRESS (msymbol);
   store_unsigned_integer (buf, 4, byte_order, ptid_get_pid (inferior_ptid));
   status = target_write_memory (anaddr, buf, 4);
   if (status != 0)
@@ -251,16 +251,16 @@ Suggest linking with /opt/langtools/lib/end.o.\n\
 GDB will be unable to track shl_load/shl_unload calls"));
       goto keep_going;
     }
-  anaddr = SYMBOL_VALUE_ADDRESS (msymbol);
+  anaddr = MSYMBOL_VALUE_ADDRESS (msymbol);
   dld_cache.hook.address = anaddr;
 
   /* Grrr, this might not be an export symbol!  We have to find the
      export stub.  */
-  msymbol = hppa_lookup_stub_minimal_symbol (SYMBOL_LINKAGE_NAME (msymbol),
+  msymbol = hppa_lookup_stub_minimal_symbol (MSYMBOL_LINKAGE_NAME (msymbol),
                                              EXPORT);
   if (msymbol != NULL)
     {
-      anaddr = SYMBOL_VALUE (msymbol);
+      anaddr = MSYMBOL_VALUE (msymbol);
       dld_cache.hook_stub.address = anaddr;
     }
   store_unsigned_integer (buf, 4, byte_order, anaddr);
@@ -274,7 +274,7 @@ Suggest linking with /opt/langtools/lib/end.o.\n\
 GDB will be unable to track shl_load/shl_unload calls"));
       goto keep_going;
     }
-  anaddr = SYMBOL_VALUE_ADDRESS (msymbol);
+  anaddr = MSYMBOL_VALUE_ADDRESS (msymbol);
   status = target_write_memory (anaddr, buf, 4);
 
   /* Now set a shlib_event breakpoint at __d_trap so we can track
@@ -289,7 +289,7 @@ GDB will be unable to track shl_load/shl_unload calls"));
       goto keep_going;
     }
   create_solib_event_breakpoint (target_gdbarch (),
-				 SYMBOL_VALUE_ADDRESS (msymbol));
+				 MSYMBOL_VALUE_ADDRESS (msymbol));
 
   /* We have all the support usually found in end.o, so we can track
      shl_load and shl_unload calls.  */
@@ -305,7 +305,7 @@ keep_going:
       error (_("Unable to find __dld_flags symbol in object file."));
     }
 
-  anaddr = SYMBOL_VALUE_ADDRESS (msymbol);
+  anaddr = MSYMBOL_VALUE_ADDRESS (msymbol);
 
   /* Read the current contents.  */
   status = target_read_memory (anaddr, buf, 4);
@@ -350,7 +350,7 @@ manpage for methods to privately map shared library text."));
   if (msymbol == NULL)
     error (_("Unable to find _start symbol in object file."));
 
-  anaddr = SYMBOL_VALUE_ADDRESS (msymbol);
+  anaddr = MSYMBOL_VALUE_ADDRESS (msymbol);
 
   /* Make the breakpoint at "_start" a shared library event breakpoint.  */
   create_solib_event_breakpoint (target_gdbarch (), anaddr);
@@ -384,7 +384,7 @@ som_solib_desire_dynamic_linker_symbols (void)
     dld_msymbol = lookup_minimal_symbol ("shl_load", NULL, objfile);
     if (dld_msymbol != NULL)
       {
-	dld_cache.load.address = SYMBOL_VALUE (dld_msymbol);
+	dld_cache.load.address = MSYMBOL_VALUE (dld_msymbol);
 	dld_cache.load.unwind = find_unwind_entry (dld_cache.load.address);
       }
 
@@ -394,10 +394,10 @@ som_solib_desire_dynamic_linker_symbols (void)
       {
 	if (MSYMBOL_TYPE (dld_msymbol) == mst_solib_trampoline)
 	  {
-	    u = find_unwind_entry (SYMBOL_VALUE (dld_msymbol));
+	    u = find_unwind_entry (MSYMBOL_VALUE (dld_msymbol));
 	    if ((u != NULL) && (u->stub_unwind.stub_type == EXPORT))
 	      {
-		dld_cache.load_stub.address = SYMBOL_VALUE (dld_msymbol);
+		dld_cache.load_stub.address = MSYMBOL_VALUE (dld_msymbol);
 		dld_cache.load_stub.unwind = u;
 	      }
 	  }
@@ -406,7 +406,7 @@ som_solib_desire_dynamic_linker_symbols (void)
     dld_msymbol = lookup_minimal_symbol ("shl_unload", NULL, objfile);
     if (dld_msymbol != NULL)
       {
-	dld_cache.unload.address = SYMBOL_VALUE (dld_msymbol);
+	dld_cache.unload.address = MSYMBOL_VALUE (dld_msymbol);
 	dld_cache.unload.unwind = find_unwind_entry (dld_cache.unload.address);
 
 	/* ??rehrauer: I'm not sure exactly what this is, but it appears
@@ -433,10 +433,10 @@ som_solib_desire_dynamic_linker_symbols (void)
       {
 	if (MSYMBOL_TYPE (dld_msymbol) == mst_solib_trampoline)
 	  {
-	    u = find_unwind_entry (SYMBOL_VALUE (dld_msymbol));
+	    u = find_unwind_entry (MSYMBOL_VALUE (dld_msymbol));
 	    if ((u != NULL) && (u->stub_unwind.stub_type == EXPORT))
 	      {
-		dld_cache.unload_stub.address = SYMBOL_VALUE (dld_msymbol);
+		dld_cache.unload_stub.address = MSYMBOL_VALUE (dld_msymbol);
 		dld_cache.unload_stub.unwind = u;
 	      }
 	  }
@@ -534,7 +534,7 @@ link_map_start (void)
   sym = lookup_minimal_symbol ("__dld_flags", NULL, NULL);
   if (!sym)
     error (_("Unable to find __dld_flags symbol in object file."));
-  addr = SYMBOL_VALUE_ADDRESS (sym);
+  addr = MSYMBOL_VALUE_ADDRESS (sym);
   read_memory (addr, buf, 4);
   dld_flags = extract_unsigned_integer (buf, 4, byte_order);
   if ((dld_flags & DLD_FLAGS_LISTVALID) == 0)
@@ -551,10 +551,10 @@ link_map_start (void)
 	  error (_("Unable to find dynamic library list."));
 	  return 0;
 	}
-      addr = SYMBOL_VALUE_ADDRESS (sym) - 8;
+      addr = MSYMBOL_VALUE_ADDRESS (sym) - 8;
     }
   else
-    addr = SYMBOL_VALUE_ADDRESS (sym);
+    addr = MSYMBOL_VALUE_ADDRESS (sym);
 
   read_memory (addr, buf, 4);
   addr = extract_unsigned_integer (buf, 4, byte_order);
diff --git a/gdb/solib-spu.c b/gdb/solib-spu.c
index b8e5e23..b4aa7a4 100644
--- a/gdb/solib-spu.c
+++ b/gdb/solib-spu.c
@@ -418,7 +418,7 @@ spu_enable_break (struct objfile *objfile)
   /* Place a solib_event breakpoint on the symbol.  */
   if (spe_event_sym)
     {
-      CORE_ADDR addr = SYMBOL_VALUE_ADDRESS (spe_event_sym);
+      CORE_ADDR addr = MSYMBOL_VALUE_ADDRESS (spe_event_sym);
 
       addr = gdbarch_convert_from_func_ptr_addr (target_gdbarch (), addr,
                                                  &current_target);
@@ -448,7 +448,7 @@ ocl_enable_break (struct objfile *objfile)
   if (event_sym && addr_sym)
     {
       /* Place a solib_event breakpoint on the symbol.  */
-      CORE_ADDR event_addr = SYMBOL_VALUE_ADDRESS (event_sym);
+      CORE_ADDR event_addr = MSYMBOL_VALUE_ADDRESS (event_sym);
       create_solib_event_breakpoint (get_objfile_arch (objfile), event_addr);
 
       /* Store the address of the symbol that will point to OpenCL program
@@ -459,7 +459,7 @@ ocl_enable_break (struct objfile *objfile)
 		  &objfile->objfile_obstack,
 		  objfile->sections_end - objfile->sections,
 		  CORE_ADDR);
-	  *ocl_program_addr_base = SYMBOL_VALUE_ADDRESS (addr_sym);
+	  *ocl_program_addr_base = MSYMBOL_VALUE_ADDRESS (addr_sym);
 	  set_objfile_data (objfile, ocl_program_data_key,
 			    ocl_program_addr_base);
         }
diff --git a/gdb/solib-svr4.c b/gdb/solib-svr4.c
index 55572d4..3434e80 100644
--- a/gdb/solib-svr4.c
+++ b/gdb/solib-svr4.c
@@ -817,7 +817,7 @@ elf_locate_base (void)
      conventionally named _r_debug, as a last resort.  */
   msymbol = lookup_minimal_symbol ("_r_debug", NULL, symfile_objfile);
   if (msymbol != NULL)
-    return SYMBOL_VALUE_ADDRESS (msymbol);
+    return MSYMBOL_VALUE_ADDRESS (msymbol);
 
   /* DT_DEBUG entry not found.  */
   return 0;
@@ -2348,9 +2348,9 @@ enable_break (struct svr4_info *info, int from_tty)
   for (bkpt_namep = solib_break_names; *bkpt_namep != NULL; bkpt_namep++)
     {
       msymbol = lookup_minimal_symbol (*bkpt_namep, NULL, symfile_objfile);
-      if ((msymbol != NULL) && (SYMBOL_VALUE_ADDRESS (msymbol) != 0))
+      if ((msymbol != NULL) && (MSYMBOL_VALUE_ADDRESS (msymbol) != 0))
 	{
-	  sym_addr = SYMBOL_VALUE_ADDRESS (msymbol);
+	  sym_addr = MSYMBOL_VALUE_ADDRESS (msymbol);
 	  sym_addr = gdbarch_convert_from_func_ptr_addr (target_gdbarch (),
 							 sym_addr,
 							 &current_target);
@@ -2364,9 +2364,9 @@ enable_break (struct svr4_info *info, int from_tty)
       for (bkpt_namep = bkpt_names; *bkpt_namep != NULL; bkpt_namep++)
 	{
 	  msymbol = lookup_minimal_symbol (*bkpt_namep, NULL, symfile_objfile);
-	  if ((msymbol != NULL) && (SYMBOL_VALUE_ADDRESS (msymbol) != 0))
+	  if ((msymbol != NULL) && (MSYMBOL_VALUE_ADDRESS (msymbol) != 0))
 	    {
-	      sym_addr = SYMBOL_VALUE_ADDRESS (msymbol);
+	      sym_addr = MSYMBOL_VALUE_ADDRESS (msymbol);
 	      sym_addr = gdbarch_convert_from_func_ptr_addr (target_gdbarch (),
 							     sym_addr,
 							     &current_target);
diff --git a/gdb/spu-tdep.c b/gdb/spu-tdep.c
index f096a2e..e4244ee 100644
--- a/gdb/spu-tdep.c
+++ b/gdb/spu-tdep.c
@@ -1768,10 +1768,10 @@ spu_get_overlay_table (struct objfile *objfile)
   if (!ovly_buf_table_msym)
     return NULL;
 
-  ovly_table_base = SYMBOL_VALUE_ADDRESS (ovly_table_msym);
+  ovly_table_base = MSYMBOL_VALUE_ADDRESS (ovly_table_msym);
   ovly_table_size = MSYMBOL_SIZE (ovly_table_msym);
 
-  ovly_buf_table_base = SYMBOL_VALUE_ADDRESS (ovly_buf_table_msym);
+  ovly_buf_table_base = MSYMBOL_VALUE_ADDRESS (ovly_buf_table_msym);
   ovly_buf_table_size = MSYMBOL_SIZE (ovly_buf_table_msym);
 
   ovly_table = xmalloc (ovly_table_size);
@@ -1923,8 +1923,8 @@ spu_catch_start (struct objfile *objfile)
 
   /* If we have debugging information, try to use it -- this
      will allow us to properly skip the prologue.  */
-  pc = SYMBOL_VALUE_ADDRESS (minsym);
-  symtab = find_pc_sect_symtab (pc, SYMBOL_OBJ_SECTION (objfile, minsym));
+  pc = MSYMBOL_VALUE_ADDRESS (minsym);
+  symtab = find_pc_sect_symtab (pc, MSYMBOL_OBJ_SECTION (objfile, minsym));
   if (symtab != NULL)
     {
       struct blockvector *bv = BLOCKVECTOR (symtab);
@@ -2001,7 +2001,7 @@ flush_ea_cache (void)
       type = objfile_type (obj)->builtin_void;
       type = lookup_function_type (type);
       type = lookup_pointer_type (type);
-      addr = SYMBOL_VALUE_ADDRESS (msymbol);
+      addr = MSYMBOL_VALUE_ADDRESS (msymbol);
 
       call_function_by_hand (value_from_pointer (type, addr), 0, NULL);
     }
diff --git a/gdb/stabsread.c b/gdb/stabsread.c
index d58b633..78766c0 100644
--- a/gdb/stabsread.c
+++ b/gdb/stabsread.c
@@ -1178,7 +1178,7 @@ define_symbol (CORE_ADDR valu, char *string, int desc, int type,
 		(gdbarch, SYMBOL_LINKAGE_NAME (sym));
 
 	      SYMBOL_SET_LINKAGE_NAME (sym, new_name);
-	      SYMBOL_VALUE_ADDRESS (sym) = SYMBOL_VALUE_ADDRESS (msym);
+	      SYMBOL_VALUE_ADDRESS (sym) = MSYMBOL_VALUE_ADDRESS (msym);
 	    }
 	}
       SYMBOL_DOMAIN (sym) = VAR_DOMAIN;
@@ -1370,7 +1370,7 @@ define_symbol (CORE_ADDR valu, char *string, int desc, int type,
 		(gdbarch, SYMBOL_LINKAGE_NAME (sym));
 
 	      SYMBOL_SET_LINKAGE_NAME (sym, new_name);
-	      SYMBOL_VALUE_ADDRESS (sym) = SYMBOL_VALUE_ADDRESS (msym);
+	      SYMBOL_VALUE_ADDRESS (sym) = MSYMBOL_VALUE_ADDRESS (msym);
 	    }
 	}
       SYMBOL_DOMAIN (sym) = VAR_DOMAIN;
@@ -4654,11 +4654,11 @@ scan_file_globals (struct objfile *objfile)
 	  /* Get the hash index and check all the symbols
 	     under that hash index.  */
 
-	  hash = hashname (SYMBOL_LINKAGE_NAME (msymbol));
+	  hash = hashname (MSYMBOL_LINKAGE_NAME (msymbol));
 
 	  for (sym = global_sym_chain[hash]; sym;)
 	    {
-	      if (strcmp (SYMBOL_LINKAGE_NAME (msymbol),
+	      if (strcmp (MSYMBOL_LINKAGE_NAME (msymbol),
 			  SYMBOL_LINKAGE_NAME (sym)) == 0)
 		{
 		  /* Splice this symbol out of the hash chain and
@@ -4680,14 +4680,14 @@ scan_file_globals (struct objfile *objfile)
 		      if (SYMBOL_CLASS (sym) == LOC_BLOCK)
 			{
 			  fix_common_block (sym,
-					    SYMBOL_VALUE_ADDRESS (msymbol));
+					    MSYMBOL_VALUE_ADDRESS (msymbol));
 			}
 		      else
 			{
 			  SYMBOL_VALUE_ADDRESS (sym)
-			    = SYMBOL_VALUE_ADDRESS (msymbol);
+			    = MSYMBOL_VALUE_ADDRESS (msymbol);
 			}
-		      SYMBOL_SECTION (sym) = SYMBOL_SECTION (msymbol);
+		      SYMBOL_SECTION (sym) = MSYMBOL_SECTION (msymbol);
 		    }
 
 		  if (prev)
diff --git a/gdb/stack.c b/gdb/stack.c
index 54553bc..aec0e5d 100644
--- a/gdb/stack.c
+++ b/gdb/stack.c
@@ -1076,14 +1076,14 @@ find_frame_funname (struct frame_info *frame, char **funname,
 	memset (&msymbol, 0, sizeof (msymbol));
 
       if (msymbol.minsym != NULL
-	  && (SYMBOL_VALUE_ADDRESS (msymbol.minsym)
+	  && (MSYMBOL_VALUE_ADDRESS (msymbol.minsym)
 	      > BLOCK_START (SYMBOL_BLOCK_VALUE (func))))
 	{
 	  /* We also don't know anything about the function besides
 	     its address and name.  */
 	  func = 0;
-	  *funname = xstrdup (SYMBOL_PRINT_NAME (msymbol.minsym));
-	  *funlang = SYMBOL_LANGUAGE (msymbol.minsym);
+	  *funname = xstrdup (MSYMBOL_PRINT_NAME (msymbol.minsym));
+	  *funlang = MSYMBOL_LANGUAGE (msymbol.minsym);
 	}
       else
 	{
@@ -1119,8 +1119,8 @@ find_frame_funname (struct frame_info *frame, char **funname,
       msymbol = lookup_minimal_symbol_by_pc (pc);
       if (msymbol.minsym != NULL)
 	{
-	  *funname = xstrdup (SYMBOL_PRINT_NAME (msymbol.minsym));
-	  *funlang = SYMBOL_LANGUAGE (msymbol.minsym);
+	  *funname = xstrdup (MSYMBOL_PRINT_NAME (msymbol.minsym));
+	  *funlang = MSYMBOL_LANGUAGE (msymbol.minsym);
 	}
     }
 }
@@ -1459,8 +1459,8 @@ frame_info (char *addr_exp, int from_tty)
       msymbol = lookup_minimal_symbol_by_pc (frame_pc);
       if (msymbol.minsym != NULL)
 	{
-	  funname = SYMBOL_PRINT_NAME (msymbol.minsym);
-	  funlang = SYMBOL_LANGUAGE (msymbol.minsym);
+	  funname = MSYMBOL_PRINT_NAME (msymbol.minsym);
+	  funlang = MSYMBOL_LANGUAGE (msymbol.minsym);
 	}
     }
   calling_frame_info = get_prev_frame (fi);
diff --git a/gdb/symfile.c b/gdb/symfile.c
index 06d2119..7420643 100644
--- a/gdb/symfile.c
+++ b/gdb/symfile.c
@@ -3561,11 +3561,11 @@ simple_read_overlay_table (void)
   word_size = gdbarch_long_bit (gdbarch) / TARGET_CHAR_BIT;
   byte_order = gdbarch_byte_order (gdbarch);
 
-  cache_novlys = read_memory_integer (SYMBOL_VALUE_ADDRESS (novlys_msym),
+  cache_novlys = read_memory_integer (MSYMBOL_VALUE_ADDRESS (novlys_msym),
 				      4, byte_order);
   cache_ovly_table
     = (void *) xmalloc (cache_novlys * sizeof (*cache_ovly_table));
-  cache_ovly_table_base = SYMBOL_VALUE_ADDRESS (ovly_table_msym.minsym);
+  cache_ovly_table_base = MSYMBOL_VALUE_ADDRESS (ovly_table_msym.minsym);
   read_target_long_array (cache_ovly_table_base,
                           (unsigned int *) cache_ovly_table,
                           cache_novlys * 4, word_size, byte_order);
@@ -3641,7 +3641,7 @@ simple_overlay_update (struct obj_section *osect)
 		   "find `_ovly_table' array\n"
 		   "in inferior.  Use `overlay manual' mode."));
 	
-	if (cache_ovly_table_base == SYMBOL_VALUE_ADDRESS (minsym))
+	if (cache_ovly_table_base == MSYMBOL_VALUE_ADDRESS (minsym))
 	  /* Then go ahead and try to look up this single section in
 	     the cache.  */
 	  if (simple_overlay_update_1 (osect))
diff --git a/gdb/symmisc.c b/gdb/symmisc.c
index 4064e06..fe324a0 100644
--- a/gdb/symmisc.c
+++ b/gdb/symmisc.c
@@ -212,7 +212,7 @@ dump_msymbols (struct objfile *objfile, struct ui_file *outfile)
   index = 0;
   ALL_OBJFILE_MSYMBOLS (objfile, msymbol)
     {
-      struct obj_section *section = SYMBOL_OBJ_SECTION (objfile, msymbol);
+      struct obj_section *section = MSYMBOL_OBJ_SECTION (objfile, msymbol);
 
       switch (MSYMBOL_TYPE (msymbol))
 	{
@@ -251,9 +251,9 @@ dump_msymbols (struct objfile *objfile, struct ui_file *outfile)
 	  break;
 	}
       fprintf_filtered (outfile, "[%2d] %c ", index, ms_type);
-      fputs_filtered (paddress (gdbarch, SYMBOL_VALUE_ADDRESS (msymbol)),
+      fputs_filtered (paddress (gdbarch, MSYMBOL_VALUE_ADDRESS (msymbol)),
 		      outfile);
-      fprintf_filtered (outfile, " %s", SYMBOL_LINKAGE_NAME (msymbol));
+      fprintf_filtered (outfile, " %s", MSYMBOL_LINKAGE_NAME (msymbol));
       if (section)
 	{
 	  if (section->the_bfd_section != NULL)
@@ -264,9 +264,9 @@ dump_msymbols (struct objfile *objfile, struct ui_file *outfile)
 	    fprintf_filtered (outfile, " spurious section %ld",
 			      (long) (section - objfile->sections));
 	}
-      if (SYMBOL_DEMANGLED_NAME (msymbol) != NULL)
+      if (MSYMBOL_DEMANGLED_NAME (msymbol) != NULL)
 	{
-	  fprintf_filtered (outfile, "  %s", SYMBOL_DEMANGLED_NAME (msymbol));
+	  fprintf_filtered (outfile, "  %s", MSYMBOL_DEMANGLED_NAME (msymbol));
 	}
       if (msymbol->filename)
 	fprintf_filtered (outfile, "  %s", msymbol->filename);
diff --git a/gdb/symtab.c b/gdb/symtab.c
index 50c09c1..326f4c9 100644
--- a/gdb/symtab.c
+++ b/gdb/symtab.c
@@ -1118,7 +1118,7 @@ fixup_section (struct general_symbol_info *ginfo,
      point to the actual function code.  */
   msym = lookup_minimal_symbol_by_pc_name (addr, ginfo->name, objfile);
   if (msym)
-    ginfo->section = SYMBOL_SECTION (msym);
+    ginfo->section = MSYMBOL_SECTION (msym);
   else
     {
       /* Static, function-local variables do appear in the linker
@@ -2378,7 +2378,7 @@ find_pc_sect_line (CORE_ADDR pc, struct obj_section *section, int notcurrent)
     if (MSYMBOL_TYPE (msymbol.minsym) == mst_solib_trampoline)
       {
 	mfunsym
-	  = lookup_minimal_symbol_text (SYMBOL_LINKAGE_NAME (msymbol.minsym),
+	  = lookup_minimal_symbol_text (MSYMBOL_LINKAGE_NAME (msymbol.minsym),
 					NULL);
 	if (mfunsym == NULL)
 	  /* I eliminated this warning since it is coming out
@@ -2394,8 +2394,8 @@ find_pc_sect_line (CORE_ADDR pc, struct obj_section *section, int notcurrent)
 	     SYMBOL_LINKAGE_NAME (msymbol)); */
 	  ;
 	/* fall through */
-	else if (SYMBOL_VALUE_ADDRESS (mfunsym)
-		 == SYMBOL_VALUE_ADDRESS (msymbol.minsym))
+	else if (MSYMBOL_VALUE_ADDRESS (mfunsym)
+		 == MSYMBOL_VALUE_ADDRESS (msymbol.minsym))
 	  /* Avoid infinite recursion */
 	  /* See above comment about why warning is commented out.  */
 	  /* warning ("In stub for %s; unable to find real function/line info",
@@ -2403,7 +2403,7 @@ find_pc_sect_line (CORE_ADDR pc, struct obj_section *section, int notcurrent)
 	  ;
 	/* fall through */
 	else
-	  return find_pc_line (SYMBOL_VALUE_ADDRESS (mfunsym), 0);
+	  return find_pc_line (MSYMBOL_VALUE_ADDRESS (mfunsym), 0);
       }
 
 
@@ -2917,9 +2917,9 @@ skip_prologue_sal (struct symtab_and_line *sal)
 	}
 
       objfile = msymbol.objfile;
-      pc = SYMBOL_VALUE_ADDRESS (msymbol.minsym);
-      section = SYMBOL_OBJ_SECTION (objfile, msymbol.minsym);
-      name = SYMBOL_LINKAGE_NAME (msymbol.minsym);
+      pc = MSYMBOL_VALUE_ADDRESS (msymbol.minsym);
+      section = MSYMBOL_OBJ_SECTION (objfile, msymbol.minsym);
+      name = MSYMBOL_LINKAGE_NAME (msymbol.minsym);
     }
 
   gdbarch = get_objfile_arch (objfile);
@@ -3658,16 +3658,16 @@ search_symbols (char *regexp, enum search_domain kind,
 	    || MSYMBOL_TYPE (msymbol) == ourtype4)
 	  {
 	    if (!datum.preg_p
-		|| regexec (&datum.preg, SYMBOL_NATURAL_NAME (msymbol), 0,
+		|| regexec (&datum.preg, MSYMBOL_NATURAL_NAME (msymbol), 0,
 			    NULL, 0) == 0)
 	      {
 		/* Note: An important side-effect of these lookup functions
 		   is to expand the symbol table if msymbol is found, for the
 		   benefit of the next loop on ALL_PRIMARY_SYMTABS.  */
 		if (kind == FUNCTIONS_DOMAIN
-		    ? find_pc_symtab (SYMBOL_VALUE_ADDRESS (msymbol)) == NULL
+		    ? find_pc_symtab (MSYMBOL_VALUE_ADDRESS (msymbol)) == NULL
 		    : (lookup_symbol_in_objfile_from_linkage_name
-		       (objfile, SYMBOL_LINKAGE_NAME (msymbol), VAR_DOMAIN)
+		       (objfile, MSYMBOL_LINKAGE_NAME (msymbol), VAR_DOMAIN)
 		       == NULL))
 		  found_misc = 1;
 	      }
@@ -3761,16 +3761,16 @@ search_symbols (char *regexp, enum search_domain kind,
 	    || MSYMBOL_TYPE (msymbol) == ourtype4)
 	  {
 	    if (!datum.preg_p
-		|| regexec (&datum.preg, SYMBOL_NATURAL_NAME (msymbol), 0,
+		|| regexec (&datum.preg, MSYMBOL_NATURAL_NAME (msymbol), 0,
 			    NULL, 0) == 0)
 	      {
 		/* For functions we can do a quick check of whether the
 		   symbol might be found via find_pc_symtab.  */
 		if (kind != FUNCTIONS_DOMAIN
-		    || find_pc_symtab (SYMBOL_VALUE_ADDRESS (msymbol)) == NULL)
+		    || find_pc_symtab (MSYMBOL_VALUE_ADDRESS (msymbol)) == NULL)
 		  {
 		    if (lookup_symbol_in_objfile_from_linkage_name
-			(objfile, SYMBOL_LINKAGE_NAME (msymbol), VAR_DOMAIN)
+			(objfile, MSYMBOL_LINKAGE_NAME (msymbol), VAR_DOMAIN)
 			== NULL)
 		      {
 			/* match */
@@ -3848,14 +3848,14 @@ print_msymbol_info (struct bound_minimal_symbol msymbol)
   char *tmp;
 
   if (gdbarch_addr_bit (gdbarch) <= 32)
-    tmp = hex_string_custom (SYMBOL_VALUE_ADDRESS (msymbol.minsym)
+    tmp = hex_string_custom (MSYMBOL_VALUE_ADDRESS (msymbol.minsym)
 			     & (CORE_ADDR) 0xffffffff,
 			     8);
   else
-    tmp = hex_string_custom (SYMBOL_VALUE_ADDRESS (msymbol.minsym),
+    tmp = hex_string_custom (MSYMBOL_VALUE_ADDRESS (msymbol.minsym),
 			     16);
   printf_filtered ("%s  %s\n",
-		   tmp, SYMBOL_PRINT_NAME (msymbol.minsym));
+		   tmp, MSYMBOL_PRINT_NAME (msymbol.minsym));
 }
 
 /* This is the guts of the commands "info functions", "info types", and
@@ -4013,7 +4013,7 @@ rbreak_command (char *regexp, int from_tty)
 	}
       else
 	{
-	  int newlen = (strlen (SYMBOL_LINKAGE_NAME (p->msymbol.minsym)) + 3);
+	  int newlen = (strlen (MSYMBOL_LINKAGE_NAME (p->msymbol.minsym)) + 3);
 
 	  if (newlen > len)
 	    {
@@ -4021,12 +4021,12 @@ rbreak_command (char *regexp, int from_tty)
 	      len = newlen;
 	    }
 	  strcpy (string, "'");
-	  strcat (string, SYMBOL_LINKAGE_NAME (p->msymbol.minsym));
+	  strcat (string, MSYMBOL_LINKAGE_NAME (p->msymbol.minsym));
 	  strcat (string, "'");
 
 	  break_command (string, from_tty);
 	  printf_filtered ("<function, no debug info> %s;\n",
-			   SYMBOL_PRINT_NAME (p->msymbol.minsym));
+			   MSYMBOL_PRINT_NAME (p->msymbol.minsym));
 	}
     }
 
@@ -4097,6 +4097,10 @@ static VEC (char_ptr) *return_val;
       completion_list_add_name \
 	(SYMBOL_NATURAL_NAME (symbol), (sym_text), (len), (text), (word))
 
+#define MCOMPLETION_LIST_ADD_SYMBOL(symbol, sym_text, len, text, word) \
+      completion_list_add_name \
+	(MSYMBOL_NATURAL_NAME (symbol), (sym_text), (len), (text), (word))
+
 /*  Test to see if the symbol specified by SYMNAME (which is already
    demangled for C++ symbols) matches SYM_TEXT in the first SYM_TEXT_LEN
    characters.  If so, add it to the current completion list.  */
@@ -4154,7 +4158,7 @@ completion_list_objc_symbol (struct minimal_symbol *msymbol,
   const char *method, *category, *selector;
   char *tmp2 = NULL;
 
-  method = SYMBOL_NATURAL_NAME (msymbol);
+  method = MSYMBOL_NATURAL_NAME (msymbol);
 
   /* Is it a method?  */
   if ((method[0] != '-') && (method[0] != '+'))
@@ -4418,8 +4422,8 @@ default_make_symbol_completion_list_break_on (const char *text,
       ALL_MSYMBOLS (objfile, msymbol)
 	{
 	  QUIT;
-	  COMPLETION_LIST_ADD_SYMBOL (msymbol, sym_text, sym_text_len, text,
-				      word);
+	  MCOMPLETION_LIST_ADD_SYMBOL (msymbol, sym_text, sym_text_len, text,
+				       word);
 
 	  completion_list_objc_symbol (msymbol, sym_text, sym_text_len, text,
 				       word);
diff --git a/gdb/symtab.h b/gdb/symtab.h
index 25ac028..4bf3035 100644
--- a/gdb/symtab.h
+++ b/gdb/symtab.h
@@ -180,8 +180,8 @@ extern const char *symbol_get_demangled_name
 extern CORE_ADDR symbol_overlayed_address (CORE_ADDR, struct obj_section *);
 
 /* Note that all the following SYMBOL_* macros are used with the
-   SYMBOL argument being either a partial symbol, a minimal symbol or
-   a full symbol.  All three types have a ginfo field.  In particular
+   SYMBOL argument being either a partial symbol or
+   a full symbol.  Both types have a ginfo field.  In particular
    the SYMBOL_SET_LANGUAGE, SYMBOL_DEMANGLED_NAME, etc.
    macros cannot be entirely substituted by
    functions, unless the callers are changed to pass in the ginfo
@@ -339,7 +339,7 @@ struct minimal_symbol
      The SYMBOL_VALUE_ADDRESS contains the address that this symbol
      corresponds to.  */
 
-  struct general_symbol_info ginfo;
+  struct general_symbol_info mginfo;
 
   /* Size of this symbol.  end_psymtab in dbxread.c uses this
      information to calculate the end of the partial symtab based on the
@@ -390,6 +390,34 @@ struct minimal_symbol
 #define MSYMBOL_HAS_SIZE(msymbol)	((msymbol)->has_size + 0)
 #define MSYMBOL_TYPE(msymbol)		(msymbol)->type
 
+#define MSYMBOL_VALUE(symbol)		(symbol)->mginfo.value.ivalue
+#define MSYMBOL_VALUE_ADDRESS(symbol)	(symbol)->mginfo.value.address
+#define MSYMBOL_VALUE_BYTES(symbol)	(symbol)->mginfo.value.bytes
+#define MSYMBOL_BLOCK_VALUE(symbol)	(symbol)->mginfo.value.block
+#define MSYMBOL_VALUE_CHAIN(symbol)	(symbol)->mginfo.value.chain
+#define MSYMBOL_LANGUAGE(symbol)	(symbol)->mginfo.language
+#define MSYMBOL_SECTION(symbol)		(symbol)->mginfo.section
+#define MSYMBOL_OBJ_SECTION(objfile, symbol)			\
+  (((symbol)->mginfo.section >= 0)				\
+   ? (&(((objfile)->sections)[(symbol)->mginfo.section]))	\
+   : NULL)
+
+#define MSYMBOL_NATURAL_NAME(symbol) \
+  (symbol_natural_name (&(symbol)->mginfo))
+#define MSYMBOL_LINKAGE_NAME(symbol)	(symbol)->mginfo.name
+#define MSYMBOL_PRINT_NAME(symbol)					\
+  (demangle ? MSYMBOL_NATURAL_NAME (symbol) : MSYMBOL_LINKAGE_NAME (symbol))
+#define MSYMBOL_DEMANGLED_NAME(symbol) \
+  (symbol_demangled_name (&(symbol)->mginfo))
+#define MSYMBOL_SET_LANGUAGE(symbol,language,obstack)	\
+  (symbol_set_language (&(symbol)->mginfo, (language), (obstack)))
+#define MSYMBOL_SEARCH_NAME(symbol)					 \
+   (symbol_search_name (&(symbol)->mginfo))
+#define MSYMBOL_MATCHES_SEARCH_NAME(symbol, name)			\
+  (strcmp_iw (MSYMBOL_SEARCH_NAME (symbol), (name)) == 0)
+#define MSYMBOL_SET_NAMES(symbol,linkage_name,len,copy_name,objfile)	\
+  symbol_set_names (&(symbol)->mginfo, linkage_name, len, copy_name, objfile)
+
 #include "minsyms.h"
 
 \f
diff --git a/gdb/tracepoint.c b/gdb/tracepoint.c
index 23eba32..13e132f 100644
--- a/gdb/tracepoint.c
+++ b/gdb/tracepoint.c
@@ -2831,7 +2831,7 @@ scope_info (char *args, int from_tty)
 		      printf_filtered ("static storage at address ");
 		      printf_filtered ("%s",
 				       paddress (gdbarch,
-						 SYMBOL_VALUE_ADDRESS (msym)));
+						 MSYMBOL_VALUE_ADDRESS (msym)));
 		    }
 		  break;
 		case LOC_OPTIMIZED_OUT:
diff --git a/gdb/tui/tui-disasm.c b/gdb/tui/tui-disasm.c
index 00f8325..ee629f3 100644
--- a/gdb/tui/tui-disasm.c
+++ b/gdb/tui/tui-disasm.c
@@ -124,7 +124,7 @@ tui_find_disassembly_address (struct gdbarch *gdbarch, CORE_ADDR pc, int from)
          msymbol = lookup_minimal_symbol_by_pc_section (new_low, 0).minsym;
 
          if (msymbol)
-            new_low = SYMBOL_VALUE_ADDRESS (msymbol);
+            new_low = MSYMBOL_VALUE_ADDRESS (msymbol);
          else
             new_low += 1 * max_lines;
 
@@ -349,7 +349,7 @@ tui_get_begin_asm_address (struct gdbarch **gdbarch_p, CORE_ADDR *addr_p)
       if (main_symbol == 0)
         main_symbol = lookup_minimal_symbol ("_start", NULL, NULL);
       if (main_symbol)
-        addr = SYMBOL_VALUE_ADDRESS (main_symbol);
+        addr = MSYMBOL_VALUE_ADDRESS (main_symbol);
       else
         addr = 0;
     }
diff --git a/gdb/valops.c b/gdb/valops.c
index 82417dac..cdbaeca 100644
--- a/gdb/valops.c
+++ b/gdb/valops.c
@@ -160,7 +160,7 @@ find_function_in_inferior (const char *name, struct objfile **objf_p)
 	  type = lookup_pointer_type (builtin_type (gdbarch)->builtin_char);
 	  type = lookup_function_type (type);
 	  type = lookup_pointer_type (type);
-	  maddr = SYMBOL_VALUE_ADDRESS (msymbol.minsym);
+	  maddr = MSYMBOL_VALUE_ADDRESS (msymbol.minsym);
 
 	  if (objf_p)
 	    *objf_p = objfile;
diff --git a/gdb/value.c b/gdb/value.c
index 50b0245..0ee29f5 100644
--- a/gdb/value.c
+++ b/gdb/value.c
@@ -2758,7 +2758,7 @@ value_static_field (struct type *type, int fieldno)
 	  else
 	    {
 	      retval = value_at_lazy (TYPE_FIELD_TYPE (type, fieldno),
-				      SYMBOL_VALUE_ADDRESS (msym));
+				      MSYMBOL_VALUE_ADDRESS (msym));
 	    }
 	}
       else
@@ -2974,7 +2974,7 @@ value_fn_field (struct value **arg1p, struct fn_field *f,
 
       set_value_address (v,
 	gdbarch_convert_from_func_ptr_addr
-	   (gdbarch, SYMBOL_VALUE_ADDRESS (msym.minsym), &current_target));
+	   (gdbarch, MSYMBOL_VALUE_ADDRESS (msym.minsym), &current_target));
     }
 
   if (arg1p)
-- 
1.8.1.4

^ permalink raw reply	[flat|nested] 11+ messages in thread

* [FYI v3 06/10] change minsyms not to be relocated at read-time
  2014-02-26 20:23 [FYI v3 00/10] share minimal symbols across objfiles Tom Tromey
                   ` (4 preceding siblings ...)
  2014-02-26 19:01 ` [FYI v3 04/10] use bound_minsym as result for lookup_minimal_symbol et al Tom Tromey
@ 2014-02-26 19:07 ` Tom Tromey
  2014-02-26 19:39 ` [FYI v3 10/10] make "file" use the BFD cache better Tom Tromey
                   ` (3 subsequent siblings)
  9 siblings, 0 replies; 11+ messages in thread
From: Tom Tromey @ 2014-02-26 19:07 UTC (permalink / raw)
  To: gdb-patches; +Cc: Tom Tromey

This removes the runtime offsets from minsyms.  Instead, these offsets
will now be applied whenever the minsym's address is computed.

This patch redefines MSYMBOL_VALUE_ADDRESS to actually use the offsets
from the given objfile.  Then, it updates all the symbol readers,
changing them so that they do not add in the section offset when
creating the symbol.

This change also lets us remove relocation of minsyms from
objfile_relocate1 and also msymbols_sort.

2014-02-26  Tom Tromey  <tromey@redhat.com>

	* minsyms.c (msymbols_sort): Remove.
	* minsyms.h (msymbols_sort): Remove.
	* objfiles.c (objfile_relocate1): Don't relocate minsyms.
	* symtab.h (MSYMBOL_VALUE_ADDRESS): Use objfile offsets.
	* elfread.c (elf_symtab_read): Don't add section offsets.
	* xcoffread.c (record_minimal_symbol): Don't add section offset
	to minimal symbol address.
	* somread.c (text_offset, data_offset): Remove.
	(som_symtab_read): Don't add section offsets to minimal symbol
	addresses.
	* coff-pe-read.c (add_pe_forwarded_sym, read_pe_exported_syms):
	Don't add section offsets to minimal symbols.
	* coffread.c (coff_symtab_read): Don't add section offsets
	to minimal symbol addresses.
	* machoread.c (macho_symtab_add_minsym): Don't add section offset
	to minimal symbol addresses.
	* mipsread.c (read_alphacoff_dynamic_symtab): Don't add
	section offset to minimal symbol addresses.
	* mdebugread.c (parse_partial_symbols): Don't add section
	offset to minimal symbol addresses.
	* dbxread.c (read_dbx_dynamic_symtab): Don't add section
	offset to minimal symbol addresses.
---
 gdb/ChangeLog      | 25 +++++++++++++++++++++++++
 gdb/coff-pe-read.c | 24 +++++++++++-------------
 gdb/coffread.c     |  8 ++++----
 gdb/dbxread.c      | 23 ++++-------------------
 gdb/elfread.c      | 11 -----------
 gdb/machoread.c    | 13 -------------
 gdb/mdebugread.c   | 38 ++++++++++++--------------------------
 gdb/minsyms.c      | 10 ----------
 gdb/minsyms.h      |  6 ------
 gdb/mipsread.c     |  3 ---
 gdb/objfiles.c     | 13 -------------
 gdb/somread.c      | 24 ++++++++----------------
 gdb/symtab.h       |  7 +++----
 gdb/xcoffread.c    |  1 -
 14 files changed, 67 insertions(+), 139 deletions(-)

diff --git a/gdb/coff-pe-read.c b/gdb/coff-pe-read.c
index e1a61b7..dbb57f8 100644
--- a/gdb/coff-pe-read.c
+++ b/gdb/coff-pe-read.c
@@ -204,7 +204,7 @@ add_pe_forwarded_sym (const char *sym_name, const char *forward_dll_name,
 		      const char *forward_func_name, int ordinal,
 		      const char *dll_name, struct objfile *objfile)
 {
-  CORE_ADDR vma;
+  CORE_ADDR vma, baseaddr;
   struct bound_minimal_symbol msymbol;
   enum minimal_symbol_type msymtype;
   char *qualified_name, *bare_name;
@@ -259,11 +259,18 @@ add_pe_forwarded_sym (const char *sym_name, const char *forward_dll_name,
 
   qualified_name = xstrprintf ("%s!%s", dll_name, bare_name);
 
-  prim_record_minimal_symbol_and_info (qualified_name, vma, msymtype,
-				       section, objfile);
+  /* Note that this code makes a minimal symbol whose value may point
+     outside of any section in this objfile.  These symbols can't
+     really be relocated properly, but nevertheless we make a stab at
+     it, choosing an approach consistent with the history of this
+     code.  */
+  baseaddr = ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
+
+  prim_record_minimal_symbol_and_info (qualified_name, vma - baseaddr,
+				       msymtype, section, objfile);
 
   /* Enter the plain name as well, which might not be unique.  */
-  prim_record_minimal_symbol_and_info (bare_name, vma, msymtype,
+  prim_record_minimal_symbol_and_info (bare_name, vma - baseaddr, msymtype,
 				       section, objfile);
   xfree (qualified_name);
   xfree (bare_name);
@@ -528,15 +535,6 @@ read_pe_exported_syms (struct objfile *objfile)
 
   bfd_map_over_sections (dll, get_section_vmas, &pe_sections_info);
 
-  /* Adjust the vma_offsets in case this PE got relocated. This
-     assumes that *all* sections share the same relocation offset
-     as the text section.  */
-  for (i = 0; i < otherix; i++)
-    {
-      section_data[i].vma_offset
-	+= ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
-    }
-
   /* Truncate name at first dot. Should maybe also convert to all
      lower case for convenience on Windows.  */
   read_pe_truncate_name (dll_name);
diff --git a/gdb/coffread.c b/gdb/coffread.c
index c5ad60c..44d77f0 100644
--- a/gdb/coffread.c
+++ b/gdb/coffread.c
@@ -873,8 +873,7 @@ coff_symtab_read (long symtab_offset, unsigned int nsyms,
 	     minsyms.  */
 	  int section = cs_to_section (cs, objfile);
 
-	  tmpaddr = cs->c_value + ANOFFSET (objfile->section_offsets,
-					    SECT_OFF_TEXT (objfile));
+	  tmpaddr = cs->c_value;
 	  record_minimal_symbol (cs, tmpaddr, mst_text,
 				 section, objfile);
 
@@ -976,6 +975,7 @@ coff_symtab_read (long symtab_offset, unsigned int nsyms,
 
 	    enum minimal_symbol_type ms_type;
 	    int sec;
+	    CORE_ADDR offset = 0;
 
 	    if (cs->c_secnum == N_UNDEF)
 	      {
@@ -1007,7 +1007,7 @@ coff_symtab_read (long symtab_offset, unsigned int nsyms,
  		    || cs->c_sclass == C_THUMBEXTFUNC
  		    || cs->c_sclass == C_THUMBEXT
  		    || (pe_file && (cs->c_sclass == C_STAT)))
-		  tmpaddr += ANOFFSET (objfile->section_offsets, sec);
+		  offset = ANOFFSET (objfile->section_offsets, sec);
 
 		if (bfd_section->flags & SEC_CODE)
 		  {
@@ -1046,7 +1046,7 @@ coff_symtab_read (long symtab_offset, unsigned int nsyms,
 
 		sym = process_coff_symbol
 		  (cs, &main_aux, objfile);
-		SYMBOL_VALUE (sym) = tmpaddr;
+		SYMBOL_VALUE (sym) = tmpaddr + offset;
 		SYMBOL_SECTION (sym) = sec;
 	      }
 	  }
diff --git a/gdb/dbxread.c b/gdb/dbxread.c
index e0e5c48..5171f50 100644
--- a/gdb/dbxread.c
+++ b/gdb/dbxread.c
@@ -1045,20 +1045,14 @@ read_dbx_dynamic_symtab (struct objfile *objfile)
 
 	  if (bfd_get_section_flags (abfd, sec) & SEC_CODE)
 	    {
-	      sym_value += ANOFFSET (objfile->section_offsets,
-				     SECT_OFF_TEXT (objfile));
 	      type = N_TEXT;
 	    }
 	  else if (bfd_get_section_flags (abfd, sec) & SEC_DATA)
 	    {
-	      sym_value	+= ANOFFSET (objfile->section_offsets,
-				     SECT_OFF_DATA (objfile));
 	      type = N_DATA;
 	    }
 	  else if (bfd_get_section_flags (abfd, sec) & SEC_ALLOC)
 	    {
-	      sym_value += ANOFFSET (objfile->section_offsets,
-				     SECT_OFF_BSS (objfile));
 	      type = N_BSS;
 	    }
 	  else
@@ -1098,9 +1092,7 @@ read_dbx_dynamic_symtab (struct objfile *objfile)
        counter++, relptr++)
     {
       arelent *rel = *relptr;
-      CORE_ADDR address =
-	rel->address + ANOFFSET (objfile->section_offsets,
-				 SECT_OFF_DATA (objfile));
+      CORE_ADDR address = rel->address;
 
       switch (bfd_get_arch (abfd))
 	{
@@ -1326,22 +1318,16 @@ read_dbx_symtab (struct objfile *objfile)
 
 	case N_TEXT | N_EXT:
 	case N_NBTEXT | N_EXT:
-	  nlist.n_value += ANOFFSET (objfile->section_offsets,
-				     SECT_OFF_TEXT (objfile));
 	  goto record_it;
 
 	case N_DATA | N_EXT:
 	case N_NBDATA | N_EXT:
-	  nlist.n_value += ANOFFSET (objfile->section_offsets,
-				     SECT_OFF_DATA (objfile));
 	  goto record_it;
 
 	case N_BSS:
 	case N_BSS | N_EXT:
 	case N_NBBSS | N_EXT:
 	case N_SETV | N_EXT:		/* FIXME, is this in BSS? */
-	  nlist.n_value += ANOFFSET (objfile->section_offsets,
-				     SECT_OFF_BSS (objfile));
 	  goto record_it;
 
 	case N_ABS | N_EXT:
@@ -1364,14 +1350,15 @@ read_dbx_symtab (struct objfile *objfile)
 	case N_FN:
 	case N_FN_SEQ:
 	case N_TEXT:
-	  nlist.n_value += ANOFFSET (objfile->section_offsets,
-				     SECT_OFF_TEXT (objfile));
 	  namestring = set_namestring (objfile, &nlist);
 
 	  if ((namestring[0] == '-' && namestring[1] == 'l')
 	      || (namestring[(nsl = strlen (namestring)) - 1] == 'o'
 		  && namestring[nsl - 2] == '.'))
 	    {
+	      nlist.n_value += ANOFFSET (objfile->section_offsets,
+					 SECT_OFF_TEXT (objfile));
+
 	      if (past_first_source_file && pst
 		  /* The gould NP1 uses low values for .o and -l symbols
 		     which are not the address.  */
@@ -1396,8 +1383,6 @@ read_dbx_symtab (struct objfile *objfile)
 	  continue;
 
 	case N_DATA:
-	  nlist.n_value += ANOFFSET (objfile->section_offsets,
-				     SECT_OFF_DATA (objfile));
 	  goto record_it;
 
 	case N_UNDF | N_EXT:
diff --git a/gdb/elfread.c b/gdb/elfread.c
index 7c4b175..fd88813 100644
--- a/gdb/elfread.c
+++ b/gdb/elfread.c
@@ -325,9 +325,6 @@ elf_symtab_read (struct objfile *objfile, int type,
 	      && bfd_get_section_by_name (abfd, ".plt") != NULL)
 	    continue;
 
-	  symaddr += ANOFFSET (objfile->section_offsets,
-			       gdb_bfd_section_index (objfile->obfd, sect));
-
 	  msym = record_minimal_symbol
 	    (sym->name, strlen (sym->name), copy_names,
 	     symaddr, mst_solib_trampoline, sect, objfile);
@@ -367,13 +364,6 @@ elf_symtab_read (struct objfile *objfile, int type,
 	     interested in will have a section.  */
 	  /* Bfd symbols are section relative.  */
 	  symaddr = sym->value + sym->section->vma;
-	  /* Relocate all non-absolute and non-TLS symbols by the
-	     section offset.  */
-	  if (sym->section != bfd_abs_section_ptr
-	      && !(sym->section->flags & SEC_THREAD_LOCAL))
-	    {
-	      symaddr += offset;
-	    }
 	  /* For non-absolute symbols, use the type of the section
 	     they are relative to, to intuit text/data.  Bfd provides
 	     no way of figuring this out for absolute symbols.  */
@@ -409,7 +399,6 @@ elf_symtab_read (struct objfile *objfile, int type,
 		{
 		  if (sym->name[0] == '.')
 		    continue;
-		  symaddr += offset;
 		}
 	    }
 	  else if (sym->section->flags & SEC_CODE)
diff --git a/gdb/machoread.c b/gdb/machoread.c
index f7194e2..f5e4a1e 100644
--- a/gdb/machoread.c
+++ b/gdb/machoread.c
@@ -111,24 +111,11 @@ macho_symtab_add_minsym (struct objfile *objfile, const asymbol *sym)
   if (sym->flags & (BSF_GLOBAL | BSF_LOCAL | BSF_WEAK))
     {
       CORE_ADDR symaddr;
-      CORE_ADDR offset;
       enum minimal_symbol_type ms_type;
 
-      offset = ANOFFSET (objfile->section_offsets,
-			 gdb_bfd_section_index (objfile->obfd, sym->section));
-
       /* Bfd symbols are section relative.  */
       symaddr = sym->value + sym->section->vma;
 
-      /* Select global/local/weak symbols.  Note that bfd puts abs
-         symbols in their own section, so all symbols we are
-         interested in will have a section.  */
-      /* Relocate all non-absolute and non-TLS symbols by the
-         section offset.  */
-      if (sym->section != bfd_abs_section_ptr
-          && !(sym->section->flags & SEC_THREAD_LOCAL))
-        symaddr += offset;
-
       if (sym->section == bfd_abs_section_ptr)
         ms_type = mst_abs;
       else if (sym->section->flags & SEC_CODE)
diff --git a/gdb/mdebugread.c b/gdb/mdebugread.c
index 5cb8d86..94af07b 100644
--- a/gdb/mdebugread.c
+++ b/gdb/mdebugread.c
@@ -2519,14 +2519,10 @@ parse_partial_symbols (struct objfile *objfile)
 	{
 	case stProc:
 	  /* Beginnning of Procedure */
-	  svalue += ANOFFSET (objfile->section_offsets,
-			      SECT_OFF_TEXT (objfile));
 	  break;
 	case stStaticProc:
 	  /* Load time only static procs */
 	  ms_type = mst_file_text;
-	  svalue += ANOFFSET (objfile->section_offsets,
-			      SECT_OFF_TEXT (objfile));
 	  break;
 	case stGlobal:
 	  /* External symbol */
@@ -2539,20 +2535,14 @@ parse_partial_symbols (struct objfile *objfile)
 	  else if (SC_IS_DATA (ext_in->asym.sc))
 	    {
 	      ms_type = mst_data;
-	      svalue += ANOFFSET (objfile->section_offsets,
-				  SECT_OFF_DATA (objfile));
 	    }
 	  else if (SC_IS_BSS (ext_in->asym.sc))
 	    {
 	      ms_type = mst_bss;
-	      svalue += ANOFFSET (objfile->section_offsets,
-				  SECT_OFF_BSS (objfile));
 	    }
           else if (SC_IS_SBSS (ext_in->asym.sc))
             {
               ms_type = mst_bss;
-              svalue += ANOFFSET (objfile->section_offsets, 
-                                  get_section_index (objfile, ".sbss"));
             }
 	  else
 	    ms_type = mst_abs;
@@ -2585,8 +2575,6 @@ parse_partial_symbols (struct objfile *objfile)
                 continue;
                 
 	      ms_type = mst_file_text;
-	      svalue += ANOFFSET (objfile->section_offsets,
-				  SECT_OFF_TEXT (objfile));
 	    }
 	  else if (SC_IS_DATA (ext_in->asym.sc))
 	    {
@@ -2594,8 +2582,6 @@ parse_partial_symbols (struct objfile *objfile)
                 continue;
 
 	      ms_type = mst_file_data;
-	      svalue += ANOFFSET (objfile->section_offsets,
-				  SECT_OFF_DATA (objfile));
 	    }
 	  else if (SC_IS_BSS (ext_in->asym.sc))
 	    {
@@ -2603,8 +2589,6 @@ parse_partial_symbols (struct objfile *objfile)
                 continue;
 
 	      ms_type = mst_file_bss;
-	      svalue += ANOFFSET (objfile->section_offsets,
-				  SECT_OFF_BSS (objfile));
 	    }
           else if (SC_IS_SBSS (ext_in->asym.sc))
             {
@@ -2614,7 +2598,6 @@ parse_partial_symbols (struct objfile *objfile)
                 continue;
 
               ms_type = mst_file_bss;
-              svalue += ANOFFSET (objfile->section_offsets, sbss_sect_index);
             }
 	  else
 	    ms_type = mst_abs;
@@ -2748,8 +2731,6 @@ parse_partial_symbols (struct objfile *objfile)
 		      CORE_ADDR procaddr;
 		      long isym;
 
-		      sh.value += ANOFFSET (objfile->section_offsets,
-					    SECT_OFF_TEXT (objfile));
 		      if (sh.st == stStaticProc)
 			{
 			  namestring = debug_info->ss + fh->issBase + sh.iss;
@@ -2757,6 +2738,8 @@ parse_partial_symbols (struct objfile *objfile)
                                                  mst_file_text, sh.sc,
                                                  objfile);
 			}
+		      sh.value += ANOFFSET (objfile->section_offsets,
+					    SECT_OFF_TEXT (objfile));
 		      procaddr = sh.value;
 
 		      isym = AUX_GET_ISYM (fh->fBigendian,
@@ -2796,22 +2779,22 @@ parse_partial_symbols (struct objfile *objfile)
 			case scPData:
 			case scXData:
 			  namestring = debug_info->ss + fh->issBase + sh.iss;
-			  sh.value += ANOFFSET (objfile->section_offsets,
-						SECT_OFF_DATA (objfile));
                           record_minimal_symbol (namestring, sh.value,
                                                  mst_file_data, sh.sc,
                                                  objfile);
+			  sh.value += ANOFFSET (objfile->section_offsets,
+						SECT_OFF_DATA (objfile));
 			  break;
 
 			default:
 			  /* FIXME!  Shouldn't this use cases for bss, 
 			     then have the default be abs?  */
 			  namestring = debug_info->ss + fh->issBase + sh.iss;
-			  sh.value += ANOFFSET (objfile->section_offsets,
-						SECT_OFF_BSS (objfile));
                           record_minimal_symbol (namestring, sh.value,
                                                  mst_file_bss, sh.sc,
                                                  objfile);
+			  sh.value += ANOFFSET (objfile->section_offsets,
+						SECT_OFF_BSS (objfile));
 			  break;
 			}
 		    }
@@ -3435,6 +3418,7 @@ parse_partial_symbols (struct objfile *objfile)
 	    {
 	      char *name;
 	      enum address_class class;
+	      CORE_ADDR minsym_value;
 
 	      (*swap_sym_in) (cur_bfd,
 			      ((char *) debug_info->external_sym
@@ -3460,6 +3444,8 @@ parse_partial_symbols (struct objfile *objfile)
 
 	      name = debug_info->ss + fh->issBase + sh.iss;
 
+	      minsym_value = sh.value;
+
 	      switch (sh.sc)
 		{
 		case scText:
@@ -3492,7 +3478,7 @@ parse_partial_symbols (struct objfile *objfile)
 		  int new_sdx;
 
 		case stStaticProc:
-		  prim_record_minimal_symbol_and_info (name, sh.value,
+		  prim_record_minimal_symbol_and_info (name, minsym_value,
 						       mst_file_text,
 						       SECT_OFF_TEXT (objfile),
 						       objfile);
@@ -3578,12 +3564,12 @@ parse_partial_symbols (struct objfile *objfile)
 
 		case stStatic:	/* Variable */
 		  if (SC_IS_DATA (sh.sc))
-		    prim_record_minimal_symbol_and_info (name, sh.value,
+		    prim_record_minimal_symbol_and_info (name, minsym_value,
 							 mst_file_data,
 							 SECT_OFF_DATA (objfile),
 							 objfile);
 		  else
-		    prim_record_minimal_symbol_and_info (name, sh.value,
+		    prim_record_minimal_symbol_and_info (name, minsym_value,
 							 mst_file_bss,
 							 SECT_OFF_BSS (objfile),
 							 objfile);
diff --git a/gdb/minsyms.c b/gdb/minsyms.c
index aa6df11..df499a4 100644
--- a/gdb/minsyms.c
+++ b/gdb/minsyms.c
@@ -1296,16 +1296,6 @@ terminate_minimal_symbol_table (struct objfile *objfile)
   }
 }
 
-/* Sort all the minimal symbols in OBJFILE.  */
-
-void
-msymbols_sort (struct objfile *objfile)
-{
-  qsort (objfile->msymbols, objfile->minimal_symbol_count,
-	 sizeof (struct minimal_symbol), compare_minimal_symbols);
-  build_minimal_symbol_hash_tables (objfile);
-}
-
 /* Check if PC is in a shared library trampoline code stub.
    Return minimal symbol for the trampoline entry or NULL if PC is not
    in a trampoline code stub.  */
diff --git a/gdb/minsyms.h b/gdb/minsyms.h
index a11b5e8..289dcae 100644
--- a/gdb/minsyms.h
+++ b/gdb/minsyms.h
@@ -136,12 +136,6 @@ void install_minimal_symbols (struct objfile *);
 
 void terminate_minimal_symbol_table (struct objfile *objfile);
 
-/* Sort all the minimal symbols in OBJFILE.  This should be only be
-   called after relocating symbols; it ensures that the minimal
-   symbols are properly sorted by address.  */
-
-void msymbols_sort (struct objfile *objfile);
-
 \f
 
 /* Compute a hash code for the string argument.  */
diff --git a/gdb/mipsread.c b/gdb/mipsread.c
index d199554..090a7e7 100644
--- a/gdb/mipsread.c
+++ b/gdb/mipsread.c
@@ -367,7 +367,6 @@ read_alphacoff_dynamic_symtab (struct section_offsets *section_offsets,
 		ms_type = mst_text;
 	      else
 		ms_type = mst_file_text;
-	      sym_value += ANOFFSET (section_offsets, SECT_OFF_TEXT (objfile));
 	    }
 	  else if (sym_shndx == SHN_MIPS_DATA)
 	    {
@@ -375,7 +374,6 @@ read_alphacoff_dynamic_symtab (struct section_offsets *section_offsets,
 		ms_type = mst_data;
 	      else
 		ms_type = mst_file_data;
-	      sym_value += ANOFFSET (section_offsets, SECT_OFF_DATA (objfile));
 	    }
 	  else if (sym_shndx == SHN_MIPS_ACOMMON)
 	    {
@@ -383,7 +381,6 @@ read_alphacoff_dynamic_symtab (struct section_offsets *section_offsets,
 		ms_type = mst_bss;
 	      else
 		ms_type = mst_file_bss;
-	      sym_value += ANOFFSET (section_offsets, SECT_OFF_BSS (objfile));
 	    }
 	  else if (sym_shndx == SHN_ABS)
 	    {
diff --git a/gdb/objfiles.c b/gdb/objfiles.c
index db0c720..f456569 100644
--- a/gdb/objfiles.c
+++ b/gdb/objfiles.c
@@ -801,19 +801,6 @@ objfile_relocate1 (struct objfile *objfile,
     objfile->sf->qf->relocate (objfile, new_offsets, delta);
 
   {
-    struct minimal_symbol *msym;
-
-    ALL_OBJFILE_MSYMBOLS (objfile, msym)
-      if (MSYMBOL_SECTION (msym) >= 0)
-	SET_MSYMBOL_VALUE_ADDRESS (msym, (MSYMBOL_VALUE_ADDRESS (objfile, msym)
-					  + ANOFFSET (delta,
-						      MSYMBOL_SECTION (msym))));
-  }
-  /* Relocating different sections by different amounts may cause the symbols
-     to be out of order.  */
-  msymbols_sort (objfile);
-
-  {
     int i;
 
     for (i = 0; i < objfile->num_sections; ++i)
diff --git a/gdb/somread.c b/gdb/somread.c
index 79068cd..4a7837e 100644
--- a/gdb/somread.c
+++ b/gdb/somread.c
@@ -57,9 +57,6 @@ som_symtab_read (bfd *abfd, struct objfile *objfile,
   const int symsize = sizeof (struct som_external_symbol_dictionary_record);
 
 
-#define text_offset ANOFFSET (section_offsets, SECT_OFF_TEXT (objfile))
-#define data_offset ANOFFSET (section_offsets, SECT_OFF_DATA (objfile))
-
   number_of_symbols = bfd_get_symcount (abfd);
 
   /* Allocate a buffer to read in the debug info.
@@ -94,7 +91,7 @@ som_symtab_read (bfd *abfd, struct objfile *objfile,
      more accurate to check for a nonzero text offset, but they
      have not provided any information about why that test is
      more accurate.  */
-  dynamic = (text_offset != 0);
+  dynamic = (ANOFFSET (section_offsets, SECT_OFF_TEXT (objfile)) != 0);
 
   endbufp = buf + number_of_symbols;
   for (bufp = buf; bufp < endbufp; ++bufp)
@@ -152,7 +149,6 @@ som_symtab_read (bfd *abfd, struct objfile *objfile,
 	    case ST_MILLICODE:
 	      symname = bfd_getb32 (bufp->name) + stringtab;
 	      ms_type = mst_text;
-	      symbol_value += text_offset;
 	      symbol_value = gdbarch_addr_bits_remove (gdbarch, symbol_value);
 	      break;
 
@@ -165,20 +161,17 @@ som_symtab_read (bfd *abfd, struct objfile *objfile,
 		ms_type = mst_solib_trampoline;
 	      else
 		ms_type = mst_text;
-	      symbol_value += text_offset;
 	      symbol_value = gdbarch_addr_bits_remove (gdbarch, symbol_value);
 	      break;
 
 	    case ST_STUB:
 	      symname = bfd_getb32 (bufp->name) + stringtab;
 	      ms_type = mst_solib_trampoline;
-	      symbol_value += text_offset;
 	      symbol_value = gdbarch_addr_bits_remove (gdbarch, symbol_value);
 	      break;
 
 	    case ST_DATA:
 	      symname = bfd_getb32 (bufp->name) + stringtab;
-	      symbol_value += data_offset;
 	      ms_type = mst_data;
 	      break;
 	    default:
@@ -200,7 +193,6 @@ som_symtab_read (bfd *abfd, struct objfile *objfile,
 	    case ST_CODE:
 	      symname = bfd_getb32 (bufp->name) + stringtab;
 	      ms_type = mst_file_text;
-	      symbol_value += text_offset;
 	      symbol_value = gdbarch_addr_bits_remove (gdbarch, symbol_value);
 
 	    check_strange_names:
@@ -231,7 +223,6 @@ som_symtab_read (bfd *abfd, struct objfile *objfile,
 	    case ST_MILLICODE:
 	      symname = bfd_getb32 (bufp->name) + stringtab;
 	      ms_type = mst_file_text;
-	      symbol_value += text_offset;
 	      symbol_value = gdbarch_addr_bits_remove (gdbarch, symbol_value);
 	      break;
 
@@ -242,21 +233,18 @@ som_symtab_read (bfd *abfd, struct objfile *objfile,
 		 using mst_file_text vs mst_solib_trampoline here like
 		 we do for SS_UNIVERSAL and SS_EXTERNAL symbols above.  */
 	      ms_type = mst_file_text;
-	      symbol_value += text_offset;
 	      symbol_value = gdbarch_addr_bits_remove (gdbarch, symbol_value);
 	      break;
 
 	    case ST_STUB:
 	      symname = bfd_getb32 (bufp->name) + stringtab;
 	      ms_type = mst_solib_trampoline;
-	      symbol_value += text_offset;
 	      symbol_value = gdbarch_addr_bits_remove (gdbarch, symbol_value);
 	      break;
 
 
 	    case ST_DATA:
 	      symname = bfd_getb32 (bufp->name) + stringtab;
-	      symbol_value += data_offset;
 	      ms_type = mst_file_data;
 	      goto check_strange_names;
 
@@ -277,7 +265,6 @@ som_symtab_read (bfd *abfd, struct objfile *objfile,
 	    case ST_STORAGE:
 	    case ST_DATA:
 	      symname = bfd_getb32 (bufp->name) + stringtab;
-	      symbol_value += data_offset;
 	      ms_type = mst_data;
 	      break;
 
@@ -300,11 +287,16 @@ som_symtab_read (bfd *abfd, struct objfile *objfile,
 
 	  ALL_OBJFILE_OSECTIONS (objfile, iter)
 	    {
+	      CORE_ADDR start;
+	      CORE_ADDR len;
+
 	      if (bfd_is_const_section (iter->the_bfd_section))
 		continue;
 
-	      if (obj_section_addr (iter) <= symbol_value
-		  && symbol_value < obj_section_endaddr (iter))
+	      start = bfd_get_section_vma (iter->objfile->obfd,
+					   iter->the_bfd_section);
+	      len = bfd_get_section_size (iter->the_bfd_section);
+	      if (start <= symbol_value && symbol_value < start + len)
 		{
 		  section = iter->the_bfd_section;
 		  break;
diff --git a/gdb/symtab.h b/gdb/symtab.h
index d80222b5..ef145d9 100644
--- a/gdb/symtab.h
+++ b/gdb/symtab.h
@@ -393,12 +393,11 @@ struct minimal_symbol
 #define MSYMBOL_VALUE(symbol)		(symbol)->mginfo.value.ivalue
 /* The unrelocated address of the minimal symbol.  */
 #define MSYMBOL_VALUE_RAW_ADDRESS(symbol) ((symbol)->mginfo.value.address + 0)
-/* This weird definition lets us syntax-check without affecting the
-   results.  It is a temporary measure until a later patch.  */
+/* The relocated address of the minimal symbol, using the section
+   offsets from OBJFILE.  */
 #define MSYMBOL_VALUE_ADDRESS(objfile, symbol)				\
   ((symbol)->mginfo.value.address					\
-   + (0									\
-      * ANOFFSET ((objfile)->section_offsets, ((symbol)->mginfo.section))))
+   + ANOFFSET ((objfile)->section_offsets, ((symbol)->mginfo.section)))
 /* For a bound minsym, we can easily compute the address directly.  */
 #define BMSYMBOL_VALUE_ADDRESS(symbol) \
   MSYMBOL_VALUE_ADDRESS ((symbol).objfile, (symbol).minsym)
diff --git a/gdb/xcoffread.c b/gdb/xcoffread.c
index db11820..b986dbd 100644
--- a/gdb/xcoffread.c
+++ b/gdb/xcoffread.c
@@ -948,7 +948,6 @@ record_minimal_symbol (const char *name, CORE_ADDR address,
   if (name[0] == '.')
     ++name;
 
-  address += ANOFFSET (objfile->section_offsets, section);
   prim_record_minimal_symbol_and_info (name, address, ms_type,
 				       secnum_to_section (n_scnum, objfile),
 				       objfile);
-- 
1.8.1.4

^ permalink raw reply	[flat|nested] 11+ messages in thread

* [FYI v3 09/10] add short-circuit logic to elfread.c
  2014-02-26 20:23 [FYI v3 00/10] share minimal symbols across objfiles Tom Tromey
                   ` (6 preceding siblings ...)
  2014-02-26 19:39 ` [FYI v3 10/10] make "file" use the BFD cache better Tom Tromey
@ 2014-02-26 19:39 ` Tom Tromey
  2014-02-26 19:39 ` [FYI v3 08/10] split out elf_read_minimal_symbols Tom Tromey
  2014-02-26 19:39 ` [FYI v3 01/10] introduce minimal_symbol_upper_bound Tom Tromey
  9 siblings, 0 replies; 11+ messages in thread
From: Tom Tromey @ 2014-02-26 19:39 UTC (permalink / raw)
  To: gdb-patches; +Cc: Tom Tromey

If minimal symbols have already been read into a per-BFD object, then
a symbol reader can skip re-reading them.  This changes the ELF reader
to do so.

We only skip the work if the file is ELF+DWARF.  If it has stabs or
mdebug sections, then I think extra information is computed during the
minsym creation pass; and so we must still repeat it.  Eventually even
this will go away, once all symbol types have switched to being
progspace-independent.  In the meantime this has no negative effect --
it is just a missing optimization for a small set of users.

This change also required a somewhat non-obvious change to the OBJSTAT
accounting code.  If a symbol reader skips re-reading minimal symbols,
then the corresponding OBJSTAT will not be updated.  This leads to a
test failure in gdb.base/maint.exp.

To fix this, I've moved the needed stat field out of objfile and into
the per-BFD object.

2014-02-26  Tom Tromey  <tromey@redhat.com>

	* elfread.c (elf_read_minimal_symbols): Return early if
	minimal symbols have already been read.  Add "ei" parameter.
	(elf_symfile_read): Call elf_read_minimal_symbols earlier.
	* minsyms.c (prim_record_minimal_symbol_full): Update.
	* objfiles.h (struct objstats) <n_minsyms>: Move...
	(struct objfile_per_bfd_storage) <n_minsyms>: ... here.
	* symmisc.c (print_objfile_statistics): Update.
---
 gdb/ChangeLog  | 10 ++++++++++
 gdb/elfread.c  | 27 +++++++++++++++++++--------
 gdb/minsyms.c  |  6 ++++--
 gdb/objfiles.h |  7 ++++++-
 gdb/symmisc.c  |  4 ++--
 5 files changed, 41 insertions(+), 13 deletions(-)

diff --git a/gdb/elfread.c b/gdb/elfread.c
index 3aec352..88fb018 100644
--- a/gdb/elfread.c
+++ b/gdb/elfread.c
@@ -1084,7 +1084,8 @@ elf_gnu_ifunc_resolver_return_stop (struct breakpoint *b)
    symbols.  */
 
 static void
-elf_read_minimal_symbols (struct objfile *objfile, int symfile_flags)
+elf_read_minimal_symbols (struct objfile *objfile, int symfile_flags,
+			  const struct elfinfo *ei)
 {
   bfd *synth_abfd, *abfd = objfile->obfd;
   struct cleanup *back_to;
@@ -1100,6 +1101,21 @@ elf_read_minimal_symbols (struct objfile *objfile, int symfile_flags)
 			  objfile_name (objfile));
     }
 
+  /* If we already have minsyms, then we can skip some work here.
+     However, if there were stabs or mdebug sections, we go ahead and
+     redo all the work anyway, because the psym readers for those
+     kinds of debuginfo need extra information found here.  This can
+     go away once all types of symbols are in the per-BFD object.  */
+  if (objfile->per_bfd->minsyms_read
+      && ei->stabsect == NULL
+      && ei->mdebugsect == NULL)
+    {
+      if (symtab_create_debug)
+	fprintf_unfiltered (gdb_stdlog,
+			    "... minimal symbols previously read\n");
+      return;
+    }
+
   init_minimal_symbol_collection ();
   back_to = make_cleanup_discard_minimal_symbols ();
 
@@ -1242,16 +1258,11 @@ elf_symfile_read (struct objfile *objfile, int symfile_flags)
   bfd *abfd = objfile->obfd;
   struct elfinfo ei;
 
-  elf_read_minimal_symbols (objfile, symfile_flags);
-
   memset ((char *) &ei, 0, sizeof (ei));
-
-  /* Now process debugging information, which is contained in
-     special ELF sections.  */
-
-  /* We first have to find them...  */
   bfd_map_over_sections (abfd, elf_locate_sections, (void *) & ei);
 
+  elf_read_minimal_symbols (objfile, symfile_flags, &ei);
+
   /* ELF debugging information is inserted into the psymtab in the
      order of least informative first - most informative last.  Since
      the psymtab table is searched `most recent insertion first' this
diff --git a/gdb/minsyms.c b/gdb/minsyms.c
index 1dc86eb..6f1fb35 100644
--- a/gdb/minsyms.c
+++ b/gdb/minsyms.c
@@ -977,9 +977,11 @@ prim_record_minimal_symbol_full (const char *name, int name_len, int copy_name,
   /* If we already read minimal symbols for this objfile, then don't
      ever allocate a new one.  */
   if (!objfile->per_bfd->minsyms_read)
-    msym_bunch_index++;
+    {
+      msym_bunch_index++;
+      objfile->per_bfd->n_minsyms++;
+    }
   msym_count++;
-  OBJSTAT (objfile, n_minsyms++);
   return msymbol;
 }
 
diff --git a/gdb/objfiles.h b/gdb/objfiles.h
index d585bc4..dc06c7b 100644
--- a/gdb/objfiles.h
+++ b/gdb/objfiles.h
@@ -151,7 +151,6 @@ struct obj_section
 
 struct objstats
   {
-    int n_minsyms;		/* Number of minimal symbols read */
     int n_psyms;		/* Number of partial symbols read */
     int n_syms;			/* Number of full symbols read */
     int n_stabs;		/* Number of ".stabs" read (if applicable) */
@@ -224,6 +223,12 @@ struct objfile_per_bfd_storage
   struct minimal_symbol *msymbols;
   int minimal_symbol_count;
 
+  /* The number of minimal symbols read, before any minimal symbol
+     de-duplication is applied.  Note in particular that this has only
+     a passing relationship with the actual size of the table above;
+     use minimal_symbol_count if you need the true size.  */
+  int n_minsyms;
+
   /* This is true if minimal symbols have already been read.  Symbol
      readers can use this to bypass minimal symbol reading.  Also, the
      minimal symbol table management code in minsyms.c uses this to
diff --git a/gdb/symmisc.c b/gdb/symmisc.c
index eb15ecc..7ea97bd 100644
--- a/gdb/symmisc.c
+++ b/gdb/symmisc.c
@@ -111,9 +111,9 @@ print_objfile_statistics (void)
     if (OBJSTAT (objfile, n_stabs) > 0)
       printf_filtered (_("  Number of \"stab\" symbols read: %d\n"),
 		       OBJSTAT (objfile, n_stabs));
-    if (OBJSTAT (objfile, n_minsyms) > 0)
+    if (objfile->per_bfd->n_minsyms > 0)
       printf_filtered (_("  Number of \"minimal\" symbols read: %d\n"),
-		       OBJSTAT (objfile, n_minsyms));
+		       objfile->per_bfd->n_minsyms);
     if (OBJSTAT (objfile, n_psyms) > 0)
       printf_filtered (_("  Number of \"partial\" symbols read: %d\n"),
 		       OBJSTAT (objfile, n_psyms));
-- 
1.8.1.4

^ permalink raw reply	[flat|nested] 11+ messages in thread

* [FYI v3 01/10] introduce minimal_symbol_upper_bound
  2014-02-26 20:23 [FYI v3 00/10] share minimal symbols across objfiles Tom Tromey
                   ` (8 preceding siblings ...)
  2014-02-26 19:39 ` [FYI v3 08/10] split out elf_read_minimal_symbols Tom Tromey
@ 2014-02-26 19:39 ` Tom Tromey
  9 siblings, 0 replies; 11+ messages in thread
From: Tom Tromey @ 2014-02-26 19:39 UTC (permalink / raw)
  To: gdb-patches; +Cc: Tom Tromey

This introduces minimal_symbol_upper_bound and changes various bits of
code to use it.  Since this function is intimately tied to the
implementation of minimal symbol tables, I believe it belongs in
minsyms.c.

The new function is extracted from find_pc_partial_function_gnu_ifunc.
This isn't a "clean" move because the old function interleaved the
caching and the computation; but this doesn't make sense for the new
code.

2014-02-26  Tom Tromey  <tromey@redhat.com>

	* blockframe.c (find_pc_partial_function_gnu_ifunc): Use
	bound minimal symbols.  Move code that knows about minsym
	table layout...
	* minsyms.c (minimal_symbol_upper_bound): ... here.  New
	function.
	* minsyms.h (minimal_symbol_upper_bound): Declare.
	* objc-lang.c (find_objc_msgsend): Use bound minimal symbols,
	minimal_symbol_upper_bound.
---
 gdb/ChangeLog    | 11 +++++++++++
 gdb/blockframe.c | 54 ++++++++++++------------------------------------------
 gdb/minsyms.c    | 45 +++++++++++++++++++++++++++++++++++++++++++++
 gdb/minsyms.h    |  8 ++++++++
 gdb/objc-lang.c  | 16 +++++++---------
 5 files changed, 83 insertions(+), 51 deletions(-)

diff --git a/gdb/blockframe.c b/gdb/blockframe.c
index b03cd1b..014c45b 100644
--- a/gdb/blockframe.c
+++ b/gdb/blockframe.c
@@ -195,7 +195,7 @@ find_pc_partial_function_gnu_ifunc (CORE_ADDR pc, const char **name,
 {
   struct obj_section *section;
   struct symbol *f;
-  struct minimal_symbol *msymbol;
+  struct bound_minimal_symbol msymbol;
   struct symtab *symtab = NULL;
   struct objfile *objfile;
   int i;
@@ -217,11 +217,11 @@ find_pc_partial_function_gnu_ifunc (CORE_ADDR pc, const char **name,
       && section == cache_pc_function_section)
     goto return_cached_value;
 
-  msymbol = lookup_minimal_symbol_by_pc_section (mapped_pc, section).minsym;
+  msymbol = lookup_minimal_symbol_by_pc_section (mapped_pc, section);
   ALL_OBJFILES (objfile)
   {
     if (objfile->sf)
-      symtab = objfile->sf->qf->find_pc_sect_symtab (objfile, msymbol,
+      symtab = objfile->sf->qf->find_pc_sect_symtab (objfile, msymbol.minsym,
 						     mapped_pc, section, 0);
     if (symtab)
       break;
@@ -233,9 +233,9 @@ find_pc_partial_function_gnu_ifunc (CORE_ADDR pc, const char **name,
 	 "pathological" case mentioned in print_frame_info.  */
       f = find_pc_sect_function (mapped_pc, section);
       if (f != NULL
-	  && (msymbol == NULL
+	  && (msymbol.minsym == NULL
 	      || (BLOCK_START (SYMBOL_BLOCK_VALUE (f))
-		  >= SYMBOL_VALUE_ADDRESS (msymbol))))
+		  >= SYMBOL_VALUE_ADDRESS (msymbol.minsym))))
 	{
 	  cache_pc_function_low = BLOCK_START (SYMBOL_BLOCK_VALUE (f));
 	  cache_pc_function_high = BLOCK_END (SYMBOL_BLOCK_VALUE (f));
@@ -252,10 +252,10 @@ find_pc_partial_function_gnu_ifunc (CORE_ADDR pc, const char **name,
      last function in the text segment.  */
 
   if (!section)
-    msymbol = NULL;
+    msymbol.minsym = NULL;
 
   /* Must be in the minimal symbol table.  */
-  if (msymbol == NULL)
+  if (msymbol.minsym == NULL)
     {
       /* No available symbol.  */
       if (name != NULL)
@@ -269,42 +269,12 @@ find_pc_partial_function_gnu_ifunc (CORE_ADDR pc, const char **name,
       return 0;
     }
 
-  cache_pc_function_low = SYMBOL_VALUE_ADDRESS (msymbol);
-  cache_pc_function_name = SYMBOL_LINKAGE_NAME (msymbol);
+  cache_pc_function_low = SYMBOL_VALUE_ADDRESS (msymbol.minsym);
+  cache_pc_function_name = SYMBOL_LINKAGE_NAME (msymbol.minsym);
   cache_pc_function_section = section;
-  cache_pc_function_is_gnu_ifunc = MSYMBOL_TYPE (msymbol) == mst_text_gnu_ifunc;
-
-  /* If the minimal symbol has a size, use it for the cache.
-     Otherwise use the lesser of the next minimal symbol in the same
-     section, or the end of the section, as the end of the
-     function.  */
-
-  if (MSYMBOL_SIZE (msymbol) != 0)
-    cache_pc_function_high = cache_pc_function_low + MSYMBOL_SIZE (msymbol);
-  else
-    {
-      /* Step over other symbols at this same address, and symbols in
-	 other sections, to find the next symbol in this section with
-	 a different address.  */
-
-      for (i = 1; SYMBOL_LINKAGE_NAME (msymbol + i) != NULL; i++)
-	{
-	  if (SYMBOL_VALUE_ADDRESS (msymbol + i)
-	      != SYMBOL_VALUE_ADDRESS (msymbol)
-	      && SYMBOL_SECTION (msymbol + i)
-	      == SYMBOL_SECTION (msymbol))
-	    break;
-	}
-
-      if (SYMBOL_LINKAGE_NAME (msymbol + i) != NULL
-	  && SYMBOL_VALUE_ADDRESS (msymbol + i)
-	  < obj_section_endaddr (section))
-	cache_pc_function_high = SYMBOL_VALUE_ADDRESS (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.  */
-	cache_pc_function_high = obj_section_endaddr (section);
-    }
+  cache_pc_function_is_gnu_ifunc = (MSYMBOL_TYPE (msymbol.minsym)
+				    == mst_text_gnu_ifunc);
+  cache_pc_function_high = minimal_symbol_upper_bound (msymbol);
 
  return_cached_value:
 
diff --git a/gdb/minsyms.c b/gdb/minsyms.c
index c7ae981..0981e3d 100644
--- a/gdb/minsyms.c
+++ b/gdb/minsyms.c
@@ -1358,3 +1358,48 @@ find_solib_trampoline_target (struct frame_info *frame, CORE_ADDR pc)
     }
   return 0;
 }
+
+/* See minsyms.h.  */
+
+CORE_ADDR
+minimal_symbol_upper_bound (struct bound_minimal_symbol minsym)
+{
+  int i;
+  short section;
+  struct obj_section *obj_section;
+  CORE_ADDR result;
+  struct minimal_symbol *msymbol;
+
+  gdb_assert (minsym.minsym != NULL);
+
+  /* If the minimal symbol has a size, use it.  Otherwise use the
+     lesser of the next minimal symbol in the same section, or the end
+     of the section, as the end of the function.  */
+
+  if (MSYMBOL_SIZE (minsym.minsym) != 0)
+    return SYMBOL_VALUE_ADDRESS (minsym.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
+     different address.  */
+
+  msymbol = minsym.minsym;
+  section = SYMBOL_SECTION (msymbol);
+  for (i = 1; SYMBOL_LINKAGE_NAME (msymbol + i) != NULL; i++)
+    {
+      if (SYMBOL_VALUE_ADDRESS (msymbol + i) != SYMBOL_VALUE_ADDRESS (msymbol)
+	  && SYMBOL_SECTION (msymbol + i) == section)
+	break;
+    }
+
+  obj_section = SYMBOL_OBJ_SECTION (minsym.objfile, minsym.minsym);
+  if (SYMBOL_LINKAGE_NAME (msymbol + i) != NULL
+      && SYMBOL_VALUE_ADDRESS (msymbol + i) < obj_section_endaddr (obj_section))
+    result = SYMBOL_VALUE_ADDRESS (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.  */
+    result = obj_section_endaddr (obj_section);
+
+  return result;
+}
diff --git a/gdb/minsyms.h b/gdb/minsyms.h
index f4b1c32..f201a73 100644
--- a/gdb/minsyms.h
+++ b/gdb/minsyms.h
@@ -249,4 +249,12 @@ void iterate_over_minimal_symbols (struct objfile *objf,
 						     void *),
 				   void *user_data);
 
+/* Compute the upper bound of MINSYM.  The upper bound is the last
+   address thought to be part of the symbol.  If the symbol has a
+   size, it is used.  Otherwise use the lesser of the next minimal
+   symbol in the same section, or the end of the section, as the end
+   of the function.  */
+
+CORE_ADDR minimal_symbol_upper_bound (struct bound_minimal_symbol minsym);
+
 #endif /* MINSYMS_H */
diff --git a/gdb/objc-lang.c b/gdb/objc-lang.c
index d79f361..8717947 100644
--- a/gdb/objc-lang.c
+++ b/gdb/objc-lang.c
@@ -1260,25 +1260,23 @@ find_objc_msgsend (void)
 
   for (i = 0; i < nmethcalls; i++)
     {
-      struct minimal_symbol *func;
+      struct bound_minimal_symbol func;
 
       /* Try both with and without underscore.  */
-      func = lookup_minimal_symbol (methcalls[i].name, NULL, NULL);
-      if ((func == NULL) && (methcalls[i].name[0] == '_'))
+      func = lookup_bound_minimal_symbol (methcalls[i].name);
+      if ((func.minsym == NULL) && (methcalls[i].name[0] == '_'))
 	{
-	  func = lookup_minimal_symbol (methcalls[i].name + 1, NULL, NULL);
+	  func = lookup_bound_minimal_symbol (methcalls[i].name + 1);
 	}
-      if (func == NULL)
+      if (func.minsym == NULL)
 	{ 
 	  methcalls[i].begin = 0;
 	  methcalls[i].end = 0;
 	  continue; 
 	}
 
-      methcalls[i].begin = SYMBOL_VALUE_ADDRESS (func);
-      do {
-	methcalls[i].end = SYMBOL_VALUE_ADDRESS (++func);
-      } while (methcalls[i].begin == methcalls[i].end);
+      methcalls[i].begin = SYMBOL_VALUE_ADDRESS (func.minsym);
+      methcalls[i].end = minimal_symbol_upper_bound (func);
     }
 }
 
-- 
1.8.1.4

^ permalink raw reply	[flat|nested] 11+ messages in thread

* [FYI v3 08/10] split out elf_read_minimal_symbols
  2014-02-26 20:23 [FYI v3 00/10] share minimal symbols across objfiles Tom Tromey
                   ` (7 preceding siblings ...)
  2014-02-26 19:39 ` [FYI v3 09/10] add short-circuit logic to elfread.c Tom Tromey
@ 2014-02-26 19:39 ` Tom Tromey
  2014-02-26 19:39 ` [FYI v3 01/10] introduce minimal_symbol_upper_bound Tom Tromey
  9 siblings, 0 replies; 11+ messages in thread
From: Tom Tromey @ 2014-02-26 19:39 UTC (permalink / raw)
  To: gdb-patches; +Cc: Tom Tromey

This is just a simple refactoring in elfread.c to split out the
minsym-reading code into its own function.

2014-02-26  Tom Tromey  <tromey@redhat.com>

	* elfread.c (elf_read_minimal_symbols): New function, from
	elf_symfile_read.
	(elf_symfile_read): Call it.
---
 gdb/ChangeLog |  6 +++++
 gdb/elfread.c | 73 ++++++++++++++++++++++++++++++++++-------------------------
 2 files changed, 48 insertions(+), 31 deletions(-)

diff --git a/gdb/elfread.c b/gdb/elfread.c
index fd88813..3aec352 100644
--- a/gdb/elfread.c
+++ b/gdb/elfread.c
@@ -1080,39 +1080,13 @@ elf_gnu_ifunc_resolver_return_stop (struct breakpoint *b)
   update_breakpoint_locations (b, sals, sals_end);
 }
 
-/* Scan and build partial symbols for a symbol file.
-   We have been initialized by a call to elf_symfile_init, which
-   currently does nothing.
-
-   SECTION_OFFSETS is a set of offsets to apply to relocate the symbols
-   in each section.  We simplify it down to a single offset for all
-   symbols.  FIXME.
-
-   This function only does the minimum work necessary for letting the
-   user "name" things symbolically; it does not read the entire symtab.
-   Instead, it reads the external and static symbols and puts them in partial
-   symbol tables.  When more extensive information is requested of a
-   file, the corresponding partial symbol table is mutated into a full
-   fledged symbol table by going back and reading the symbols
-   for real.
-
-   We look for sections with specific names, to tell us what debug
-   format to look for:  FIXME!!!
-
-   elfstab_build_psymtabs() handles STABS symbols;
-   mdebug_build_psymtabs() handles ECOFF debugging information.
-
-   Note that ELF files have a "minimal" symbol table, which looks a lot
-   like a COFF symbol table, but has only the minimal information necessary
-   for linking.  We process this also, and use the information to
-   build gdb's minimal symbol table.  This gives us some minimal debugging
-   capability even for files compiled without -g.  */
+/* A helper function for elf_symfile_read that reads the minimal
+   symbols.  */
 
 static void
-elf_symfile_read (struct objfile *objfile, int symfile_flags)
+elf_read_minimal_symbols (struct objfile *objfile, int symfile_flags)
 {
   bfd *synth_abfd, *abfd = objfile->obfd;
-  struct elfinfo ei;
   struct cleanup *back_to;
   long symcount = 0, dynsymcount = 0, synthcount, storage_needed;
   asymbol **symbol_table = NULL, **dyn_symbol_table = NULL;
@@ -1129,8 +1103,6 @@ elf_symfile_read (struct objfile *objfile, int symfile_flags)
   init_minimal_symbol_collection ();
   back_to = make_cleanup_discard_minimal_symbols ();
 
-  memset ((char *) &ei, 0, sizeof (ei));
-
   /* Allocate struct to keep track of the symfile.  */
   dbx = XCNEW (struct dbx_symfile_info);
   set_objfile_data (objfile, dbx_objfile_data_key, dbx);
@@ -1234,6 +1206,45 @@ elf_symfile_read (struct objfile *objfile, int symfile_flags)
 
   if (symtab_create_debug)
     fprintf_unfiltered (gdb_stdlog, "Done reading minimal symbols.\n");
+}
+
+/* Scan and build partial symbols for a symbol file.
+   We have been initialized by a call to elf_symfile_init, which
+   currently does nothing.
+
+   SECTION_OFFSETS is a set of offsets to apply to relocate the symbols
+   in each section.  We simplify it down to a single offset for all
+   symbols.  FIXME.
+
+   This function only does the minimum work necessary for letting the
+   user "name" things symbolically; it does not read the entire symtab.
+   Instead, it reads the external and static symbols and puts them in partial
+   symbol tables.  When more extensive information is requested of a
+   file, the corresponding partial symbol table is mutated into a full
+   fledged symbol table by going back and reading the symbols
+   for real.
+
+   We look for sections with specific names, to tell us what debug
+   format to look for:  FIXME!!!
+
+   elfstab_build_psymtabs() handles STABS symbols;
+   mdebug_build_psymtabs() handles ECOFF debugging information.
+
+   Note that ELF files have a "minimal" symbol table, which looks a lot
+   like a COFF symbol table, but has only the minimal information necessary
+   for linking.  We process this also, and use the information to
+   build gdb's minimal symbol table.  This gives us some minimal debugging
+   capability even for files compiled without -g.  */
+
+static void
+elf_symfile_read (struct objfile *objfile, int symfile_flags)
+{
+  bfd *abfd = objfile->obfd;
+  struct elfinfo ei;
+
+  elf_read_minimal_symbols (objfile, symfile_flags);
+
+  memset ((char *) &ei, 0, sizeof (ei));
 
   /* Now process debugging information, which is contained in
      special ELF sections.  */
-- 
1.8.1.4

^ permalink raw reply	[flat|nested] 11+ messages in thread

* [FYI v3 10/10] make "file" use the BFD cache better
  2014-02-26 20:23 [FYI v3 00/10] share minimal symbols across objfiles Tom Tromey
                   ` (5 preceding siblings ...)
  2014-02-26 19:07 ` [FYI v3 06/10] change minsyms not to be relocated at read-time Tom Tromey
@ 2014-02-26 19:39 ` Tom Tromey
  2014-02-26 19:39 ` [FYI v3 09/10] add short-circuit logic to elfread.c Tom Tromey
                   ` (2 subsequent siblings)
  9 siblings, 0 replies; 11+ messages in thread
From: Tom Tromey @ 2014-02-26 19:39 UTC (permalink / raw)
  To: gdb-patches; +Cc: Tom Tromey

Right now the "file" command will discard the exec_bfd and then
possibly open a new one.

If this ends up reopening the same file, it can cause needless work by
gdb -- destroying all the per-BFD data just to re-read it again.

This patch changes the code to hold a reference to the old exec_bfd
while opening the new one.

The possible downside of this is a higher peak memory use.

2014-02-26  Tom Tromey  <tromey@redhat.com>

	* exec.c (exec_file_attach): Hold a reference to exec_bfd.
---
 gdb/ChangeLog |  4 ++++
 gdb/exec.c    | 16 ++++++++++++----
 2 files changed, 16 insertions(+), 4 deletions(-)

diff --git a/gdb/exec.c b/gdb/exec.c
index 44dddc1..908858e 100644
--- a/gdb/exec.c
+++ b/gdb/exec.c
@@ -168,6 +168,14 @@ exec_file_clear (int from_tty)
 void
 exec_file_attach (char *filename, int from_tty)
 {
+  struct cleanup *cleanups;
+
+  /* First, acquire a reference to the current exec_bfd.  We release
+     this at the end of the function; but acquiring it now lets the
+     BFD cache return it if this call refers to the same file.  */
+  gdb_bfd_ref (exec_bfd);
+  cleanups = make_cleanup_bfd_unref (exec_bfd);
+
   /* Remove any previous exec file.  */
   exec_close ();
 
@@ -182,7 +190,6 @@ exec_file_attach (char *filename, int from_tty)
     }
   else
     {
-      struct cleanup *cleanups;
       char *scratch_pathname, *canonical_pathname;
       int scratch_chan;
       struct target_section *sections = NULL, *sections_end = NULL;
@@ -205,7 +212,7 @@ exec_file_attach (char *filename, int from_tty)
       if (scratch_chan < 0)
 	perror_with_name (filename);
 
-      cleanups = make_cleanup (xfree, scratch_pathname);
+      make_cleanup (xfree, scratch_pathname);
 
       /* gdb_bfd_open (and its variants) prefers canonicalized pathname for
 	 better BFD caching.  */
@@ -261,9 +268,10 @@ exec_file_attach (char *filename, int from_tty)
       /* Tell display code (if any) about the changed file name.  */
       if (deprecated_exec_file_display_hook)
 	(*deprecated_exec_file_display_hook) (filename);
-
-      do_cleanups (cleanups);
     }
+
+  do_cleanups (cleanups);
+
   bfd_cache_close_all ();
   observer_notify_executable_changed ();
 }
-- 
1.8.1.4

^ permalink raw reply	[flat|nested] 11+ messages in thread

* [FYI v3 00/10] share minimal symbols across objfiles
@ 2014-02-26 20:23 Tom Tromey
  2014-02-26 19:01 ` [FYI v3 03/10] make MSYMBOL_VALUE_ADDRESS an rvalue Tom Tromey
                   ` (9 more replies)
  0 siblings, 10 replies; 11+ messages in thread
From: Tom Tromey @ 2014-02-26 20:23 UTC (permalink / raw)
  To: gdb-patches

I'm pushing this series now.

v2 was posted here:

    https://sourceware.org/ml/gdb-patches/2013-10/msg00521.html

v3 does not differ in any substantial way; some minor fixups were
required due to rebasing it periodically since last October.

Please note that it is not unlikely that this series will break the
build and/or introduce regressions.  Please report problems to me and
I will try to fix them or help you fix them.  Based on my experiences
with the branch, the build breaks are generally trivial to solve.

The v2 note describes the original testing I did.  At some point since
then I've redone the regression tests on AIX.  For this final rebase I
rebuilt using the mingw cross tools on x86-86 Fedora 18, and I built
and regtested on x86-64 Fedora 18.

Tom

^ permalink raw reply	[flat|nested] 11+ messages in thread

end of thread, other threads:[~2014-02-26 20:23 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-02-26 20:23 [FYI v3 00/10] share minimal symbols across objfiles Tom Tromey
2014-02-26 19:01 ` [FYI v3 03/10] make MSYMBOL_VALUE_ADDRESS an rvalue Tom Tromey
2014-02-26 19:01 ` [FYI v3 05/10] start change to progspace independence Tom Tromey
2014-02-26 19:01 ` [FYI v3 07/10] move minimal symbols to per-bfd Tom Tromey
2014-02-26 19:01 ` [FYI v3 02/10] change minsym representation Tom Tromey
2014-02-26 19:01 ` [FYI v3 04/10] use bound_minsym as result for lookup_minimal_symbol et al Tom Tromey
2014-02-26 19:07 ` [FYI v3 06/10] change minsyms not to be relocated at read-time Tom Tromey
2014-02-26 19:39 ` [FYI v3 10/10] make "file" use the BFD cache better Tom Tromey
2014-02-26 19:39 ` [FYI v3 09/10] add short-circuit logic to elfread.c Tom Tromey
2014-02-26 19:39 ` [FYI v3 08/10] split out elf_read_minimal_symbols Tom Tromey
2014-02-26 19:39 ` [FYI v3 01/10] introduce minimal_symbol_upper_bound Tom Tromey

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).