* c-exp.y (yylex): Recognize single-quoted strings that specify

tokens with embedded whitespace, such as C++ demangled names.
	* defs.h (demangle_and_match, strcmp_iw, skip_quoted):  Prototypes.
	* main.c (gdb_completer_quote_characters):  Add global variable.
	* main.c (symbol_completion_function):  Total rewrite for C++
	demangled name handling.
	* main.c (skip_quoted):  New function.
	* main.c (main):  Set rl_completer_quote_characters.
	* symmisc.c (dump_symtab):  Print source language for symtab.
	* symtab.c (expensive_mangler):  Add prototype and function.
	* symtab.c (completion_list_add_symbol):  Total rewrite for new
	C++ demangled name handling.
	* symtab.c (lookup_symbol): Check for demangled C++ symbol first,
	other changes for demangled C++ symbol handling.
	* symtab.c (lookup_demangled_block_symbol):  Use demangle_and_match.
	* symtab.c (lookup_demangled_partial_symbol):  Use demangle_and_match.
	* symtab.c (decode_line_1):  Recognize C++ demangled names on input.
	* symtab.c (completion_list_add_symbol):  Total rewrite for new
	C++ demangled name handling.
	* symtab.c (expensive_mangler):  New function.
	* utils.c (strcmp_iw, demangle_and_match):  New functions.
	* xcoffread.c (aixcoff_symfile_read):  Fix prototype.
This commit is contained in:
Fred Fish 1992-06-09 06:09:33 +00:00
parent d9915ebc47
commit d630b6150e
5 changed files with 204 additions and 354 deletions

View File

@ -1,3 +1,28 @@
Mon Jun 8 23:05:51 1992 Fred Fish (fnf@cygnus.com)
* c-exp.y (yylex): Recognize single-quoted strings that specify
tokens with embedded whitespace, such as C++ demangled names.
* defs.h (demangle_and_match, strcmp_iw, skip_quoted): Prototypes.
* main.c (gdb_completer_quote_characters): Add global variable.
* main.c (symbol_completion_function): Total rewrite for C++
demangled name handling.
* main.c (skip_quoted): New function.
* main.c (main): Set rl_completer_quote_characters.
* symmisc.c (dump_symtab): Print source language for symtab.
* symtab.c (expensive_mangler): Add prototype and function.
* symtab.c (completion_list_add_symbol): Total rewrite for new
C++ demangled name handling.
* symtab.c (lookup_symbol): Check for demangled C++ symbol first,
other changes for demangled C++ symbol handling.
* symtab.c (lookup_demangled_block_symbol): Use demangle_and_match.
* symtab.c (lookup_demangled_partial_symbol): Use demangle_and_match.
* symtab.c (decode_line_1): Recognize C++ demangled names on input.
* symtab.c (completion_list_add_symbol): Total rewrite for new
C++ demangled name handling.
* symtab.c (expensive_mangler): New function.
* utils.c (strcmp_iw, demangle_and_match): New functions.
* xcoffread.c (aixcoff_symfile_read): Fix prototype.
Mon Jun 8 21:59:08 1992 John Gilmore (gnu at cygnus.com) Mon Jun 8 21:59:08 1992 John Gilmore (gnu at cygnus.com)
* Makefile.in: Roll VERSION to 4.5.4. * Makefile.in: Roll VERSION to 4.5.4.

View File

