diff options
author | Tom Tromey <tromey@redhat.com> | 2009-11-16 18:40:23 +0000 |
---|---|---|
committer | Tom Tromey <tromey@redhat.com> | 2009-11-16 18:40:23 +0000 |
commit | 04a679b8f5aed2c56ed5cb02f798d87df8415671 (patch) | |
tree | 5705c33f3946a993bf65136dbb4add9d599b7e55 /gdb/symtab.c | |
parent | fd7dd3e67aa6a8d3f8019a4b3e19837660db1414 (diff) | |
download | gdb-04a679b8f5aed2c56ed5cb02f798d87df8415671.zip gdb-04a679b8f5aed2c56ed5cb02f798d87df8415671.tar.gz gdb-04a679b8f5aed2c56ed5cb02f798d87df8415671.tar.bz2 |
* 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.
Diffstat (limited to 'gdb/symtab.c')
-rw-r--r-- | gdb/symtab.c | 114 |
1 files changed, 88 insertions, 26 deletions
diff --git a/gdb/symtab.c b/gdb/symtab.c index e092ad4..b512bf3 100644 --- a/gdb/symtab.c +++ b/gdb/symtab.c @@ -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. */ - gsymbol->name = obstack_alloc (&objfile->objfile_obstack, len + 1); - memcpy (gsymbol->name, linkage_name, len); - gsymbol->name[len] = '\0'; + 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. */ - *slot = obstack_alloc (&objfile->objfile_obstack, - lookup_len + demangled_len + 2); - memcpy (*slot, lookup_name, lookup_len + 1); + /* 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, + 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; } |