#include "symfile.h"
#include "objfiles.h"
#include "value.h"
-#include "gdb_assert.h"
#include "top.h"
#include "timeval-utils.h"
#include "maint.h"
{
printf_unfiltered (_("\"maintenance\" must be followed by "
"the name of a maintenance command.\n"));
- help_list (maintenancelist, "maintenance ", -1, gdb_stdout);
+ help_list (maintenancelist, "maintenance ", all_commands, gdb_stdout);
}
#ifndef _WIN32
internal_warning (__FILE__, __LINE__, "%s", (args == NULL ? "" : args));
}
+/* Stimulate the internal error mechanism that GDB uses when an
+ demangler problem is detected. Allows testing of the mechanism. */
+
+static void
+maintenance_demangler_warning (char *args, int from_tty)
+{
+ demangler_warning (__FILE__, __LINE__, "%s", (args == NULL ? "" : args));
+}
+
/* Someday we should allow demangling for things other than just
explicit strings. For example, we might want to be able to specify
the address of a string in either GDB's process space or the
{
printf_unfiltered (_("\"maintenance info\" must be followed "
"by the name of an info command.\n"));
- help_list (maintenanceinfolist, "maintenance info ", -1, gdb_stdout);
+ help_list (maintenanceinfolist, "maintenance info ", all_commands,
+ gdb_stdout);
}
/* Mini tokenizing lexer for 'maint info sections' command. */
}
static int
-match_bfd_flags (char *string, flagword flags)
+match_bfd_flags (const char *string, flagword flags)
{
if (flags & SEC_ALLOC)
if (match_substring (string, "ALLOC"))
static void
print_bfd_section_info (bfd *abfd,
asection *asect,
- void *arg)
+ void *datum)
{
flagword flags = bfd_get_section_flags (abfd, asect);
const char *name = bfd_section_name (abfd, asect);
+ const char *arg = datum;
- if (arg == NULL || *((char *) arg) == '\0'
- || match_substring ((char *) arg, name)
- || match_bfd_flags ((char *) arg, flags))
+ if (arg == NULL || *arg == '\0'
+ || match_substring (arg, name)
+ || match_bfd_flags (arg, flags))
{
struct gdbarch *gdbarch = gdbarch_from_bfd (abfd);
int addr_size = gdbarch_addr_bit (gdbarch) / 8;
static void
print_objfile_section_info (bfd *abfd,
struct obj_section *asect,
- char *string)
+ const char *string)
{
flagword flags = bfd_get_section_flags (abfd, asect->the_bfd_section);
const char *name = bfd_section_name (abfd, asect->the_bfd_section);
{
printf_unfiltered (_("\"maintenance print\" must be followed "
"by the name of a print command.\n"));
- help_list (maintenanceprintlist, "maintenance print ", -1, gdb_stdout);
+ help_list (maintenanceprintlist, "maintenance print ", all_commands,
+ gdb_stdout);
}
/* The "maintenance translate-address" command converts a section and address
if (alias)
{
if (alias->malloced_replacement)
- xfree (alias->replacement);
+ xfree ((char *) alias->replacement);
if (deprecate)
{
else if (cmd)
{
if (cmd->malloced_replacement)
- xfree (cmd->replacement);
+ xfree ((char *) cmd->replacement);
if (deprecate)
{
{
printf_unfiltered (_("\"maintenance set\" must be followed "
"by the name of a set command.\n"));
- help_list (maintenance_set_cmdlist, "maintenance set ", -1, gdb_stdout);
+ help_list (maintenance_set_cmdlist, "maintenance set ", all_commands,
+ gdb_stdout);
}
static void
long start_space;
/* Total number of symtabs (over all objfiles). */
int start_nr_symtabs;
- /* Of those, a count of just the primary ones. */
- int start_nr_primary_symtabs;
+ /* A count of the compunits. */
+ int start_nr_compunit_symtabs;
/* Total number of blocks. */
int start_nr_blocks;
};
/* Count the number of symtabs and blocks. */
static void
-count_symtabs_and_blocks (int *nr_symtabs_ptr, int *nr_primary_symtabs_ptr,
+count_symtabs_and_blocks (int *nr_symtabs_ptr, int *nr_compunit_symtabs_ptr,
int *nr_blocks_ptr)
{
struct objfile *o;
+ struct compunit_symtab *cu;
struct symtab *s;
int nr_symtabs = 0;
- int nr_primary_symtabs = 0;
+ int nr_compunit_symtabs = 0;
int nr_blocks = 0;
- ALL_SYMTABS (o, s)
+ /* When collecting statistics during startup, this is called before
+ pretty much anything in gdb has been initialized, and thus
+ current_program_space may be NULL. */
+ if (current_program_space != NULL)
{
- ++nr_symtabs;
- if (s->primary)
+ ALL_COMPUNITS (o, cu)
{
- ++nr_primary_symtabs;
- nr_blocks += BLOCKVECTOR_NBLOCKS (BLOCKVECTOR (s));
+ ++nr_compunit_symtabs;
+ nr_blocks += BLOCKVECTOR_NBLOCKS (COMPUNIT_BLOCKVECTOR (cu));
+ ALL_COMPUNIT_FILETABS (cu, s)
+ ++nr_symtabs;
}
}
*nr_symtabs_ptr = nr_symtabs;
- *nr_primary_symtabs_ptr = nr_primary_symtabs;
+ *nr_compunit_symtabs_ptr = nr_compunit_symtabs;
*nr_blocks_ptr = nr_blocks;
}
struct cmd_stats *start_stats = (struct cmd_stats *) arg;
int msg_type = start_stats->msg_type;
- if (start_stats->time_enabled)
+ if (start_stats->time_enabled && per_command_time)
{
long cmd_time = get_run_time () - start_stats->start_cpu_time;
struct timeval now_wall_time, delta_wall_time, wait_time;
(long) delta_wall_time.tv_usec);
}
- if (start_stats->space_enabled)
+ if (start_stats->space_enabled && per_command_space)
{
#ifdef HAVE_SBRK
char *lim = (char *) sbrk (0);
#endif
}
- if (start_stats->symtab_enabled)
+ if (start_stats->symtab_enabled && per_command_symtab)
{
- int nr_symtabs, nr_primary_symtabs, nr_blocks;
+ int nr_symtabs, nr_compunit_symtabs, nr_blocks;
- count_symtabs_and_blocks (&nr_symtabs, &nr_primary_symtabs, &nr_blocks);
+ count_symtabs_and_blocks (&nr_symtabs, &nr_compunit_symtabs, &nr_blocks);
printf_unfiltered (_("#symtabs: %d (+%d),"
- " #primary symtabs: %d (+%d),"
+ " #compunits: %d (+%d),"
" #blocks: %d (+%d)\n"),
nr_symtabs,
nr_symtabs - start_stats->start_nr_symtabs,
- nr_primary_symtabs,
- nr_primary_symtabs - start_stats->start_nr_primary_symtabs,
+ nr_compunit_symtabs,
+ (nr_compunit_symtabs
+ - start_stats->start_nr_compunit_symtabs),
nr_blocks,
nr_blocks - start_stats->start_nr_blocks);
}
{
struct cmd_stats *new_stat;
- /* Early exit if we're not reporting any stats. */
- if (!per_command_time
+ /* Early exit if we're not reporting any stats. It can be expensive to
+ compute the pre-command values so don't collect them at all if we're
+ not reporting stats. Alas this doesn't work in the startup case because
+ we don't know yet whether we will be reporting the stats. For the
+ startup case collect the data anyway (it should be cheap at this point),
+ and leave it to the reporter to decide whether to print them. */
+ if (msg_type != 0
+ && !per_command_time
&& !per_command_space
&& !per_command_symtab)
return make_cleanup (null_cleanup, 0);
new_stat->msg_type = msg_type;
- if (per_command_space)
+ if (msg_type == 0 || per_command_space)
{
#ifdef HAVE_SBRK
char *lim = (char *) sbrk (0);
#endif
}
- if (per_command_time)
+ if (msg_type == 0 || per_command_time)
{
new_stat->start_cpu_time = get_run_time ();
gettimeofday (&new_stat->start_wall_time, NULL);
new_stat->time_enabled = 1;
}
- if (per_command_symtab)
+ if (msg_type == 0 || per_command_symtab)
{
- int nr_symtabs, nr_primary_symtabs, nr_blocks;
+ int nr_symtabs, nr_compunit_symtabs, nr_blocks;
- count_symtabs_and_blocks (&nr_symtabs, &nr_primary_symtabs, &nr_blocks);
+ count_symtabs_and_blocks (&nr_symtabs, &nr_compunit_symtabs, &nr_blocks);
new_stat->start_nr_symtabs = nr_symtabs;
- new_stat->start_nr_primary_symtabs = nr_primary_symtabs;
+ new_stat->start_nr_compunit_symtabs = nr_compunit_symtabs;
new_stat->start_nr_blocks = nr_blocks;
new_stat->symtab_enabled = 1;
}
Cause GDB to behave as if an internal warning was reported."),
&maintenancelist);
+ add_cmd ("demangler-warning", class_maintenance,
+ maintenance_demangler_warning, _("\
+Give GDB a demangler warning.\n\
+Cause GDB to behave as if a demangler warning was reported."),
+ &maintenancelist);
+
add_cmd ("demangle", class_maintenance, maintenance_demangle, _("\
Demangle a C++/ObjC mangled name.\n\
Call internal GDB demangler routine to demangle a C++ link name\n\