gdb: fix typo "breapoint" -> "breakpoint"
[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
ece5bc8a 1044 gdb_argv argv (args);
d369b608 1045 selftests::run_tests (argv.as_array_view ());
1e5ded6c
YQ
1046#else
1047 printf_filtered (_("\
8ecfd7bd 1048Selftests have been disabled for this build.\n"));
1e5ded6c 1049#endif
1526853e
SM
1050}
1051
1052static void
5fed81ff 1053maintenance_info_selftests (const char *arg, int from_tty)
1526853e 1054{
1e5ded6c 1055#if GDB_SELF_TEST
1526853e
SM
1056 printf_filtered ("Registered selftests:\n");
1057 selftests::for_each_selftest ([] (const std::string &name) {
1058 printf_filtered (" - %s\n", name.c_str ());
1059 });
1e5ded6c
YQ
1060#else
1061 printf_filtered (_("\
8ecfd7bd 1062Selftests have been disabled for this build.\n"));
1e5ded6c 1063#endif
dcd1f979
TT
1064}
1065
bd712aed 1066\f
6c265988 1067void _initialize_maint_cmds ();
c906108c 1068void
6c265988 1069_initialize_maint_cmds ()
c906108c 1070{
439250fb
DE
1071 struct cmd_list_element *cmd;
1072
0743fc83 1073 add_basic_prefix_cmd ("maintenance", class_maintenance, _("\
1bedd215 1074Commands for use by GDB maintainers.\n\
c906108c 1075Includes commands to dump specific internal GDB structures in\n\
439250fb 1076a human readable form, to cause GDB to deliberately dump core, etc."),
0743fc83
TT
1077 &maintenancelist, "maintenance ", 0,
1078 &cmdlist);
c906108c
SS
1079
1080 add_com_alias ("mt", "maintenance", class_maintenance, 1);
1081
0743fc83 1082 add_basic_prefix_cmd ("info", class_maintenance, _("\
1bedd215 1083Commands for showing internal info about the program being debugged."),
0743fc83
TT
1084 &maintenanceinfolist, "maintenance info ", 0,
1085 &maintenancelist);
90515c23 1086 add_alias_cmd ("i", "info", class_maintenance, 1, &maintenancelist);
c906108c 1087
1a966eab 1088 add_cmd ("sections", class_maintenance, maintenance_info_sections, _("\
590042fc 1089List the BFD sections of the exec and core files.\n\
e3d3bfda
MS
1090Arguments may be any combination of:\n\
1091 [one or more section names]\n\
1092 ALLOC LOAD RELOC READONLY CODE DATA ROM CONSTRUCTOR\n\
1093 HAS_CONTENTS NEVER_LOAD COFF_SHARED_LIBRARY IS_COMMON\n\
1094Sections matching any argument will be listed (no argument\n\
1095implies all sections). In addition, the special argument\n\
1096 ALLOBJ\n\
1a966eab 1097lists all sections from all object files, including shared libraries."),
c906108c
SS
1098 &maintenanceinfolist);
1099
0743fc83
TT
1100 add_basic_prefix_cmd ("print", class_maintenance,
1101 _("Maintenance command for printing GDB internal state."),
1102 &maintenanceprintlist, "maintenance print ", 0,
1103 &maintenancelist);
c906108c 1104
0743fc83 1105 add_basic_prefix_cmd ("set", class_maintenance, _("\
4f337972 1106Set GDB internal variables used by the GDB maintainer.\n\
1bedd215 1107Configure variables internal to GDB that aid in GDB's maintenance"),
0743fc83
TT
1108 &maintenance_set_cmdlist, "maintenance set ",
1109 0/*allow-unknown*/,
1110 &maintenancelist);
4f337972 1111
0743fc83 1112 add_show_prefix_cmd ("show", class_maintenance, _("\
4f337972 1113Show GDB internal variables used by the GDB maintainer.\n\
1bedd215 1114Configure variables internal to GDB that aid in GDB's maintenance"),
0743fc83
TT
1115 &maintenance_show_cmdlist, "maintenance show ",
1116 0/*allow-unknown*/,
1117 &maintenancelist);
4f337972 1118
fdbc9870
PA
1119 cmd = add_cmd ("with", class_maintenance, maintenance_with_cmd, _("\
1120Like \"with\", but works with \"maintenance set\" variables.\n\
1121Usage: maintenance with SETTING [VALUE] [-- COMMAND]\n\
1122With no COMMAND, repeats the last executed command.\n\
1123SETTING is any setting you can change with the \"maintenance set\"\n\
1124subcommands."),
1125 &maintenancelist);
1126 set_cmd_completer_handle_brkchars (cmd, maintenance_with_cmd_completer);
1127
c906108c 1128#ifndef _WIN32
1a966eab
AC
1129 add_cmd ("dump-me", class_maintenance, maintenance_dump_me, _("\
1130Get fatal error; make debugger dump its core.\n\
8308e54c 1131GDB sets its handling of SIGQUIT back to SIG_DFL and then sends\n\
1a966eab 1132itself a SIGQUIT signal."),
c906108c
SS
1133 &maintenancelist);
1134#endif
1135
1a966eab
AC
1136 add_cmd ("internal-error", class_maintenance,
1137 maintenance_internal_error, _("\
1138Give GDB an internal error.\n\
1139Cause GDB to behave as if an internal error was detected."),
7be570e7
JM
1140 &maintenancelist);
1141
1a966eab
AC
1142 add_cmd ("internal-warning", class_maintenance,
1143 maintenance_internal_warning, _("\
1144Give GDB an internal warning.\n\
1145Cause GDB to behave as if an internal warning was reported."),
dec43320
AC
1146 &maintenancelist);
1147
57fcfb1b
GB
1148 add_cmd ("demangler-warning", class_maintenance,
1149 maintenance_demangler_warning, _("\
1150Give GDB a demangler warning.\n\
1151Cause GDB to behave as if a demangler warning was reported."),
1152 &maintenancelist);
1153
439250fb
DE
1154 cmd = add_cmd ("demangle", class_maintenance, maintenance_demangle, _("\
1155This command has been moved to \"demangle\"."),
1156 &maintenancelist);
1157 deprecate_cmd (cmd, "demangle");
c906108c 1158
bd712aed
DE
1159 add_prefix_cmd ("per-command", class_maintenance, set_per_command_cmd, _("\
1160Per-command statistics settings."),
387cd15b 1161 &per_command_setlist, "maintenance set per-command ",
bd712aed
DE
1162 1/*allow-unknown*/, &maintenance_set_cmdlist);
1163
0743fc83 1164 add_show_prefix_cmd ("per-command", class_maintenance, _("\
bd712aed 1165Show per-command statistics settings."),
0743fc83
TT
1166 &per_command_showlist, "maintenance show per-command ",
1167 0/*allow-unknown*/, &maintenance_show_cmdlist);
bd712aed
DE
1168
1169 add_setshow_boolean_cmd ("time", class_maintenance,
1170 &per_command_time, _("\
1171Set whether to display per-command execution time."), _("\
1172Show whether to display per-command execution time."),
1173 _("\
1174If enabled, the execution time for each command will be\n\
1175displayed following the command's output."),
1176 NULL, NULL,
1177 &per_command_setlist, &per_command_showlist);
1178
1179 add_setshow_boolean_cmd ("space", class_maintenance,
1180 &per_command_space, _("\
1181Set whether to display per-command space usage."), _("\
1182Show whether to display per-command space usage."),
1183 _("\
1184If enabled, the space usage for each command will be\n\
1185displayed following the command's output."),
1186 NULL, NULL,
1187 &per_command_setlist, &per_command_showlist);
1188
1189 add_setshow_boolean_cmd ("symtab", class_maintenance,
1190 &per_command_symtab, _("\
1191Set whether to display per-command symtab statistics."), _("\
1192Show whether to display per-command symtab statistics."),
1193 _("\
1194If enabled, the basic symtab statistics for each command will be\n\
1195displayed following the command's output."),
1196 NULL, NULL,
1197 &per_command_setlist, &per_command_showlist);
1198
1199 /* This is equivalent to "mt set per-command time on".
1200 Kept because some people are used to typing "mt time 1". */
1a966eab
AC
1201 add_cmd ("time", class_maintenance, maintenance_time_display, _("\
1202Set the display of time usage.\n\
c906108c 1203If nonzero, will cause the execution time for each command to be\n\
1a966eab 1204displayed, following the command's output."),
c906108c
SS
1205 &maintenancelist);
1206
bd712aed
DE
1207 /* This is equivalent to "mt set per-command space on".
1208 Kept because some people are used to typing "mt space 1". */
1a966eab
AC
1209 add_cmd ("space", class_maintenance, maintenance_space_display, _("\
1210Set the display of space usage.\n\
c906108c 1211If nonzero, will cause the execution space for each command to be\n\
1a966eab 1212displayed, following the command's output."),
c906108c
SS
1213 &maintenancelist);
1214
1a966eab
AC
1215 add_cmd ("type", class_maintenance, maintenance_print_type, _("\
1216Print a type chain for a given symbol.\n\
c906108c 1217For each node in a type chain, print the raw data for each member of\n\
1a966eab 1218the type structure, and the interpretation of the data."),
c906108c
SS
1219 &maintenanceprintlist);
1220
c906108c 1221 add_cmd ("statistics", class_maintenance, maintenance_print_statistics,
1a966eab 1222 _("Print statistics about internal gdb state."),
c906108c
SS
1223 &maintenanceprintlist);
1224
1a966eab
AC
1225 add_cmd ("architecture", class_maintenance,
1226 maintenance_print_architecture, _("\
1227Print the internal architecture configuration.\n\
1228Takes an optional file parameter."),
4b9b3959
AC
1229 &maintenanceprintlist);
1230
0743fc83 1231 add_basic_prefix_cmd ("check", class_maintenance, _("\
27d41eac 1232Commands for checking internal gdb state."),
0743fc83
TT
1233 &maintenancechecklist, "maintenance check ", 0,
1234 &maintenancelist);
27d41eac 1235
3e43a32a
MS
1236 add_cmd ("translate-address", class_maintenance,
1237 maintenance_translate_address,
1a966eab 1238 _("Translate a section name and address to a symbol."),
c906108c
SS
1239 &maintenancelist);
1240
1a966eab 1241 add_cmd ("deprecate", class_maintenance, maintenance_deprecate, _("\
590042fc
PW
1242Deprecate a command (for testing purposes).\n\
1243Usage: maintenance deprecate COMMANDNAME [\"REPLACEMENT\"]\n\
1244This is used by the testsuite to check the command deprecator.\n\
1245You probably shouldn't use this,\n\
1246rather you should use the C function deprecate_cmd()."), &maintenancelist);
56382845 1247
1a966eab 1248 add_cmd ("undeprecate", class_maintenance, maintenance_undeprecate, _("\
590042fc
PW
1249Undeprecate a command (for testing purposes).\n\
1250Usage: maintenance undeprecate COMMANDNAME\n\
1251This is used by the testsuite to check the command deprecator.\n\
1252You probably shouldn't use this."),
33f91161 1253 &maintenancelist);
56382845 1254
dcd1f979
TT
1255 add_cmd ("selftest", class_maintenance, maintenance_selftest, _("\
1256Run gdb's unit tests.\n\
590042fc 1257Usage: maintenance selftest [FILTER]\n\
dcd1f979 1258This will run any unit tests that were built in to gdb.\n\
1526853e 1259If a filter is given, only the tests with that value in their name will ran."),
dcd1f979
TT
1260 &maintenancelist);
1261
1526853e
SM
1262 add_cmd ("selftests", class_maintenance, maintenance_info_selftests,
1263 _("List the registered selftests."), &maintenanceinfolist);
1264
d28f9cdf 1265 add_setshow_boolean_cmd ("profile", class_maintenance,
7915a72c
AC
1266 &maintenance_profile_p, _("\
1267Set internal profiling."), _("\
1268Show internal profiling."), _("\
1269When enabled GDB is profiled."),
2c5b56ce 1270 maintenance_set_profile_cmd,
920d2a44 1271 show_maintenance_profile_p,
d28f9cdf
DJ
1272 &maintenance_set_cmdlist,
1273 &maintenance_show_cmdlist);
22138db6
TT
1274
1275 add_setshow_zuinteger_unlimited_cmd ("worker-threads",
1276 class_maintenance,
1277 &n_worker_threads, _("\
1278Set the number of worker threads GDB can use."), _("\
1279Show the number of worker threads GDB can use."), _("\
1280GDB may use multiple threads to speed up certain CPU-intensive operations,\n\
1281such as demangling symbol names."),
1282 maintenance_set_worker_threads, NULL,
1283 &maintenance_set_cmdlist,
1284 &maintenance_show_cmdlist);
1285
1286 update_thread_pool_size ();
c906108c 1287}
This page took 1.803569 seconds and 4 git commands to generate.