@ -1112,6 +1112,9 @@ yylex ()
goto retry; goto retry;
case '\'': case '\'':
/* We either have a character constant ('0' or '\177' for example)
or we have a quoted symbol reference ('foo(int,int)' in C++
for example). */
lexptr++; lexptr++;
c = *lexptr++; c = *lexptr++;
if (c == '\\') if (c == '\\')
@ -1119,7 +1122,17 @@ yylex ()
yylval.lval = c; yylval.lval = c;
c = *lexptr++; c = *lexptr++;
if (c != '\'') if (c != '\'')
error ("Invalid character constant."); {
namelen = skip_quoted (tokstart) - tokstart;
if (namelen > 2)
{
lexptr = tokstart + namelen;
namelen -= 2;
tokstart++;
goto tryname;
}
error ("Invalid character constant.");
}
return CHAR; return CHAR;
case '(': case '(':
@ -1272,6 +1285,7 @@ yylex ()
and $$digits (equivalent to $<-digits> if you could type that). and $$digits (equivalent to $<-digits> if you could type that).
Make token type LAST, and put the number (the digits) in yylval. */ Make token type LAST, and put the number (the digits) in yylval. */
tryname:
if (*tokstart == '$') if (*tokstart == '$')
{ {
register int negate = 0; register int negate = 0;

View File

@ -132,6 +132,12 @@ mmalloc_getkey PARAMS ((PTR, int));
/* From utils.c */ /* From utils.c */
extern char *
demangle_and_match PARAMS ((const char *, const char *, int));
extern int
strcmp_iw PARAMS ((const char *, const char *));
extern char * extern char *
safe_strerror PARAMS ((int)); safe_strerror PARAMS ((int));
@ -241,6 +247,9 @@ symbol_file_command PARAMS ((char *, int));
/* From main.c */ /* From main.c */
extern char *
skip_quoted PARAMS ((char *));
extern char * extern char *
gdb_readline PARAMS ((char *)); gdb_readline PARAMS ((char *));
@ -651,7 +660,7 @@ free PARAMS ((void *)); /* 4.10.3.2 */
#endif /* MALLOC_INCOMPATIBLE */ #endif /* MALLOC_INCOMPATIBLE */
extern PTR extern void
qsort PARAMS ((void *base, size_t nmemb, /* 4.10.5.2 */ qsort PARAMS ((void *base, size_t nmemb, /* 4.10.5.2 */
size_t size, size_t size,
int (*comp)(const void *, const void *))); int (*comp)(const void *, const void *)));

View File

@ -17,12 +17,12 @@ You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
#include "defs.h" #include "defs.h"
#include "symtab.h" #include "symtab.h"
#include "gdbtypes.h" #include "gdbtypes.h"
#include "bfd.h" #include "bfd.h"
#include "symfile.h" #include "symfile.h"
#include "objfiles.h"
#include "breakpoint.h" #include "breakpoint.h"
#include "command.h" #include "command.h"
#include "obstack.h" #include "obstack.h"
@ -33,23 +33,29 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
#define DEV_TTY "/dev/tty" #define DEV_TTY "/dev/tty"
#endif #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;
/* Prototypes for local functions */ /* Prototypes for local functions */
static PTR static void
dump_symtab PARAMS ((struct objfile *, struct symtab *, PTR, PTR, PTR)); dump_symtab PARAMS ((struct objfile *, struct symtab *, FILE *));
static PTR static void
dump_psymtab PARAMS ((struct objfile *, struct partial_symtab *, PTR, PTR, dump_psymtab PARAMS ((struct objfile *, struct partial_symtab *, FILE *));
PTR));
static PTR static void
dump_msymbols PARAMS ((struct objfile *, PTR, PTR, PTR)); dump_msymbols PARAMS ((struct objfile *, FILE *));
static PTR static void
dump_objfile PARAMS ((struct objfile *, PTR, PTR, PTR)); dump_objfile PARAMS ((struct objfile *));
static void static void
printobjfiles_command PARAMS ((void)); printobjfiles_command PARAMS ((char *, int));
static int static int
block_depth PARAMS ((struct block *)); block_depth PARAMS ((struct block *));
@ -71,40 +77,6 @@ free_symtab_block PARAMS ((struct objfile *, struct block *));
static void static void
printmsyms_command PARAMS ((char *, int)); printmsyms_command PARAMS ((char *, int));
static void
dump_symtab_lines PARAMS ((struct symtab *));
static void
dump_symtabs PARAMS ((struct symtab *));
static void
dump_last_symtab PARAMS ((struct symtab *));
static void
dump_blockvector PARAMS ((struct blockvector *));
static void
dump_block PARAMS ((struct block *));
static char *
dump_addrclass PARAMS ((int));
static char *
dump_namespace PARAMS ((int));
static void
dump_symbol PARAMS ((struct symbol *));
static void
dump_type PARAMS ((struct type *));
static void
dump_linetable PARAMS ((struct linetable *));
static void
dump_strtbl PARAMS ((void));
/* Free a struct block <- B and all the symbols defined in that block. */ /* Free a struct block <- B and all the symbols defined in that block. */
@ -118,9 +90,9 @@ free_symtab_block (objfile, b)
for (i = 0; i < n; i++) for (i = 0; i < n; i++)
{ {
mfree (objfile -> md, SYMBOL_NAME (BLOCK_SYM (b, i))); mfree (objfile -> md, SYMBOL_NAME (BLOCK_SYM (b, i)));
mfree (objfile -> md, BLOCK_SYM (b, i)); mfree (objfile -> md, (PTR) BLOCK_SYM (b, i));
} }
mfree (objfile -> md, b); mfree (objfile -> md, (PTR) b);
} }
/* Free all the storage associated with the struct symtab <- S. /* Free all the storage associated with the struct symtab <- S.
@ -155,7 +127,7 @@ free_symtab (s)
for (i = 0; i < n; i++) for (i = 0; i < n; i++)
free_symtab_block (s -> objfile, BLOCKVECTOR_BLOCK (bv, i)); free_symtab_block (s -> objfile, BLOCKVECTOR_BLOCK (bv, i));
/* Free the blockvector itself. */ /* Free the blockvector itself. */
mfree (s -> objfile -> md, bv); mfree (s -> objfile -> md, (PTR) bv);
/* Also free the linetable. */ /* Also free the linetable. */
case free_linetable: case free_linetable:
@ -163,7 +135,7 @@ free_symtab (s)
or by some other symtab, except for our linetable. or by some other symtab, except for our linetable.
Free that now. */ Free that now. */
if (LINETABLE (s)) if (LINETABLE (s))
mfree (s -> objfile -> md, LINETABLE (s)); mfree (s -> objfile -> md, (PTR) LINETABLE (s));
break; break;
} }
@ -173,18 +145,15 @@ free_symtab (s)
/* Free source-related stuff */ /* Free source-related stuff */
if (s -> line_charpos != NULL) if (s -> line_charpos != NULL)
mfree (s -> objfile -> md, s -> line_charpos); mfree (s -> objfile -> md, (PTR) s -> line_charpos);
if (s -> fullname != NULL) if (s -> fullname != NULL)
mfree (s -> objfile -> md, s -> fullname); mfree (s -> objfile -> md, s -> fullname);
mfree (s -> objfile -> md, s); mfree (s -> objfile -> md, (PTR) s);
} }
static PTR static void
dump_objfile (objfile, arg1, arg2, arg3) dump_objfile (objfile)
struct objfile *objfile; struct objfile *objfile;
PTR arg1;
PTR arg2;
PTR arg3;
{ {
struct symtab *symtab; struct symtab *symtab;
struct partial_symtab *psymtab; struct partial_symtab *psymtab;
@ -226,124 +195,101 @@ dump_objfile (objfile, arg1, arg2, arg3)
} }
printf_filtered ("\n\n"); printf_filtered ("\n\n");
} }
return (NULL);
} }
static PTR /* Print minimal symbols from this objfile. */
dump_msymbols (objfile, arg1, arg2, arg3)
static void
dump_msymbols (objfile, outfile)
struct objfile *objfile; struct objfile *objfile;
PTR arg1; FILE *outfile;
PTR arg2;
PTR arg3;
{ {
FILE *outfile = (FILE *) arg1;
char *symname = (char *) arg2;
struct minimal_symbol *msymbol; struct minimal_symbol *msymbol;
int index; int index;
char ms_type; char ms_type;
/* Print minimal symbols from this objfile unless a specific linkage fprintf_filtered (outfile, "\nObject file %s:\n\n", objfile -> name);
unit file was requested, in which case we only print the symbols for (index = 0, msymbol = objfile -> msymbols;
for that one. */ msymbol -> name != NULL; msymbol++, index++)
if (symname == NULL || (strcmp (symname, objfile -> name) == 0))
{ {
fprintf_filtered (outfile, "\nObject file %s:\n\n", objfile -> name); switch (msymbol -> type)
for (index = 0, msymbol = objfile -> msymbols;
msymbol -> name != NULL; msymbol++, index++)
{ {
switch (msymbol -> type) case mst_unknown:
{ ms_type = 'u';
case mst_unknown: break;
ms_type = 'u'; case mst_text:
break; ms_type = 't';
case mst_text: break;
ms_type = 't'; case mst_data:
break; ms_type = 'd';
case mst_data: break;
ms_type = 'd'; case mst_bss:
break; ms_type = 'b';
case mst_bss: break;
ms_type = 'b'; case mst_abs:
break; ms_type = 'a';
case mst_abs: break;
ms_type = 'a'; default:
break; ms_type = '?';
default: break;
ms_type = '?';
break;
}
fprintf_filtered (outfile, "[%2d] %c %#10x %s\n", index, ms_type,
msymbol -> address, msymbol -> name);
} }
if (objfile -> minimal_symbol_count != index) fprintf_filtered (outfile, "[%2d] %c %#10x %s\n", index, ms_type,
{ msymbol -> address, msymbol -> name);
warning ("internal error: minimal symbol count %d != %d",
objfile -> minimal_symbol_count, index);
}
fprintf_filtered (outfile, "\n");
} }
return (NULL); if (objfile -> minimal_symbol_count != index)
{
warning ("internal error: minimal symbol count %d != %d",
objfile -> minimal_symbol_count, index);
}
fprintf_filtered (outfile, "\n");
} }
static PTR static void
dump_psymtab (objfile, psymtab, arg1, arg2, arg3) dump_psymtab (objfile, psymtab, outfile)
struct objfile *objfile; struct objfile *objfile;
struct partial_symtab *psymtab; struct partial_symtab *psymtab;
PTR arg1; FILE *outfile;
PTR arg2;
PTR arg3;
{ {
FILE *outfile = (FILE *) arg1;
char *symname = (char *) arg2;
/* If source file name is specified, reject all but that one. */ fprintf_filtered (outfile, "\nPartial symtab for source file %s ",
if (symname == NULL || (strcmp (symname, psymtab -> filename) == 0)) psymtab -> filename);
fprintf_filtered (outfile, "(object 0x%x)\n\n", psymtab);
fprintf (outfile, " Read from object file %s (0x%x)\n",
objfile -> name, objfile);
if (psymtab -> readin)
{ {
fprintf_filtered (outfile, "\nPartial symtab for source file %s ", fprintf_filtered (outfile,
psymtab -> filename); " Full symtab was read (at 0x%x by function at 0x%x)\n",
fprintf_filtered (outfile, "(object 0x%x)\n\n", psymtab); psymtab -> symtab, psymtab -> read_symtab);
fprintf (outfile, " Read from object file %s (0x%x)\n",
objfile -> name, objfile);
if (psymtab -> readin)
{
fprintf_filtered (outfile,
" Full symtab was read (at 0x%x by function at 0x%x)\n",
psymtab -> symtab, psymtab -> read_symtab);
}
fprintf_filtered (outfile, " Relocate symbols by 0x%x\n",
psymtab -> addr);
fprintf_filtered (outfile, " Symbols cover text addresses 0x%x-0x%x\n",
psymtab -> textlow, psymtab -> texthigh);
fprintf_filtered (outfile, " Depends on %d other partial symtabs.\n",
psymtab -> number_of_dependencies);
if (psymtab -> n_global_syms > 0)
{
print_partial_symbol (objfile -> global_psymbols.list
+ psymtab -> globals_offset,
psymtab -> n_global_syms, "Global", outfile);
}
if (psymtab -> n_static_syms > 0)
{
print_partial_symbol (objfile -> static_psymbols.list
+ psymtab -> statics_offset,
psymtab -> n_static_syms, "Static", outfile);
}
fprintf_filtered (outfile, "\n");
} }
return (NULL); fprintf_filtered (outfile, " Relocate symbols by 0x%x\n",
psymtab -> addr);
fprintf_filtered (outfile, " Symbols cover text addresses 0x%x-0x%x\n",
psymtab -> textlow, psymtab -> texthigh);
fprintf_filtered (outfile, " Depends on %d other partial symtabs.\n",
psymtab -> number_of_dependencies);
if (psymtab -> n_global_syms > 0)
{
print_partial_symbol (objfile -> global_psymbols.list
+ psymtab -> globals_offset,
psymtab -> n_global_syms, "Global", outfile);
}
if (psymtab -> n_static_syms > 0)
{
print_partial_symbol (objfile -> static_psymbols.list
+ psymtab -> statics_offset,
psymtab -> n_static_syms, "Static", outfile);
}
fprintf_filtered (outfile, "\n");
} }
static PTR static void
dump_symtab (objfile, symtab, arg1, arg2, arg3) dump_symtab (objfile, symtab, outfile)
struct objfile *objfile; struct objfile *objfile;
struct symtab *symtab; struct symtab *symtab;
PTR arg1; FILE *outfile;
PTR arg2;
PTR arg3;
{ {
FILE *outfile = (FILE *) arg1;
char *symname = (char *) arg2;
register int i, j; register int i, j;
int len, blen; int len, blen;
register struct linetable *l; register struct linetable *l;
@ -351,46 +297,43 @@ dump_symtab (objfile, symtab, arg1, arg2, arg3)
register struct block *b; register struct block *b;
int depth; int depth;
if (symname == NULL || (strcmp (symname, symtab -> filename) == 0)) fprintf (outfile, "\nSymtab for file %s\n", symtab->filename);
fprintf (outfile, "Read from object file %s (%x)\n", objfile->name,
objfile);
fprintf (outfile, "Language: %s\n", language_str (symtab -> language));
/* First print the line table. */
l = LINETABLE (symtab);
if (l) {
fprintf (outfile, "\nLine table:\n\n");
len = l->nitems;
for (i = 0; i < len; i++)
fprintf (outfile, " line %d at %x\n", l->item[i].line,
l->item[i].pc);
}
/* Now print the block info. */
fprintf (outfile, "\nBlockvector:\n\n");
bv = BLOCKVECTOR (symtab);
len = BLOCKVECTOR_NBLOCKS (bv);
for (i = 0; i < len; i++)
{ {
fprintf (outfile, "\nSymtab for file %s\n", symtab->filename); b = BLOCKVECTOR_BLOCK (bv, i);
fprintf (outfile, "Read from object file %s (%x)\n", objfile->name, depth = block_depth (b) * 2;
objfile); print_spaces (depth, outfile);
fprintf (outfile, "block #%03d (object 0x%x) ", i, b);
/* First print the line table. */ fprintf (outfile, "[0x%x..0x%x]", BLOCK_START (b), BLOCK_END (b));
l = LINETABLE (symtab); if (BLOCK_SUPERBLOCK (b))
if (l) { fprintf (outfile, " (under 0x%x)", BLOCK_SUPERBLOCK (b));
fprintf (outfile, "\nLine table:\n\n"); if (BLOCK_FUNCTION (b))
len = l->nitems; fprintf (outfile, " %s", SYMBOL_NAME (BLOCK_FUNCTION (b)));
for (i = 0; i < len; i++) fputc ('\n', outfile);
fprintf (outfile, " line %d at %x\n", l->item[i].line, blen = BLOCK_NSYMS (b);
l->item[i].pc); for (j = 0; j < blen; j++)
}
/* Now print the block info. */
fprintf (outfile, "\nBlockvector:\n\n");
bv = BLOCKVECTOR (symtab);
len = BLOCKVECTOR_NBLOCKS (bv);
for (i = 0; i < len; i++)
{ {
b = BLOCKVECTOR_BLOCK (bv, i); print_symbol (BLOCK_SYM (b, j), depth + 1, outfile);
depth = block_depth (b) * 2;
print_spaces (depth, outfile);
fprintf (outfile, "block #%03d (object 0x%x) ", i, b);
fprintf (outfile, "[0x%x..0x%x]", BLOCK_START (b), BLOCK_END (b));
if (BLOCK_SUPERBLOCK (b))
fprintf (outfile, " (under 0x%x)", BLOCK_SUPERBLOCK (b));
if (BLOCK_FUNCTION (b))
fprintf (outfile, " %s", SYMBOL_NAME (BLOCK_FUNCTION (b)));
fputc ('\n', outfile);
blen = BLOCK_NSYMS (b);
for (j = 0; j < blen; j++)
{
print_symbol (BLOCK_SYM (b, j), depth + 1, outfile);
}
} }
fprintf (outfile, "\n");
} }
return (NULL); fprintf (outfile, "\n");
} }
static void static void
@ -403,6 +346,8 @@ printsyms_command (args, from_tty)
struct cleanup *cleanups; struct cleanup *cleanups;
char *symname = NULL; char *symname = NULL;
char *filename = DEV_TTY; char *filename = DEV_TTY;
struct objfile *objfile;
struct symtab *s;
dont_repeat (); dont_repeat ();
@ -435,7 +380,9 @@ printsyms_command (args, from_tty)
make_cleanup (fclose, (char *) outfile); make_cleanup (fclose, (char *) outfile);
immediate_quit++; immediate_quit++;
iterate_over_symtabs (dump_symtab, (PTR) outfile, (PTR) symname, (PTR) NULL); ALL_SYMTABS (objfile, s)
if (symname == NULL || (strcmp (symname, s -> filename) == 0))
dump_symtab (objfile, s, outfile);
immediate_quit--; immediate_quit--;
do_cleanups (cleanups); do_cleanups (cleanups);
} }
@ -477,8 +424,10 @@ print_symbol (symbol, depth, outfile)
fprintf (outfile, "typedef "); fprintf (outfile, "typedef ");
if (SYMBOL_TYPE (symbol)) if (SYMBOL_TYPE (symbol))
{ {
type_print_1 (SYMBOL_TYPE (symbol), SYMBOL_NAME (symbol), /* Print details of types, except for enums where it's clutter. */
outfile, 1, depth); type_print_1 (SYMBOL_TYPE (symbol), SYMBOL_NAME (symbol), outfile,
TYPE_CODE (SYMBOL_TYPE (symbol)) != TYPE_CODE_ENUM,
depth);
fprintf (outfile, "; "); fprintf (outfile, "; ");
} }
else else
@ -562,6 +511,8 @@ printpsyms_command (args, from_tty)
struct cleanup *cleanups; struct cleanup *cleanups;
char *symname = NULL; char *symname = NULL;
char *filename = DEV_TTY; char *filename = DEV_TTY;
struct objfile *objfile;
struct partial_symtab *ps;
dont_repeat (); dont_repeat ();
@ -594,8 +545,9 @@ printpsyms_command (args, from_tty)
make_cleanup (fclose, outfile); make_cleanup (fclose, outfile);
immediate_quit++; immediate_quit++;
iterate_over_psymtabs (dump_psymtab, (PTR) outfile, (PTR) symname, ALL_PSYMTABS (objfile, ps)
(PTR) NULL); if (symname == NULL || (strcmp (symname, ps -> filename) == 0))
dump_psymtab (objfile, ps, outfile);
immediate_quit--; immediate_quit--;
do_cleanups (cleanups); do_cleanups (cleanups);
} }
@ -691,6 +643,7 @@ printmsyms_command (args, from_tty)
struct cleanup *cleanups; struct cleanup *cleanups;
char *filename = DEV_TTY; char *filename = DEV_TTY;
char *symname = NULL; char *symname = NULL;
struct objfile *objfile;
dont_repeat (); dont_repeat ();
@ -723,179 +676,28 @@ printmsyms_command (args, from_tty)
make_cleanup (fclose, outfile); make_cleanup (fclose, outfile);
immediate_quit++; immediate_quit++;
iterate_over_objfiles (dump_msymbols, (PTR) outfile, (PTR) symname, ALL_OBJFILES (objfile)
(PTR) NULL); if (symname == NULL || (strcmp (symname, objfile -> name) == 0))
dump_msymbols (objfile, outfile);
immediate_quit--; immediate_quit--;
fprintf_filtered (outfile, "\n\n"); fprintf_filtered (outfile, "\n\n");
do_cleanups (cleanups); do_cleanups (cleanups);
} }
static void static void
printobjfiles_command () printobjfiles_command (ignore, from_tty)
char *ignore;
int from_tty;
{ {
struct objfile *objfile;
dont_repeat (); dont_repeat ();
immediate_quit++; immediate_quit++;
iterate_over_objfiles (dump_objfile, (PTR) NULL, (PTR) NULL, (PTR) NULL); ALL_OBJFILES (objfile)
dump_objfile (objfile);
immediate_quit--; immediate_quit--;
} }
/* Debugging functions from xcoffread.c originally. Some are redundant
and should probably disappear. */
static void
dump_strtbl ()
{
#if 0 /* We don't know its length FIXME */
int ii;
printf ("===STRING TABLE DUMP...\n\n");
for ( ii=0; ii < strtbl_len; ++ii )
printf ("%c", isprint (*(strtbl+ii)) ? *(strtbl+ii) : ' ');
printf ("\n");
#endif
}
static void
dump_linetable (ltb)
struct linetable *ltb;
{
int ii;
for (ii=0; ii < ltb->nitems; ++ii)
printf ("line: %d, addr: 0x%x\n", ltb->item[ii].line, ltb->item[ii].pc);
}
static void
dump_type (typeP)
struct type *typeP;
{
printf ("0x%x: name: %s\n", typeP, typeP->name ? typeP->name : "(nil)");
}
static void
dump_symbol (pp)
struct symbol *pp;
{
printf (" sym: %s\t%s,\t%s\ttype: 0x%x, val: 0x%x end: 0x%x\n",
pp->name, dump_namespace (pp->namespace),
dump_addrclass (pp->class), pp->type,
SYMBOL_CLASS(pp) == LOC_BLOCK ? BLOCK_START(SYMBOL_BLOCK_VALUE(pp))
: pp->value.value,
SYMBOL_CLASS(pp) == LOC_BLOCK ? BLOCK_END(SYMBOL_BLOCK_VALUE(pp)) : 0);
}
static char *
dump_namespace (ns)
int ns;
{
static char *ns_name [] = {
"UNDEF_NS", "VAR_NS", "STRUCT_NS", "LABEL_NS"};
switch (ns) {
case UNDEF_NAMESPACE:
case VAR_NAMESPACE:
case STRUCT_NAMESPACE:
case LABEL_NAMESPACE:
return ns_name[ns];
}
return "***ERROR***";
}
static char *
dump_addrclass (ac)
int ac; /* address class */
{
static char *ac_name [] = {
"LOC_UNDEF",
"LOC_CONST",
"LOC_STATIC",
"LOC_REGISTER",
"LOC_ARG",
"LOC_REF_ARG",
"LOC_REGPARM",
"LOC_LOCAL",
"LOC_TYPEDEF",
"LOC_LABEL",
"LOC_BLOCK",
"LOC_CONST_BYTES",
"LOC_LOCAL_ARG",
};
switch (ac) {
case LOC_UNDEF:
case LOC_CONST:
case LOC_STATIC:
case LOC_REGISTER:
case LOC_ARG:
case LOC_REF_ARG:
case LOC_REGPARM:
case LOC_LOCAL:
case LOC_TYPEDEF:
case LOC_LABEL:
case LOC_BLOCK:
case LOC_CONST_BYTES:
case LOC_LOCAL_ARG:
return ac_name [ac];
}
return "***ERROR***";
}
static void
dump_block (pp)
struct block *pp;
{
int ii;
printf ("BLOCK..: start: 0x%x, end: 0x%x\n", pp->startaddr, pp->endaddr);
for (ii=0; ii < pp->nsyms; ++ii)
dump_symbol (pp->sym[ii]);
}
static void
dump_blockvector (pp)
struct blockvector *pp;
{
int ii;
for (ii=0; ii < pp->nblocks; ++ii)
dump_block (pp->block [ii]);
}
static void
dump_last_symtab (pp)
struct symtab *pp;
{
for ( ; pp; pp = pp->next) {
if ( pp->next == 0 ) {
printf ("SYMTAB NAME: %s\n", pp->filename);
dump_blockvector (pp->blockvector);
}
}
}
static void
dump_symtabs (pp)
struct symtab *pp;
{
for ( ; pp; pp = pp->next) {
printf ("SYMTAB NAME: %s\n", pp->filename ? pp->filename : "(nil)");
/* if (pp->linetable)
dump_linetable (pp->linetable); */
dump_blockvector (pp->blockvector);
}
}
static void
dump_symtab_lines (pp)
struct symtab *pp;
{
for ( ; pp; pp = pp->next) {
printf ("SYMTAB NAME: %s\n", pp->filename ? pp->filename : "(nil)");
if (pp->linetable)
dump_linetable (pp->linetable);
/* dump_blockvector (pp->blockvector); */
}
}
/* Return the nexting depth of a block within other blocks in its symtab. */ /* Return the nexting depth of a block within other blocks in its symtab. */

View File

@ -182,7 +182,7 @@ static void
aixcoff_new_init PARAMS ((struct objfile *)); aixcoff_new_init PARAMS ((struct objfile *));
static void static void
aixcoff_symfile_read PARAMS ((struct sym_fns *, CORE_ADDR, int)); aixcoff_symfile_read PARAMS ((struct objfile *, CORE_ADDR, int));
static void static void
aixcoff_symfile_finish PARAMS ((struct objfile *)); aixcoff_symfile_finish PARAMS ((struct objfile *));