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