* xcoffread.c (scan_xcoff_symtab): Update.

* symfile.h (add_psymbol_to_list): Update prototype.
	* symfile.c (add_psymbol_to_bcache): Add copy_name argument.
	(add_psymbol_to_list): Likewise.
	* stabsread.c (define_symbol): Update.
	* mdebugread.c (parse_partial_symbols): Update.
	(handle_psymbol_enumerators): Update.
	(new_symbol): Update.
	* dbxread.c (read_dbx_symtab): Update.
	* coffread.c (process_coff_symbol): Update.
	* symtab.h (prim_record_minimal_symbol_full): Declare.
	(SYMBOL_SET_NAMES): Add copy_name argument.
	* symtab.c (struct demangled_name_entry): New struct.
	(hash_demangled_name_entry): New function.
	(eq_demangled_name_entry): Likewise.
	(create_demangled_names_hash): Use new functions.
	(symbol_set_names): Use struct demangled_name_entry.  Add
	copy_name argument.
	* minsyms.c (prim_record_minimal_symbol_full): New function.
	(prim_record_minimal_symbol_and_info): Use it.
	* elfread.c (record_minimal_symbol): Add name_len and copy_name
	arguments.  Call prim_record_minimal_symbol_full.
	(elf_symtab_read): Add copy_names argument.
	(elf_symfile_read): Update calls to elf_symtab_read.
	* dwarf2read.c (add_partial_symbol): Don't copy symbol names.
	(load_partial_dies): Likewise.
	(new_symbol): Likewise.
	* cp-namespace.c (check_one_possible_namespace_symbol): Don't save
	name on the obstack.  Update call to SYMBOL_SET_NAMES.
This commit is contained in:
Tom Tromey 2009-11-16 18:40:23 +00:00
parent fd7dd3e67a
commit 04a679b8f5
15 changed files with 228 additions and 97 deletions

View file

@ -1,3 +1,35 @@
2009-11-16 Tom Tromey <tromey@redhat.com>
* xcoffread.c (scan_xcoff_symtab): Update.
* symfile.h (add_psymbol_to_list): Update prototype.
* symfile.c (add_psymbol_to_bcache): Add copy_name argument.
(add_psymbol_to_list): Likewise.
* stabsread.c (define_symbol): Update.
* mdebugread.c (parse_partial_symbols): Update.
(handle_psymbol_enumerators): Update.
(new_symbol): Update.
* dbxread.c (read_dbx_symtab): Update.
* coffread.c (process_coff_symbol): Update.
* symtab.h (prim_record_minimal_symbol_full): Declare.
(SYMBOL_SET_NAMES): Add copy_name argument.
* symtab.c (struct demangled_name_entry): New struct.
(hash_demangled_name_entry): New function.
(eq_demangled_name_entry): Likewise.
(create_demangled_names_hash): Use new functions.
(symbol_set_names): Use struct demangled_name_entry. Add
copy_name argument.
* minsyms.c (prim_record_minimal_symbol_full): New function.
(prim_record_minimal_symbol_and_info): Use it.
* elfread.c (record_minimal_symbol): Add name_len and copy_name
arguments. Call prim_record_minimal_symbol_full.
(elf_symtab_read): Add copy_names argument.
(elf_symfile_read): Update calls to elf_symtab_read.
* dwarf2read.c (add_partial_symbol): Don't copy symbol names.
(load_partial_dies): Likewise.
(new_symbol): Likewise.
* cp-namespace.c (check_one_possible_namespace_symbol): Don't save
name on the obstack. Update call to SYMBOL_SET_NAMES.
2009-11-15 Pedro Alves <pedro@codesourcery.com>
* infrun.c (handle_inferior_event): When handling a fork or vfork

View file

