aboutsummaryrefslogtreecommitdiff
path: root/gdb/symtab.c
diff options
context:
space:
mode:
authorKeith Seitz <keiths@redhat.com>2014-06-07 10:40:39 -0700
committerKeith Seitz <keiths@redhat.com>2014-06-07 10:40:39 -0700
commit4186eb54dd4d57b59d58f470ec0fa9b19b9c9d5e (patch)
treea06ca25b09e28008b738dbbda552e4628c4fdbc4 /gdb/symtab.c
parentb893397a4b1316610f49819344817715e4305de9 (diff)
downloadgdb-4186eb54dd4d57b59d58f470ec0fa9b19b9c9d5e.zip
gdb-4186eb54dd4d57b59d58f470ec0fa9b19b9c9d5e.tar.gz
gdb-4186eb54dd4d57b59d58f470ec0fa9b19b9c9d5e.tar.bz2
Revert patchset for c++/16253: it causes a large performance regression.
See the bug for further information.
Diffstat (limited to 'gdb/symtab.c')
-rw-r--r--gdb/symtab.c60
1 files changed, 29 insertions, 31 deletions
diff --git a/gdb/symtab.c b/gdb/symtab.c
index 15ac3d1..66d1624 100644
--- a/gdb/symtab.c
+++ b/gdb/symtab.c
@@ -1310,11 +1310,7 @@ demangle_for_lookup (const char *name, enum language lang,
NAME is a field of the current implied argument `this'. If so set
*IS_A_FIELD_OF_THIS to 1, otherwise set it to zero.
BLOCK_FOUND is set to the block in which NAME is found (in the case of
- a field of `this', value_of_this sets BLOCK_FOUND to the proper value.)
-
- If DOMAIN is VAR_DOMAIN and the language permits using tag names for
- elaborated types, such as classes in C++, this function will search
- STRUCT_DOMAIN if no matching is found. */
+ a field of `this', value_of_this sets BLOCK_FOUND to the proper value.) */
/* This function (or rather its subordinates) have a bunch of loops and
it would seem to be attractive to put in some QUIT's (though I'm not really
@@ -1337,23 +1333,6 @@ lookup_symbol_in_language (const char *name, const struct block *block,
returnval = lookup_symbol_aux (modified_name, block, domain, lang,
is_a_field_of_this);
- if (returnval == NULL)
- {
- if (is_a_field_of_this != NULL
- && is_a_field_of_this->type != NULL)
- return NULL;
-
- /* Some languages define typedefs of a type equal to its tag name,
- e.g., in C++, "struct foo { ... }" also defines a typedef for
- "foo". */
- if (domain == VAR_DOMAIN
- && (lang == language_cplus || lang == language_java
- || lang == language_ada || lang == language_d))
- {
- returnval = lookup_symbol_aux (modified_name, block, STRUCT_DOMAIN,
- lang, is_a_field_of_this);
- }
- }
do_cleanups (cleanup);
return returnval;
@@ -1928,6 +1907,27 @@ lookup_symbol_global (const char *name,
return lookup_data.result;
}
+int
+symbol_matches_domain (enum language symbol_language,
+ domain_enum symbol_domain,
+ domain_enum domain)
+{
+ /* For C++ "struct foo { ... }" also defines a typedef for "foo".
+ A Java class declaration also defines a typedef for the class.
+ Similarly, any Ada type declaration implicitly defines a typedef. */
+ if (symbol_language == language_cplus
+ || symbol_language == language_d
+ || symbol_language == language_java
+ || symbol_language == language_ada)
+ {
+ if ((domain == VAR_DOMAIN || domain == STRUCT_DOMAIN)
+ && symbol_domain == STRUCT_DOMAIN)
+ return 1;
+ }
+ /* For all other languages, strict match is required. */
+ return (symbol_domain == domain);
+}
+
/* Look up a type named NAME in the struct_domain. The type returned
must not be opaque -- i.e., must have at least one field
defined. */
@@ -2050,12 +2050,7 @@ basic_lookup_transparent_type (const char *name)
binary search terminates, we drop through and do a straight linear
search on the symbols. Each symbol which is marked as being a ObjC/C++
symbol (language_cplus or language_objc set) has both the encoded and
- non-encoded names tested for a match.
-
- This function specifically disallows domain mismatches. If a language
- defines a typedef for an elaborated type, such as classes in C++,
- then this function will need to be called twice, once to search
- VAR_DOMAIN and once to search STRUCT_DOMAIN. */
+ non-encoded names tested for a match. */
struct symbol *
lookup_block_symbol (const struct block *block, const char *name,
@@ -2070,7 +2065,8 @@ lookup_block_symbol (const struct block *block, const char *name,
sym != NULL;
sym = block_iter_name_next (name, &iter))
{
- if (SYMBOL_DOMAIN (sym) == domain)
+ if (symbol_matches_domain (SYMBOL_LANGUAGE (sym),
+ SYMBOL_DOMAIN (sym), domain))
return sym;
}
return NULL;
@@ -2089,7 +2085,8 @@ lookup_block_symbol (const struct block *block, const char *name,
sym != NULL;
sym = block_iter_name_next (name, &iter))
{
- if (SYMBOL_DOMAIN (sym) == domain)
+ if (symbol_matches_domain (SYMBOL_LANGUAGE (sym),
+ SYMBOL_DOMAIN (sym), domain))
{
sym_found = sym;
if (!SYMBOL_IS_ARGUMENT (sym))
@@ -2123,7 +2120,8 @@ iterate_over_symbols (const struct block *block, const char *name,
sym != NULL;
sym = block_iter_name_next (name, &iter))
{
- if (SYMBOL_DOMAIN (sym) == domain)
+ if (symbol_matches_domain (SYMBOL_LANGUAGE (sym),
+ SYMBOL_DOMAIN (sym), domain))
{
if (!callback (sym, data))
return;