From 77087adf50cedf78cc216ac6eb3b2863839d713c Mon Sep 17 00:00:00 2001 From: Doug Evans Date: Sun, 11 Jan 2015 12:02:23 -0800 Subject: [PATCH] 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. --- gdb/ChangeLog | 5 +++++ gdb/symtab.c | 40 +++++++++++++++++++++++++++++++++------- 2 files changed, 38 insertions(+), 7 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index f2f4b9cd6e8..3070077568f 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,8 @@ +2015-01-11 Doug Evans + + * symtab.c (eq_symbol_entry): Use SYMBOL_SEARCH_NAME and + symbol_matches_domain for symbol comparisons. + 2015-01-11 Doug Evans * symtab.c (symbol_cache_mark_found): Improve function comment. diff --git a/gdb/symtab.c b/gdb/symtab.c index 698de5f8eee..321241beb69 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; } -- 2.30.2