| Index: gdb/minsyms.c
|
| diff --git a/gdb/minsyms.c b/gdb/minsyms.c
|
| index 1070fff644e8a08446632895ac642a25c8d743e6..db830c7a836665144eba6411ce941923de259020 100644
|
| --- a/gdb/minsyms.c
|
| +++ b/gdb/minsyms.c
|
| @@ -1,5 +1,5 @@
|
| /* GDB routines for manipulating the minimal symbol tables.
|
| - Copyright (C) 1992-2004, 2007-2012 Free Software Foundation, Inc.
|
| + Copyright (C) 1992-2013 Free Software Foundation, Inc.
|
| Contributed by Cygnus Support, using pieces from other GDB modules.
|
|
|
| This file is part of GDB.
|
| @@ -38,7 +38,7 @@
|
|
|
| #include "defs.h"
|
| #include <ctype.h>
|
| -#include "gdb_string.h"
|
| +#include <string.h>
|
| #include "symtab.h"
|
| #include "bfd.h"
|
| #include "filenames.h"
|
| @@ -50,6 +50,7 @@
|
| #include "target.h"
|
| #include "cp-support.h"
|
| #include "language.h"
|
| +#include "cli/cli-utils.h"
|
|
|
| /* 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
|
| @@ -85,8 +86,7 @@ msymbol_hash_iw (const char *string)
|
|
|
| while (*string && *string != '(')
|
| {
|
| - while (isspace (*string))
|
| - ++string;
|
| + string = skip_spaces_const (string);
|
| if (*string && *string != '(')
|
| {
|
| hash = SYMBOL_HASH_NEXT (hash, *string);
|
| @@ -139,27 +139,6 @@ add_minsym_to_demangled_hash_table (struct minimal_symbol *sym,
|
| }
|
| }
|
|
|
| -/* See minsyms.h. */
|
| -
|
| -struct objfile *
|
| -msymbol_objfile (struct minimal_symbol *sym)
|
| -{
|
| - struct objfile *objf;
|
| - struct minimal_symbol *tsym;
|
| -
|
| - unsigned int hash
|
| - = msymbol_hash (SYMBOL_LINKAGE_NAME (sym)) % MINIMAL_SYMBOL_HASH_SIZE;
|
| -
|
| - for (objf = object_files; objf; objf = objf->next)
|
| - for (tsym = objf->msymbol_hash[hash]; tsym; tsym = tsym->hash_next)
|
| - if (tsym == sym)
|
| - return objf;
|
| -
|
| - /* We should always be able to find the objfile ... */
|
| - internal_error (__FILE__, __LINE__, _("failed internal consistency check"));
|
| -}
|
| -
|
| -
|
| /* 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
|
| @@ -180,15 +159,14 @@ msymbol_objfile (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. */
|
|
|
| -struct minimal_symbol *
|
| -lookup_minimal_symbol (const char *name, const char *sfile,
|
| - struct objfile *objf)
|
| +static struct bound_minimal_symbol
|
| +lookup_minimal_symbol_internal (const char *name, const char *sfile,
|
| + struct objfile *objf)
|
| {
|
| struct objfile *objfile;
|
| - struct minimal_symbol *msymbol;
|
| - struct minimal_symbol *found_symbol = NULL;
|
| - struct minimal_symbol *found_file_symbol = NULL;
|
| - struct minimal_symbol *trampoline_symbol = NULL;
|
| + struct bound_minimal_symbol found_symbol = { NULL, NULL };
|
| + struct bound_minimal_symbol found_file_symbol = { NULL, NULL };
|
| + struct bound_minimal_symbol trampoline_symbol = { NULL, NULL };
|
|
|
| unsigned int hash = msymbol_hash (name) % MINIMAL_SYMBOL_HASH_SIZE;
|
| unsigned int dem_hash = msymbol_hash_iw (name) % MINIMAL_SYMBOL_HASH_SIZE;
|
| @@ -213,9 +191,11 @@ lookup_minimal_symbol (const char *name, const char *sfile,
|
| }
|
|
|
| for (objfile = object_files;
|
| - objfile != NULL && found_symbol == NULL;
|
| + objfile != NULL && found_symbol.minsym == NULL;
|
| objfile = objfile->next)
|
| {
|
| + struct minimal_symbol *msymbol;
|
| +
|
| if (objf == NULL || objf == objfile
|
| || objf == objfile->separate_debug_objfile_backlink)
|
| {
|
| @@ -223,7 +203,7 @@ lookup_minimal_symbol (const char *name, const char *sfile,
|
| and the second over the demangled hash table. */
|
| int pass;
|
|
|
| - for (pass = 1; pass <= 2 && found_symbol == NULL; pass++)
|
| + for (pass = 1; pass <= 2 && found_symbol.minsym == NULL; pass++)
|
| {
|
| /* Select hash list according to pass. */
|
| if (pass == 1)
|
| @@ -231,7 +211,7 @@ lookup_minimal_symbol (const char *name, const char *sfile,
|
| else
|
| msymbol = objfile->msymbol_demangled_hash[dem_hash];
|
|
|
| - while (msymbol != NULL && found_symbol == NULL)
|
| + while (msymbol != NULL && found_symbol.minsym == NULL)
|
| {
|
| int match;
|
|
|
| @@ -260,7 +240,10 @@ lookup_minimal_symbol (const char *name, const char *sfile,
|
| case mst_file_bss:
|
| if (sfile == NULL
|
| || filename_cmp (msymbol->filename, sfile) == 0)
|
| - found_file_symbol = msymbol;
|
| + {
|
| + found_file_symbol.minsym = msymbol;
|
| + found_file_symbol.objfile = objfile;
|
| + }
|
| break;
|
|
|
| case mst_solib_trampoline:
|
| @@ -269,13 +252,17 @@ lookup_minimal_symbol (const char *name, const char *sfile,
|
| keep looking for the *real* symbol. If the
|
| actual symbol is not found, then we'll use the
|
| trampoline entry. */
|
| - if (trampoline_symbol == NULL)
|
| - trampoline_symbol = msymbol;
|
| + if (trampoline_symbol.minsym == NULL)
|
| + {
|
| + trampoline_symbol.minsym = msymbol;
|
| + trampoline_symbol.objfile = objfile;
|
| + }
|
| break;
|
|
|
| case mst_unknown:
|
| default:
|
| - found_symbol = msymbol;
|
| + found_symbol.minsym = msymbol;
|
| + found_symbol.objfile = objfile;
|
| break;
|
| }
|
| }
|
| @@ -294,18 +281,36 @@ lookup_minimal_symbol (const char *name, const char *sfile,
|
| xfree ((void *) modified_name);
|
|
|
| /* External symbols are best. */
|
| - if (found_symbol)
|
| + if (found_symbol.minsym != NULL)
|
| return found_symbol;
|
|
|
| /* File-local symbols are next best. */
|
| - if (found_file_symbol)
|
| + if (found_file_symbol.minsym != NULL)
|
| return found_file_symbol;
|
|
|
| /* Symbols for shared library trampolines are next best. */
|
| - if (trampoline_symbol)
|
| - return trampoline_symbol;
|
| + return trampoline_symbol;
|
| +}
|
|
|
| - return NULL;
|
| +/* 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);
|
| }
|
|
|
| /* See minsyms.h. */
|
| @@ -474,7 +479,7 @@ lookup_minimal_symbol_solib_trampoline (const char *name,
|
| there are text and trampoline symbols at the same address.
|
| Otherwise prefer mst_text symbols. */
|
|
|
| -static struct minimal_symbol *
|
| +static struct bound_minimal_symbol
|
| lookup_minimal_symbol_by_pc_section_1 (CORE_ADDR pc,
|
| struct obj_section *section,
|
| int want_trampoline)
|
| @@ -485,6 +490,8 @@ lookup_minimal_symbol_by_pc_section_1 (CORE_ADDR pc,
|
| struct objfile *objfile;
|
| struct minimal_symbol *msymbol;
|
| struct minimal_symbol *best_symbol = NULL;
|
| + struct objfile *best_objfile = NULL;
|
| + struct bound_minimal_symbol result;
|
| enum minimal_symbol_type want_type, other_type;
|
|
|
| want_type = want_trampoline ? mst_solib_trampoline : mst_text;
|
| @@ -591,9 +598,10 @@ 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 (&msymbol[hi]) != NULL
|
| + && SYMBOL_OBJ_SECTION (objfile, &msymbol[hi]) != NULL
|
| && (!matching_obj_sections
|
| - (SYMBOL_OBJ_SECTION (&msymbol[hi]), section)))
|
| + (SYMBOL_OBJ_SECTION (objfile, &msymbol[hi]),
|
| + section)))
|
| {
|
| hi--;
|
| continue;
|
| @@ -610,8 +618,8 @@ lookup_minimal_symbol_by_pc_section_1 (CORE_ADDR pc,
|
| == MSYMBOL_SIZE (&msymbol[hi - 1]))
|
| && (SYMBOL_VALUE_ADDRESS (&msymbol[hi])
|
| == SYMBOL_VALUE_ADDRESS (&msymbol[hi - 1]))
|
| - && (SYMBOL_OBJ_SECTION (&msymbol[hi])
|
| - == SYMBOL_OBJ_SECTION (&msymbol[hi - 1])))
|
| + && (SYMBOL_OBJ_SECTION (objfile, &msymbol[hi])
|
| + == SYMBOL_OBJ_SECTION (objfile, &msymbol[hi - 1])))
|
| {
|
| hi--;
|
| continue;
|
| @@ -690,14 +698,18 @@ lookup_minimal_symbol_by_pc_section_1 (CORE_ADDR pc,
|
| SYMBOL_VALUE_ADDRESS (&msymbol[hi]))))
|
| {
|
| best_symbol = &msymbol[hi];
|
| + best_objfile = objfile;
|
| }
|
| }
|
| }
|
| }
|
| - return (best_symbol);
|
| +
|
| + result.minsym = best_symbol;
|
| + result.objfile = best_objfile;
|
| + return result;
|
| }
|
|
|
| -struct minimal_symbol *
|
| +struct bound_minimal_symbol
|
| lookup_minimal_symbol_by_pc_section (CORE_ADDR pc, struct obj_section *section)
|
| {
|
| if (section == NULL)
|
| @@ -707,17 +719,31 @@ lookup_minimal_symbol_by_pc_section (CORE_ADDR pc, struct obj_section *section)
|
| debugging) always returns NULL making the call somewhat useless. */
|
| section = find_pc_section (pc);
|
| if (section == NULL)
|
| - return NULL;
|
| + {
|
| + struct bound_minimal_symbol result;
|
| +
|
| + memset (&result, 0, sizeof (result));
|
| + return result;
|
| + }
|
| }
|
| return lookup_minimal_symbol_by_pc_section_1 (pc, section, 0);
|
| }
|
|
|
| /* See minsyms.h. */
|
|
|
| -struct minimal_symbol *
|
| +struct bound_minimal_symbol
|
| lookup_minimal_symbol_by_pc (CORE_ADDR pc)
|
| {
|
| - return lookup_minimal_symbol_by_pc_section (pc, NULL);
|
| + struct obj_section *section = find_pc_section (pc);
|
| +
|
| + if (section == NULL)
|
| + {
|
| + struct bound_minimal_symbol result;
|
| +
|
| + memset (&result, 0, sizeof (result));
|
| + return result;
|
| + }
|
| + return lookup_minimal_symbol_by_pc_section_1 (pc, section, 0);
|
| }
|
|
|
| /* Return non-zero iff PC is in an STT_GNU_IFUNC function resolver. */
|
| @@ -725,9 +751,9 @@ lookup_minimal_symbol_by_pc (CORE_ADDR pc)
|
| int
|
| in_gnu_ifunc_stub (CORE_ADDR pc)
|
| {
|
| - struct minimal_symbol *msymbol = lookup_minimal_symbol_by_pc (pc);
|
| + struct bound_minimal_symbol msymbol = lookup_minimal_symbol_by_pc (pc);
|
|
|
| - return msymbol && MSYMBOL_TYPE (msymbol) == mst_text_gnu_ifunc;
|
| + return msymbol.minsym && MSYMBOL_TYPE (msymbol.minsym) == mst_text_gnu_ifunc;
|
| }
|
|
|
| /* See elf_gnu_ifunc_resolve_addr for its real implementation. */
|
| @@ -785,10 +811,10 @@ const struct gnu_ifunc_fns *gnu_ifunc_fns_p = &stub_gnu_ifunc_fns;
|
|
|
| /* See minsyms.h. */
|
|
|
| -struct minimal_symbol *
|
| -lookup_minimal_symbol_and_objfile (const char *name,
|
| - struct objfile **objfile_p)
|
| +struct bound_minimal_symbol
|
| +lookup_minimal_symbol_and_objfile (const char *name)
|
| {
|
| + struct bound_minimal_symbol result;
|
| struct objfile *objfile;
|
| unsigned int hash = msymbol_hash (name) % MINIMAL_SYMBOL_HASH_SIZE;
|
|
|
| @@ -802,21 +828,21 @@ lookup_minimal_symbol_and_objfile (const char *name,
|
| {
|
| if (strcmp (SYMBOL_LINKAGE_NAME (msym), name) == 0)
|
| {
|
| - *objfile_p = objfile;
|
| - return msym;
|
| + result.minsym = msym;
|
| + result.objfile = objfile;
|
| + return result;
|
| }
|
| }
|
| }
|
|
|
| - return 0;
|
| + memset (&result, 0, sizeof (result));
|
| + return result;
|
| }
|
|
|
|
|
| /* Return leading symbol character for a BFD. If BFD is NULL,
|
| return the leading symbol character from the main objfile. */
|
|
|
| -static int get_symbol_leading_char (bfd *);
|
| -
|
| static int
|
| get_symbol_leading_char (bfd *abfd)
|
| {
|
| @@ -870,7 +896,7 @@ prim_record_minimal_symbol (const char *name, CORE_ADDR address,
|
| }
|
|
|
| prim_record_minimal_symbol_and_info (name, address, ms_type,
|
| - section, NULL, objfile);
|
| + section, objfile);
|
| }
|
|
|
| /* See minsyms.h. */
|
| @@ -880,7 +906,6 @@ prim_record_minimal_symbol_full (const char *name, int name_len, int copy_name,
|
| CORE_ADDR address,
|
| enum minimal_symbol_type ms_type,
|
| int section,
|
| - asection *bfd_section,
|
| struct objfile *objfile)
|
| {
|
| struct obj_section *obj_section;
|
| @@ -916,28 +941,18 @@ 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);
|
| + SYMBOL_SET_LANGUAGE (msymbol, language_auto, &objfile->objfile_obstack);
|
| SYMBOL_SET_NAMES (msymbol, name, name_len, copy_name, objfile);
|
|
|
| SYMBOL_VALUE_ADDRESS (msymbol) = address;
|
| SYMBOL_SECTION (msymbol) = section;
|
| - SYMBOL_OBJ_SECTION (msymbol) = NULL;
|
| -
|
| - /* Find obj_section corresponding to bfd_section. */
|
| - if (bfd_section)
|
| - ALL_OBJFILE_OSECTIONS (objfile, obj_section)
|
| - {
|
| - if (obj_section->the_bfd_section == bfd_section)
|
| - {
|
| - SYMBOL_OBJ_SECTION (msymbol) = obj_section;
|
| - break;
|
| - }
|
| - }
|
|
|
| MSYMBOL_TYPE (msymbol) = ms_type;
|
| MSYMBOL_TARGET_FLAG_1 (msymbol) = 0;
|
| MSYMBOL_TARGET_FLAG_2 (msymbol) = 0;
|
| - MSYMBOL_SIZE (msymbol) = 0;
|
| + /* Do not use the SET_MSYMBOL_SIZE macro to initialize the size,
|
| + as it would also set the has_size flag. */
|
| + msymbol->size = 0;
|
|
|
| /* The hash pointers must be cleared! If they're not,
|
| add_minsym_to_hash_table will NOT add this msymbol to the hash table. */
|
| @@ -956,12 +971,11 @@ struct minimal_symbol *
|
| prim_record_minimal_symbol_and_info (const char *name, CORE_ADDR address,
|
| enum minimal_symbol_type ms_type,
|
| int section,
|
| - asection *bfd_section,
|
| struct objfile *objfile)
|
| {
|
| return prim_record_minimal_symbol_full (name, strlen (name), 1,
|
| - address, ms_type, section,
|
| - bfd_section, objfile);
|
| + address, ms_type,
|
| + section, objfile);
|
| }
|
|
|
| /* Compare two minimal symbols by address and return a signed result based
|
| @@ -1171,7 +1185,7 @@ install_minimal_symbols (struct objfile *objfile)
|
| {
|
| fprintf_unfiltered (gdb_stdlog,
|
| "Installing %d minimal symbols of objfile %s.\n",
|
| - msym_count, objfile->name);
|
| + msym_count, objfile_name (objfile));
|
| }
|
|
|
| /* Allocate enough space in the obstack, into which we will gather the
|
| @@ -1229,13 +1243,7 @@ install_minimal_symbols (struct objfile *objfile)
|
| symbol count does *not* include this null symbol, which is why it
|
| is indexed by mcount and not mcount-1. */
|
|
|
| - SYMBOL_LINKAGE_NAME (&msymbols[mcount]) = NULL;
|
| - SYMBOL_VALUE_ADDRESS (&msymbols[mcount]) = 0;
|
| - MSYMBOL_TARGET_FLAG_1 (&msymbols[mcount]) = 0;
|
| - MSYMBOL_TARGET_FLAG_2 (&msymbols[mcount]) = 0;
|
| - MSYMBOL_SIZE (&msymbols[mcount]) = 0;
|
| - MSYMBOL_TYPE (&msymbols[mcount]) = mst_unknown;
|
| - SYMBOL_SET_LANGUAGE (&msymbols[mcount], language_unknown);
|
| + 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
|
| @@ -1244,29 +1252,6 @@ install_minimal_symbols (struct objfile *objfile)
|
| objfile->minimal_symbol_count = mcount;
|
| objfile->msymbols = msymbols;
|
|
|
| - /* Try to guess the appropriate C++ ABI by looking at the names
|
| - of the minimal symbols in the table. */
|
| - {
|
| - int i;
|
| -
|
| - for (i = 0; i < mcount; i++)
|
| - {
|
| - /* If a symbol's name starts with _Z and was successfully
|
| - demangled, then we can assume we've found a GNU v3 symbol.
|
| - For now we set the C++ ABI globally; if the user is
|
| - mixing ABIs then the user will need to "set cp-abi"
|
| - manually. */
|
| - const char *name = SYMBOL_LINKAGE_NAME (&objfile->msymbols[i]);
|
| -
|
| - if (name[0] == '_' && name[1] == 'Z'
|
| - && SYMBOL_DEMANGLED_NAME (&objfile->msymbols[i]) != NULL)
|
| - {
|
| - set_cp_abi_as_auto_default ("gnu-v3");
|
| - break;
|
| - }
|
| - }
|
| - }
|
| -
|
| /* Now build the hash tables; we can't do this incrementally
|
| at an earlier point since we weren't finished with the obstack
|
| yet. (And if the msymbol obstack gets moved, all the internal
|
| @@ -1292,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);
|
| + SYMBOL_SET_LANGUAGE (m, language_unknown, &objfile->objfile_obstack);
|
| }
|
| }
|
|
|
| @@ -1306,20 +1291,23 @@ msymbols_sort (struct objfile *objfile)
|
| build_minimal_symbol_hash_tables (objfile);
|
| }
|
|
|
| -/* See minsyms.h. */
|
| +/* 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. */
|
|
|
| -struct minimal_symbol *
|
| +static struct minimal_symbol *
|
| lookup_solib_trampoline_symbol_by_pc (CORE_ADDR pc)
|
| {
|
| struct obj_section *section = find_pc_section (pc);
|
| - struct minimal_symbol *msymbol;
|
| + struct bound_minimal_symbol msymbol;
|
|
|
| if (section == NULL)
|
| return NULL;
|
| msymbol = lookup_minimal_symbol_by_pc_section_1 (pc, section, 1);
|
|
|
| - if (msymbol != NULL && MSYMBOL_TYPE (msymbol) == mst_solib_trampoline)
|
| - return msymbol;
|
| + if (msymbol.minsym != NULL
|
| + && MSYMBOL_TYPE (msymbol.minsym) == mst_solib_trampoline)
|
| + return msymbol.minsym;
|
| return NULL;
|
| }
|
|
|
|
|