forked from Imagelibrary/binutils-gdb
* mipsread.c (parse_partial_symbols, psymtab_to_symtab_1):
Set language for psymtab and symtab. * mipsread.c (new_symbol): Set language and initialize demangled name for symbol. * symmisc.c (print_symbol): Use SYMBOL_SOURCE_NAME when printing the symbol type. * symtab.c (decode_line_1): Inhibit coredumps with cfront executables.
This commit is contained in:
@@ -1,3 +1,13 @@
|
||||
Fri Aug 20 15:07:05 1993 Peter Schauer (pes@regent.e-technik.tu-muenchen.de)
|
||||
|
||||
* mipsread.c (parse_partial_symbols, psymtab_to_symtab_1):
|
||||
Set language for psymtab and symtab.
|
||||
* mipsread.c (new_symbol): Set language and initialize demangled
|
||||
name for symbol.
|
||||
* symmisc.c (print_symbol): Use SYMBOL_SOURCE_NAME when printing
|
||||
the symbol type.
|
||||
* symtab.c (decode_line_1): Inhibit coredumps with cfront executables.
|
||||
|
||||
Fri Aug 20 14:01:39 1993 Jim Kingdon (kingdon@lioth.cygnus.com)
|
||||
|
||||
* Move KERNEL_U_ADDR from xm-hp300bsd.h to nm-hp300bsd.h and make
|
||||
|
||||
@@ -2110,6 +2110,8 @@ parse_partial_symbols (objfile, section_offsets)
|
||||
/* The way to turn this into a symtab is to call... */
|
||||
pst->read_symtab = mipscoff_psymtab_to_symtab;
|
||||
|
||||
psymtab_language = deduce_language_from_filename (fdr_name (fh));
|
||||
|
||||
pst->texthigh = pst->textlow;
|
||||
|
||||
/* For stabs-in-ecoff files, the second symbol must be @stab.
|
||||
@@ -2745,6 +2747,8 @@ psymtab_to_symtab_1 (pst, filename)
|
||||
st = new_symtab (pst->filename, 2 * f_max, maxlines, pst->objfile);
|
||||
}
|
||||
|
||||
psymtab_language = st->language;
|
||||
|
||||
lines = LINETABLE (st);
|
||||
pending_list = PST_PRIVATE (pst)->pending_list;
|
||||
if (pending_list == 0)
|
||||
@@ -3344,6 +3348,8 @@ new_symbol (name)
|
||||
|
||||
memset ((PTR) s, 0, sizeof (*s));
|
||||
SYMBOL_NAME (s) = name;
|
||||
SYMBOL_LANGUAGE (s) = psymtab_language;
|
||||
SYMBOL_INIT_DEMANGLED_NAME (s, ¤t_objfile->symbol_obstack);
|
||||
return s;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/* Do various things to symbol tables (other than lookup), for GDB.
|
||||
Copyright 1986, 1987, 1989, 1991, 1992 Free Software Foundation, Inc.
|
||||
Copyright 1986, 1987, 1989, 1991, 1992, 1993 Free Software Foundation, Inc.
|
||||
|
||||
This file is part of GDB.
|
||||
|
||||
@@ -34,12 +34,15 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
||||
#define DEV_TTY "/dev/tty"
|
||||
#endif
|
||||
|
||||
/* Unfortunately for debugging, stderr is usually a macro. Better if we
|
||||
make a variable which has the same value and which is accessible when
|
||||
debugging GDB with itself. */
|
||||
FILE *std_in = stdin;
|
||||
FILE *std_out = stdout;
|
||||
FILE *std_err = stderr;
|
||||
/* Unfortunately for debugging, stderr is usually a macro. This is painful
|
||||
when calling functions that take FILE *'s from the debugger.
|
||||
So we make a variable which has the same value and which is accessible when
|
||||
debugging GDB with itself. Because stdin et al need not be constants,
|
||||
we initialize them in the _initialize_symmisc function at the bottom
|
||||
of the file. */
|
||||
FILE *std_in;
|
||||
FILE *std_out;
|
||||
FILE *std_err;
|
||||
|
||||
/* Prototypes for local functions */
|
||||
|
||||
@@ -201,6 +204,11 @@ dump_msymbols (objfile, outfile)
|
||||
char ms_type;
|
||||
|
||||
fprintf_filtered (outfile, "\nObject file %s:\n\n", objfile -> name);
|
||||
if (objfile -> minimal_symbol_count == 0)
|
||||
{
|
||||
fprintf_filtered (outfile, "No minimal symbols found.\n");
|
||||
return;
|
||||
}
|
||||
for (index = 0, msymbol = objfile -> msymbols;
|
||||
SYMBOL_NAME (msymbol) != NULL; msymbol++, index++)
|
||||
{
|
||||
@@ -210,16 +218,25 @@ dump_msymbols (objfile, outfile)
|
||||
ms_type = 'u';
|
||||
break;
|
||||
case mst_text:
|
||||
ms_type = 't';
|
||||
ms_type = 'T';
|
||||
break;
|
||||
case mst_data:
|
||||
ms_type = 'd';
|
||||
ms_type = 'D';
|
||||
break;
|
||||
case mst_bss:
|
||||
ms_type = 'b';
|
||||
ms_type = 'B';
|
||||
break;
|
||||
case mst_abs:
|
||||
ms_type = 'a';
|
||||
ms_type = 'A';
|
||||
break;
|
||||
case mst_file_text:
|
||||
ms_type = 't';
|
||||
break;
|
||||
case mst_file_data:
|
||||
ms_type = 'd';
|
||||
break;
|
||||
case mst_file_bss:
|
||||
ms_type = 'b';
|
||||
break;
|
||||
default:
|
||||
ms_type = '?';
|
||||
@@ -388,7 +405,7 @@ maintenance_print_symbols (args, from_tty)
|
||||
filename = tilde_expand (filename);
|
||||
make_cleanup (free, filename);
|
||||
|
||||
outfile = fopen (filename, "w");
|
||||
outfile = fopen (filename, FOPEN_WT);
|
||||
if (outfile == 0)
|
||||
perror_with_name (filename);
|
||||
make_cleanup (fclose, (char *) outfile);
|
||||
@@ -439,7 +456,8 @@ print_symbol (symbol, depth, outfile)
|
||||
if (SYMBOL_TYPE (symbol))
|
||||
{
|
||||
/* Print details of types, except for enums where it's clutter. */
|
||||
LA_PRINT_TYPE (SYMBOL_TYPE (symbol), SYMBOL_NAME (symbol), outfile,
|
||||
LA_PRINT_TYPE (SYMBOL_TYPE (symbol), SYMBOL_SOURCE_NAME (symbol),
|
||||
outfile,
|
||||
TYPE_CODE (SYMBOL_TYPE (symbol)) != TYPE_CODE_ENUM,
|
||||
depth);
|
||||
fprintf (outfile, "; ");
|
||||
@@ -506,6 +524,10 @@ print_symbol (symbol, depth, outfile)
|
||||
fprintf (outfile, "parameter register %ld,", SYMBOL_VALUE (symbol));
|
||||
break;
|
||||
|
||||
case LOC_REGPARM_ADDR:
|
||||
fprintf (outfile, "address parameter register %ld,", SYMBOL_VALUE (symbol));
|
||||
break;
|
||||
|
||||
case LOC_LOCAL:
|
||||
if (SYMBOL_BASEREG_VALID (symbol))
|
||||
{
|
||||
@@ -531,6 +553,10 @@ print_symbol (symbol, depth, outfile)
|
||||
BLOCK_START (SYMBOL_BLOCK_VALUE (symbol)));
|
||||
break;
|
||||
|
||||
case LOC_OPTIMIZED_OUT:
|
||||
fprintf (outfile, "optimized out");
|
||||
break;
|
||||
|
||||
default:
|
||||
fprintf (outfile, "botched symbol class %x", SYMBOL_CLASS (symbol));
|
||||
break;
|
||||
@@ -577,7 +603,7 @@ maintenance_print_psymbols (args, from_tty)
|
||||
filename = tilde_expand (filename);
|
||||
make_cleanup (free, filename);
|
||||
|
||||
outfile = fopen (filename, "w");
|
||||
outfile = fopen (filename, FOPEN_WT);
|
||||
if (outfile == 0)
|
||||
perror_with_name (filename);
|
||||
make_cleanup (fclose, outfile);
|
||||
@@ -648,6 +674,9 @@ print_partial_symbol (p, count, what, outfile)
|
||||
case LOC_REGPARM:
|
||||
fputs_filtered ("register parameter", outfile);
|
||||
break;
|
||||
case LOC_REGPARM_ADDR:
|
||||
fputs_filtered ("register address parameter", outfile);
|
||||
break;
|
||||
case LOC_LOCAL:
|
||||
fputs_filtered ("stack parameter", outfile);
|
||||
break;
|
||||
@@ -666,6 +695,9 @@ print_partial_symbol (p, count, what, outfile)
|
||||
case LOC_LOCAL_ARG:
|
||||
fputs_filtered ("shuffled arg", outfile);
|
||||
break;
|
||||
case LOC_OPTIMIZED_OUT:
|
||||
fputs_filtered ("optimized out", outfile);
|
||||
break;
|
||||
default:
|
||||
fputs_filtered ("<invalid location>", outfile);
|
||||
break;
|
||||
@@ -713,7 +745,7 @@ maintenance_print_msymbols (args, from_tty)
|
||||
filename = tilde_expand (filename);
|
||||
make_cleanup (free, filename);
|
||||
|
||||
outfile = fopen (filename, "w");
|
||||
outfile = fopen (filename, FOPEN_WT);
|
||||
if (outfile == 0)
|
||||
perror_with_name (filename);
|
||||
make_cleanup (fclose, outfile);
|
||||
@@ -788,3 +820,13 @@ extend_psymbol_list (listp, objfile)
|
||||
listp->next = listp->list + listp->size;
|
||||
listp->size = new_size;
|
||||
}
|
||||
|
||||
|
||||
/* Do early runtime initializations. */
|
||||
void
|
||||
_initialize_symmisc ()
|
||||
{
|
||||
std_in = stdin;
|
||||
std_out = stdout;
|
||||
std_err = stderr;
|
||||
}
|
||||
|
||||
142
gdb/symtab.c
142
gdb/symtab.c
@@ -81,8 +81,7 @@ output_source_filename PARAMS ((char *, int *));
|
||||
static char *
|
||||
operator_chars PARAMS ((char *, char **));
|
||||
|
||||
static int
|
||||
find_line_common PARAMS ((struct linetable *, int, int *));
|
||||
static int find_line_common PARAMS ((struct linetable *, int, int *));
|
||||
|
||||
static struct partial_symbol *
|
||||
lookup_partial_symbol PARAMS ((struct partial_symtab *, const char *,
|
||||
@@ -259,14 +258,14 @@ gdb_mangle_name (type, i, j)
|
||||
char *field_name = TYPE_FN_FIELDLIST_NAME (type, i);
|
||||
char *physname = TYPE_FN_FIELD_PHYSNAME (f, j);
|
||||
char *newname = type_name_no_tag (type);
|
||||
int is_constructor = STREQ (field_name, newname);
|
||||
int is_constructor = newname != NULL && STREQ (field_name, newname);
|
||||
int is_destructor = is_constructor && DESTRUCTOR_PREFIX_P (physname);
|
||||
/* Need a new type prefix. */
|
||||
char *const_prefix = method->is_const ? "C" : "";
|
||||
char *volatile_prefix = method->is_volatile ? "V" : "";
|
||||
char buf[20];
|
||||
#ifndef GCC_MANGLE_BUG
|
||||
int len = strlen (newname);
|
||||
int len = newname == NULL ? 0 : strlen (newname);
|
||||
|
||||
if (is_destructor)
|
||||
{
|
||||
@@ -304,7 +303,11 @@ gdb_mangle_name (type, i, j)
|
||||
strcpy (mangled_name, field_name);
|
||||
}
|
||||
strcat (mangled_name, buf);
|
||||
strcat (mangled_name, newname);
|
||||
/* If the class doesn't have a name, i.e. newname NULL, then we just
|
||||
mangle it using 0 for the length of the class. Thus it gets mangled
|
||||
as something starting with `::' rather than `classname::'. */
|
||||
if (newname != NULL)
|
||||
strcat (mangled_name, newname);
|
||||
#else
|
||||
char *opname;
|
||||
|
||||
@@ -934,10 +937,15 @@ find_pc_symtab (pc)
|
||||
register struct symtab *best_s = NULL;
|
||||
register struct partial_symtab *ps;
|
||||
register struct objfile *objfile;
|
||||
int distance = 0;;
|
||||
int distance = 0;
|
||||
|
||||
|
||||
/* Search all symtabs for one whose file contains our pc */
|
||||
/* Search all symtabs for the one whose file contains our address, and which
|
||||
is the smallest of all the ones containing the address. This is designed
|
||||
to deal with a case like symtab a is at 0x1000-0x2000 and 0x3000-0x4000
|
||||
and symtab b is at 0x2000-0x3000. So the GLOBAL_BLOCK for a is from
|
||||
0x1000-0x4000, but for address 0x2345 we want to return symtab b.
|
||||
This is said to happen for the mips; it might be swifter to create
|
||||
several symtabs with the same name like xcoff does (I'm not sure). */
|
||||
|
||||
ALL_SYMTABS (objfile, s)
|
||||
{
|
||||
@@ -1133,6 +1141,99 @@ find_pc_line (pc, notcurrent)
|
||||
return val;
|
||||
}
|
||||
|
||||
static int find_line_symtab PARAMS ((struct symtab *, int, struct linetable **,
|
||||
int *, int *));
|
||||
|
||||
/* Find line number LINE in any symtab whose name is the same as
|
||||
SYMTAB.
|
||||
|
||||
If found, return 1, set *LINETABLE to the linetable in which it was
|
||||
found, set *INDEX to the index in the linetable of the best entry
|
||||
found, and set *EXACT_MATCH nonzero if the value returned is an
|
||||
exact match.
|
||||
|
||||
If not found, return 0. */
|
||||
|
||||
static int
|
||||
find_line_symtab (symtab, line, linetable, index, exact_match)
|
||||
struct symtab *symtab;
|
||||
int line;
|
||||
struct linetable **linetable;
|
||||
int *index;
|
||||
int *exact_match;
|
||||
{
|
||||
int exact;
|
||||
|
||||
/* BEST_INDEX and BEST_LINETABLE identify the smallest linenumber > LINE
|
||||
so far seen. */
|
||||
|
||||
int best_index;
|
||||
struct linetable *best_linetable;
|
||||
|
||||
/* First try looking it up in the given symtab. */
|
||||
best_linetable = LINETABLE (symtab);
|
||||
best_index = find_line_common (best_linetable, line, &exact);
|
||||
if (best_index < 0 || !exact)
|
||||
{
|
||||
/* Didn't find an exact match. So we better keep looking for
|
||||
another symtab with the same name. In the case of xcoff,
|
||||
multiple csects for one source file (produced by IBM's FORTRAN
|
||||
compiler) produce multiple symtabs (this is unavoidable
|
||||
assuming csects can be at arbitrary places in memory and that
|
||||
the GLOBAL_BLOCK of a symtab has a begin and end address). */
|
||||
|
||||
/* BEST is the smallest linenumber > LINE so far seen,
|
||||
or 0 if none has been seen so far.
|
||||
BEST_INDEX and BEST_LINETABLE identify the item for it. */
|
||||
int best;
|
||||
|
||||
struct objfile *objfile;
|
||||
struct symtab *s;
|
||||
|
||||
if (best_index >= 0)
|
||||
best = best_linetable->item[best_index].line;
|
||||
else
|
||||
best = 0;
|
||||
|
||||
ALL_SYMTABS (objfile, s)
|
||||
{
|
||||
struct linetable *l;
|
||||
int ind;
|
||||
|
||||
if (!STREQ (symtab->filename, s->filename))
|
||||
continue;
|
||||
l = LINETABLE (s);
|
||||
ind = find_line_common (l, line, &exact);
|
||||
if (ind >= 0)
|
||||
{
|
||||
if (exact)
|
||||
{
|
||||
best_index = ind;
|
||||
best_linetable = l;
|
||||
goto done;
|
||||
}
|
||||
if (best == 0 || l->item[ind].line < best)
|
||||
{
|
||||
best = l->item[ind].line;
|
||||
best_index = ind;
|
||||
best_linetable = l;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
done:
|
||||
if (best_index < 0)
|
||||
return 0;
|
||||
|
||||
if (index)
|
||||
*index = best_index;
|
||||
if (linetable)
|
||||
*linetable = best_linetable;
|
||||
if (exact_match)
|
||||
*exact_match = exact;
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* Find the PC value for a given source file and line number.
|
||||
Returns zero for invalid line number.
|
||||
The source file is specified with a struct symtab. */
|
||||
@@ -1142,15 +1243,15 @@ find_line_pc (symtab, line)
|
||||
struct symtab *symtab;
|
||||
int line;
|
||||
{
|
||||
register struct linetable *l;
|
||||
register int ind;
|
||||
int dummy;
|
||||
struct linetable *l;
|
||||
int ind;
|
||||
|
||||
if (symtab == 0)
|
||||
return 0;
|
||||
l = LINETABLE (symtab);
|
||||
ind = find_line_common(l, line, &dummy);
|
||||
return (ind >= 0) ? l->item[ind].pc : 0;
|
||||
if (find_line_symtab (symtab, line, &l, &ind, NULL))
|
||||
return l->item[ind].pc;
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Find the range of pc values in a line.
|
||||
@@ -1165,16 +1266,14 @@ find_line_pc_range (symtab, thisline, startptr, endptr)
|
||||
int thisline;
|
||||
CORE_ADDR *startptr, *endptr;
|
||||
{
|
||||
register struct linetable *l;
|
||||
register int ind;
|
||||
struct linetable *l;
|
||||
int ind;
|
||||
int exact_match; /* did we get an exact linenumber match */
|
||||
|
||||
if (symtab == 0)
|
||||
return 0;
|
||||
|
||||
l = LINETABLE (symtab);
|
||||
ind = find_line_common (l, thisline, &exact_match);
|
||||
if (ind >= 0)
|
||||
if (find_line_symtab (symtab, thisline, &l, &ind, &exact_match))
|
||||
{
|
||||
*startptr = l->item[ind].pc;
|
||||
/* If we have not seen an entry for the specified line,
|
||||
@@ -1671,7 +1770,8 @@ decode_line_1 (argptr, funfirstline, default_symtab, default_line, canonical)
|
||||
t = SYMBOL_TYPE (sym_class);
|
||||
sym_arr = (struct symbol **) alloca(TYPE_NFN_FIELDS_TOTAL (t) * sizeof(struct symbol*));
|
||||
|
||||
if (destructor_name_p (copy, t))
|
||||
/* Cfront objects don't have fieldlists. */
|
||||
if (destructor_name_p (copy, t) && TYPE_FN_FIELDLISTS (t) != NULL)
|
||||
{
|
||||
/* destructors are a special case. */
|
||||
struct fn_field *f = TYPE_FN_FIELDLIST1 (t, 0);
|
||||
@@ -1849,6 +1949,8 @@ decode_line_1 (argptr, funfirstline, default_symtab, default_line, canonical)
|
||||
Find the next token (everything up to end or next whitespace). */
|
||||
|
||||
p = skip_quoted (*argptr);
|
||||
if (is_quoted && p[-1] != '\'')
|
||||
error ("Unmatched single quote.");
|
||||
copy = (char *) alloca (p - *argptr + 1);
|
||||
memcpy (copy, *argptr, p - *argptr);
|
||||
copy[p - *argptr] = '\0';
|
||||
|
||||
Reference in New Issue
Block a user