#include "symfile.h"
#include "objfiles.h"
#include "value.h"
-#include "gdb_assert.h"
#include "top.h"
#include "timeval-utils.h"
#include "maint.h"
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
}
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);
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)
{
int nr_primary_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_SYMTABS (o, s)
{
- ++nr_primary_symtabs;
- nr_blocks += BLOCKVECTOR_NBLOCKS (BLOCKVECTOR (s));
+ ++nr_symtabs;
+ if (s->primary)
+ {
+ ++nr_primary_symtabs;
+ nr_blocks += BLOCKVECTOR_NBLOCKS (BLOCKVECTOR (s));
+ }
}
}
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;
{
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;
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\