2003-05-19 David Carlton <carlton@bactrian.org>

* 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.
This commit is contained in:
David Carlton 2003-05-20 01:55:18 +00:00
parent 89a9d1b163
commit 5f9a71c3d7
14 changed files with 219 additions and 59 deletions

View File

@ -1,3 +1,31 @@
2003-05-19 David Carlton <carlton@bactrian.org>
* 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.
2003-05-19 David Carlton <carlton@bactrian.org>
* block.h: Declare block_static_block.

View File

@ -1703,7 +1703,7 @@ expprint.o: expprint.c $(defs_h) $(symtab_h) $(gdbtypes_h) $(expression_h) \
$(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_h) $(osabi_h) $(elf_bfd_h) \
$(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)

View File

@ -8082,6 +8082,8 @@ const struct language_defn ada_language_defn = {
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

View File

@ -553,6 +553,8 @@ const struct language_defn c_language_defn =
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_language_defn =
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_defn =
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_language_defn =
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 */

View File

@ -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_defn =
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 */

View File

@ -1063,6 +1063,8 @@ const struct language_defn java_language_defn =
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 */

View File

@ -1479,6 +1479,8 @@ const struct language_defn unknown_language_defn =
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_defn =
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_language_defn =
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 */

View File

@ -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);

View File

@ -426,6 +426,8 @@ const struct language_defn m2_language_defn =
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 */

View File

@ -701,6 +701,8 @@ const struct language_defn objc_language_defn = {
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 */

View File

@ -28,6 +28,7 @@
#include "language.h"
#include "p-lang.h"
#include "valprint.h"
#include "value.h"
#include <ctype.h>
extern void _initialize_pascal_language (void);
@ -461,6 +462,8 @@ const struct language_defn pascal_language_defn =
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 */

View File

@ -252,6 +252,8 @@ const struct language_defn scm_language_defn =
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 */

View File

@ -95,13 +95,6 @@ struct symbol *lookup_symbol_aux_local (const char *name,
const domain_enum domain,
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,
@ -957,7 +950,6 @@ lookup_symbol_aux (const char *name, const char *linkage_name,
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, const char *linkage_name,
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, const char *linkage_name,
}
}
/* If there's a static block to search, search it next. */
/* Now do whatever is appropriate for the current language to look
up static and global variables. */
/* 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. */
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 *name, const char *linkage_name,
/* 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,
@ -1344,6 +1299,93 @@ lookup_symbol_aux_minsyms (const char *name,
}
#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
linkage name matches it. Check the global symbols if GLOBAL, the

View File

@ -988,6 +988,45 @@ extern struct symbol *lookup_symbol (const char *, const struct block *,
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 *,