* ada-lang.c (ada_decode_symbol): Check and set 'ada_mangled'.
[deliverable/binutils-gdb.git] / gdb / maint.c
CommitLineData
c906108c 1/* Support for GDB maintenance commands.
c6f0559b 2
28e7fd62 3 Copyright (C) 1992-2013 Free Software Foundation, Inc.
c6f0559b 4
c906108c
SS
5 Written by Fred Fish at Cygnus Support.
6
c5aa993b 7 This file is part of GDB.
c906108c 8
c5aa993b
JM
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
a9762ec7 11 the Free Software Foundation; either version 3 of the License, or
c5aa993b 12 (at your option) any later version.
c906108c 13
c5aa993b
JM
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
c906108c 18
c5aa993b 19 You should have received a copy of the GNU General Public License
a9762ec7 20 along with this program. If not, see <http://www.gnu.org/licenses/>. */
c906108c
SS
21
22
23#include "defs.h"
e17c207e 24#include "arch-utils.h"
c906108c
SS
25#include <ctype.h>
26#include <signal.h>
bd712aed
DE
27#include <sys/time.h>
28#include <time.h>
c906108c
SS
29#include "command.h"
30#include "gdbcmd.h"
31#include "symtab.h"
bd712aed 32#include "block.h"
c906108c
SS
33#include "gdbtypes.h"
34#include "demangle.h"
35#include "gdbcore.h"
c5aa993b 36#include "expression.h" /* For language.h */
c906108c
SS
37#include "language.h"
38#include "symfile.h"
39#include "objfiles.h"
40#include "value.h"
c14c28ba 41#include "gdb_assert.h"
bd712aed
DE
42#include "top.h"
43#include "timeval-utils.h"
44#include "maint.h"
c906108c 45
18a642a1 46#include "cli/cli-decode.h"
529480d0 47#include "cli/cli-utils.h"
bd712aed 48#include "cli/cli-setshow.h"
18a642a1 49
a14ed312 50extern void _initialize_maint_cmds (void);
392a587b 51
a14ed312 52static void maintenance_command (char *, int);
c906108c 53
a14ed312 54static void maintenance_internal_error (char *args, int from_tty);
7be570e7 55
a14ed312 56static void maintenance_demangle (char *, int);
c906108c 57
a14ed312 58static void maintenance_time_display (char *, int);
c906108c 59
a14ed312 60static void maintenance_space_display (char *, int);
c906108c 61
a14ed312 62static void maintenance_info_command (char *, int);
c906108c 63
a14ed312 64static void maintenance_info_sections (char *, int);
c906108c 65
a14ed312 66static void maintenance_print_command (char *, int);
c906108c 67
1c689132
DB
68static void maintenance_do_deprecate (char *, int);
69
c906108c
SS
70/* Set this to the maximum number of seconds to wait instead of waiting forever
71 in target_wait(). If this timer times out, then it generates an error and
72 the command is aborted. This replaces most of the need for timeouts in the
73 GDB test suite, and makes it possible to distinguish between a hung target
74 and one with slow communications. */
75
76int watchdog = 0;
920d2a44
AC
77static void
78show_watchdog (struct ui_file *file, int from_tty,
79 struct cmd_list_element *c, const char *value)
80{
81 fprintf_filtered (file, _("Watchdog timer is %s.\n"), value);
82}
c906108c 83
7f86f058 84/* Access the maintenance subcommands. */
c906108c
SS
85
86static void
fba45db2 87maintenance_command (char *args, int from_tty)
c906108c 88{
3e43a32a
MS
89 printf_unfiltered (_("\"maintenance\" must be followed by "
90 "the name of a maintenance command.\n"));
c906108c
SS
91 help_list (maintenancelist, "maintenance ", -1, gdb_stdout);
92}
93
94#ifndef _WIN32
c906108c 95static void
fba45db2 96maintenance_dump_me (char *args, int from_tty)
c906108c 97{
9e2f0ad4 98 if (query (_("Should GDB dump core? ")))
c906108c 99 {
7be570e7
JM
100#ifdef __DJGPP__
101 /* SIGQUIT by default is ignored, so use SIGABRT instead. */
102 signal (SIGABRT, SIG_DFL);
103 kill (getpid (), SIGABRT);
104#else
c906108c
SS
105 signal (SIGQUIT, SIG_DFL);
106 kill (getpid (), SIGQUIT);
7be570e7 107#endif
c906108c
SS
108 }
109}
110#endif
111
7be570e7
JM
112/* Stimulate the internal error mechanism that GDB uses when an
113 internal problem is detected. Allows testing of the mechanism.
114 Also useful when the user wants to drop a core file but not exit
025bb325 115 GDB. */
7be570e7
JM
116
117static void
118maintenance_internal_error (char *args, int from_tty)
119{
dec43320
AC
120 internal_error (__FILE__, __LINE__, "%s", (args == NULL ? "" : args));
121}
122
123/* Stimulate the internal error mechanism that GDB uses when an
124 internal problem is detected. Allows testing of the mechanism.
125 Also useful when the user wants to drop a core file but not exit
025bb325 126 GDB. */
dec43320
AC
127
128static void
129maintenance_internal_warning (char *args, int from_tty)
130{
131 internal_warning (__FILE__, __LINE__, "%s", (args == NULL ? "" : args));
7be570e7
JM
132}
133
33f91161
AC
134/* Someday we should allow demangling for things other than just
135 explicit strings. For example, we might want to be able to specify
136 the address of a string in either GDB's process space or the
137 debuggee's process space, and have gdb fetch and demangle that
138 string. If we have a char* pointer "ptr" that points to a string,
139 we might want to be able to given just the name and have GDB
025bb325 140 demangle and print what it points to, etc. (FIXME) */
c906108c
SS
141
142static void
fba45db2 143maintenance_demangle (char *args, int from_tty)
c906108c
SS
144{
145 char *demangled;
146
147 if (args == NULL || *args == '\0')
148 {
3e43a32a
MS
149 printf_unfiltered (_("\"maintenance demangle\" takes "
150 "an argument to demangle.\n"));
c906108c
SS
151 }
152 else
153 {
9a3d7dfd
AF
154 demangled = language_demangle (current_language, args,
155 DMGL_ANSI | DMGL_PARAMS);
c906108c
SS
156 if (demangled != NULL)
157 {
158 printf_unfiltered ("%s\n", demangled);
b8c9b27d 159 xfree (demangled);
c906108c
SS
160 }
161 else
162 {
a3f17187 163 printf_unfiltered (_("Can't demangle \"%s\"\n"), args);
c906108c
SS
164 }
165 }
166}
167
168static void
fba45db2 169maintenance_time_display (char *args, int from_tty)
c906108c 170{
c906108c 171 if (args == NULL || *args == '\0')
a3f17187 172 printf_unfiltered (_("\"maintenance time\" takes a numeric argument.\n"));
c906108c 173 else
bd712aed 174 set_per_command_time (strtol (args, NULL, 10));
c906108c
SS
175}
176
177static void
fba45db2 178maintenance_space_display (char *args, int from_tty)
c906108c 179{
c906108c
SS
180 if (args == NULL || *args == '\0')
181 printf_unfiltered ("\"maintenance space\" takes a numeric argument.\n");
182 else
bd712aed 183 set_per_command_space (strtol (args, NULL, 10));
c906108c
SS
184}
185
33f91161
AC
186/* The "maintenance info" command is defined as a prefix, with
187 allow_unknown 0. Therefore, its own definition is called only for
188 "maintenance info" with no args. */
c906108c 189
c906108c 190static void
fba45db2 191maintenance_info_command (char *arg, int from_tty)
c906108c 192{
3e43a32a
MS
193 printf_unfiltered (_("\"maintenance info\" must be followed "
194 "by the name of an info command.\n"));
c906108c
SS
195 help_list (maintenanceinfolist, "maintenance info ", -1, gdb_stdout);
196}
197
a532ca62
MS
198/* Mini tokenizing lexer for 'maint info sections' command. */
199
200static int
473e38f3 201match_substring (const char *string, const char *substr)
a532ca62
MS
202{
203 int substr_len = strlen(substr);
473e38f3 204 const char *tok;
a532ca62
MS
205
206 while ((tok = strstr (string, substr)) != NULL)
207 {
025bb325 208 /* Got a partial match. Is it a whole word? */
b01d807c
MS
209 if (tok == string
210 || tok[-1] == ' '
211 || tok[-1] == '\t')
a532ca62 212 {
025bb325 213 /* Token is delimited at the front... */
b01d807c
MS
214 if (tok[substr_len] == ' '
215 || tok[substr_len] == '\t'
216 || tok[substr_len] == '\0')
a532ca62
MS
217 {
218 /* Token is delimited at the rear. Got a whole-word match. */
219 return 1;
220 }
221 }
222 /* Token didn't match as a whole word. Advance and try again. */
223 string = tok + 1;
224 }
225 return 0;
226}
227
43155bc1
MS
228static int
229match_bfd_flags (char *string, flagword flags)
c906108c 230{
43155bc1 231 if (flags & SEC_ALLOC)
a532ca62 232 if (match_substring (string, "ALLOC"))
43155bc1
MS
233 return 1;
234 if (flags & SEC_LOAD)
a532ca62 235 if (match_substring (string, "LOAD"))
43155bc1
MS
236 return 1;
237 if (flags & SEC_RELOC)
a532ca62 238 if (match_substring (string, "RELOC"))
43155bc1
MS
239 return 1;
240 if (flags & SEC_READONLY)
a532ca62 241 if (match_substring (string, "READONLY"))
43155bc1
MS
242 return 1;
243 if (flags & SEC_CODE)
a532ca62 244 if (match_substring (string, "CODE"))
43155bc1
MS
245 return 1;
246 if (flags & SEC_DATA)
a532ca62 247 if (match_substring (string, "DATA"))
43155bc1
MS
248 return 1;
249 if (flags & SEC_ROM)
a532ca62 250 if (match_substring (string, "ROM"))
43155bc1
MS
251 return 1;
252 if (flags & SEC_CONSTRUCTOR)
a532ca62 253 if (match_substring (string, "CONSTRUCTOR"))
43155bc1
MS
254 return 1;
255 if (flags & SEC_HAS_CONTENTS)
a532ca62 256 if (match_substring (string, "HAS_CONTENTS"))
43155bc1
MS
257 return 1;
258 if (flags & SEC_NEVER_LOAD)
a532ca62 259 if (match_substring (string, "NEVER_LOAD"))
43155bc1
MS
260 return 1;
261 if (flags & SEC_COFF_SHARED_LIBRARY)
a532ca62 262 if (match_substring (string, "COFF_SHARED_LIBRARY"))
43155bc1
MS
263 return 1;
264 if (flags & SEC_IS_COMMON)
a532ca62 265 if (match_substring (string, "IS_COMMON"))
43155bc1 266 return 1;
c906108c 267
43155bc1
MS
268 return 0;
269}
c906108c 270
43155bc1
MS
271static void
272print_bfd_flags (flagword flags)
273{
c906108c
SS
274 if (flags & SEC_ALLOC)
275 printf_filtered (" ALLOC");
276 if (flags & SEC_LOAD)
277 printf_filtered (" LOAD");
278 if (flags & SEC_RELOC)
279 printf_filtered (" RELOC");
280 if (flags & SEC_READONLY)
281 printf_filtered (" READONLY");
282 if (flags & SEC_CODE)
283 printf_filtered (" CODE");
284 if (flags & SEC_DATA)
285 printf_filtered (" DATA");
286 if (flags & SEC_ROM)
287 printf_filtered (" ROM");
288 if (flags & SEC_CONSTRUCTOR)
289 printf_filtered (" CONSTRUCTOR");
290 if (flags & SEC_HAS_CONTENTS)
291 printf_filtered (" HAS_CONTENTS");
292 if (flags & SEC_NEVER_LOAD)
293 printf_filtered (" NEVER_LOAD");
294 if (flags & SEC_COFF_SHARED_LIBRARY)
295 printf_filtered (" COFF_SHARED_LIBRARY");
296 if (flags & SEC_IS_COMMON)
297 printf_filtered (" IS_COMMON");
43155bc1
MS
298}
299
300static void
67a2b77e
AC
301maint_print_section_info (const char *name, flagword flags,
302 CORE_ADDR addr, CORE_ADDR endaddr,
5af949e3 303 unsigned long filepos, int addr_size)
43155bc1 304{
5af949e3
UW
305 printf_filtered (" %s", hex_string_custom (addr, addr_size));
306 printf_filtered ("->%s", hex_string_custom (endaddr, addr_size));
3ab13650 307 printf_filtered (" at %s",
bb599908 308 hex_string_custom ((unsigned long) filepos, 8));
e3d3bfda
MS
309 printf_filtered (": %s", name);
310 print_bfd_flags (flags);
311 printf_filtered ("\n");
312}
c906108c 313
e3d3bfda
MS
314static void
315print_bfd_section_info (bfd *abfd,
316 asection *asect,
317 void *arg)
318{
319 flagword flags = bfd_get_section_flags (abfd, asect);
320 const char *name = bfd_section_name (abfd, asect);
321
b01d807c
MS
322 if (arg == NULL || *((char *) arg) == '\0'
323 || match_substring ((char *) arg, name)
324 || match_bfd_flags ((char *) arg, flags))
e3d3bfda 325 {
5af949e3
UW
326 struct gdbarch *gdbarch = gdbarch_from_bfd (abfd);
327 int addr_size = gdbarch_addr_bit (gdbarch) / 8;
e3d3bfda
MS
328 CORE_ADDR addr, endaddr;
329
330 addr = bfd_section_vma (abfd, asect);
331 endaddr = addr + bfd_section_size (abfd, asect);
5af949e3
UW
332 maint_print_section_info (name, flags, addr, endaddr,
333 asect->filepos, addr_size);
e3d3bfda
MS
334 }
335}
336
337static void
338print_objfile_section_info (bfd *abfd,
339 struct obj_section *asect,
340 char *string)
341{
342 flagword flags = bfd_get_section_flags (abfd, asect->the_bfd_section);
343 const char *name = bfd_section_name (abfd, asect->the_bfd_section);
43155bc1 344
b01d807c
MS
345 if (string == NULL || *string == '\0'
346 || match_substring (string, name)
347 || match_bfd_flags (string, flags))
43155bc1 348 {
5af949e3
UW
349 struct gdbarch *gdbarch = gdbarch_from_bfd (abfd);
350 int addr_size = gdbarch_addr_bit (gdbarch) / 8;
b8d56208 351
f1f6aadf
PA
352 maint_print_section_info (name, flags,
353 obj_section_addr (asect),
354 obj_section_endaddr (asect),
5af949e3
UW
355 asect->the_bfd_section->filepos,
356 addr_size);
43155bc1 357 }
c906108c
SS
358}
359
c906108c 360static void
fba45db2 361maintenance_info_sections (char *arg, int from_tty)
c906108c
SS
362{
363 if (exec_bfd)
364 {
a3f17187 365 printf_filtered (_("Exec file:\n"));
c5aa993b 366 printf_filtered (" `%s', ", bfd_get_filename (exec_bfd));
c906108c 367 wrap_here (" ");
a3f17187 368 printf_filtered (_("file type %s.\n"), bfd_get_target (exec_bfd));
a532ca62 369 if (arg && *arg && match_substring (arg, "ALLOBJ"))
e3d3bfda
MS
370 {
371 struct objfile *ofile;
372 struct obj_section *osect;
373
374 /* Only this function cares about the 'ALLOBJ' argument;
375 if 'ALLOBJ' is the only argument, discard it rather than
376 passing it down to print_objfile_section_info (which
377 wouldn't know how to handle it). */
378 if (strcmp (arg, "ALLOBJ") == 0)
379 arg = NULL;
380
381 ALL_OBJFILES (ofile)
382 {
a3f17187 383 printf_filtered (_(" Object file: %s\n"),
e3d3bfda
MS
384 bfd_get_filename (ofile->obfd));
385 ALL_OBJFILE_OSECTIONS (ofile, osect)
386 {
387 print_objfile_section_info (ofile->obfd, osect, arg);
388 }
389 }
390 }
391 else
392 bfd_map_over_sections (exec_bfd, print_bfd_section_info, arg);
c906108c
SS
393 }
394
395 if (core_bfd)
396 {
a3f17187 397 printf_filtered (_("Core file:\n"));
c5aa993b 398 printf_filtered (" `%s', ", bfd_get_filename (core_bfd));
c906108c 399 wrap_here (" ");
a3f17187 400 printf_filtered (_("file type %s.\n"), bfd_get_target (core_bfd));
e3d3bfda 401 bfd_map_over_sections (core_bfd, print_bfd_section_info, arg);
c906108c
SS
402 }
403}
404
025cfdb2 405static void
fba45db2 406maintenance_print_statistics (char *args, int from_tty)
c906108c
SS
407{
408 print_objfile_statistics ();
409 print_symbol_bcache_statistics ();
410}
411
b9362cc7 412static void
4b9b3959
AC
413maintenance_print_architecture (char *args, int from_tty)
414{
e17c207e
UW
415 struct gdbarch *gdbarch = get_current_arch ();
416
4b9b3959 417 if (args == NULL)
e17c207e 418 gdbarch_dump (gdbarch, gdb_stdout);
4b9b3959
AC
419 else
420 {
724b958c 421 struct cleanup *cleanups;
4b9b3959 422 struct ui_file *file = gdb_fopen (args, "w");
b8d56208 423
4b9b3959 424 if (file == NULL)
e2e0b3e5 425 perror_with_name (_("maintenance print architecture"));
724b958c 426 cleanups = make_cleanup_ui_file_delete (file);
e17c207e 427 gdbarch_dump (gdbarch, file);
724b958c 428 do_cleanups (cleanups);
4b9b3959
AC
429 }
430}
431
33f91161
AC
432/* The "maintenance print" command is defined as a prefix, with
433 allow_unknown 0. Therefore, its own definition is called only for
434 "maintenance print" with no args. */
c906108c 435
c906108c 436static void
fba45db2 437maintenance_print_command (char *arg, int from_tty)
c906108c 438{
3e43a32a
MS
439 printf_unfiltered (_("\"maintenance print\" must be followed "
440 "by the name of a print command.\n"));
c906108c
SS
441 help_list (maintenanceprintlist, "maintenance print ", -1, gdb_stdout);
442}
443
444/* The "maintenance translate-address" command converts a section and address
445 to a symbol. This can be called in two ways:
c5aa993b 446 maintenance translate-address <secname> <addr>
025bb325 447 or maintenance translate-address <addr>. */
c906108c
SS
448
449static void
fba45db2 450maintenance_translate_address (char *arg, int from_tty)
c906108c
SS
451{
452 CORE_ADDR address;
714835d5 453 struct obj_section *sect;
c906108c
SS
454 char *p;
455 struct minimal_symbol *sym;
456 struct objfile *objfile;
457
458 if (arg == NULL || *arg == 0)
8a3fe4f8 459 error (_("requires argument (address or section + address)"));
c906108c
SS
460
461 sect = NULL;
462 p = arg;
463
464 if (!isdigit (*p))
025bb325
MS
465 { /* See if we have a valid section name. */
466 while (*p && !isspace (*p)) /* Find end of section name. */
c906108c 467 p++;
025bb325 468 if (*p == '\000') /* End of command? */
8a3fe4f8 469 error (_("Need to specify <section-name> and <address>"));
c906108c 470 *p++ = '\000';
529480d0 471 p = skip_spaces (p);
c906108c 472
714835d5 473 ALL_OBJSECTIONS (objfile, sect)
c5aa993b 474 {
714835d5 475 if (strcmp (sect->the_bfd_section->name, arg) == 0)
c5aa993b
JM
476 break;
477 }
c906108c 478
15c99a44 479 if (!objfile)
8a3fe4f8 480 error (_("Unknown section %s."), arg);
c906108c
SS
481 }
482
483 address = parse_and_eval_address (p);
484
485 if (sect)
486 sym = lookup_minimal_symbol_by_pc_section (address, sect);
487 else
488 sym = lookup_minimal_symbol_by_pc (address);
489
490 if (sym)
c14c28ba
PP
491 {
492 const char *symbol_name = SYMBOL_PRINT_NAME (sym);
3e43a32a
MS
493 const char *symbol_offset
494 = pulongest (address - SYMBOL_VALUE_ADDRESS (sym));
c14c28ba
PP
495
496 sect = SYMBOL_OBJ_SECTION(sym);
497 if (sect != NULL)
498 {
499 const char *section_name;
500 const char *obj_name;
501
502 gdb_assert (sect->the_bfd_section && sect->the_bfd_section->name);
503 section_name = sect->the_bfd_section->name;
504
505 gdb_assert (sect->objfile && sect->objfile->name);
506 obj_name = sect->objfile->name;
507
508 if (MULTI_OBJFILE_P ())
509 printf_filtered (_("%s + %s in section %s of %s\n"),
3e43a32a
MS
510 symbol_name, symbol_offset,
511 section_name, obj_name);
c14c28ba
PP
512 else
513 printf_filtered (_("%s + %s in section %s\n"),
514 symbol_name, symbol_offset, section_name);
515 }
516 else
517 printf_filtered (_("%s + %s\n"), symbol_name, symbol_offset);
518 }
c906108c 519 else if (sect)
5af949e3
UW
520 printf_filtered (_("no symbol at %s:%s\n"),
521 sect->the_bfd_section->name, hex_string (address));
c906108c 522 else
5af949e3 523 printf_filtered (_("no symbol at %s\n"), hex_string (address));
c906108c
SS
524
525 return;
526}
527
56382845 528
c114dcd5 529/* When a command is deprecated the user will be warned the first time
33f91161 530 the command is used. If possible, a replacement will be
025bb325 531 offered. */
56382845
FN
532
533static void
534maintenance_deprecate (char *args, int from_tty)
535{
536 if (args == NULL || *args == '\0')
537 {
cce7e648
PA
538 printf_unfiltered (_("\"maintenance deprecate\" takes an argument,\n\
539the command you want to deprecate, and optionally the replacement command\n\
a3f17187 540enclosed in quotes.\n"));
56382845 541 }
33f91161 542
56382845
FN
543 maintenance_do_deprecate (args, 1);
544
545}
546
547
548static void
549maintenance_undeprecate (char *args, int from_tty)
550{
551 if (args == NULL || *args == '\0')
552 {
a3f17187
AC
553 printf_unfiltered (_("\"maintenance undeprecate\" takes an argument, \n\
554the command you want to undeprecate.\n"));
56382845 555 }
33f91161 556
56382845 557 maintenance_do_deprecate (args, 0);
33f91161 558
56382845
FN
559}
560
025bb325 561/* You really shouldn't be using this. It is just for the testsuite.
33f91161
AC
562 Rather, you should use deprecate_cmd() when the command is created
563 in _initialize_blah().
564
565 This function deprecates a command and optionally assigns it a
566 replacement. */
567
8399535b 568static void
33f91161
AC
569maintenance_do_deprecate (char *text, int deprecate)
570{
33f91161
AC
571 struct cmd_list_element *alias = NULL;
572 struct cmd_list_element *prefix_cmd = NULL;
573 struct cmd_list_element *cmd = NULL;
574
575 char *start_ptr = NULL;
576 char *end_ptr = NULL;
56382845 577 int len;
33f91161
AC
578 char *replacement = NULL;
579
1c689132
DB
580 if (text == NULL)
581 return;
56382845 582
33f91161
AC
583 if (!lookup_cmd_composition (text, &alias, &prefix_cmd, &cmd))
584 {
a3f17187 585 printf_filtered (_("Can't find command '%s' to deprecate.\n"), text);
33f91161
AC
586 return;
587 }
56382845 588
56382845
FN
589 if (deprecate)
590 {
025bb325 591 /* Look for a replacement command. */
80ce1ecb
AC
592 start_ptr = strchr (text, '\"');
593 if (start_ptr != NULL)
33f91161
AC
594 {
595 start_ptr++;
80ce1ecb
AC
596 end_ptr = strrchr (start_ptr, '\"');
597 if (end_ptr != NULL)
33f91161
AC
598 {
599 len = end_ptr - start_ptr;
600 start_ptr[len] = '\0';
601 replacement = xstrdup (start_ptr);
602 }
603 }
56382845 604 }
33f91161 605
56382845
FN
606 if (!start_ptr || !end_ptr)
607 replacement = NULL;
33f91161
AC
608
609
56382845 610 /* If they used an alias, we only want to deprecate the alias.
33f91161 611
56382845
FN
612 Note the MALLOCED_REPLACEMENT test. If the command's replacement
613 string was allocated at compile time we don't want to free the
025bb325 614 memory. */
56382845
FN
615 if (alias)
616 {
56382845 617 if (alias->flags & MALLOCED_REPLACEMENT)
b8c9b27d 618 xfree (alias->replacement);
33f91161 619
56382845 620 if (deprecate)
33f91161 621 alias->flags |= (DEPRECATED_WARN_USER | CMD_DEPRECATED);
56382845 622 else
33f91161
AC
623 alias->flags &= ~(DEPRECATED_WARN_USER | CMD_DEPRECATED);
624 alias->replacement = replacement;
56382845
FN
625 alias->flags |= MALLOCED_REPLACEMENT;
626 return;
627 }
628 else if (cmd)
629 {
630 if (cmd->flags & MALLOCED_REPLACEMENT)
b8c9b27d 631 xfree (cmd->replacement);
56382845
FN
632
633 if (deprecate)
33f91161 634 cmd->flags |= (DEPRECATED_WARN_USER | CMD_DEPRECATED);
56382845 635 else
33f91161
AC
636 cmd->flags &= ~(DEPRECATED_WARN_USER | CMD_DEPRECATED);
637 cmd->replacement = replacement;
56382845
FN
638 cmd->flags |= MALLOCED_REPLACEMENT;
639 return;
640 }
240f9570 641 xfree (replacement);
56382845
FN
642}
643
4f337972
AC
644/* Maintenance set/show framework. */
645
ae038cb0
DJ
646struct cmd_list_element *maintenance_set_cmdlist;
647struct cmd_list_element *maintenance_show_cmdlist;
4f337972
AC
648
649static void
650maintenance_set_cmd (char *args, int from_tty)
651{
3e43a32a
MS
652 printf_unfiltered (_("\"maintenance set\" must be followed "
653 "by the name of a set command.\n"));
4f337972
AC
654 help_list (maintenance_set_cmdlist, "maintenance set ", -1, gdb_stdout);
655}
656
657static void
658maintenance_show_cmd (char *args, int from_tty)
659{
660 cmd_show_list (maintenance_show_cmdlist, from_tty, "");
661}
662
4f337972
AC
663/* Profiling support. */
664
665static int maintenance_profile_p;
920d2a44
AC
666static void
667show_maintenance_profile_p (struct ui_file *file, int from_tty,
668 struct cmd_list_element *c, const char *value)
669{
670 fprintf_filtered (file, _("Internal profiling is %s.\n"), value);
671}
d9feb4e7 672
b0b1c2c0
MK
673#ifdef HAVE__ETEXT
674extern char _etext;
675#define TEXTEND &_etext
01fe12f6 676#elif defined (HAVE_ETEXT)
b0b1c2c0
MK
677extern char etext;
678#define TEXTEND &etext
679#endif
680
01fe12f6
JB
681#if defined (HAVE_MONSTARTUP) && defined (HAVE__MCLEANUP) && defined (TEXTEND)
682
d28f9cdf
DJ
683static int profiling_state;
684
685static void
686mcleanup_wrapper (void)
687{
688 extern void _mcleanup (void);
689
690 if (profiling_state)
691 _mcleanup ();
692}
4f337972
AC
693
694static void
3e43a32a
MS
695maintenance_set_profile_cmd (char *args, int from_tty,
696 struct cmd_list_element *c)
4f337972 697{
d28f9cdf
DJ
698 if (maintenance_profile_p == profiling_state)
699 return;
700
701 profiling_state = maintenance_profile_p;
702
703 if (maintenance_profile_p)
704 {
705 static int profiling_initialized;
706
707 extern void monstartup (unsigned long, unsigned long);
d28f9cdf
DJ
708 extern int main();
709
710 if (!profiling_initialized)
711 {
712 atexit (mcleanup_wrapper);
713 profiling_initialized = 1;
714 }
715
716 /* "main" is now always the first function in the text segment, so use
717 its address for monstartup. */
b0b1c2c0 718 monstartup ((unsigned long) &main, (unsigned long) TEXTEND);
d28f9cdf
DJ
719 }
720 else
721 {
722 extern void _mcleanup (void);
b8d56208 723
d28f9cdf
DJ
724 _mcleanup ();
725 }
4f337972 726}
d9feb4e7
DJ
727#else
728static void
3e43a32a
MS
729maintenance_set_profile_cmd (char *args, int from_tty,
730 struct cmd_list_element *c)
d9feb4e7 731{
8a3fe4f8 732 error (_("Profiling support is not available on this system."));
d9feb4e7
DJ
733}
734#endif
bd712aed
DE
735\f
736/* If nonzero, display time usage both at startup and for each command. */
56382845 737
bd712aed
DE
738static int per_command_time;
739
740/* If nonzero, display space usage both at startup and for each command. */
741
742static int per_command_space;
743
744/* If nonzero, display basic symtab stats for each command. */
745
746static int per_command_symtab;
747
748/* mt per-command commands. */
749
750static struct cmd_list_element *per_command_setlist;
751static struct cmd_list_element *per_command_showlist;
752
753/* Records a run time and space usage to be used as a base for
754 reporting elapsed time or change in space. */
755
756struct cmd_stats
757{
758 /* Zero if the saved time is from the beginning of GDB execution.
759 One if from the beginning of an individual command execution. */
760 int msg_type;
761 /* Track whether the stat was enabled at the start of the command
762 so that we can avoid printing anything if it gets turned on by
763 the current command. */
764 int time_enabled : 1;
765 int space_enabled : 1;
766 int symtab_enabled : 1;
767 long start_cpu_time;
768 struct timeval start_wall_time;
769 long start_space;
770 /* Total number of symtabs (over all objfiles). */
771 int start_nr_symtabs;
772 /* Of those, a count of just the primary ones. */
773 int start_nr_primary_symtabs;
774 /* Total number of blocks. */
775 int start_nr_blocks;
776};
777
778/* Set whether to display time statistics to NEW_VALUE
779 (non-zero means true). */
780
781void
782set_per_command_time (int new_value)
783{
784 per_command_time = new_value;
785}
786
787/* Set whether to display space statistics to NEW_VALUE
788 (non-zero means true). */
789
790void
791set_per_command_space (int new_value)
792{
793 per_command_space = new_value;
794}
795
796/* Count the number of symtabs and blocks. */
797
798static void
799count_symtabs_and_blocks (int *nr_symtabs_ptr, int *nr_primary_symtabs_ptr,
800 int *nr_blocks_ptr)
801{
802 struct objfile *o;
803 struct symtab *s;
804 int nr_symtabs = 0;
805 int nr_primary_symtabs = 0;
806 int nr_blocks = 0;
807
808 ALL_SYMTABS (o, s)
809 {
810 ++nr_symtabs;
811 if (s->primary)
812 {
813 ++nr_primary_symtabs;
814 nr_blocks += BLOCKVECTOR_NBLOCKS (BLOCKVECTOR (s));
815 }
816 }
817
818 *nr_symtabs_ptr = nr_symtabs;
819 *nr_primary_symtabs_ptr = nr_primary_symtabs;
820 *nr_blocks_ptr = nr_blocks;
821}
822
823/* As indicated by display_time and display_space, report GDB's elapsed time
824 and space usage from the base time and space provided in ARG, which
825 must be a pointer to a struct cmd_stat. This function is intended
826 to be called as a cleanup. */
827
828static void
829report_command_stats (void *arg)
830{
831 struct cmd_stats *start_stats = (struct cmd_stats *) arg;
832 int msg_type = start_stats->msg_type;
833
834 if (start_stats->time_enabled)
835 {
836 long cmd_time = get_run_time () - start_stats->start_cpu_time;
837 struct timeval now_wall_time, delta_wall_time, wait_time;
838
839 gettimeofday (&now_wall_time, NULL);
840 timeval_sub (&delta_wall_time,
841 &now_wall_time, &start_stats->start_wall_time);
842
843 /* Subtract time spend in prompt_for_continue from walltime. */
844 wait_time = get_prompt_for_continue_wait_time ();
845 timeval_sub (&delta_wall_time, &delta_wall_time, &wait_time);
846
847 printf_unfiltered (msg_type == 0
848 ? _("Startup time: %ld.%06ld (cpu), %ld.%06ld (wall)\n")
849 : _("Command execution time: %ld.%06ld (cpu), %ld.%06ld (wall)\n"),
850 cmd_time / 1000000, cmd_time % 1000000,
851 (long) delta_wall_time.tv_sec,
852 (long) delta_wall_time.tv_usec);
853 }
854
855 if (start_stats->space_enabled)
856 {
857#ifdef HAVE_SBRK
858 char *lim = (char *) sbrk (0);
859
860 long space_now = lim - lim_at_start;
861 long space_diff = space_now - start_stats->start_space;
862
863 printf_unfiltered (msg_type == 0
864 ? _("Space used: %ld (%s%ld during startup)\n")
865 : _("Space used: %ld (%s%ld for this command)\n"),
866 space_now,
867 (space_diff >= 0 ? "+" : ""),
868 space_diff);
869#endif
870 }
871
872 if (start_stats->symtab_enabled)
873 {
874 int nr_symtabs, nr_primary_symtabs, nr_blocks;
875
876 count_symtabs_and_blocks (&nr_symtabs, &nr_primary_symtabs, &nr_blocks);
877 printf_unfiltered (_("#symtabs: %d (+%d),"
878 " #primary symtabs: %d (+%d),"
879 " #blocks: %d (+%d)\n"),
880 nr_symtabs,
881 nr_symtabs - start_stats->start_nr_symtabs,
882 nr_primary_symtabs,
883 nr_primary_symtabs - start_stats->start_nr_primary_symtabs,
884 nr_blocks,
885 nr_blocks - start_stats->start_nr_blocks);
886 }
887}
888
889/* Create a cleanup that reports time and space used since its creation.
890 MSG_TYPE is zero for gdb startup, otherwise it is one(1) to report
891 data for individual commands. */
892
893struct cleanup *
894make_command_stats_cleanup (int msg_type)
895{
896 struct cmd_stats *new_stat;
897
898 /* Early exit if we're not reporting any stats. */
899 if (!per_command_time
900 && !per_command_space
901 && !per_command_symtab)
902 return make_cleanup (null_cleanup, 0);
903
904 new_stat = XZALLOC (struct cmd_stats);
905
906 new_stat->msg_type = msg_type;
907
908 if (per_command_space)
909 {
910#ifdef HAVE_SBRK
911 char *lim = (char *) sbrk (0);
912 new_stat->start_space = lim - lim_at_start;
913 new_stat->space_enabled = 1;
914#endif
915 }
916
917 if (per_command_time)
918 {
919 new_stat->start_cpu_time = get_run_time ();
920 gettimeofday (&new_stat->start_wall_time, NULL);
921 new_stat->time_enabled = 1;
922 }
923
924 if (per_command_symtab)
925 {
926 int nr_symtabs, nr_primary_symtabs, nr_blocks;
927
928 count_symtabs_and_blocks (&nr_symtabs, &nr_primary_symtabs, &nr_blocks);
929 new_stat->start_nr_symtabs = nr_symtabs;
930 new_stat->start_nr_primary_symtabs = nr_primary_symtabs;
931 new_stat->start_nr_blocks = nr_blocks;
932 new_stat->symtab_enabled = 1;
933 }
934
935 /* Initalize timer to keep track of how long we waited for the user. */
936 reset_prompt_for_continue_wait_time ();
937
938 return make_cleanup_dtor (report_command_stats, new_stat, xfree);
939}
940
941/* Handle unknown "mt set per-command" arguments.
942 In this case have "mt set per-command on|off" affect every setting. */
943
944static void
945set_per_command_cmd (char *args, int from_tty)
946{
947 struct cmd_list_element *list;
948 size_t length;
949 int val;
950
951 val = parse_cli_boolean_value (args);
952 if (val < 0)
953 error (_("Bad value for 'mt set per-command no'."));
954
955 for (list = per_command_setlist; list != NULL; list = list->next)
956 if (list->var_type == var_boolean)
957 {
958 gdb_assert (list->type == set_cmd);
959 do_set_command (args, from_tty, list);
960 }
961}
962
963/* Command "show per-command" displays summary of all the current
964 "show per-command " settings. */
965
966static void
967show_per_command_cmd (char *args, int from_tty)
968{
969 cmd_show_list (per_command_showlist, from_tty, "");
970}
971\f
c906108c 972void
fba45db2 973_initialize_maint_cmds (void)
c906108c 974{
1bedd215
AC
975 add_prefix_cmd ("maintenance", class_maintenance, maintenance_command, _("\
976Commands for use by GDB maintainers.\n\
c906108c
SS
977Includes commands to dump specific internal GDB structures in\n\
978a human readable form, to cause GDB to deliberately dump core,\n\
1bedd215 979to test internal functions such as the C++/ObjC demangler, etc."),
c906108c
SS
980 &maintenancelist, "maintenance ", 0,
981 &cmdlist);
982
983 add_com_alias ("mt", "maintenance", class_maintenance, 1);
984
1bedd215
AC
985 add_prefix_cmd ("info", class_maintenance, maintenance_info_command, _("\
986Commands for showing internal info about the program being debugged."),
c906108c
SS
987 &maintenanceinfolist, "maintenance info ", 0,
988 &maintenancelist);
90515c23 989 add_alias_cmd ("i", "info", class_maintenance, 1, &maintenancelist);
c906108c 990
1a966eab
AC
991 add_cmd ("sections", class_maintenance, maintenance_info_sections, _("\
992List the BFD sections of the exec and core files. \n\
e3d3bfda
MS
993Arguments may be any combination of:\n\
994 [one or more section names]\n\
995 ALLOC LOAD RELOC READONLY CODE DATA ROM CONSTRUCTOR\n\
996 HAS_CONTENTS NEVER_LOAD COFF_SHARED_LIBRARY IS_COMMON\n\
997Sections matching any argument will be listed (no argument\n\
998implies all sections). In addition, the special argument\n\
999 ALLOBJ\n\
1a966eab 1000lists all sections from all object files, including shared libraries."),
c906108c
SS
1001 &maintenanceinfolist);
1002
1003 add_prefix_cmd ("print", class_maintenance, maintenance_print_command,
1bedd215 1004 _("Maintenance command for printing GDB internal state."),
c906108c
SS
1005 &maintenanceprintlist, "maintenance print ", 0,
1006 &maintenancelist);
1007
1bedd215 1008 add_prefix_cmd ("set", class_maintenance, maintenance_set_cmd, _("\
4f337972 1009Set GDB internal variables used by the GDB maintainer.\n\
1bedd215 1010Configure variables internal to GDB that aid in GDB's maintenance"),
4f337972
AC
1011 &maintenance_set_cmdlist, "maintenance set ",
1012 0/*allow-unknown*/,
1013 &maintenancelist);
1014
1bedd215 1015 add_prefix_cmd ("show", class_maintenance, maintenance_show_cmd, _("\
4f337972 1016Show GDB internal variables used by the GDB maintainer.\n\
1bedd215 1017Configure variables internal to GDB that aid in GDB's maintenance"),
4f337972
AC
1018 &maintenance_show_cmdlist, "maintenance show ",
1019 0/*allow-unknown*/,
1020 &maintenancelist);
1021
c906108c 1022#ifndef _WIN32
1a966eab
AC
1023 add_cmd ("dump-me", class_maintenance, maintenance_dump_me, _("\
1024Get fatal error; make debugger dump its core.\n\
8308e54c 1025GDB sets its handling of SIGQUIT back to SIG_DFL and then sends\n\
1a966eab 1026itself a SIGQUIT signal."),
c906108c
SS
1027 &maintenancelist);
1028#endif
1029
1a966eab
AC
1030 add_cmd ("internal-error", class_maintenance,
1031 maintenance_internal_error, _("\
1032Give GDB an internal error.\n\
1033Cause GDB to behave as if an internal error was detected."),
7be570e7
JM
1034 &maintenancelist);
1035
1a966eab
AC
1036 add_cmd ("internal-warning", class_maintenance,
1037 maintenance_internal_warning, _("\
1038Give GDB an internal warning.\n\
1039Cause GDB to behave as if an internal warning was reported."),
dec43320
AC
1040 &maintenancelist);
1041
1a966eab
AC
1042 add_cmd ("demangle", class_maintenance, maintenance_demangle, _("\
1043Demangle a C++/ObjC mangled name.\n\
c906108c 1044Call internal GDB demangler routine to demangle a C++ link name\n\
1a966eab 1045and prints the result."),
c906108c
SS
1046 &maintenancelist);
1047
bd712aed
DE
1048 add_prefix_cmd ("per-command", class_maintenance, set_per_command_cmd, _("\
1049Per-command statistics settings."),
1050 &per_command_setlist, "set per-command ",
1051 1/*allow-unknown*/, &maintenance_set_cmdlist);
1052
1053 add_prefix_cmd ("per-command", class_maintenance, show_per_command_cmd, _("\
1054Show per-command statistics settings."),
1055 &per_command_showlist, "show per-command ",
1056 0/*allow-unknown*/, &maintenance_show_cmdlist);
1057
1058 add_setshow_boolean_cmd ("time", class_maintenance,
1059 &per_command_time, _("\
1060Set whether to display per-command execution time."), _("\
1061Show whether to display per-command execution time."),
1062 _("\
1063If enabled, the execution time for each command will be\n\
1064displayed following the command's output."),
1065 NULL, NULL,
1066 &per_command_setlist, &per_command_showlist);
1067
1068 add_setshow_boolean_cmd ("space", class_maintenance,
1069 &per_command_space, _("\
1070Set whether to display per-command space usage."), _("\
1071Show whether to display per-command space usage."),
1072 _("\
1073If enabled, the space usage for each command will be\n\
1074displayed following the command's output."),
1075 NULL, NULL,
1076 &per_command_setlist, &per_command_showlist);
1077
1078 add_setshow_boolean_cmd ("symtab", class_maintenance,
1079 &per_command_symtab, _("\
1080Set whether to display per-command symtab statistics."), _("\
1081Show whether to display per-command symtab statistics."),
1082 _("\
1083If enabled, the basic symtab statistics for each command will be\n\
1084displayed following the command's output."),
1085 NULL, NULL,
1086 &per_command_setlist, &per_command_showlist);
1087
1088 /* This is equivalent to "mt set per-command time on".
1089 Kept because some people are used to typing "mt time 1". */
1a966eab
AC
1090 add_cmd ("time", class_maintenance, maintenance_time_display, _("\
1091Set the display of time usage.\n\
c906108c 1092If nonzero, will cause the execution time for each command to be\n\
1a966eab 1093displayed, following the command's output."),
c906108c
SS
1094 &maintenancelist);
1095
bd712aed
DE
1096 /* This is equivalent to "mt set per-command space on".
1097 Kept because some people are used to typing "mt space 1". */
1a966eab
AC
1098 add_cmd ("space", class_maintenance, maintenance_space_display, _("\
1099Set the display of space usage.\n\
c906108c 1100If nonzero, will cause the execution space for each command to be\n\
1a966eab 1101displayed, following the command's output."),
c906108c
SS
1102 &maintenancelist);
1103
1a966eab
AC
1104 add_cmd ("type", class_maintenance, maintenance_print_type, _("\
1105Print a type chain for a given symbol.\n\
c906108c 1106For each node in a type chain, print the raw data for each member of\n\
1a966eab 1107the type structure, and the interpretation of the data."),
c906108c
SS
1108 &maintenanceprintlist);
1109
c906108c 1110 add_cmd ("statistics", class_maintenance, maintenance_print_statistics,
1a966eab 1111 _("Print statistics about internal gdb state."),
c906108c
SS
1112 &maintenanceprintlist);
1113
1a966eab
AC
1114 add_cmd ("architecture", class_maintenance,
1115 maintenance_print_architecture, _("\
1116Print the internal architecture configuration.\n\
1117Takes an optional file parameter."),
4b9b3959
AC
1118 &maintenanceprintlist);
1119
3e43a32a
MS
1120 add_cmd ("translate-address", class_maintenance,
1121 maintenance_translate_address,
1a966eab 1122 _("Translate a section name and address to a symbol."),
c906108c
SS
1123 &maintenancelist);
1124
1a966eab
AC
1125 add_cmd ("deprecate", class_maintenance, maintenance_deprecate, _("\
1126Deprecate a command. Note that this is just in here so the \n\
ef4cb050 1127testsuite can check the command deprecator. You probably shouldn't use this,\n\
56382845 1128rather you should use the C function deprecate_cmd(). If you decide you \n\
6f122dc9 1129want to use it: maintenance deprecate 'commandname' \"replacement\". The \n\
1a966eab 1130replacement is optional."), &maintenancelist);
56382845 1131
1a966eab
AC
1132 add_cmd ("undeprecate", class_maintenance, maintenance_undeprecate, _("\
1133Undeprecate a command. Note that this is just in here so the \n\
ef4cb050 1134testsuite can check the command deprecator. You probably shouldn't use this,\n\
1a966eab 1135If you decide you want to use it: maintenance undeprecate 'commandname'"),
33f91161 1136 &maintenancelist);
56382845 1137
85c07804
AC
1138 add_setshow_zinteger_cmd ("watchdog", class_maintenance, &watchdog, _("\
1139Set watchdog timer."), _("\
1140Show watchdog timer."), _("\
cb1a6d5f
AC
1141When non-zero, this timeout is used instead of waiting forever for a target\n\
1142to finish a low-level step or continue operation. If the specified amount\n\
85c07804
AC
1143of time passes without a response from the target, an error occurs."),
1144 NULL,
920d2a44 1145 show_watchdog,
85c07804 1146 &setlist, &showlist);
4f337972 1147
d28f9cdf 1148 add_setshow_boolean_cmd ("profile", class_maintenance,
7915a72c
AC
1149 &maintenance_profile_p, _("\
1150Set internal profiling."), _("\
1151Show internal profiling."), _("\
1152When enabled GDB is profiled."),
2c5b56ce 1153 maintenance_set_profile_cmd,
920d2a44 1154 show_maintenance_profile_p,
d28f9cdf
DJ
1155 &maintenance_set_cmdlist,
1156 &maintenance_show_cmdlist);
c906108c 1157}
This page took 1.124246 seconds and 4 git commands to generate.