hp merge changes -- too numerous to mention here; see ChangeLog and

ChangeLog-gdbtk for details.
This commit is contained in:
David Taylor 1998-12-28 23:06:13 +00:00
parent d6fdf61c78
commit 4ef1f46773
68 changed files with 7667 additions and 859 deletions

View file

@ -1,5 +1,5 @@
/* Symbol table lookup for the GNU debugger, GDB.
Copyright 1986, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 1997
Copyright 1986, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 1998
Free Software Foundation, Inc.
This file is part of GDB.
@ -45,56 +45,65 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
/* Prototypes for local functions */
static int
find_methods PARAMS ((struct type *, char *, struct symbol **));
static int find_methods PARAMS ((struct type *, char *, struct symbol **));
static void
completion_list_add_name PARAMS ((char *, char *, int, char *, char *));
static void completion_list_add_name PARAMS ((char *, char *, int, char *,
char *));
static void
build_canonical_line_spec PARAMS ((struct symtab_and_line *, char *, char ***));
static void build_canonical_line_spec PARAMS ((struct symtab_and_line *,
char *, char ***));
static struct symtabs_and_lines
decode_line_2 PARAMS ((struct symbol *[], int, int, char ***));
static struct symtabs_and_lines decode_line_2 PARAMS ((struct symbol *[],
int, int, char ***));
static void
rbreak_command PARAMS ((char *, int));
static void rbreak_command PARAMS ((char *, int));
static void
types_info PARAMS ((char *, int));
static void types_info PARAMS ((char *, int));
static void
functions_info PARAMS ((char *, int));
static void functions_info PARAMS ((char *, int));
static void
variables_info PARAMS ((char *, int));
static void variables_info PARAMS ((char *, int));
static void
sources_info PARAMS ((char *, int));
static void sources_info PARAMS ((char *, int));
static void
output_source_filename PARAMS ((char *, int *));
static void output_source_filename PARAMS ((char *, int *));
char *
operator_chars PARAMS ((char *, char **));
char *operator_chars PARAMS ((char *, char **));
static int find_line_common PARAMS ((struct linetable *, int, int *));
static struct partial_symbol *
lookup_partial_symbol PARAMS ((struct partial_symtab *, const char *,
int, namespace_enum));
static struct partial_symbol *lookup_partial_symbol PARAMS
((struct partial_symtab *, const char *,
int, namespace_enum));
static struct partial_symbol *
fixup_psymbol_section PARAMS ((struct partial_symbol *, struct objfile *));
static struct partial_symbol *fixup_psymbol_section PARAMS ((struct
partial_symbol *, struct objfile *));
static struct symtab *
lookup_symtab_1 PARAMS ((char *));
static struct symtab *lookup_symtab_1 PARAMS ((char *));
static void
cplusplus_hint PARAMS ((char *));
static void cplusplus_hint PARAMS ((char *));
static struct symbol *
find_active_alias PARAMS ((struct symbol *sym, CORE_ADDR addr));
static struct symbol *find_active_alias PARAMS ((struct symbol *sym,
CORE_ADDR addr));
/* This flag is used in hppa-tdep.c, and set in hp-symtab-read.c */
/* Signals the presence of objects compiled by HP compilers */
int hp_som_som_object_present = 0;
static void fixup_section PARAMS ((struct general_symbol_info *,
struct objfile *));
static int file_matches PARAMS ((char *, char **, int));
static void print_symbol_info PARAMS ((namespace_enum,
struct symtab *, struct symbol *,
int, char *));
static void print_msymbol_info PARAMS ((struct minimal_symbol *));
static void symtab_symbol_info PARAMS ((char *, namespace_enum, int));
void _initialize_symtab PARAMS ((void));
/* */
@ -887,6 +896,120 @@ lookup_partial_symbol (pst, name, global, namespace)
return (NULL);
}
/* Look up a type named NAME in the struct_namespace. The type returned
must not be opaque -- i.e., must have at least one field defined
This code was modelled on lookup_symbol -- the parts not relevant to looking
up types were just left out. In particular it's assumed here that types
are available in struct_namespace and only at file-static or global blocks. */
struct type *
lookup_transparent_type (name)
const char *name;
{
register struct symbol *sym;
register struct symtab *s = NULL;
register struct partial_symtab *ps;
struct blockvector *bv;
register struct objfile *objfile;
register struct block *block;
register struct minimal_symbol *msymbol;
/* Now search all the global symbols. 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. */
ALL_SYMTABS (objfile, s)
{
bv = BLOCKVECTOR (s);
block = BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK);
sym = lookup_block_symbol (block, name, STRUCT_NAMESPACE);
if (sym && !TYPE_IS_OPAQUE (SYMBOL_TYPE (sym)))
{
return SYMBOL_TYPE (sym);
}
}
ALL_PSYMTABS (objfile, ps)
{
if (!ps->readin && lookup_partial_symbol (ps, name, 1, STRUCT_NAMESPACE))
{
s = PSYMTAB_TO_SYMTAB(ps);
bv = BLOCKVECTOR (s);
block = BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK);
sym = lookup_block_symbol (block, name, STRUCT_NAMESPACE);
if (!sym)
{
/* This shouldn't be necessary, but as a last resort
* try looking in the statics even though the psymtab
* claimed the symbol was global. It's possible that
* the psymtab gets it wrong in some cases.
*/
block = BLOCKVECTOR_BLOCK (bv, STATIC_BLOCK);
sym = lookup_block_symbol (block, name, STRUCT_NAMESPACE);
if (!sym)
error ("Internal: global symbol `%s' found in %s psymtab but not in symtab.\n\
%s may be an inlined function, or may be a template function\n\
(if a template, try specifying an instantiation: %s<type>).",
name, ps->filename, name, name);
}
if (!TYPE_IS_OPAQUE (SYMBOL_TYPE (sym)))
return SYMBOL_TYPE (sym);
}
}
/* Now search the static file-level symbols.
Not strictly correct, but more useful than an error.
Do the symtab's first, then
check the psymtab's. If a psymtab indicates the existence
of the desired name as a file-level static, then do psymtab-to-symtab
conversion on the fly and return the found symbol.
*/
ALL_SYMTABS (objfile, s)
{
bv = BLOCKVECTOR (s);
block = BLOCKVECTOR_BLOCK (bv, STATIC_BLOCK);
sym = lookup_block_symbol (block, name, STRUCT_NAMESPACE);
if (sym && !TYPE_IS_OPAQUE (SYMBOL_TYPE (sym)))
{
return SYMBOL_TYPE (sym);
}
}
ALL_PSYMTABS (objfile, ps)
{
if (!ps->readin && lookup_partial_symbol (ps, name, 0, STRUCT_NAMESPACE))
{
s = PSYMTAB_TO_SYMTAB(ps);
bv = BLOCKVECTOR (s);
block = BLOCKVECTOR_BLOCK (bv, STATIC_BLOCK);
sym = lookup_block_symbol (block, name, STRUCT_NAMESPACE);
if (!sym)
{
/* This shouldn't be necessary, but as a last resort
* try looking in the globals even though the psymtab
* claimed the symbol was static. It's possible that
* the psymtab gets it wrong in some cases.
*/
block = BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK);
sym = lookup_block_symbol (block, name, STRUCT_NAMESPACE);
if (!sym)
error ("Internal: static symbol `%s' found in %s psymtab but not in symtab.\n\
%s may be an inlined function, or may be a template function\n\
(if a template, try specifying an instantiation: %s<type>).",
name, ps->filename, name, name);
}
if (!TYPE_IS_OPAQUE (SYMBOL_TYPE (sym)))
return SYMBOL_TYPE (sym);
}
}
return (struct type *) 0;
}
/* Find the psymtab containing main(). */
/* FIXME: What about languages without main() or specially linked
executables that have no main() ? */
@ -1912,10 +2035,12 @@ find_methods (t, name, sym_arr)
if (strncmp (method_name, "__", 2) == 0 ||
strncmp (method_name, "op", 2) == 0 ||
strncmp (method_name, "type", 4) == 0)
if (cplus_demangle_opname (method_name, dem_opname, DMGL_ANSI))
method_name = dem_opname;
else if (cplus_demangle_opname (method_name, dem_opname, 0))
method_name = dem_opname;
{
if (cplus_demangle_opname (method_name, dem_opname, DMGL_ANSI))
method_name = dem_opname;
else if (cplus_demangle_opname (method_name, dem_opname, 0))
method_name = dem_opname;
}
if (STREQ (name, method_name))
/* Find all the overloaded methods with that name. */
@ -2575,16 +2700,16 @@ decode_line_1 (argptr, funfirstline, default_symtab, default_line, canonical)
msymbol = lookup_minimal_symbol (copy, NULL, NULL);
if (msymbol != NULL)
{
val.pc = SYMBOL_VALUE_ADDRESS (msymbol);
val.section = SYMBOL_BFD_SECTION (msymbol);
if (funfirstline)
{
val.pc += FUNCTION_START_OFFSET;
SKIP_PROLOGUE (val.pc);
}
values.sals = (struct symtab_and_line *)
xmalloc (sizeof (struct symtab_and_line));
values.sals[0] = val;
values.sals[0] = find_pc_sect_line ( SYMBOL_VALUE_ADDRESS (msymbol),
(struct sec *)0,0 );
values.sals[0].section = SYMBOL_BFD_SECTION (msymbol);
if (funfirstline)
{
values.sals[0].pc += FUNCTION_START_OFFSET;
SKIP_PROLOGUE (values.sals[0].pc);
}
values.nelts = 1;
return values;
}
@ -2669,12 +2794,9 @@ decode_line_2 (sym_arr, nelts, funfirstline, canonical)
if ((prompt = getenv ("PS2")) == NULL)
{
prompt = ">";
prompt = "> ";
}
printf_unfiltered("%s ",prompt);
gdb_flush(gdb_stdout);
args = command_line_input ((char *) NULL, 0, "overload-choice");
args = command_line_input (prompt, 0, "overload-choice");
if (args == 0 || *args == 0)
error_no_arg ("one or more choice numbers");
@ -2904,7 +3026,8 @@ search_symbols (regexp, kind, nfiles, files, matches)
register struct blockvector *bv;
struct blockvector *prev_bv = 0;
register struct block *b;
register int i, j;
register int i = 0;
register int j;
register struct symbol *sym;
struct partial_symbol **psym;
struct objfile *objfile;
@ -3104,7 +3227,8 @@ search_symbols (regexp, kind, nfiles, files, matches)
if (tail == NULL)
{
sr = psr;
old_chain = make_cleanup (free_search_symbols, sr);
old_chain = make_cleanup ((make_cleanup_func)
free_search_symbols, sr);
}
else
tail->next = psr;
@ -3148,7 +3272,8 @@ search_symbols (regexp, kind, nfiles, files, matches)
if (tail == NULL)
{
sr = psr;
old_chain = make_cleanup (free_search_symbols, &sr);
old_chain = make_cleanup ((make_cleanup_func)
free_search_symbols, &sr);
}
else
tail->next = psr;
@ -3169,7 +3294,7 @@ search_symbols (regexp, kind, nfiles, files, matches)
the data returned from search_symbols() to print information
regarding the match to gdb_stdout.
*/
static int
static void
print_symbol_info (kind, s, sym, block, last)
namespace_enum kind;
struct symtab *s;
@ -3262,7 +3387,7 @@ symtab_symbol_info (regexp, kind, from_tty)
/* must make sure that if we're interrupted, symbols gets freed */
search_symbols (regexp, kind, 0, (char **) NULL, &symbols);
old_chain = make_cleanup (free_search_symbols, symbols);
old_chain = make_cleanup ((make_cleanup_func) free_search_symbols, symbols);
printf_filtered (regexp
? "All %ss matching regular expression \"%s\":\n"
@ -3341,7 +3466,7 @@ rbreak_command (regexp, from_tty)
struct cleanup *old_chain;
search_symbols (regexp, FUNCTIONS_NAMESPACE, 0, (char **) NULL, &ss);
old_chain = make_cleanup (free_search_symbols, ss);
old_chain = make_cleanup ((make_cleanup_func) free_search_symbols, ss);
for (p = ss; p != NULL; p = p->next)
{