* 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:
parent
d9915ebc47
commit
d630b6150e
|
@ -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.
|
||||||
|
|
16
gdb/c-exp.y
16
gdb/c-exp.y
|
@ -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;
|
||||||
|
|
11
gdb/defs.h
11
gdb/defs.h
|
@ -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 *)));
|
||||||
|
|
504
gdb/symmisc.c
504
gdb/symmisc.c
|
@ -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. */
|
||||||
|
|
||||||
|
|
|
@ -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 *));
|
||||||
|
|
Loading…
Reference in New Issue