From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 26875 invoked by alias); 20 May 2003 02:01:26 -0000 Mailing-List: contact gdb-patches-help@sources.redhat.com; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sources.redhat.com Received: (qmail 26735 invoked from network); 20 May 2003 02:01:25 -0000 Received: from unknown (HELO jackfruit.Stanford.EDU) (171.64.38.136) by sources.redhat.com with SMTP; 20 May 2003 02:01:25 -0000 Received: (from carlton@localhost) by jackfruit.Stanford.EDU (8.11.6/8.11.6) id h4K21He28888; Mon, 19 May 2003 19:01:17 -0700 X-Authentication-Warning: jackfruit.Stanford.EDU: carlton set sender to carlton@math.stanford.edu using -f To: Elena Zannoni Cc: gdb-patches@sources.redhat.com Subject: Re: [rfa] language hooks for lookup_symbol References: <16072.62998.398450.521135@localhost.redhat.com> From: David Carlton Date: Tue, 20 May 2003 02:01:00 -0000 In-Reply-To: <16072.62998.398450.521135@localhost.redhat.com> Message-ID: User-Agent: Gnus/5.0808 (Gnus v5.8.8) XEmacs/21.4 (Common Lisp) MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-SW-Source: 2003-05/txt/msg00355.txt.bz2 On Mon, 19 May 2003 11:19:50 -0400, Elena Zannoni said: > Yes. I like it. Great; it's in, in 3 parts, as you suggested. I'm including the patch for the third part below. Thanks a bunch for working with me on this lookup_symbol rewrite. It's amazing how much we've changed it over the last half-year. David Carlton carlton@math.stanford.edu 2003-05-19 David Carlton * language.h (struct language_defn): Add 'la_value_of_this' and 'la_lookup_symbol_nonlocal' members. * symtab.h: Declare basic_lookup_symbol_nonlocal, lookup_symbol_static, lookup_symbol_global, lookup_symbol_aux_block. * symtab.c (lookup_symbol_aux): Call language hooks to determine if we should search fields of this and how to do static/global lookup. (lookup_symbol_aux_block): Make extern. (basic_lookup_symbol_nonlocal): New. (lookup_symbol_static, lookup_symbol_global): Ditto. * ada-lang.c (ada_language_defn): Set 'la_value_of_this' and 'la_lookup_symbol_nonlocal' members. * c-lang.c (c_language_defn, cplus_language_defn) (asm_language_defn, minimal_language_defn): Ditto. * jv-lang.c (java_language_defn): Ditto. * language.c (unknown_language_defn, auto_language_defn) (local_language_defn): Ditto. * m2-lang.c (m2_language_defn): Ditto. * objc-lang.c (objc_language_defn): Ditto. * scm-lang.c (scm_language_defn): Ditto. * f-lang.c (f_language_defn): Ditto, and include value.h as well. * p-lang.c (pascal_language_defn): Ditto for both. * Makefile.in (f-lang.o): Depend on value_h. (p-lang.o): Ditto. Index: Makefile.in =================================================================== RCS file: /cvs/src/src/gdb/Makefile.in,v retrieving revision 1.378 diff -u -p -r1.378 Makefile.in --- Makefile.in 18 May 2003 21:10:10 -0000 1.378 +++ Makefile.in 20 May 2003 01:51:56 -0000 @@ -1703,7 +1703,7 @@ expprint.o: expprint.c $(defs_h) $(symta $(block_h) f-lang.o: f-lang.c $(defs_h) $(gdb_string_h) $(symtab_h) $(gdbtypes_h) \ $(expression_h) $(parser_defs_h) $(language_h) $(f_lang_h) \ - $(valprint_h) + $(valprint_h) $(value_h) f-typeprint.o: f-typeprint.c $(defs_h) $(gdb_obstack_h) $(bfd_h) $(symtab_h) \ $(gdbtypes_h) $(expression_h) $(value_h) $(gdbcore_h) $(target_h) \ $(f_lang_h) $(gdb_string_h) @@ -2022,7 +2022,7 @@ osabi.o: osabi.c $(defs_h) $(gdb_string_ $(gdbcmd_h) $(command_h) $(arch_utils_h) p-lang.o: p-lang.c $(defs_h) $(gdb_string_h) $(symtab_h) $(gdbtypes_h) \ $(expression_h) $(parser_defs_h) $(language_h) $(p_lang_h) \ - $(valprint_h) + $(valprint_h) $(value_h) p-typeprint.o: p-typeprint.c $(defs_h) $(gdb_obstack_h) $(bfd_h) $(symtab_h) \ $(gdbtypes_h) $(expression_h) $(value_h) $(gdbcore_h) $(target_h) \ $(language_h) $(p_lang_h) $(typeprint_h) $(gdb_string_h) Index: ada-lang.c =================================================================== RCS file: /cvs/src/src/gdb/ada-lang.c,v retrieving revision 1.25 diff -u -p -r1.25 ada-lang.c --- ada-lang.c 14 May 2003 17:43:15 -0000 1.25 +++ ada-lang.c 20 May 2003 01:52:04 -0000 @@ -8082,6 +8082,8 @@ const struct language_defn ada_language_ ada_val_print, /* Print a value using appropriate syntax */ ada_value_print, /* Print a top-level value */ NULL, /* Language specific skip_trampoline */ + value_of_this, /* value_of_this */ + basic_lookup_symbol_nonlocal, /* lookup_symbol_nonlocal */ NULL, /* Language specific symbol demangler */ {"", "", "", ""}, /* Binary format info */ #if 0 Index: c-lang.c =================================================================== RCS file: /cvs/src/src/gdb/c-lang.c,v retrieving revision 1.20 diff -u -p -r1.20 c-lang.c --- c-lang.c 15 May 2003 22:18:42 -0000 1.20 +++ c-lang.c 20 May 2003 01:52:05 -0000 @@ -553,6 +553,8 @@ const struct language_defn c_language_de c_val_print, /* Print a value using appropriate syntax */ c_value_print, /* Print a top-level value */ NULL, /* Language specific skip_trampoline */ + NULL, /* value_of_this */ + basic_lookup_symbol_nonlocal, /* lookup_symbol_nonlocal */ NULL, /* Language specific symbol demangler */ {"", "", "", ""}, /* Binary format info */ {"0%lo", "0", "o", ""}, /* Octal format info */ @@ -607,6 +609,8 @@ const struct language_defn cplus_languag c_val_print, /* Print a value using appropriate syntax */ c_value_print, /* Print a top-level value */ NULL, /* Language specific skip_trampoline */ + value_of_this, /* value_of_this */ + basic_lookup_symbol_nonlocal, /* lookup_symbol_nonlocal */ cplus_demangle, /* Language specific symbol demangler */ {"", "", "", ""}, /* Binary format info */ {"0%lo", "0", "o", ""}, /* Octal format info */ @@ -638,6 +642,8 @@ const struct language_defn asm_language_ c_val_print, /* Print a value using appropriate syntax */ c_value_print, /* Print a top-level value */ NULL, /* Language specific skip_trampoline */ + NULL, /* value_of_this */ + basic_lookup_symbol_nonlocal, /* lookup_symbol_nonlocal */ NULL, /* Language specific symbol demangler */ {"", "", "", ""}, /* Binary format info */ {"0%lo", "0", "o", ""}, /* Octal format info */ @@ -674,6 +680,8 @@ const struct language_defn minimal_langu c_val_print, /* Print a value using appropriate syntax */ c_value_print, /* Print a top-level value */ NULL, /* Language specific skip_trampoline */ + NULL, /* value_of_this */ + basic_lookup_symbol_nonlocal, /* lookup_symbol_nonlocal */ NULL, /* Language specific symbol demangler */ {"", "", "", ""}, /* Binary format info */ {"0%lo", "0", "o", ""}, /* Octal format info */ Index: f-lang.c =================================================================== RCS file: /cvs/src/src/gdb/f-lang.c,v retrieving revision 1.14 diff -u -p -r1.14 f-lang.c --- f-lang.c 15 May 2003 22:18:42 -0000 1.14 +++ f-lang.c 20 May 2003 01:52:06 -0000 @@ -30,6 +30,7 @@ #include "language.h" #include "f-lang.h" #include "valprint.h" +#include "value.h" /* The built-in types of F77. FIXME: integer*4 is missing, plain logical is missing (builtin_type_logical is logical*4). */ @@ -472,6 +473,8 @@ const struct language_defn f_language_de f_val_print, /* Print a value using appropriate syntax */ c_value_print, /* FIXME */ NULL, /* Language specific skip_trampoline */ + value_of_this, /* value_of_this */ + basic_lookup_symbol_nonlocal, /* lookup_symbol_nonlocal */ NULL, /* Language specific symbol demangler */ {"", "", "", ""}, /* Binary format info */ {"0%o", "0", "o", ""}, /* Octal format info */ Index: jv-lang.c =================================================================== RCS file: /cvs/src/src/gdb/jv-lang.c,v retrieving revision 1.19 diff -u -p -r1.19 jv-lang.c --- jv-lang.c 14 May 2003 17:43:18 -0000 1.19 +++ jv-lang.c 20 May 2003 01:52:08 -0000 @@ -1063,6 +1063,8 @@ const struct language_defn java_language java_val_print, /* Print a value using appropriate syntax */ java_value_print, /* Print a top-level value */ NULL, /* Language specific skip_trampoline */ + value_of_this, /* value_of_this */ + basic_lookup_symbol_nonlocal, /* lookup_symbol_nonlocal */ java_demangle, /* Language specific symbol demangler */ {"", "", "", ""}, /* Binary format info */ {"0%lo", "0", "o", ""}, /* Octal format info */ Index: language.c =================================================================== RCS file: /cvs/src/src/gdb/language.c,v retrieving revision 1.34 diff -u -p -r1.34 language.c --- language.c 14 May 2003 17:43:18 -0000 1.34 +++ language.c 20 May 2003 01:52:08 -0000 @@ -1479,6 +1479,8 @@ const struct language_defn unknown_langu unk_lang_val_print, /* Print a value using appropriate syntax */ unk_lang_value_print, /* Print a top-level value */ unk_lang_trampoline, /* Language specific skip_trampoline */ + value_of_this, /* value_of_this */ + basic_lookup_symbol_nonlocal, /* lookup_symbol_nonlocal */ unk_lang_demangle, /* Language specific symbol demangler */ {"", "", "", ""}, /* Binary format info */ {"0%lo", "0", "o", ""}, /* Octal format info */ @@ -1511,6 +1513,8 @@ const struct language_defn auto_language unk_lang_val_print, /* Print a value using appropriate syntax */ unk_lang_value_print, /* Print a top-level value */ unk_lang_trampoline, /* Language specific skip_trampoline */ + value_of_this, /* value_of_this */ + basic_lookup_symbol_nonlocal, /* lookup_symbol_nonlocal */ unk_lang_demangle, /* Language specific symbol demangler */ {"", "", "", ""}, /* Binary format info */ {"0%lo", "0", "o", ""}, /* Octal format info */ @@ -1542,6 +1546,8 @@ const struct language_defn local_languag unk_lang_val_print, /* Print a value using appropriate syntax */ unk_lang_value_print, /* Print a top-level value */ unk_lang_trampoline, /* Language specific skip_trampoline */ + value_of_this, /* value_of_this */ + basic_lookup_symbol_nonlocal, /* lookup_symbol_nonlocal */ unk_lang_demangle, /* Language specific symbol demangler */ {"", "", "", ""}, /* Binary format info */ {"0%lo", "0", "o", ""}, /* Octal format info */ Index: language.h =================================================================== RCS file: /cvs/src/src/gdb/language.h,v retrieving revision 1.19 diff -u -p -r1.19 language.h --- language.h 12 Apr 2003 17:41:25 -0000 1.19 +++ language.h 20 May 2003 01:52:09 -0000 @@ -211,6 +211,27 @@ struct language_defn if it isn't a language tramp for this language. */ CORE_ADDR (*skip_trampoline) (CORE_ADDR pc); + /* Now come some hooks for lookup_symbol. */ + + /* If this is non-NULL, lookup_symbol will do the 'field_of_this' + check, using this function to find the value of this. */ + + /* FIXME: carlton/2003-05-19: Audit all the language_defn structs + to make sure we're setting this appropriately: I'm sure it + could be NULL in more languages. */ + + struct value *(*la_value_of_this) (int complain); + + /* This is a function that lookup_symbol will call when it gets to + the part of symbol lookup where C looks up static and global + variables. */ + + struct symbol *(*la_lookup_symbol_nonlocal) (const char *, + const char *, + const struct block *, + const domain_enum, + struct symtab **); + /* Return demangled language symbol, or NULL. */ char *(*la_demangle) (const char *mangled, int options); Index: m2-lang.c =================================================================== RCS file: /cvs/src/src/gdb/m2-lang.c,v retrieving revision 1.10 diff -u -p -r1.10 m2-lang.c --- m2-lang.c 15 May 2003 22:18:42 -0000 1.10 +++ m2-lang.c 20 May 2003 01:52:09 -0000 @@ -426,6 +426,8 @@ const struct language_defn m2_language_d m2_val_print, /* Print a value using appropriate syntax */ c_value_print, /* Print a top-level value */ NULL, /* Language specific skip_trampoline */ + value_of_this, /* value_of_this */ + basic_lookup_symbol_nonlocal, /* lookup_symbol_nonlocal */ NULL, /* Language specific symbol demangler */ {"", "", "", ""}, /* Binary format info */ {"%loB", "", "o", "B"}, /* Octal format info */ Index: objc-lang.c =================================================================== RCS file: /cvs/src/src/gdb/objc-lang.c,v retrieving revision 1.22 diff -u -p -r1.22 objc-lang.c --- objc-lang.c 15 May 2003 22:18:42 -0000 1.22 +++ objc-lang.c 20 May 2003 01:52:11 -0000 @@ -701,6 +701,8 @@ const struct language_defn objc_language c_val_print, /* Print a value using appropriate syntax */ c_value_print, /* Print a top-level value */ objc_skip_trampoline, /* Language specific skip_trampoline */ + value_of_this, /* value_of_this */ + basic_lookup_symbol_nonlocal, /* lookup_symbol_nonlocal */ objc_demangle, /* Language specific symbol demangler */ {"", "", "", ""}, /* Binary format info */ {"0%lo", "0", "o", ""}, /* Octal format info */ Index: p-lang.c =================================================================== RCS file: /cvs/src/src/gdb/p-lang.c,v retrieving revision 1.12 diff -u -p -r1.12 p-lang.c --- p-lang.c 15 May 2003 22:18:43 -0000 1.12 +++ p-lang.c 20 May 2003 01:52:12 -0000 @@ -28,6 +28,7 @@ #include "language.h" #include "p-lang.h" #include "valprint.h" +#include "value.h" #include extern void _initialize_pascal_language (void); @@ -461,6 +462,8 @@ const struct language_defn pascal_langua pascal_val_print, /* Print a value using appropriate syntax */ pascal_value_print, /* Print a top-level value */ NULL, /* Language specific skip_trampoline */ + value_of_this, /* value_of_this */ + basic_lookup_symbol_nonlocal, /* lookup_symbol_nonlocal */ NULL, /* Language specific symbol demangler */ {"", "%", "b", ""}, /* Binary format info */ {"0%lo", "0", "o", ""}, /* Octal format info */ Index: scm-lang.c =================================================================== RCS file: /cvs/src/src/gdb/scm-lang.c,v retrieving revision 1.17 diff -u -p -r1.17 scm-lang.c --- scm-lang.c 14 May 2003 17:43:18 -0000 1.17 +++ scm-lang.c 20 May 2003 01:52:12 -0000 @@ -252,6 +252,8 @@ const struct language_defn scm_language_ scm_val_print, /* Print a value using appropriate syntax */ scm_value_print, /* Print a top-level value */ NULL, /* Language specific skip_trampoline */ + value_of_this, /* value_of_this */ + basic_lookup_symbol_nonlocal, /* lookup_symbol_nonlocal */ NULL, /* Language specific symbol demangler */ {"", "", "", ""}, /* Binary format info */ {"#o%lo", "#o", "o", ""}, /* Octal format info */ Index: symtab.c =================================================================== RCS file: /cvs/src/src/gdb/symtab.c,v retrieving revision 1.108 diff -u -p -r1.108 symtab.c --- symtab.c 20 May 2003 01:26:58 -0000 1.108 +++ symtab.c 20 May 2003 01:52:16 -0000 @@ -96,13 +96,6 @@ struct symbol *lookup_symbol_aux_local ( struct symtab **symtab); static -struct symbol *lookup_symbol_aux_block (const char *name, - const char *linkage_name, - const struct block *block, - const domain_enum domain, - struct symtab **symtab); - -static struct symbol *lookup_symbol_aux_symtabs (int block_index, const char *name, const char *linkage_name, @@ -957,7 +950,6 @@ lookup_symbol_aux (const char *name, con int *is_a_field_of_this, struct symtab **symtab) { struct symbol *sym; - const struct block *static_block; /* Search specified block and its superiors. Don't search STATIC_BLOCK or GLOBAL_BLOCK. */ @@ -967,11 +959,13 @@ lookup_symbol_aux (const char *name, con if (sym != NULL) return sym; - /* C++/Java/Objective-C: If requested to do so by the caller, - check to see if NAME is a field of `this'. */ - if (is_a_field_of_this) + /* If requested to do so by the caller and if appropriate for the + current language, check to see if NAME is a field of `this'. */ + + if (current_language->la_value_of_this != NULL + && is_a_field_of_this != NULL) { - struct value *v = value_of_this (0); + struct value *v = current_language->la_value_of_this (0); *is_a_field_of_this = 0; if (v && check_field (v, name)) @@ -983,51 +977,12 @@ lookup_symbol_aux (const char *name, con } } - /* If there's a static block to search, search it next. */ - - /* NOTE: carlton/2002-12-05: There is a question as to whether or - not it would be appropriate to search the current global block - here as well. (That's what this code used to do before the - is_a_field_of_this check was moved up.) On the one hand, it's - redundant with the lookup_symbol_aux_symtabs search that happens - next. On the other hand, if decode_line_1 is passed an argument - like filename:var, then the user presumably wants 'var' to be - searched for in filename. On the third hand, there shouldn't be - multiple global variables all of which are named 'var', and it's - not like decode_line_1 has ever restricted its search to only - global variables in a single filename. All in all, only - searching the static block here seems best: it's correct and it's - cleanest. */ - - /* NOTE: carlton/2002-12-05: There's also a possible performance - issue here: if you usually search for global symbols in the - current file, then it would be slightly better to search the - current global block before searching all the symtabs. But there - are other factors that have a much greater effect on performance - than that one, so I don't think we should worry about that for - now. */ - - static_block = block_static_block (block); - if (static_block != NULL) - { - sym = lookup_symbol_aux_block (name, linkage_name, static_block, - domain, symtab); - if (sym != NULL) - return sym; - } - - /* Now search all global blocks. Do the symtab's first, then - check the psymtab's. If a psymtab indicates the existence - of the desired name as a global, then do psymtab-to-symtab - conversion on the fly and return the found symbol. */ + /* Now do whatever is appropriate for the current language to look + up static and global variables. */ - sym = lookup_symbol_aux_symtabs (GLOBAL_BLOCK, name, linkage_name, - domain, symtab); - if (sym != NULL) - return sym; - - sym = lookup_symbol_aux_psymtabs (GLOBAL_BLOCK, name, linkage_name, - domain, symtab); + sym = current_language->la_lookup_symbol_nonlocal (name, linkage_name, + block, domain, + symtab); if (sym != NULL) return sym; @@ -1086,7 +1041,7 @@ lookup_symbol_aux_local (const char *nam /* Look up a symbol in a block; if found, locate its symtab, fixup the symbol, and set block_found appropriately. */ -static struct symbol * +struct symbol * lookup_symbol_aux_block (const char *name, const char *linkage_name, const struct block *block, const domain_enum domain, @@ -1343,6 +1298,93 @@ lookup_symbol_aux_minsyms (const char *n return NULL; } #endif /* 0 */ + +/* A default version of lookup_symbol_nonlocal for use by languages + that can't think of anything better to do. This implements the C + lookup rules. */ + +struct symbol * +basic_lookup_symbol_nonlocal (const char *name, + const char *linkage_name, + const struct block *block, + const domain_enum domain, + struct symtab **symtab) +{ + struct symbol *sym; + + /* NOTE: carlton/2003-05-19: The comments below were written when + this (or what turned into this) was part of lookup_symbol_aux; + I'm much less worried about these questions now, since these + decisions have turned out well, but I leave these comments here + for posterity. */ + + /* NOTE: carlton/2002-12-05: There is a question as to whether or + not it would be appropriate to search the current global block + here as well. (That's what this code used to do before the + is_a_field_of_this check was moved up.) On the one hand, it's + redundant with the lookup_symbol_aux_symtabs search that happens + next. On the other hand, if decode_line_1 is passed an argument + like filename:var, then the user presumably wants 'var' to be + searched for in filename. On the third hand, there shouldn't be + multiple global variables all of which are named 'var', and it's + not like decode_line_1 has ever restricted its search to only + global variables in a single filename. All in all, only + searching the static block here seems best: it's correct and it's + cleanest. */ + + /* NOTE: carlton/2002-12-05: There's also a possible performance + issue here: if you usually search for global symbols in the + current file, then it would be slightly better to search the + current global block before searching all the symtabs. But there + are other factors that have a much greater effect on performance + than that one, so I don't think we should worry about that for + now. */ + + sym = lookup_symbol_static (name, linkage_name, block, domain, symtab); + if (sym != NULL) + return sym; + + return lookup_symbol_global (name, linkage_name, domain, symtab); +} + +/* Lookup a symbol in the static block associated to BLOCK, if there + is one; do nothing if BLOCK is NULL or a global block. */ + +struct symbol * +lookup_symbol_static (const char *name, + const char *linkage_name, + const struct block *block, + const domain_enum domain, + struct symtab **symtab) +{ + const struct block *static_block = block_static_block (block); + + if (static_block != NULL) + return lookup_symbol_aux_block (name, linkage_name, static_block, + domain, symtab); + else + return NULL; +} + +/* Lookup a symbol in all files' global blocks (searching psymtabs if + necessary). */ + +struct symbol * +lookup_symbol_global (const char *name, + const char *linkage_name, + const domain_enum domain, + struct symtab **symtab) +{ + struct symbol *sym; + + sym = lookup_symbol_aux_symtabs (GLOBAL_BLOCK, name, linkage_name, + domain, symtab); + if (sym != NULL) + return sym; + + return lookup_symbol_aux_psymtabs (GLOBAL_BLOCK, name, linkage_name, + domain, symtab); +} /* Look, in partial_symtab PST, for symbol whose natural name is NAME. If LINKAGE_NAME is non-NULL, check in addition that the symbol's Index: symtab.h =================================================================== RCS file: /cvs/src/src/gdb/symtab.h,v retrieving revision 1.71 diff -u -p -r1.71 symtab.h --- symtab.h 15 May 2003 22:23:24 -0000 1.71 +++ symtab.h 20 May 2003 01:52:18 -0000 @@ -988,6 +988,45 @@ extern struct symbol *lookup_symbol (con const domain_enum, int *, struct symtab **); +/* A default version of lookup_symbol_nonlocal for use by languages + that can't think of anything better to do. */ + +extern struct symbol *basic_lookup_symbol_nonlocal (const char *, + const char *, + const struct block *, + const domain_enum, + struct symtab **); + +/* Some helper functions for languages that need to write their own + lookup_symbol_nonlocal functions. */ + +/* Lookup a symbol in the static block associated to BLOCK, if there + is one; do nothing if BLOCK is NULL or a global block. */ + +extern struct symbol *lookup_symbol_static (const char *name, + const char *linkage_name, + const struct block *block, + const domain_enum domain, + struct symtab **symtab); + +/* Lookup a symbol in all files' global blocks (searching psymtabs if + necessary). */ + +extern struct symbol *lookup_symbol_global (const char *name, + const char *linkage_name, + const domain_enum domain, + struct symtab **symtab); + +/* Lookup a symbol within the block BLOCK. This, unlike + lookup_symbol_block, will set SYMTAB and BLOCK_FOUND correctly, and + will fix up the symbol if necessary. */ + +extern struct symbol *lookup_symbol_aux_block (const char *name, + const char *linkage_name, + const struct block *block, + const domain_enum domain, + struct symtab **symtab); + /* lookup a symbol by name, within a specified block */ extern struct symbol *lookup_block_symbol (const struct block *, const char *,