@ -1503,7 +1503,7 @@ process_coff_symbol (struct coff_symbol *cs,
name = cs->c_name;
name = EXTERNAL_NAME (name, objfile->obfd);
SYMBOL_LANGUAGE (sym) = current_subfile->language;
SYMBOL_SET_NAMES (sym, name, strlen (name), objfile);
SYMBOL_SET_NAMES (sym, name, strlen (name), 1, objfile);
/* default assumptions */
SYMBOL_VALUE (sym) = cs->c_value;

View file

@ -714,7 +714,6 @@ check_one_possible_namespace_symbol (const char *name, int len,
if (sym == NULL)
{
struct type *type;
name_copy = obsavestring (name, len, &objfile->objfile_obstack);
type = init_type (TYPE_CODE_NAMESPACE, 0, 0, name_copy, objfile);
@ -723,7 +722,9 @@ check_one_possible_namespace_symbol (const char *name, int len,
sym = obstack_alloc (&objfile->objfile_obstack, sizeof (struct symbol));
memset (sym, 0, sizeof (struct symbol));
SYMBOL_LANGUAGE (sym) = language_cplus;
SYMBOL_SET_NAMES (sym, name_copy, len, objfile);
/* Note that init_type copied the name to the objfile's
obstack. */
SYMBOL_SET_NAMES (sym, TYPE_NAME (type), len, 0, objfile);
SYMBOL_CLASS (sym) = LOC_TYPEDEF;
SYMBOL_TYPE (sym) = type;
SYMBOL_DOMAIN (sym) = VAR_DOMAIN;

View file

@ -1726,7 +1726,7 @@ pos %d"),
namestring = gdbarch_static_transform_name (gdbarch,
namestring);
add_psymbol_to_list (sym_name, sym_len,
add_psymbol_to_list (sym_name, sym_len, 1,
VAR_DOMAIN, LOC_STATIC,
&objfile->static_psymbols,
0, nlist.n_value,
@ -1738,7 +1738,7 @@ pos %d"),
data_sect_index);
/* The addresses in these entries are reported to be
wrong. See the code that reads 'G's for symtabs. */
add_psymbol_to_list (sym_name, sym_len,
add_psymbol_to_list (sym_name, sym_len, 1,
VAR_DOMAIN, LOC_STATIC,
&objfile->global_psymbols,
0, nlist.n_value,
@ -1756,7 +1756,7 @@ pos %d"),
|| (p == namestring + 1
&& namestring[0] != ' '))
{
add_psymbol_to_list (sym_name, sym_len,
add_psymbol_to_list (sym_name, sym_len, 1,
STRUCT_DOMAIN, LOC_TYPEDEF,
&objfile->static_psymbols,
nlist.n_value, 0,
@ -1764,7 +1764,7 @@ pos %d"),
if (p[2] == 't')
{
/* Also a typedef with the same name. */
add_psymbol_to_list (sym_name, sym_len,
add_psymbol_to_list (sym_name, sym_len, 1,
VAR_DOMAIN, LOC_TYPEDEF,
&objfile->static_psymbols,
nlist.n_value, 0,
@ -1777,7 +1777,7 @@ pos %d"),
case 't':
if (p != namestring) /* a name is there, not just :T... */
{
add_psymbol_to_list (sym_name, sym_len,
add_psymbol_to_list (sym_name, sym_len, 1,
VAR_DOMAIN, LOC_TYPEDEF,
&objfile->static_psymbols,
nlist.n_value, 0,
@ -1839,7 +1839,7 @@ pos %d"),
;
/* Note that the value doesn't matter for
enum constants in psymtabs, just in symtabs. */
add_psymbol_to_list (p, q - p,
add_psymbol_to_list (p, q - p, 1,
VAR_DOMAIN, LOC_CONST,
&objfile->static_psymbols, 0,
0, psymtab_language, objfile);
@ -1857,7 +1857,7 @@ pos %d"),
case 'c':
/* Constant, e.g. from "const" in Pascal. */
add_psymbol_to_list (sym_name, sym_len,
add_psymbol_to_list (sym_name, sym_len, 1,
VAR_DOMAIN, LOC_CONST,
&objfile->static_psymbols, nlist.n_value,
0, psymtab_language, objfile);
@ -1921,7 +1921,7 @@ pos %d"),
pst->textlow = nlist.n_value;
textlow_not_set = 0;
}
add_psymbol_to_list (sym_name, sym_len,
add_psymbol_to_list (sym_name, sym_len, 1,
VAR_DOMAIN, LOC_BLOCK,
&objfile->static_psymbols,
0, nlist.n_value,
@ -1989,7 +1989,7 @@ pos %d"),
pst->textlow = nlist.n_value;
textlow_not_set = 0;
}
add_psymbol_to_list (sym_name, sym_len,
add_psymbol_to_list (sym_name, sym_len, 1,
VAR_DOMAIN, LOC_BLOCK,
&objfile->global_psymbols,
0, nlist.n_value,

View file

@ -2460,6 +2460,7 @@ add_partial_symbol (struct partial_die_info *pdi, struct dwarf2_cu *cu)
/*prim_record_minimal_symbol (actual_name, pdi->lowpc + baseaddr,
mst_text, objfile); */
psym = add_psymbol_to_list (actual_name, strlen (actual_name),
built_actual_name,
VAR_DOMAIN, LOC_BLOCK,
&objfile->global_psymbols,
0, pdi->lowpc + baseaddr,
@ -2470,6 +2471,7 @@ add_partial_symbol (struct partial_die_info *pdi, struct dwarf2_cu *cu)
/*prim_record_minimal_symbol (actual_name, pdi->lowpc + baseaddr,
mst_file_text, objfile); */
psym = add_psymbol_to_list (actual_name, strlen (actual_name),
built_actual_name,
VAR_DOMAIN, LOC_BLOCK,
&objfile->static_psymbols,
0, pdi->lowpc + baseaddr,
@ -2496,6 +2498,7 @@ add_partial_symbol (struct partial_die_info *pdi, struct dwarf2_cu *cu)
addr = decode_locdesc (pdi->locdesc, cu);
if (pdi->locdesc || pdi->has_type)
psym = add_psymbol_to_list (actual_name, strlen (actual_name),
built_actual_name,
VAR_DOMAIN, LOC_STATIC,
&objfile->global_psymbols,
0, addr + baseaddr,
@ -2514,6 +2517,7 @@ add_partial_symbol (struct partial_die_info *pdi, struct dwarf2_cu *cu)
/*prim_record_minimal_symbol (actual_name, addr + baseaddr,
mst_file_data, objfile); */
psym = add_psymbol_to_list (actual_name, strlen (actual_name),
built_actual_name,
VAR_DOMAIN, LOC_STATIC,
&objfile->static_psymbols,
0, addr + baseaddr,
@ -2524,12 +2528,14 @@ add_partial_symbol (struct partial_die_info *pdi, struct dwarf2_cu *cu)
case DW_TAG_base_type:
case DW_TAG_subrange_type:
add_psymbol_to_list (actual_name, strlen (actual_name),
built_actual_name,
VAR_DOMAIN, LOC_TYPEDEF,
&objfile->static_psymbols,
0, (CORE_ADDR) 0, cu->language, objfile);
break;
case DW_TAG_namespace:
add_psymbol_to_list (actual_name, strlen (actual_name),
built_actual_name,
VAR_DOMAIN, LOC_TYPEDEF,
&objfile->global_psymbols,
0, (CORE_ADDR) 0, cu->language, objfile);
@ -2554,6 +2560,7 @@ add_partial_symbol (struct partial_die_info *pdi, struct dwarf2_cu *cu)
/* NOTE: carlton/2003-10-07: See comment in new_symbol about
static vs. global. */
add_psymbol_to_list (actual_name, strlen (actual_name),
built_actual_name,
STRUCT_DOMAIN, LOC_TYPEDEF,
(cu->language == language_cplus
|| cu->language == language_java)
@ -2564,6 +2571,7 @@ add_partial_symbol (struct partial_die_info *pdi, struct dwarf2_cu *cu)
break;
case DW_TAG_enumerator:
add_psymbol_to_list (actual_name, strlen (actual_name),
built_actual_name,
VAR_DOMAIN, LOC_CONST,
(cu->language == language_cplus
|| cu->language == language_java)
@ -6572,7 +6580,7 @@ load_partial_dies (bfd *abfd, gdb_byte *buffer, gdb_byte *info_ptr,
|| part_die->tag == DW_TAG_subrange_type))
{
if (building_psymtab && part_die->name != NULL)
add_psymbol_to_list (part_die->name, strlen (part_die->name),
add_psymbol_to_list (part_die->name, strlen (part_die->name), 0,
VAR_DOMAIN, LOC_TYPEDEF,
&cu->objfile->static_psymbols,
0, (CORE_ADDR) 0, cu->language, cu->objfile);
@ -6593,7 +6601,7 @@ load_partial_dies (bfd *abfd, gdb_byte *buffer, gdb_byte *info_ptr,
if (part_die->name == NULL)
complaint (&symfile_complaints, _("malformed enumerator DIE ignored"));
else if (building_psymtab)
add_psymbol_to_list (part_die->name, strlen (part_die->name),
add_psymbol_to_list (part_die->name, strlen (part_die->name), 0,
VAR_DOMAIN, LOC_CONST,
(cu->language == language_cplus
|| cu->language == language_java)
@ -8325,7 +8333,7 @@ new_symbol (struct die_info *die, struct type *type, struct dwarf2_cu *cu)
/* Cache this symbol's name and the name's demangled form (if any). */
SYMBOL_LANGUAGE (sym) = cu->language;
SYMBOL_SET_NAMES (sym, name, strlen (name), objfile);
SYMBOL_SET_NAMES (sym, name, strlen (name), 0, objfile);
/* Default assumptions.
Use the passed type or decode it from the die. */

View file

@ -172,7 +172,8 @@ elf_locate_sections (bfd *ignore_abfd, asection *sectp, void *eip)
}
static struct minimal_symbol *
record_minimal_symbol (char *name, CORE_ADDR address,
record_minimal_symbol (const char *name, int name_len, int copy_name,
CORE_ADDR address,
enum minimal_symbol_type ms_type,
asection *bfd_section, struct objfile *objfile)
{
@ -181,8 +182,9 @@ record_minimal_symbol (char *name, CORE_ADDR address,
if (ms_type == mst_text || ms_type == mst_file_text)
address = gdbarch_smash_text_address (gdbarch, address);
return prim_record_minimal_symbol_and_info
(name, address, ms_type, bfd_section->index, bfd_section, objfile);
return prim_record_minimal_symbol_full (name, name_len, copy_name, address,
ms_type, bfd_section->index,
bfd_section, objfile);
}
/*
@ -216,7 +218,8 @@ record_minimal_symbol (char *name, CORE_ADDR address,
static void
elf_symtab_read (struct objfile *objfile, int type,
long number_of_symbols, asymbol **symbol_table)
long number_of_symbols, asymbol **symbol_table,
int copy_names)
{
struct gdbarch *gdbarch = get_objfile_arch (objfile);
long storage_needed;
@ -298,7 +301,8 @@ elf_symtab_read (struct objfile *objfile, int type,
symaddr += ANOFFSET (objfile->section_offsets, sect->index);
msym = record_minimal_symbol
((char *) sym->name, symaddr, mst_solib_trampoline, sect, objfile);
(sym->name, strlen (sym->name), copy_names,
symaddr, mst_solib_trampoline, sect, objfile);
if (msym != NULL)
msym->filename = filesymname;
continue;
@ -511,7 +515,7 @@ elf_symtab_read (struct objfile *objfile, int type,
continue; /* Skip this symbol. */
}
msym = record_minimal_symbol
((char *) sym->name, symaddr,
(sym->name, strlen (sym->name), copy_names, symaddr,
ms_type, sym->section, objfile);
if (msym)
@ -546,15 +550,12 @@ elf_symtab_read (struct objfile *objfile, int type,
if (len > 4 && strcmp (sym->name + len - 4, "@plt") == 0)
{
char *base_name = xmalloc (len - 4 + 1);
struct minimal_symbol *mtramp;
memcpy (base_name, sym->name, len - 4);
base_name[len - 4] = '\0';
mtramp = record_minimal_symbol (base_name, symaddr,
mtramp = record_minimal_symbol (sym->name, len - 4, 1,
symaddr,
mst_solib_trampoline,
sym->section, objfile);
xfree (base_name);
if (mtramp)
{
MSYMBOL_SIZE (mtramp) = MSYMBOL_SIZE (msym);
@ -639,7 +640,7 @@ elf_symfile_read (struct objfile *objfile, int mainline)
error (_("Can't read symbols from %s: %s"), bfd_get_filename (objfile->obfd),
bfd_errmsg (bfd_get_error ()));
elf_symtab_read (objfile, ST_REGULAR, symcount, symbol_table);
elf_symtab_read (objfile, ST_REGULAR, symcount, symbol_table, 0);
}
/* Add the dynamic symbols. */
@ -657,7 +658,7 @@ elf_symfile_read (struct objfile *objfile, int mainline)
error (_("Can't read symbols from %s: %s"), bfd_get_filename (objfile->obfd),
bfd_errmsg (bfd_get_error ()));
elf_symtab_read (objfile, ST_DYNAMIC, dynsymcount, dyn_symbol_table);
elf_symtab_read (objfile, ST_DYNAMIC, dynsymcount, dyn_symbol_table, 0);
}
/* Add synthetic symbols - for instance, names for any PLT entries. */
@ -675,7 +676,7 @@ elf_symfile_read (struct objfile *objfile, int mainline)
for (i = 0; i < synthcount; i++)
synth_symbol_table[i] = synthsyms + i;
make_cleanup (xfree, synth_symbol_table);
elf_symtab_read (objfile, ST_SYNTHETIC, synthcount, synth_symbol_table);
elf_symtab_read (objfile, ST_SYNTHETIC, synthcount, synth_symbol_table, 1);
}
/* Install any minimal symbols that have been collected as the current

View file

@ -253,7 +253,7 @@ JITed symbol file is not an object file, ignoring it.\n"));
/* We assume that these virtual addresses are absolute, and do not
treat them as offsets. */
sai->other[i].addr = bfd_get_section_vma (nbfd, sec);
sai->other[i].name = (char *) bfd_get_section_name (nbfd, sec);
sai->other[i].name = xstrdup (bfd_get_section_name (nbfd, sec));
sai->other[i].sectindex = sec->index;
++i;
}

View file

@ -3095,7 +3095,7 @@ parse_partial_symbols (struct objfile *objfile)
namestring = gdbarch_static_transform_name
(gdbarch, namestring);
add_psymbol_to_list (namestring, p - namestring,
add_psymbol_to_list (namestring, p - namestring, 1,
VAR_DOMAIN, LOC_STATIC,
&objfile->static_psymbols,
0, sh.value,
@ -3105,7 +3105,7 @@ parse_partial_symbols (struct objfile *objfile)
sh.value += ANOFFSET (objfile->section_offsets, SECT_OFF_DATA (objfile));
/* The addresses in these entries are reported to be
wrong. See the code that reads 'G's for symtabs. */
add_psymbol_to_list (namestring, p - namestring,
add_psymbol_to_list (namestring, p - namestring, 1,
VAR_DOMAIN, LOC_STATIC,
&objfile->global_psymbols,
0, sh.value,
@ -3123,7 +3123,7 @@ parse_partial_symbols (struct objfile *objfile)
|| (p == namestring + 1
&& namestring[0] != ' '))
{
add_psymbol_to_list (namestring, p - namestring,
add_psymbol_to_list (namestring, p - namestring, 1,
STRUCT_DOMAIN, LOC_TYPEDEF,
&objfile->static_psymbols,
sh.value, 0,
@ -3132,6 +3132,7 @@ parse_partial_symbols (struct objfile *objfile)
{
/* Also a typedef with the same name. */
add_psymbol_to_list (namestring, p - namestring,
1,
VAR_DOMAIN, LOC_TYPEDEF,
&objfile->static_psymbols,
sh.value, 0,
@ -3143,7 +3144,7 @@ parse_partial_symbols (struct objfile *objfile)
case 't':
if (p != namestring) /* a name is there, not just :T... */
{
add_psymbol_to_list (namestring, p - namestring,
add_psymbol_to_list (namestring, p - namestring, 1,
VAR_DOMAIN, LOC_TYPEDEF,
&objfile->static_psymbols,
sh.value, 0,
@ -3205,7 +3206,7 @@ parse_partial_symbols (struct objfile *objfile)
;
/* Note that the value doesn't matter for
enum constants in psymtabs, just in symtabs. */
add_psymbol_to_list (p, q - p,
add_psymbol_to_list (p, q - p, 1,
VAR_DOMAIN, LOC_CONST,
&objfile->static_psymbols, 0,
0, psymtab_language, objfile);
@ -3222,7 +3223,7 @@ parse_partial_symbols (struct objfile *objfile)
continue;
case 'c':
/* Constant, e.g. from "const" in Pascal. */
add_psymbol_to_list (namestring, p - namestring,
add_psymbol_to_list (namestring, p - namestring, 1,
VAR_DOMAIN, LOC_CONST,
&objfile->static_psymbols, sh.value,
0, psymtab_language, objfile);
@ -3239,7 +3240,7 @@ parse_partial_symbols (struct objfile *objfile)
xfree (name);
}
sh.value += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
add_psymbol_to_list (namestring, p - namestring,
add_psymbol_to_list (namestring, p - namestring, 1,
VAR_DOMAIN, LOC_BLOCK,
&objfile->static_psymbols,
0, sh.value,
@ -3260,7 +3261,7 @@ parse_partial_symbols (struct objfile *objfile)
xfree (name);
}
sh.value += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
add_psymbol_to_list (namestring, p - namestring,
add_psymbol_to_list (namestring, p - namestring, 1,
VAR_DOMAIN, LOC_BLOCK,
&objfile->global_psymbols,
0, sh.value,
@ -3489,12 +3490,12 @@ parse_partial_symbols (struct objfile *objfile)
symbol table, and the MAIN__ symbol via the minimal
symbol table. */
if (sh.st == stProc)
add_psymbol_to_list (name, strlen (name),
add_psymbol_to_list (name, strlen (name), 1,
VAR_DOMAIN, LOC_BLOCK,
&objfile->global_psymbols,
0, sh.value, psymtab_language, objfile);
else
add_psymbol_to_list (name, strlen (name),
add_psymbol_to_list (name, strlen (name), 1,
VAR_DOMAIN, LOC_BLOCK,
&objfile->static_psymbols,
0, sh.value, psymtab_language, objfile);
@ -3563,7 +3564,7 @@ parse_partial_symbols (struct objfile *objfile)
&& sh.iss != 0
&& sh.index != cur_sdx + 2)
{
add_psymbol_to_list (name, strlen (name),
add_psymbol_to_list (name, strlen (name), 1,
STRUCT_DOMAIN, LOC_TYPEDEF,
&objfile->static_psymbols,
0, (CORE_ADDR) 0,
@ -3604,7 +3605,7 @@ parse_partial_symbols (struct objfile *objfile)
continue;
}
/* Use this gdb symbol */
add_psymbol_to_list (name, strlen (name),
add_psymbol_to_list (name, strlen (name), 1,
VAR_DOMAIN, class,
&objfile->static_psymbols,
0, sh.value, psymtab_language, objfile);
@ -3680,7 +3681,7 @@ parse_partial_symbols (struct objfile *objfile)
break;
}
name = debug_info->ssext + psh->iss;
add_psymbol_to_list (name, strlen (name),
add_psymbol_to_list (name, strlen (name), 1,
VAR_DOMAIN, class,
&objfile->global_psymbols,
0, svalue,
@ -3843,7 +3844,7 @@ handle_psymbol_enumerators (struct objfile *objfile, FDR *fh, int stype,
/* Note that the value doesn't matter for enum constants
in psymtabs, just in symtabs. */
add_psymbol_to_list (name, strlen (name),
add_psymbol_to_list (name, strlen (name), 1,
VAR_DOMAIN, LOC_CONST,
&objfile->static_psymbols, 0,
(CORE_ADDR) 0, psymtab_language, objfile);
@ -4788,7 +4789,7 @@ new_symbol (char *name)
memset (s, 0, sizeof (*s));
SYMBOL_LANGUAGE (s) = psymtab_language;
SYMBOL_SET_NAMES (s, name, strlen (name), current_objfile);
SYMBOL_SET_NAMES (s, name, strlen (name), 1, current_objfile);
return s;
}

View file

@ -757,7 +757,8 @@ prim_record_minimal_symbol (const char *name, CORE_ADDR address,
newly created. */
struct minimal_symbol *
prim_record_minimal_symbol_and_info (const char *name, CORE_ADDR address,
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,
@ -780,7 +781,10 @@ prim_record_minimal_symbol_and_info (const char *name, CORE_ADDR address,
/* It's safe to strip the leading char here once, since the name
is also stored stripped in the minimal symbol table. */
if (name[0] == get_symbol_leading_char (objfile->obfd))
{
++name;
--name_len;
}
if (ms_type == mst_file_text && strncmp (name, "__gnu_compiled", 14) == 0)
return (NULL);
@ -795,7 +799,7 @@ prim_record_minimal_symbol_and_info (const char *name, CORE_ADDR address,
msymbol = &msym_bunch->contents[msym_bunch_index];
SYMBOL_INIT_LANGUAGE_SPECIFIC (msymbol, language_unknown);
SYMBOL_LANGUAGE (msymbol) = language_auto;
SYMBOL_SET_NAMES (msymbol, (char *)name, strlen (name), objfile);
SYMBOL_SET_NAMES (msymbol, name, name_len, copy_name, objfile);
SYMBOL_VALUE_ADDRESS (msymbol) = address;
SYMBOL_SECTION (msymbol) = section;
@ -828,6 +832,21 @@ prim_record_minimal_symbol_and_info (const char *name, CORE_ADDR address,
return msymbol;
}
/* Record a minimal symbol in the msym bunches. Returns the symbol
newly created. */
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);
}
/* Compare two minimal symbols by address and return a signed result based
on unsigned comparisons, so that we sort into unsigned numeric order.
Within groups with the same address, sort by name. */

View file

@ -713,11 +713,11 @@ define_symbol (CORE_ADDR valu, char *string, int desc, int type,
}
if (new_name != NULL)
{
SYMBOL_SET_NAMES (sym, new_name, strlen (new_name), objfile);
SYMBOL_SET_NAMES (sym, new_name, strlen (new_name), 1, objfile);
xfree (new_name);
}
else
SYMBOL_SET_NAMES (sym, string, p - string, objfile);
SYMBOL_SET_NAMES (sym, string, p - string, 1, objfile);
}
p++;

View file

@ -3132,7 +3132,8 @@ start_psymtab_common (struct objfile *objfile,
different domain (or address) is possible and correct. */
static const struct partial_symbol *
add_psymbol_to_bcache (char *name, int namelength, domain_enum domain,
add_psymbol_to_bcache (char *name, int namelength, int copy_name,
domain_enum domain,
enum address_class class,
long val, /* Value as a long */
CORE_ADDR coreaddr, /* Value as a CORE_ADDR */
@ -3162,7 +3163,7 @@ add_psymbol_to_bcache (char *name, int namelength, domain_enum domain,
PSYMBOL_DOMAIN (&psymbol) = domain;
PSYMBOL_CLASS (&psymbol) = class;
SYMBOL_SET_NAMES (&psymbol, name, namelength, objfile);
SYMBOL_SET_NAMES (&psymbol, name, namelength, copy_name, objfile);
/* Stash the partial symbol away in the cache */
return bcache_full (&psymbol, sizeof (struct partial_symbol),
@ -3199,7 +3200,8 @@ append_psymbol_to_list (struct psymbol_allocation_list *list,
cache. */
const struct partial_symbol *
add_psymbol_to_list (char *name, int namelength, domain_enum domain,
add_psymbol_to_list (char *name, int namelength, int copy_name,
domain_enum domain,
enum address_class class,
struct psymbol_allocation_list *list,
long val, /* Value as a long */
@ -3211,7 +3213,7 @@ add_psymbol_to_list (char *name, int namelength, domain_enum domain,
int added;
/* Stash the partial symbol away in the cache */
psym = add_psymbol_to_bcache (name, namelength, domain, class,
psym = add_psymbol_to_bcache (name, namelength, copy_name, domain, class,
val, coreaddr, language, objfile, &added);
/* Do not duplicate global partial symbols. */

View file

@ -194,7 +194,7 @@ extern void extend_psymbol_list (struct psymbol_allocation_list *,
/* #include "demangle.h" */
extern const
struct partial_symbol *add_psymbol_to_list (char *, int, domain_enum,
struct partial_symbol *add_psymbol_to_list (char *, int, int, domain_enum,
enum address_class,
struct psymbol_allocation_list *,
long, CORE_ADDR,

View file

@ -427,6 +427,30 @@ symbol_init_language_specific (struct general_symbol_info *gsymbol,
/* Functions to initialize a symbol's mangled name. */
/* Objects of this type are stored in the demangled name hash table. */
struct demangled_name_entry
{
char *mangled;
char demangled[1];
};
/* Hash function for the demangled name hash. */
static hashval_t
hash_demangled_name_entry (const void *data)
{
const struct demangled_name_entry *e = data;
return htab_hash_string (e->mangled);
}
/* Equality function for the demangled name hash. */
static int
eq_demangled_name_entry (const void *a, const void *b)
{
const struct demangled_name_entry *da = a;
const struct demangled_name_entry *db = b;
return strcmp (da->mangled, db->mangled) == 0;
}
/* Create the hash table used for demangled names. Each hash entry is
a pair of strings; one for the mangled name and one for the demangled
name. The entry is hashed via just the mangled name. */
@ -440,7 +464,7 @@ create_demangled_names_hash (struct objfile *objfile)
1% in symbol reading. */
objfile->demangled_names_hash = htab_create_alloc
(256, htab_hash_string, (int (*) (const void *, const void *)) streq,
(256, hash_demangled_name_entry, eq_demangled_name_entry,
NULL, xcalloc, xfree);
}
@ -496,10 +520,15 @@ symbol_find_demangled_name (struct general_symbol_info *gsymbol,
}
/* Set both the mangled and demangled (if any) names for GSYMBOL based
on LINKAGE_NAME and LEN. The hash table corresponding to OBJFILE
is used, and the memory comes from that objfile's objfile_obstack.
LINKAGE_NAME is copied, so the pointer can be discarded after
calling this function. */
on LINKAGE_NAME and LEN. Ordinarily, NAME is copied onto the
objfile's obstack; but if COPY_NAME is 0 and if NAME is
NUL-terminated, then this function assumes that NAME is already
correctly saved (either permanently or with a lifetime tied to the
objfile), and it will not be copied.
The hash table corresponding to OBJFILE is used, and the memory
comes from that objfile's objfile_obstack. LINKAGE_NAME is copied,
so the pointer can be discarded after calling this function. */
/* We have to be careful when dealing with Java names: when we run
into a Java minimal symbol, we don't know it's a Java symbol, so it
@ -522,9 +551,10 @@ symbol_find_demangled_name (struct general_symbol_info *gsymbol,
void
symbol_set_names (struct general_symbol_info *gsymbol,
const char *linkage_name, int len, struct objfile *objfile)
const char *linkage_name, int len, int copy_name,
struct objfile *objfile)
{
char **slot;
struct demangled_name_entry **slot;
/* A 0-terminated copy of the linkage name. */
const char *linkage_name_copy;
/* A copy of the linkage name that might have a special Java prefix
@ -532,9 +562,7 @@ symbol_set_names (struct general_symbol_info *gsymbol,
const char *lookup_name;
/* The length of lookup_name. */
int lookup_len;
if (objfile->demangled_names_hash == NULL)
create_demangled_names_hash (objfile);
struct demangled_name_entry entry;
if (gsymbol->language == language_ada)
{
@ -546,14 +574,22 @@ symbol_set_names (struct general_symbol_info *gsymbol,
been observed with Java. Because we don't store the demangled
name with the symbol, we don't need to use the same trick
as Java. */
if (!copy_name)
gsymbol->name = (char *) linkage_name;
else
{
gsymbol->name = obstack_alloc (&objfile->objfile_obstack, len + 1);
memcpy (gsymbol->name, linkage_name, len);
gsymbol->name[len] = '\0';
}
gsymbol->language_specific.cplus_specific.demangled_name = NULL;
return;
}
if (objfile->demangled_names_hash == NULL)
create_demangled_names_hash (objfile);
/* The stabs reader generally provides names that are not
NUL-terminated; most of the other readers don't do this, so we
can just use the given copy, unless we're in the Java case. */
@ -589,8 +625,10 @@ symbol_set_names (struct general_symbol_info *gsymbol,
linkage_name_copy = linkage_name;
}
slot = (char **) htab_find_slot (objfile->demangled_names_hash,
lookup_name, INSERT);
entry.mangled = (char *) lookup_name;
slot = ((struct demangled_name_entry **)
htab_find_slot (objfile->demangled_names_hash,
&entry, INSERT));
/* If this name is not in the hash table, add it. */
if (*slot == NULL)
@ -599,25 +637,49 @@ symbol_set_names (struct general_symbol_info *gsymbol,
linkage_name_copy);
int demangled_len = demangled_name ? strlen (demangled_name) : 0;
/* If there is a demangled name, place it right after the mangled name.
Otherwise, just place a second zero byte after the end of the mangled
name. */
/* Suppose we have demangled_name==NULL, copy_name==0, and
lookup_name==linkage_name. In this case, we already have the
mangled name saved, and we don't have a demangled name. So,
you might think we could save a little space by not recording
this in the hash table at all.
It turns out that it is actually important to still save such
an entry in the hash table, because storing this name gives
us better backache hit rates for partial symbols. */
if (!copy_name && lookup_name == linkage_name)
{
*slot = obstack_alloc (&objfile->objfile_obstack,
lookup_len + demangled_len + 2);
memcpy (*slot, lookup_name, lookup_len + 1);
offsetof (struct demangled_name_entry,
demangled)
+ demangled_len + 1);
(*slot)->mangled = (char *) lookup_name;
}
else
{
/* If we must copy the mangled name, put it directly after
the demangled name so we can have a single
allocation. */
*slot = obstack_alloc (&objfile->objfile_obstack,
offsetof (struct demangled_name_entry,
demangled)
+ lookup_len + demangled_len + 2);
(*slot)->mangled = &((*slot)->demangled[demangled_len + 1]);
strcpy ((*slot)->mangled, lookup_name);
}
if (demangled_name != NULL)
{
memcpy (*slot + lookup_len + 1, demangled_name, demangled_len + 1);
strcpy ((*slot)->demangled, demangled_name);
xfree (demangled_name);
}
else
(*slot)[lookup_len + 1] = '\0';
(*slot)->demangled[0] = '\0';
}
gsymbol->name = *slot + lookup_len - len;
if ((*slot)[lookup_len + 1] != '\0')
gsymbol->name = (*slot)->mangled;
if ((*slot)->demangled[0] != '\0')
gsymbol->language_specific.cplus_specific.demangled_name
= &(*slot)[lookup_len + 1];
= (*slot)->demangled;
else
gsymbol->language_specific.cplus_specific.demangled_name = NULL;
}

View file

@ -192,10 +192,10 @@ extern void symbol_init_language_specific (struct general_symbol_info *symbol,
/* Set the linkage and natural names of a symbol, by demangling
the linkage name. */
#define SYMBOL_SET_NAMES(symbol,linkage_name,len,objfile) \
symbol_set_names (&(symbol)->ginfo, linkage_name, len, objfile)
#define SYMBOL_SET_NAMES(symbol,linkage_name,len,copy_name,objfile) \
symbol_set_names (&(symbol)->ginfo, linkage_name, len, copy_name, objfile)
extern void symbol_set_names (struct general_symbol_info *symbol,
const char *linkage_name, int len,
const char *linkage_name, int len, int copy_name,
struct objfile *objfile);
/* Now come lots of name accessor macros. Short version as to when to
@ -1122,6 +1122,11 @@ extern void prim_record_minimal_symbol (const char *, CORE_ADDR,
enum minimal_symbol_type,
struct objfile *);
extern struct minimal_symbol *prim_record_minimal_symbol_full
(const char *, int, int, CORE_ADDR,
enum minimal_symbol_type,
int section, asection * bfd_section, struct objfile *);
extern struct minimal_symbol *prim_record_minimal_symbol_and_info
(const char *, CORE_ADDR,
enum minimal_symbol_type,

View file

@ -2606,7 +2606,7 @@ scan_xcoff_symtab (struct objfile *objfile)
namestring = gdbarch_static_transform_name
(gdbarch, namestring);
add_psymbol_to_list (namestring, p - namestring,
add_psymbol_to_list (namestring, p - namestring, 1,
VAR_DOMAIN, LOC_STATIC,
&objfile->static_psymbols,
0, symbol.n_value,
@ -2617,7 +2617,7 @@ scan_xcoff_symtab (struct objfile *objfile)
symbol.n_value += ANOFFSET (objfile->section_offsets, SECT_OFF_DATA (objfile));
/* The addresses in these entries are reported to be
wrong. See the code that reads 'G's for symtabs. */
add_psymbol_to_list (namestring, p - namestring,
add_psymbol_to_list (namestring, p - namestring, 1,
VAR_DOMAIN, LOC_STATIC,
&objfile->global_psymbols,
0, symbol.n_value,
@ -2635,7 +2635,7 @@ scan_xcoff_symtab (struct objfile *objfile)
|| (p == namestring + 1
&& namestring[0] != ' '))
{
add_psymbol_to_list (namestring, p - namestring,
add_psymbol_to_list (namestring, p - namestring, 1,
STRUCT_DOMAIN, LOC_TYPEDEF,
&objfile->static_psymbols,
symbol.n_value, 0,
@ -2643,7 +2643,7 @@ scan_xcoff_symtab (struct objfile *objfile)
if (p[2] == 't')
{
/* Also a typedef with the same name. */
add_psymbol_to_list (namestring, p - namestring,
add_psymbol_to_list (namestring, p - namestring, 1,
VAR_DOMAIN, LOC_TYPEDEF,
&objfile->static_psymbols,
symbol.n_value, 0,
@ -2656,7 +2656,7 @@ scan_xcoff_symtab (struct objfile *objfile)
case 't':
if (p != namestring) /* a name is there, not just :T... */
{
add_psymbol_to_list (namestring, p - namestring,
add_psymbol_to_list (namestring, p - namestring, 1,
VAR_DOMAIN, LOC_TYPEDEF,
&objfile->static_psymbols,
symbol.n_value, 0,
@ -2718,7 +2718,7 @@ scan_xcoff_symtab (struct objfile *objfile)
;
/* Note that the value doesn't matter for
enum constants in psymtabs, just in symtabs. */
add_psymbol_to_list (p, q - p,
add_psymbol_to_list (p, q - p, 1,
VAR_DOMAIN, LOC_CONST,
&objfile->static_psymbols, 0,
0, psymtab_language, objfile);
@ -2736,7 +2736,7 @@ scan_xcoff_symtab (struct objfile *objfile)
case 'c':
/* Constant, e.g. from "const" in Pascal. */
add_psymbol_to_list (namestring, p - namestring,
add_psymbol_to_list (namestring, p - namestring, 1,
VAR_DOMAIN, LOC_CONST,
&objfile->static_psymbols, symbol.n_value,
0, psymtab_language, objfile);
@ -2753,7 +2753,7 @@ scan_xcoff_symtab (struct objfile *objfile)
xfree (name);
}
symbol.n_value += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
add_psymbol_to_list (namestring, p - namestring,
add_psymbol_to_list (namestring, p - namestring, 1,
VAR_DOMAIN, LOC_BLOCK,
&objfile->static_psymbols,
0, symbol.n_value,
@ -2782,7 +2782,7 @@ scan_xcoff_symtab (struct objfile *objfile)
continue;
symbol.n_value += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
add_psymbol_to_list (namestring, p - namestring,
add_psymbol_to_list (namestring, p - namestring, 1,
VAR_DOMAIN, LOC_BLOCK,
&objfile->global_psymbols,
0, symbol.n_value,