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