diff options
author | Doug Evans <xdje42@gmail.com> | 2015-01-11 12:02:23 -0800 |
---|---|---|
committer | Doug Evans <xdje42@gmail.com> | 2015-01-11 12:02:23 -0800 |
commit | 77087adf50cedf78cc216ac6eb3b2863839d713c (patch) | |
tree | c5090fa8734eb00b21886ea756eee23626761593 /gdb/symtab.c | |
parent | d98b9ccbccf36563dad92f6093a93655b38bc51b (diff) | |
download | gdb-77087adf50cedf78cc216ac6eb3b2863839d713c.zip gdb-77087adf50cedf78cc216ac6eb3b2863839d713c.tar.gz gdb-77087adf50cedf78cc216ac6eb3b2863839d713c.tar.bz2 |
symtab.c (eq_symbol_entry): Use SYMBOL_SEARCH_NAME and symbol_matches_domain.
gdb/ChangeLog:
* symtab.c (eq_symbol_entry): Use SYMBOL_SEARCH_NAME and
symbol_matches_domain for symbol comparisons.
Diffstat (limited to 'gdb/symtab.c')
-rw-r--r-- | gdb/symtab.c | 40 |
1 files changed, 33 insertions, 7 deletions
diff --git a/gdb/symtab.c b/gdb/symtab.c index 698de5f..321241b 100644 --- a/gdb/symtab.c +++ b/gdb/symtab.c @@ -1200,27 +1200,53 @@ eq_symbol_entry (const struct symbol_cache_slot *slot, } else { - slot_name = SYMBOL_LINKAGE_NAME (slot->value.found); + slot_name = SYMBOL_SEARCH_NAME (slot->value.found); slot_domain = SYMBOL_DOMAIN (slot->value.found); } /* NULL names match. */ if (slot_name == NULL && name == NULL) - ; - else if (slot_name != NULL && name != NULL) { - if (strcmp (slot_name, name) != 0) + /* But there's no point in calling symbol_matches_domain in the + SYMBOL_SLOT_FOUND case. */ + if (slot_domain != domain) return 0; } + else if (slot_name != NULL && name != NULL) + { + /* It's important that we use the same comparison that was done the + first time through. If the slot records a found symbol, then this + means using strcmp_iw on SYMBOL_SEARCH_NAME. See dictionary.c. + It also means using symbol_matches_domain for found symbols. + See block.c. + + If the slot records a not-found symbol, then require a precise match. + We could still be lax with whitespace like strcmp_iw though. */ + + if (slot->state == SYMBOL_SLOT_NOT_FOUND) + { + if (strcmp (slot_name, name) != 0) + return 0; + if (slot_domain != domain) + return 0; + } + else + { + struct symbol *sym = slot->value.found; + + if (strcmp_iw (slot_name, name) != 0) + return 0; + if (!symbol_matches_domain (SYMBOL_LANGUAGE (sym), + slot_domain, domain)) + return 0; + } + } else { /* Only one name is NULL. */ return 0; } - if (slot_domain != domain) - return 0; - return 1; } |