diff options
author | David Carlton <carlton@bactrian.org> | 2004-01-23 23:03:31 +0000 |
---|---|---|
committer | David Carlton <carlton@bactrian.org> | 2004-01-23 23:03:31 +0000 |
commit | 53cf90a5bf51590119c2e7a562ab231f4f4b7b36 (patch) | |
tree | 123fb67428f31085f11aae728c5040a0f676fcfd /gdb/cp-namespace.c | |
parent | 85ba4594972f1fa8cbe12279f1b84e399cf7aa7f (diff) | |
download | gdb-53cf90a5bf51590119c2e7a562ab231f4f4b7b36.tar.gz |
2004-01-23 David Carlton <carlton@kealia.com>
Partial workaround for PR c++/1511:
* cp-namespace.c: Include frame.h.
(cp_lookup_transparent_type): New
(cp_lookup_transparent_type_loop): New.
* cp-support.h: Declare cp_lookup_transparent_type.
* symtab.c (basic_lookup_transparent_type): Renamed from
lookup_transparent_type.
(lookup_transparent_type): Replace old body by a call to
current_language->la_lookup_transparent_type.
* symtab.h: Update copyright. Declare
basic_lookup_transparent_type.
* language.h: Update copyright.
(struct language_defn): Add la_lookup_transparent_type.
* language.c: Update copyright.
(unknown_language_defn): Add basic_lookup_transparent_type.
(auto_language_defn): Add basic_lookup_transparent_type.
(local_language_defn): Add basic_lookup_transparent_type.
* ada-lang.c: Update copyright.
(ada_language_defn): Add basic_lookup_transparent_type.
* c-lang.c: Update copyright.
(c_language_defn): Add basic_lookup_transparent_type.
(cplus_language_defn): Add basic_lookup_transparent_type.
(asm_language_defn): Add basic_lookup_transparent_type.
(minimal_language_defn): Add basic_lookup_transparent_type.
* f-lang.c: Update copyright.
(f_language_defn): Add basic_lookup_transparent_type.
* jv-lang.c: Update copyright.
(java_language_defn): Add basic_lookup_transparent_type.
* m2-lang.c: Update copyright.
(m2_language_defn): Add basic_lookup_transparent_type.
* objc-lang.c: Update copyright.
(objc_language_defn): Add basic_lookup_transparent_type.
* p-lang.c: Update copyright.
(p_language_defn): Add basic_lookup_transparent_type.
* scm-lang.c: Update copyright.
(scm_language_defn): Add basic_lookup_transparent_type.
* Makefile.in (cp-namespace.o): Depend on frame.h.
2004-01-23 David Carlton <carlton@kealia.com>
* gdb.cp/rtti.exp: Don't include full path in ${srcfile}. Add
test for cp_lookup_transparent_type.
* gdb.cp/rtti1.cc: Update copyright. Add n2::func and refer_to;
call them.
Diffstat (limited to 'gdb/cp-namespace.c')
-rw-r--r-- | gdb/cp-namespace.c | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/gdb/cp-namespace.c b/gdb/cp-namespace.c index fed440ebc50..b9cc794e353 100644 --- a/gdb/cp-namespace.c +++ b/gdb/cp-namespace.c @@ -31,6 +31,7 @@ #include "gdbtypes.h" #include "dictionary.h" #include "command.h" +#include "frame.h" /* When set, the file that we're processing is known to have debugging info for C++ namespaces. */ @@ -85,6 +86,10 @@ static struct symbol *lookup_symbol_file (const char *name, struct symtab **symtab, int anonymous_namespace); +static struct type *cp_lookup_transparent_type_loop (const char *name, + const char *scope, + int scope_len); + static void initialize_namespace_symtab (struct objfile *objfile); static struct block *get_possible_namespace_block (struct objfile *objfile); @@ -551,6 +556,74 @@ cp_lookup_nested_type (struct type *parent_type, } } +/* The C++-version of lookup_transparent_type. */ + +/* FIXME: carlton/2004-01-16: The problem that this is trying to + address is that, unfortunately, sometimes NAME is wrong: it may not + include the name of namespaces enclosing the type in question. + lookup_transparent_type gets called when the the type in question + is a declaration, and we're trying to find its definition; but, for + declarations, our type name deduction mechanism doesn't work. + There's nothing we can do to fix this in general, I think, in the + absence of debug information about namespaces (I've filed PR + gdb/1511 about this); until such debug information becomes more + prevalent, one heuristic which sometimes looks is to search for the + definition in namespaces containing the current namespace. + + We should delete this functions once the appropriate debug + information becomes more widespread. (GCC 3.4 will be the first + released version of GCC with such information.) */ + +struct type * +cp_lookup_transparent_type (const char *name) +{ + /* First, try the honest way of looking up the definition. */ + struct type *t = basic_lookup_transparent_type (name); + const char *scope; + + if (t != NULL) + return t; + + /* If that doesn't work and we're within a namespace, look there + instead. */ + scope = block_scope (get_selected_block (0)); + + if (scope[0] == '\0') + return NULL; + + return cp_lookup_transparent_type_loop (name, scope, 0); +} + +/* Lookup the the type definition associated to NAME in + namespaces/classes containing SCOPE whose name is strictly longer + than LENGTH. LENGTH must be the index of the start of a + component of SCOPE. */ + +static struct type * +cp_lookup_transparent_type_loop (const char *name, const char *scope, + int length) +{ + int scope_length = cp_find_first_component (scope + length); + char *full_name; + + /* If the current scope is followed by "::", look in the next + component. */ + if (scope[scope_length] == ':') + { + struct type *retval + = cp_lookup_transparent_type_loop (name, scope, scope_length + 2); + if (retval != NULL) + return retval; + } + + full_name = alloca (scope_length + 2 + strlen (name) + 1); + strncpy (full_name, scope, scope_length); + strncpy (full_name + scope_length, "::", 2); + strcpy (full_name + scope_length + 2, name); + + return basic_lookup_transparent_type (full_name); +} + /* Now come functions for dealing with symbols associated to namespaces. (They're used to store the namespaces themselves, not objects that live in the namespaces.) These symbols come in two |