X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=gdb%2Fmaint.c;h=7fd2d583977348d2c837bbbdd70020b0df1a5a13;hb=8527d542c07f6bea86fe5baf3b31568c7fba1398;hp=873c33cce9ce16bd05165e66a5dfce2822a75757;hpb=77e371c079408e265f1dfd2b0620dd8e76c23371;p=platform%2Fupstream%2Fbinutils.git diff --git a/gdb/maint.c b/gdb/maint.c index 873c33c..7fd2d58 100644 --- a/gdb/maint.c +++ b/gdb/maint.c @@ -38,7 +38,6 @@ #include "symfile.h" #include "objfiles.h" #include "value.h" -#include "gdb_assert.h" #include "top.h" #include "timeval-utils.h" #include "maint.h" @@ -88,7 +87,7 @@ maintenance_command (char *args, int from_tty) { 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 @@ -131,6 +130,15 @@ maintenance_internal_warning (char *args, int from_tty) 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 @@ -192,7 +200,8 @@ maintenance_info_command (char *arg, int from_tty) { 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. */ @@ -226,7 +235,7 @@ match_substring (const char *string, const char *substr) } 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")) @@ -314,14 +323,15 @@ maint_print_section_info (const char *name, flagword flags, 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; @@ -338,7 +348,7 @@ print_bfd_section_info (bfd *abfd, 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); @@ -439,7 +449,8 @@ maintenance_print_command (char *arg, int from_tty) { 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 @@ -616,7 +627,7 @@ maintenance_do_deprecate (char *text, int deprecate) if (alias) { if (alias->malloced_replacement) - xfree (alias->replacement); + xfree ((char *) alias->replacement); if (deprecate) { @@ -635,7 +646,7 @@ maintenance_do_deprecate (char *text, int deprecate) else if (cmd) { if (cmd->malloced_replacement) - xfree (cmd->replacement); + xfree ((char *) cmd->replacement); if (deprecate) { @@ -664,7 +675,8 @@ maintenance_set_cmd (char *args, int from_tty) { 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 @@ -818,13 +830,19 @@ count_symtabs_and_blocks (int *nr_symtabs_ptr, int *nr_primary_symtabs_ptr, 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)); + } } } @@ -844,7 +862,7 @@ report_command_stats (void *arg) 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; @@ -865,7 +883,7 @@ report_command_stats (void *arg) (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); @@ -882,7 +900,7 @@ report_command_stats (void *arg) #endif } - if (start_stats->symtab_enabled) + if (start_stats->symtab_enabled && per_command_symtab) { int nr_symtabs, nr_primary_symtabs, nr_blocks; @@ -908,8 +926,14 @@ make_command_stats_cleanup (int msg_type) { 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); @@ -918,7 +942,7 @@ make_command_stats_cleanup (int msg_type) 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); @@ -927,14 +951,14 @@ make_command_stats_cleanup (int msg_type) #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; @@ -1052,6 +1076,12 @@ Give GDB an internal warning.\n\ 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\