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