aboutsummaryrefslogtreecommitdiff
path: root/gdb/symtab.c
diff options
context:
space:
mode:
authorDoug Evans <xdje42@gmail.com>2015-01-11 12:02:23 -0800
committerDoug Evans <xdje42@gmail.com>2015-01-11 12:02:23 -0800
commit77087adf50cedf78cc216ac6eb3b2863839d713c (patch)
treec5090fa8734eb00b21886ea756eee23626761593 /gdb/symtab.c
parentd98b9ccbccf36563dad92f6093a93655b38bc51b (diff)
downloadgdb-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.c40
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;
}