#include "breakpoint.h"
#include "command.h"
#include "obstack.h"
+#include "language.h"
#include <string.h>
static void
dump_objfile PARAMS ((struct objfile *));
-static void
-printobjfiles_command PARAMS ((char *, int));
-
static int
block_depth PARAMS ((struct block *));
static void
print_partial_symbol PARAMS ((struct partial_symbol *, int, char *, FILE *));
-static void
-printpsyms_command PARAMS ((char *, int));
-
static void
print_symbol PARAMS ((struct symbol *, int, FILE *));
-static void
-printsyms_command PARAMS ((char *, int));
-
static void
free_symtab_block PARAMS ((struct objfile *, struct block *));
-static void
-printmsyms_command PARAMS ((char *, int));
\f
/* Free a struct block <- B and all the symbols defined in that block. */
mfree (s -> objfile -> md, (PTR) s);
}
+#if MAINTENANCE_CMDS
+
static void
dump_objfile (objfile)
struct objfile *objfile;
fprintf_filtered (outfile, "\nObject file %s:\n\n", objfile -> name);
for (index = 0, msymbol = objfile -> msymbols;
- msymbol -> name != NULL; msymbol++, index++)
+ SYMBOL_NAME (msymbol) != NULL; msymbol++, index++)
{
switch (msymbol -> type)
{
ms_type = '?';
break;
}
- fprintf_filtered (outfile, "[%2d] %c %#10x %s\n", index, ms_type,
- msymbol -> address, msymbol -> name);
+ fprintf_filtered (outfile, "[%2d] %c %#10x %s", index, ms_type,
+ SYMBOL_VALUE_ADDRESS (msymbol), SYMBOL_NAME (msymbol));
+ if (SYMBOL_DEMANGLED_NAME (msymbol) != NULL)
+ {
+ fprintf_filtered (outfile, " %s", SYMBOL_DEMANGLED_NAME (msymbol));
+ }
+ fputs_filtered ("\n", outfile);
}
if (objfile -> minimal_symbol_count != index)
{
psymtab -> filename);
fprintf_filtered (outfile, "(object 0x%x)\n\n", psymtab);
fprintf (outfile, " Read from object file %s (0x%x)\n",
- objfile -> name, objfile);
+ objfile -> name, (unsigned int) objfile);
if (psymtab -> readin)
{
" 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);
+
+ /* FIXME, we need to be able to print the relocation stuff. */
+ /* This prints some garbage for anything but stabs right now. FIXME. */
+ if (psymtab->section_offsets)
+ fprintf_filtered (outfile, " Relocate symbols by 0x%x, 0x%x, 0x%x, 0x%x.\n",
+ ANOFFSET (psymtab->section_offsets, 0),
+ ANOFFSET (psymtab->section_offsets, 1),
+ ANOFFSET (psymtab->section_offsets, 2),
+ ANOFFSET (psymtab->section_offsets, 3));
+
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",
fprintf (outfile, "\nSymtab for file %s\n", symtab->filename);
fprintf (outfile, "Read from object file %s (%x)\n", objfile->name,
- objfile);
+ (unsigned int) objfile);
fprintf (outfile, "Language: %s\n", language_str (symtab -> language));
/* First print the line table. */
b = BLOCKVECTOR_BLOCK (bv, i);
depth = block_depth (b) * 2;
print_spaces (depth, outfile);
- fprintf (outfile, "block #%03d (object 0x%x) ", i, b);
+ fprintf (outfile, "block #%03d (object 0x%x) ", i, (unsigned int) 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));
+ fprintf (outfile, " (under 0x%x)", (unsigned int) BLOCK_SUPERBLOCK (b));
if (BLOCK_FUNCTION (b))
- fprintf (outfile, " %s", SYMBOL_NAME (BLOCK_FUNCTION (b)));
+ {
+ fprintf (outfile, " %s", SYMBOL_NAME (BLOCK_FUNCTION (b)));
+ if (SYMBOL_DEMANGLED_NAME (BLOCK_FUNCTION (b)) != NULL)
+ {
+ fprintf (outfile, " %s",
+ SYMBOL_DEMANGLED_NAME (BLOCK_FUNCTION (b)));
+ }
+ }
+ if (BLOCK_GCC_COMPILED(b))
+ fprintf (outfile, " gcc%d compiled", BLOCK_GCC_COMPILED(b));
fputc ('\n', outfile);
blen = BLOCK_NSYMS (b);
for (j = 0; j < blen; j++)
fprintf (outfile, "\n");
}
-static void
-printsyms_command (args, from_tty)
+void
+maintenance_print_symbols (args, from_tty)
char *args;
int from_tty;
{
if (args == NULL)
{
- error ("printsyms takes an output file name and optional symbol file name");
+ error ("print-symbols takes an output file name and optional symbol file name");
}
else if ((argv = buildargv (args)) == NULL)
{
immediate_quit++;
ALL_SYMTABS (objfile, s)
- if (symname == NULL || (strcmp (symname, s -> filename) == 0))
+ if (symname == NULL || (STREQ (symname, s -> filename)))
dump_symtab (objfile, s, outfile);
immediate_quit--;
do_cleanups (cleanups);
print_spaces (depth, outfile);
if (SYMBOL_NAMESPACE (symbol) == LABEL_NAMESPACE)
{
- fprintf (outfile, "label %s at 0x%x\n", SYMBOL_NAME (symbol),
+ fprintf (outfile, "label %s at 0x%x\n", SYMBOL_SOURCE_NAME (symbol),
SYMBOL_VALUE_ADDRESS (symbol));
return;
}
{
if (TYPE_NAME (SYMBOL_TYPE (symbol)))
{
- type_print_1 (SYMBOL_TYPE (symbol), "", outfile, 1, depth);
+ LA_PRINT_TYPE (SYMBOL_TYPE (symbol), "", outfile, 1, depth);
}
else
{
: (TYPE_CODE (SYMBOL_TYPE (symbol)) == TYPE_CODE_STRUCT
? "struct" : "union")),
SYMBOL_NAME (symbol));
- type_print_1 (SYMBOL_TYPE (symbol), "", outfile, 1, depth);
+ LA_PRINT_TYPE (SYMBOL_TYPE (symbol), "", outfile, 1, depth);
}
fprintf (outfile, ";\n");
}
if (SYMBOL_TYPE (symbol))
{
/* Print details of types, except for enums where it's clutter. */
- type_print_1 (SYMBOL_TYPE (symbol), SYMBOL_NAME (symbol), outfile,
- TYPE_CODE (SYMBOL_TYPE (symbol)) != TYPE_CODE_ENUM,
- depth);
+ LA_PRINT_TYPE (SYMBOL_TYPE (symbol), SYMBOL_NAME (symbol), outfile,
+ TYPE_CODE (SYMBOL_TYPE (symbol)) != TYPE_CODE_ENUM,
+ depth);
fprintf (outfile, "; ");
}
else
- fprintf (outfile, "%s ", SYMBOL_NAME (symbol));
+ fprintf (outfile, "%s ", SYMBOL_SOURCE_NAME (symbol));
switch (SYMBOL_CLASS (symbol))
{
break;
case LOC_ARG:
- fprintf (outfile, "arg at 0x%lx,", SYMBOL_VALUE (symbol));
+ if (SYMBOL_BASEREG_VALID (symbol))
+ {
+ fprintf (outfile, "arg at 0x%lx from register %d,",
+ SYMBOL_VALUE (symbol), SYMBOL_BASEREG (symbol));
+ }
+ else
+ {
+ fprintf (outfile, "arg at 0x%lx,", SYMBOL_VALUE (symbol));
+ }
break;
case LOC_LOCAL_ARG:
- fprintf (outfile, "arg at offset 0x%x from fp,",
- SYMBOL_VALUE (symbol));
+ if (SYMBOL_BASEREG_VALID (symbol))
+ {
+ fprintf (outfile, "arg at offset 0x%lx from register %d,",
+ SYMBOL_VALUE (symbol), SYMBOL_BASEREG (symbol));
+ }
+ else
+ {
+ fprintf (outfile, "arg at offset 0x%lx from fp,",
+ SYMBOL_VALUE (symbol));
+ }
case LOC_REF_ARG:
fprintf (outfile, "reference arg at 0x%lx,", SYMBOL_VALUE (symbol));
break;
case LOC_LOCAL:
- fprintf (outfile, "local at 0x%lx,", SYMBOL_VALUE (symbol));
+ if (SYMBOL_BASEREG_VALID (symbol))
+ {
+ fprintf (outfile, "local at 0x%lx from register %d",
+ SYMBOL_VALUE (symbol), SYMBOL_BASEREG (symbol));
+ }
+ else
+ {
+ fprintf (outfile, "local at 0x%lx,", SYMBOL_VALUE (symbol));
+ }
break;
case LOC_TYPEDEF:
case LOC_BLOCK:
fprintf (outfile, "block (object 0x%x) starting at 0x%x,",
- SYMBOL_BLOCK_VALUE (symbol),
+ (unsigned int) SYMBOL_BLOCK_VALUE (symbol),
BLOCK_START (SYMBOL_BLOCK_VALUE (symbol)));
break;
fprintf (outfile, "\n");
}
-static void
-printpsyms_command (args, from_tty)
+void
+maintenance_print_psymbols (args, from_tty)
char *args;
int from_tty;
{
if (args == NULL)
{
- error ("printpsyms takes an output file name and optional symbol file name");
+ error ("print-psymbols takes an output file name and optional symbol file name");
}
else if ((argv = buildargv (args)) == NULL)
{
immediate_quit++;
ALL_PSYMTABS (objfile, ps)
- if (symname == NULL || (strcmp (symname, ps -> filename) == 0))
+ if (symname == NULL || (STREQ (symname, ps -> filename)))
dump_psymtab (objfile, ps, outfile);
immediate_quit--;
do_cleanups (cleanups);
fprintf_filtered (outfile, " %s partial symbols:\n", what);
while (count-- > 0)
{
- fprintf_filtered (outfile, " `%s', ", SYMBOL_NAME(p));
+ fprintf_filtered (outfile, " `%s'", SYMBOL_NAME(p));
+ if (SYMBOL_DEMANGLED_NAME (p) != NULL)
+ {
+ fprintf_filtered (outfile, " `%s'", SYMBOL_DEMANGLED_NAME (p));
+ }
+ fputs_filtered (", ", outfile);
switch (SYMBOL_NAMESPACE (p))
{
case UNDEF_NAMESPACE:
}
}
-static void
-printmsyms_command (args, from_tty)
+void
+maintenance_print_msymbols (args, from_tty)
char *args;
int from_tty;
{
if (args == NULL)
{
- error ("printmsyms takes an output file name and optional symbol file name");
+ error ("print-msymbols takes an output file name and optional symbol file name");
}
else if ((argv = buildargv (args)) == NULL)
{
immediate_quit++;
ALL_OBJFILES (objfile)
- if (symname == NULL || (strcmp (symname, objfile -> name) == 0))
+ if (symname == NULL || (STREQ (symname, objfile -> name)))
dump_msymbols (objfile, outfile);
immediate_quit--;
fprintf_filtered (outfile, "\n\n");
do_cleanups (cleanups);
}
-static void
-printobjfiles_command (ignore, from_tty)
+void
+maintenance_print_objfiles (ignore, from_tty)
char *ignore;
int from_tty;
{
dump_objfile (objfile);
immediate_quit--;
}
+
\f
/* Return the nexting depth of a block within other blocks in its symtab. */
struct block *block;
{
register int i = 0;
- while (block = BLOCK_SUPERBLOCK (block)) i++;
+ while ((block = BLOCK_SUPERBLOCK (block)) != NULL)
+ {
+ i++;
+ }
return i;
}
+#endif /* MAINTENANCE_CMDS */
+
\f
-/* Increase the space allocated for LISTP. */
+/* Increase the space allocated for LISTP, which is probably
+ global_psymbol_list or static_psymbol_list. This space will eventually
+ be freed in free_objfile(). */
void
extend_psymbol_list (listp, objfile)
listp->next = listp->list + listp->size;
listp->size = new_size;
}
-
-#ifdef DEBUG
-
-/* The work performed by this function is normally done by the macro
- ADD_PSYMBOL_TO_LIST defined in symfile.h. When debugging gdb, this
- function makes things easier. */
-
-void
-add_psymbol_to_list (name, namelength, namespace, class, listp, psymval)
- char *name;
- int namelength;
- enum namespace namespace;
- enum address_class class;
- struct psymbol_allocation_list *listp;
- unsigned long psymval;
-{
- register struct partial_symbol *psym;
-
- if (listp -> next >= listp -> list + listp -> size)
- extend_psymbol_list (listp, objfile);
- psym = listp -> next++;
- SYMBOL_NAME (psym) = (char *) obstack_alloc (&objfile->psymbol_obstack,
- namelength + 1);
- memcpy (SYMBOL_NAME (psym), name, namelength);
- SYMBOL_NAME (psym)[namelength] = '\0';
- SYMBOL_NAMESPACE (psym) = namespace;
- SYMBOL_CLASS (psym) = class;
- SYMBOL_VALUE (psym) = psymval;
-}
-
-/* The work performed by this function is normally done by the macro
- ADD_PSYMBOL_ADDR_TO_LIST defined in symfile.h. When debugging gdb, this
- function makes things easier. */
-
-void
-add_psymbol_addr_to_list (name, namelength, namespace, class, listp, psymval)
- char *name;
- int namelength;
- enum namespace namespace;
- enum address_class class;
- struct psymbol_allocation_list *listp;
- CORE_ADDR psymval;
-{
- register struct partial_symbol *psym;
-
- if (listp -> next >= listp -> list + listp -> size)
- extend_psymbol_list (listp, objfile);
- psym = listp -> next++;
- SYMBOL_NAME (psym) = (char *) obstack_alloc (&objfile->psymbol_obstack,
- namelength + 1);
- memcpy (SYMBOL_NAME (psym), name, namelength);
- SYMBOL_NAME (psym)[namelength] = '\0';
- SYMBOL_NAMESPACE (psym) = namespace;
- SYMBOL_CLASS (psym) = class;
- SYMBOL_VALUE_ADDRESS (psym) = psymval;
-}
-
-#endif /* DEBUG */
-
-void
-_initialize_symmisc ()
-{
- add_com ("printmsyms", class_obscure, printmsyms_command,
- "Print dump of current minimal symbol definitions to file OUTFILE.\n\
-If a SOURCE file is specified, dump only that file's symbols.");
- add_com ("printpsyms", class_obscure, printpsyms_command,
- "Print dump of current partial symbol definitions to file OUTFILE.\n\
-If a SOURCE file is specified, dump only that file's partial symbols.");
- add_com ("printsyms", class_obscure, printsyms_command,
- "Print dump of current symbol definitions to file OUTFILE.\n\
-If a SOURCE file is specified, dump only that file's symbols.");
- add_com ("printobjfiles", class_obscure, printobjfiles_command,
- "Print dump of current object file definitions.");
-}
-