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