]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gdb/maint.c
* disasm.h (gdb_disassembly): Add GDBARCH parameter.
[thirdparty/binutils-gdb.git] / gdb / maint.c
CommitLineData
c906108c 1/* Support for GDB maintenance commands.
c6f0559b 2
6aba47ca 3 Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1999, 2000, 2001, 2002,
0fb0cc75 4 2003, 2004, 2007, 2008, 2009 Free Software Foundation, Inc.
c6f0559b 5
c906108c
SS
6 Written by Fred Fish at Cygnus Support.
7
c5aa993b 8 This file is part of GDB.
c906108c 9
c5aa993b
JM
10 This program is free software; you can redistribute it and/or modify
11 it under the terms of the GNU General Public License as published by
a9762ec7 12 the Free Software Foundation; either version 3 of the License, or
c5aa993b 13 (at your option) any later version.
c906108c 14
c5aa993b
JM
15 This program is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License for more details.
c906108c 19
c5aa993b 20 You should have received a copy of the GNU General Public License
a9762ec7 21 along with this program. If not, see <http://www.gnu.org/licenses/>. */
c906108c
SS
22
23
24#include "defs.h"
e17c207e 25#include "arch-utils.h"
c906108c
SS
26#include <ctype.h>
27#include <signal.h>
28#include "command.h"
29#include "gdbcmd.h"
30#include "symtab.h"
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"
c14c28ba 39#include "gdb_assert.h"
c906108c 40
18a642a1
AC
41#include "cli/cli-decode.h"
42
a14ed312 43extern void _initialize_maint_cmds (void);
392a587b 44
a14ed312 45static void maintenance_command (char *, int);
c906108c 46
a14ed312 47static void maintenance_internal_error (char *args, int from_tty);
7be570e7 48
a14ed312 49static void maintenance_demangle (char *, int);
c906108c 50
a14ed312 51static void maintenance_time_display (char *, int);
c906108c 52
a14ed312 53static void maintenance_space_display (char *, int);
c906108c 54
a14ed312 55static void maintenance_info_command (char *, int);
c906108c 56
a14ed312 57static void maintenance_info_sections (char *, int);
c906108c 58
a14ed312 59static void maintenance_print_command (char *, int);
c906108c 60
1c689132
DB
61static void maintenance_do_deprecate (char *, int);
62
c906108c
SS
63/* Set this to the maximum number of seconds to wait instead of waiting forever
64 in target_wait(). If this timer times out, then it generates an error and
65 the command is aborted. This replaces most of the need for timeouts in the
66 GDB test suite, and makes it possible to distinguish between a hung target
67 and one with slow communications. */
68
69int watchdog = 0;
920d2a44
AC
70static void
71show_watchdog (struct ui_file *file, int from_tty,
72 struct cmd_list_element *c, const char *value)
73{
74 fprintf_filtered (file, _("Watchdog timer is %s.\n"), value);
75}
c906108c
SS
76
77/*
78
c5aa993b 79 LOCAL FUNCTION
c906108c 80
c5aa993b 81 maintenance_command -- access the maintenance subcommands
c906108c 82
c5aa993b 83 SYNOPSIS
c906108c 84
c5aa993b 85 void maintenance_command (char *args, int from_tty)
c906108c 86
c5aa993b 87 DESCRIPTION
c906108c 88
c5aa993b 89 */
c906108c
SS
90
91static void
fba45db2 92maintenance_command (char *args, int from_tty)
c906108c 93{
a3f17187 94 printf_unfiltered (_("\"maintenance\" must be followed by the name of a maintenance command.\n"));
c906108c
SS
95 help_list (maintenancelist, "maintenance ", -1, gdb_stdout);
96}
97
98#ifndef _WIN32
c906108c 99static void
fba45db2 100maintenance_dump_me (char *args, int from_tty)
c906108c 101{
9e2f0ad4 102 if (query (_("Should GDB dump core? ")))
c906108c 103 {
7be570e7
JM
104#ifdef __DJGPP__
105 /* SIGQUIT by default is ignored, so use SIGABRT instead. */
106 signal (SIGABRT, SIG_DFL);
107 kill (getpid (), SIGABRT);
108#else
c906108c
SS
109 signal (SIGQUIT, SIG_DFL);
110 kill (getpid (), SIGQUIT);
7be570e7 111#endif
c906108c
SS
112 }
113}
114#endif
115
7be570e7
JM
116/* Stimulate the internal error mechanism that GDB uses when an
117 internal problem is detected. Allows testing of the mechanism.
118 Also useful when the user wants to drop a core file but not exit
119 GDB. */
120
121static void
122maintenance_internal_error (char *args, int from_tty)
123{
dec43320
AC
124 internal_error (__FILE__, __LINE__, "%s", (args == NULL ? "" : args));
125}
126
127/* Stimulate the internal error mechanism that GDB uses when an
128 internal problem is detected. Allows testing of the mechanism.
129 Also useful when the user wants to drop a core file but not exit
130 GDB. */
131
132static void
133maintenance_internal_warning (char *args, int from_tty)
134{
135 internal_warning (__FILE__, __LINE__, "%s", (args == NULL ? "" : args));
7be570e7
JM
136}
137
33f91161
AC
138/* Someday we should allow demangling for things other than just
139 explicit strings. For example, we might want to be able to specify
140 the address of a string in either GDB's process space or the
141 debuggee's process space, and have gdb fetch and demangle that
142 string. If we have a char* pointer "ptr" that points to a string,
143 we might want to be able to given just the name and have GDB
144 demangle and print what it points to, etc. (FIXME) */
c906108c
SS
145
146static void
fba45db2 147maintenance_demangle (char *args, int from_tty)
c906108c
SS
148{
149 char *demangled;
150
151 if (args == NULL || *args == '\0')
152 {
a3f17187 153 printf_unfiltered (_("\"maintenance demangle\" takes an argument to demangle.\n"));
c906108c
SS
154 }
155 else
156 {
9a3d7dfd
AF
157 demangled = language_demangle (current_language, args,
158 DMGL_ANSI | DMGL_PARAMS);
c906108c
SS
159 if (demangled != NULL)
160 {
161 printf_unfiltered ("%s\n", demangled);
b8c9b27d 162 xfree (demangled);
c906108c
SS
163 }
164 else
165 {
a3f17187 166 printf_unfiltered (_("Can't demangle \"%s\"\n"), args);
c906108c
SS
167 }
168 }
169}
170
171static void
fba45db2 172maintenance_time_display (char *args, int from_tty)
c906108c
SS
173{
174 extern int display_time;
175
176 if (args == NULL || *args == '\0')
a3f17187 177 printf_unfiltered (_("\"maintenance time\" takes a numeric argument.\n"));
c906108c
SS
178 else
179 display_time = strtol (args, NULL, 10);
180}
181
182static void
fba45db2 183maintenance_space_display (char *args, int from_tty)
c906108c
SS
184{
185 extern int display_space;
186
187 if (args == NULL || *args == '\0')
188 printf_unfiltered ("\"maintenance space\" takes a numeric argument.\n");
189 else
190 display_space = strtol (args, NULL, 10);
191}
192
33f91161
AC
193/* The "maintenance info" command is defined as a prefix, with
194 allow_unknown 0. Therefore, its own definition is called only for
195 "maintenance info" with no args. */
c906108c 196
c906108c 197static void
fba45db2 198maintenance_info_command (char *arg, int from_tty)
c906108c 199{
a3f17187 200 printf_unfiltered (_("\"maintenance info\" must be followed by the name of an info command.\n"));
c906108c
SS
201 help_list (maintenanceinfolist, "maintenance info ", -1, gdb_stdout);
202}
203
a532ca62
MS
204/* Mini tokenizing lexer for 'maint info sections' command. */
205
206static int
473e38f3 207match_substring (const char *string, const char *substr)
a532ca62
MS
208{
209 int substr_len = strlen(substr);
473e38f3 210 const char *tok;
a532ca62
MS
211
212 while ((tok = strstr (string, substr)) != NULL)
213 {
214 /* Got a partial match. Is it a whole word? */
b01d807c
MS
215 if (tok == string
216 || tok[-1] == ' '
217 || tok[-1] == '\t')
a532ca62
MS
218 {
219 /* Token is delimited at the front... */
b01d807c
MS
220 if (tok[substr_len] == ' '
221 || tok[substr_len] == '\t'
222 || tok[substr_len] == '\0')
a532ca62
MS
223 {
224 /* Token is delimited at the rear. Got a whole-word match. */
225 return 1;
226 }
227 }
228 /* Token didn't match as a whole word. Advance and try again. */
229 string = tok + 1;
230 }
231 return 0;
232}
233
43155bc1
MS
234static int
235match_bfd_flags (char *string, flagword flags)
c906108c 236{
43155bc1 237 if (flags & SEC_ALLOC)
a532ca62 238 if (match_substring (string, "ALLOC"))
43155bc1
MS
239 return 1;
240 if (flags & SEC_LOAD)
a532ca62 241 if (match_substring (string, "LOAD"))
43155bc1
MS
242 return 1;
243 if (flags & SEC_RELOC)
a532ca62 244 if (match_substring (string, "RELOC"))
43155bc1
MS
245 return 1;
246 if (flags & SEC_READONLY)
a532ca62 247 if (match_substring (string, "READONLY"))
43155bc1
MS
248 return 1;
249 if (flags & SEC_CODE)
a532ca62 250 if (match_substring (string, "CODE"))
43155bc1
MS
251 return 1;
252 if (flags & SEC_DATA)
a532ca62 253 if (match_substring (string, "DATA"))
43155bc1
MS
254 return 1;
255 if (flags & SEC_ROM)
a532ca62 256 if (match_substring (string, "ROM"))
43155bc1
MS
257 return 1;
258 if (flags & SEC_CONSTRUCTOR)
a532ca62 259 if (match_substring (string, "CONSTRUCTOR"))
43155bc1
MS
260 return 1;
261 if (flags & SEC_HAS_CONTENTS)
a532ca62 262 if (match_substring (string, "HAS_CONTENTS"))
43155bc1
MS
263 return 1;
264 if (flags & SEC_NEVER_LOAD)
a532ca62 265 if (match_substring (string, "NEVER_LOAD"))
43155bc1
MS
266 return 1;
267 if (flags & SEC_COFF_SHARED_LIBRARY)
a532ca62 268 if (match_substring (string, "COFF_SHARED_LIBRARY"))
43155bc1
MS
269 return 1;
270 if (flags & SEC_IS_COMMON)
a532ca62 271 if (match_substring (string, "IS_COMMON"))
43155bc1 272 return 1;
c906108c 273
43155bc1
MS
274 return 0;
275}
c906108c 276
43155bc1
MS
277static void
278print_bfd_flags (flagword flags)
279{
c906108c
SS
280 if (flags & SEC_ALLOC)
281 printf_filtered (" ALLOC");
282 if (flags & SEC_LOAD)
283 printf_filtered (" LOAD");
284 if (flags & SEC_RELOC)
285 printf_filtered (" RELOC");
286 if (flags & SEC_READONLY)
287 printf_filtered (" READONLY");
288 if (flags & SEC_CODE)
289 printf_filtered (" CODE");
290 if (flags & SEC_DATA)
291 printf_filtered (" DATA");
292 if (flags & SEC_ROM)
293 printf_filtered (" ROM");
294 if (flags & SEC_CONSTRUCTOR)
295 printf_filtered (" CONSTRUCTOR");
296 if (flags & SEC_HAS_CONTENTS)
297 printf_filtered (" HAS_CONTENTS");
298 if (flags & SEC_NEVER_LOAD)
299 printf_filtered (" NEVER_LOAD");
300 if (flags & SEC_COFF_SHARED_LIBRARY)
301 printf_filtered (" COFF_SHARED_LIBRARY");
302 if (flags & SEC_IS_COMMON)
303 printf_filtered (" IS_COMMON");
43155bc1
MS
304}
305
306static void
67a2b77e
AC
307maint_print_section_info (const char *name, flagword flags,
308 CORE_ADDR addr, CORE_ADDR endaddr,
309 unsigned long filepos)
43155bc1 310{
50ee7535 311 /* FIXME-32x64: Need paddress with field width. */
e3d3bfda
MS
312 printf_filtered (" 0x%s", paddr (addr));
313 printf_filtered ("->0x%s", paddr (endaddr));
3ab13650 314 printf_filtered (" at %s",
bb599908 315 hex_string_custom ((unsigned long) filepos, 8));
e3d3bfda
MS
316 printf_filtered (": %s", name);
317 print_bfd_flags (flags);
318 printf_filtered ("\n");
319}
c906108c 320
e3d3bfda
MS
321static void
322print_bfd_section_info (bfd *abfd,
323 asection *asect,
324 void *arg)
325{
326 flagword flags = bfd_get_section_flags (abfd, asect);
327 const char *name = bfd_section_name (abfd, asect);
328
b01d807c
MS
329 if (arg == NULL || *((char *) arg) == '\0'
330 || match_substring ((char *) arg, name)
331 || match_bfd_flags ((char *) arg, flags))
e3d3bfda
MS
332 {
333 CORE_ADDR addr, endaddr;
334
335 addr = bfd_section_vma (abfd, asect);
336 endaddr = addr + bfd_section_size (abfd, asect);
67a2b77e 337 maint_print_section_info (name, flags, addr, endaddr, asect->filepos);
e3d3bfda
MS
338 }
339}
340
341static void
342print_objfile_section_info (bfd *abfd,
343 struct obj_section *asect,
344 char *string)
345{
346 flagword flags = bfd_get_section_flags (abfd, asect->the_bfd_section);
347 const char *name = bfd_section_name (abfd, asect->the_bfd_section);
43155bc1 348
b01d807c
MS
349 if (string == NULL || *string == '\0'
350 || match_substring (string, name)
351 || match_bfd_flags (string, flags))
43155bc1 352 {
f1f6aadf
PA
353 maint_print_section_info (name, flags,
354 obj_section_addr (asect),
355 obj_section_endaddr (asect),
356 asect->the_bfd_section->filepos);
43155bc1 357 }
c906108c
SS
358}
359
c906108c 360static void
fba45db2 361maintenance_info_sections (char *arg, int from_tty)
c906108c
SS
362{
363 if (exec_bfd)
364 {
a3f17187 365 printf_filtered (_("Exec file:\n"));
c5aa993b 366 printf_filtered (" `%s', ", bfd_get_filename (exec_bfd));
c906108c 367 wrap_here (" ");
a3f17187 368 printf_filtered (_("file type %s.\n"), bfd_get_target (exec_bfd));
a532ca62 369 if (arg && *arg && match_substring (arg, "ALLOBJ"))
e3d3bfda
MS
370 {
371 struct objfile *ofile;
372 struct obj_section *osect;
373
374 /* Only this function cares about the 'ALLOBJ' argument;
375 if 'ALLOBJ' is the only argument, discard it rather than
376 passing it down to print_objfile_section_info (which
377 wouldn't know how to handle it). */
378 if (strcmp (arg, "ALLOBJ") == 0)
379 arg = NULL;
380
381 ALL_OBJFILES (ofile)
382 {
a3f17187 383 printf_filtered (_(" Object file: %s\n"),
e3d3bfda
MS
384 bfd_get_filename (ofile->obfd));
385 ALL_OBJFILE_OSECTIONS (ofile, osect)
386 {
387 print_objfile_section_info (ofile->obfd, osect, arg);
388 }
389 }
390 }
391 else
392 bfd_map_over_sections (exec_bfd, print_bfd_section_info, arg);
c906108c
SS
393 }
394
395 if (core_bfd)
396 {
a3f17187 397 printf_filtered (_("Core file:\n"));
c5aa993b 398 printf_filtered (" `%s', ", bfd_get_filename (core_bfd));
c906108c 399 wrap_here (" ");
a3f17187 400 printf_filtered (_("file type %s.\n"), bfd_get_target (core_bfd));
e3d3bfda 401 bfd_map_over_sections (core_bfd, print_bfd_section_info, arg);
c906108c
SS
402 }
403}
404
c906108c 405void
fba45db2 406maintenance_print_statistics (char *args, int from_tty)
c906108c
SS
407{
408 print_objfile_statistics ();
409 print_symbol_bcache_statistics ();
410}
411
b9362cc7 412static void
4b9b3959
AC
413maintenance_print_architecture (char *args, int from_tty)
414{
e17c207e
UW
415 struct gdbarch *gdbarch = get_current_arch ();
416
4b9b3959 417 if (args == NULL)
e17c207e 418 gdbarch_dump (gdbarch, gdb_stdout);
4b9b3959
AC
419 else
420 {
724b958c 421 struct cleanup *cleanups;
4b9b3959
AC
422 struct ui_file *file = gdb_fopen (args, "w");
423 if (file == NULL)
e2e0b3e5 424 perror_with_name (_("maintenance print architecture"));
724b958c 425 cleanups = make_cleanup_ui_file_delete (file);
e17c207e 426 gdbarch_dump (gdbarch, file);
724b958c 427 do_cleanups (cleanups);
4b9b3959
AC
428 }
429}
430
33f91161
AC
431/* The "maintenance print" command is defined as a prefix, with
432 allow_unknown 0. Therefore, its own definition is called only for
433 "maintenance print" with no args. */
c906108c 434
c906108c 435static void
fba45db2 436maintenance_print_command (char *arg, int from_tty)
c906108c 437{
a3f17187 438 printf_unfiltered (_("\"maintenance print\" must be followed by the name of a print command.\n"));
c906108c
SS
439 help_list (maintenanceprintlist, "maintenance print ", -1, gdb_stdout);
440}
441
442/* The "maintenance translate-address" command converts a section and address
443 to a symbol. This can be called in two ways:
c5aa993b
JM
444 maintenance translate-address <secname> <addr>
445 or maintenance translate-address <addr>
446 */
c906108c
SS
447
448static void
fba45db2 449maintenance_translate_address (char *arg, int from_tty)
c906108c
SS
450{
451 CORE_ADDR address;
714835d5 452 struct obj_section *sect;
c906108c
SS
453 char *p;
454 struct minimal_symbol *sym;
455 struct objfile *objfile;
456
457 if (arg == NULL || *arg == 0)
8a3fe4f8 458 error (_("requires argument (address or section + address)"));
c906108c
SS
459
460 sect = NULL;
461 p = arg;
462
463 if (!isdigit (*p))
464 { /* See if we have a valid section name */
c5aa993b 465 while (*p && !isspace (*p)) /* Find end of section name */
c906108c
SS
466 p++;
467 if (*p == '\000') /* End of command? */
8a3fe4f8 468 error (_("Need to specify <section-name> and <address>"));
c906108c 469 *p++ = '\000';
c5aa993b
JM
470 while (isspace (*p))
471 p++; /* Skip whitespace */
c906108c 472
714835d5 473 ALL_OBJSECTIONS (objfile, sect)
c5aa993b 474 {
714835d5 475 if (strcmp (sect->the_bfd_section->name, arg) == 0)
c5aa993b
JM
476 break;
477 }
c906108c 478
15c99a44 479 if (!objfile)
8a3fe4f8 480 error (_("Unknown section %s."), arg);
c906108c
SS
481 }
482
483 address = parse_and_eval_address (p);
484
485 if (sect)
486 sym = lookup_minimal_symbol_by_pc_section (address, sect);
487 else
488 sym = lookup_minimal_symbol_by_pc (address);
489
490 if (sym)
c14c28ba
PP
491 {
492 const char *symbol_name = SYMBOL_PRINT_NAME (sym);
493 const char *symbol_offset = pulongest (address - SYMBOL_VALUE_ADDRESS (sym));
494
495 sect = SYMBOL_OBJ_SECTION(sym);
496 if (sect != NULL)
497 {
498 const char *section_name;
499 const char *obj_name;
500
501 gdb_assert (sect->the_bfd_section && sect->the_bfd_section->name);
502 section_name = sect->the_bfd_section->name;
503
504 gdb_assert (sect->objfile && sect->objfile->name);
505 obj_name = sect->objfile->name;
506
507 if (MULTI_OBJFILE_P ())
508 printf_filtered (_("%s + %s in section %s of %s\n"),
509 symbol_name, symbol_offset, section_name, obj_name);
510 else
511 printf_filtered (_("%s + %s in section %s\n"),
512 symbol_name, symbol_offset, section_name);
513 }
514 else
515 printf_filtered (_("%s + %s\n"), symbol_name, symbol_offset);
516 }
c906108c 517 else if (sect)
714835d5
UW
518 printf_filtered (_("no symbol at %s:0x%s\n"),
519 sect->the_bfd_section->name, paddr (address));
c906108c 520 else
a3f17187 521 printf_filtered (_("no symbol at 0x%s\n"), paddr (address));
c906108c
SS
522
523 return;
524}
525
56382845 526
c114dcd5 527/* When a command is deprecated the user will be warned the first time
33f91161
AC
528 the command is used. If possible, a replacement will be
529 offered. */
56382845
FN
530
531static void
532maintenance_deprecate (char *args, int from_tty)
533{
534 if (args == NULL || *args == '\0')
535 {
a3f17187 536 printf_unfiltered (_("\"maintenance deprecate\" takes an argument, \n\
56382845 537the command you want to deprecate, and optionally the replacement command \n\
a3f17187 538enclosed in quotes.\n"));
56382845 539 }
33f91161 540
56382845
FN
541 maintenance_do_deprecate (args, 1);
542
543}
544
545
546static void
547maintenance_undeprecate (char *args, int from_tty)
548{
549 if (args == NULL || *args == '\0')
550 {
a3f17187
AC
551 printf_unfiltered (_("\"maintenance undeprecate\" takes an argument, \n\
552the command you want to undeprecate.\n"));
56382845 553 }
33f91161 554
56382845 555 maintenance_do_deprecate (args, 0);
33f91161 556
56382845
FN
557}
558
33f91161
AC
559/* You really shouldn't be using this. It is just for the testsuite.
560 Rather, you should use deprecate_cmd() when the command is created
561 in _initialize_blah().
562
563 This function deprecates a command and optionally assigns it a
564 replacement. */
565
8399535b 566static void
33f91161
AC
567maintenance_do_deprecate (char *text, int deprecate)
568{
569
570 struct cmd_list_element *alias = NULL;
571 struct cmd_list_element *prefix_cmd = NULL;
572 struct cmd_list_element *cmd = NULL;
573
574 char *start_ptr = NULL;
575 char *end_ptr = NULL;
56382845 576 int len;
33f91161
AC
577 char *replacement = NULL;
578
1c689132
DB
579 if (text == NULL)
580 return;
56382845 581
33f91161
AC
582 if (!lookup_cmd_composition (text, &alias, &prefix_cmd, &cmd))
583 {
a3f17187 584 printf_filtered (_("Can't find command '%s' to deprecate.\n"), text);
33f91161
AC
585 return;
586 }
56382845 587
56382845
FN
588 if (deprecate)
589 {
590 /* look for a replacement command */
80ce1ecb
AC
591 start_ptr = strchr (text, '\"');
592 if (start_ptr != NULL)
33f91161
AC
593 {
594 start_ptr++;
80ce1ecb
AC
595 end_ptr = strrchr (start_ptr, '\"');
596 if (end_ptr != NULL)
33f91161
AC
597 {
598 len = end_ptr - start_ptr;
599 start_ptr[len] = '\0';
600 replacement = xstrdup (start_ptr);
601 }
602 }
56382845 603 }
33f91161 604
56382845
FN
605 if (!start_ptr || !end_ptr)
606 replacement = NULL;
33f91161
AC
607
608
56382845 609 /* If they used an alias, we only want to deprecate the alias.
33f91161 610
56382845
FN
611 Note the MALLOCED_REPLACEMENT test. If the command's replacement
612 string was allocated at compile time we don't want to free the
33f91161 613 memory. */
56382845
FN
614 if (alias)
615 {
33f91161 616
56382845 617 if (alias->flags & MALLOCED_REPLACEMENT)
b8c9b27d 618 xfree (alias->replacement);
33f91161 619
56382845 620 if (deprecate)
33f91161 621 alias->flags |= (DEPRECATED_WARN_USER | CMD_DEPRECATED);
56382845 622 else
33f91161
AC
623 alias->flags &= ~(DEPRECATED_WARN_USER | CMD_DEPRECATED);
624 alias->replacement = replacement;
56382845
FN
625 alias->flags |= MALLOCED_REPLACEMENT;
626 return;
627 }
628 else if (cmd)
629 {
630 if (cmd->flags & MALLOCED_REPLACEMENT)
b8c9b27d 631 xfree (cmd->replacement);
56382845
FN
632
633 if (deprecate)
33f91161 634 cmd->flags |= (DEPRECATED_WARN_USER | CMD_DEPRECATED);
56382845 635 else
33f91161
AC
636 cmd->flags &= ~(DEPRECATED_WARN_USER | CMD_DEPRECATED);
637 cmd->replacement = replacement;
56382845
FN
638 cmd->flags |= MALLOCED_REPLACEMENT;
639 return;
640 }
641}
642
4f337972
AC
643/* Maintenance set/show framework. */
644
ae038cb0
DJ
645struct cmd_list_element *maintenance_set_cmdlist;
646struct cmd_list_element *maintenance_show_cmdlist;
4f337972
AC
647
648static void
649maintenance_set_cmd (char *args, int from_tty)
650{
a3f17187 651 printf_unfiltered (_("\"maintenance set\" must be followed by the name of a set command.\n"));
4f337972
AC
652 help_list (maintenance_set_cmdlist, "maintenance set ", -1, gdb_stdout);
653}
654
655static void
656maintenance_show_cmd (char *args, int from_tty)
657{
658 cmd_show_list (maintenance_show_cmdlist, from_tty, "");
659}
660
4f337972
AC
661/* Profiling support. */
662
663static int maintenance_profile_p;
920d2a44
AC
664static void
665show_maintenance_profile_p (struct ui_file *file, int from_tty,
666 struct cmd_list_element *c, const char *value)
667{
668 fprintf_filtered (file, _("Internal profiling is %s.\n"), value);
669}
d9feb4e7 670
b0b1c2c0
MK
671#ifdef HAVE__ETEXT
672extern char _etext;
673#define TEXTEND &_etext
01fe12f6 674#elif defined (HAVE_ETEXT)
b0b1c2c0
MK
675extern char etext;
676#define TEXTEND &etext
677#endif
678
01fe12f6
JB
679#if defined (HAVE_MONSTARTUP) && defined (HAVE__MCLEANUP) && defined (TEXTEND)
680
d28f9cdf
DJ
681static int profiling_state;
682
683static void
684mcleanup_wrapper (void)
685{
686 extern void _mcleanup (void);
687
688 if (profiling_state)
689 _mcleanup ();
690}
4f337972
AC
691
692static void
693maintenance_set_profile_cmd (char *args, int from_tty, struct cmd_list_element *c)
694{
d28f9cdf
DJ
695 if (maintenance_profile_p == profiling_state)
696 return;
697
698 profiling_state = maintenance_profile_p;
699
700 if (maintenance_profile_p)
701 {
702 static int profiling_initialized;
703
704 extern void monstartup (unsigned long, unsigned long);
d28f9cdf
DJ
705 extern int main();
706
707 if (!profiling_initialized)
708 {
709 atexit (mcleanup_wrapper);
710 profiling_initialized = 1;
711 }
712
713 /* "main" is now always the first function in the text segment, so use
714 its address for monstartup. */
b0b1c2c0 715 monstartup ((unsigned long) &main, (unsigned long) TEXTEND);
d28f9cdf
DJ
716 }
717 else
718 {
719 extern void _mcleanup (void);
720 _mcleanup ();
721 }
4f337972 722}
d9feb4e7
DJ
723#else
724static void
725maintenance_set_profile_cmd (char *args, int from_tty, struct cmd_list_element *c)
726{
8a3fe4f8 727 error (_("Profiling support is not available on this system."));
d9feb4e7
DJ
728}
729#endif
56382845 730
c906108c 731void
fba45db2 732_initialize_maint_cmds (void)
c906108c 733{
4f337972
AC
734 struct cmd_list_element *tmpcmd;
735
1bedd215
AC
736 add_prefix_cmd ("maintenance", class_maintenance, maintenance_command, _("\
737Commands for use by GDB maintainers.\n\
c906108c
SS
738Includes commands to dump specific internal GDB structures in\n\
739a human readable form, to cause GDB to deliberately dump core,\n\
1bedd215 740to test internal functions such as the C++/ObjC demangler, etc."),
c906108c
SS
741 &maintenancelist, "maintenance ", 0,
742 &cmdlist);
743
744 add_com_alias ("mt", "maintenance", class_maintenance, 1);
745
1bedd215
AC
746 add_prefix_cmd ("info", class_maintenance, maintenance_info_command, _("\
747Commands for showing internal info about the program being debugged."),
c906108c
SS
748 &maintenanceinfolist, "maintenance info ", 0,
749 &maintenancelist);
90515c23 750 add_alias_cmd ("i", "info", class_maintenance, 1, &maintenancelist);
c906108c 751
1a966eab
AC
752 add_cmd ("sections", class_maintenance, maintenance_info_sections, _("\
753List the BFD sections of the exec and core files. \n\
e3d3bfda
MS
754Arguments may be any combination of:\n\
755 [one or more section names]\n\
756 ALLOC LOAD RELOC READONLY CODE DATA ROM CONSTRUCTOR\n\
757 HAS_CONTENTS NEVER_LOAD COFF_SHARED_LIBRARY IS_COMMON\n\
758Sections matching any argument will be listed (no argument\n\
759implies all sections). In addition, the special argument\n\
760 ALLOBJ\n\
1a966eab 761lists all sections from all object files, including shared libraries."),
c906108c
SS
762 &maintenanceinfolist);
763
764 add_prefix_cmd ("print", class_maintenance, maintenance_print_command,
1bedd215 765 _("Maintenance command for printing GDB internal state."),
c906108c
SS
766 &maintenanceprintlist, "maintenance print ", 0,
767 &maintenancelist);
768
1bedd215 769 add_prefix_cmd ("set", class_maintenance, maintenance_set_cmd, _("\
4f337972 770Set GDB internal variables used by the GDB maintainer.\n\
1bedd215 771Configure variables internal to GDB that aid in GDB's maintenance"),
4f337972
AC
772 &maintenance_set_cmdlist, "maintenance set ",
773 0/*allow-unknown*/,
774 &maintenancelist);
775
1bedd215 776 add_prefix_cmd ("show", class_maintenance, maintenance_show_cmd, _("\
4f337972 777Show GDB internal variables used by the GDB maintainer.\n\
1bedd215 778Configure variables internal to GDB that aid in GDB's maintenance"),
4f337972
AC
779 &maintenance_show_cmdlist, "maintenance show ",
780 0/*allow-unknown*/,
781 &maintenancelist);
782
c906108c 783#ifndef _WIN32
1a966eab
AC
784 add_cmd ("dump-me", class_maintenance, maintenance_dump_me, _("\
785Get fatal error; make debugger dump its core.\n\
8308e54c 786GDB sets its handling of SIGQUIT back to SIG_DFL and then sends\n\
1a966eab 787itself a SIGQUIT signal."),
c906108c
SS
788 &maintenancelist);
789#endif
790
1a966eab
AC
791 add_cmd ("internal-error", class_maintenance,
792 maintenance_internal_error, _("\
793Give GDB an internal error.\n\
794Cause GDB to behave as if an internal error was detected."),
7be570e7
JM
795 &maintenancelist);
796
1a966eab
AC
797 add_cmd ("internal-warning", class_maintenance,
798 maintenance_internal_warning, _("\
799Give GDB an internal warning.\n\
800Cause GDB to behave as if an internal warning was reported."),
dec43320
AC
801 &maintenancelist);
802
1a966eab
AC
803 add_cmd ("demangle", class_maintenance, maintenance_demangle, _("\
804Demangle a C++/ObjC mangled name.\n\
c906108c 805Call internal GDB demangler routine to demangle a C++ link name\n\
1a966eab 806and prints the result."),
c906108c
SS
807 &maintenancelist);
808
1a966eab
AC
809 add_cmd ("time", class_maintenance, maintenance_time_display, _("\
810Set the display of time usage.\n\
c906108c 811If nonzero, will cause the execution time for each command to be\n\
1a966eab 812displayed, following the command's output."),
c906108c
SS
813 &maintenancelist);
814
1a966eab
AC
815 add_cmd ("space", class_maintenance, maintenance_space_display, _("\
816Set the display of space usage.\n\
c906108c 817If nonzero, will cause the execution space for each command to be\n\
1a966eab 818displayed, following the command's output."),
c906108c
SS
819 &maintenancelist);
820
1a966eab
AC
821 add_cmd ("type", class_maintenance, maintenance_print_type, _("\
822Print a type chain for a given symbol.\n\
c906108c 823For each node in a type chain, print the raw data for each member of\n\
1a966eab 824the type structure, and the interpretation of the data."),
c906108c
SS
825 &maintenanceprintlist);
826
1a966eab
AC
827 add_cmd ("symbols", class_maintenance, maintenance_print_symbols, _("\
828Print dump of current symbol definitions.\n\
c906108c 829Entries in the full symbol table are dumped to file OUTFILE.\n\
1a966eab 830If a SOURCE file is specified, dump only that file's symbols."),
c906108c
SS
831 &maintenanceprintlist);
832
1a966eab
AC
833 add_cmd ("msymbols", class_maintenance, maintenance_print_msymbols, _("\
834Print dump of current minimal symbol definitions.\n\
c906108c 835Entries in the minimal symbol table are dumped to file OUTFILE.\n\
1a966eab 836If a SOURCE file is specified, dump only that file's minimal symbols."),
c906108c
SS
837 &maintenanceprintlist);
838
1a966eab
AC
839 add_cmd ("psymbols", class_maintenance, maintenance_print_psymbols, _("\
840Print dump of current partial symbol definitions.\n\
c906108c 841Entries in the partial symbol table are dumped to file OUTFILE.\n\
1a966eab 842If a SOURCE file is specified, dump only that file's partial symbols."),
c906108c
SS
843 &maintenanceprintlist);
844
845 add_cmd ("objfiles", class_maintenance, maintenance_print_objfiles,
1a966eab 846 _("Print dump of current object file definitions."),
c906108c
SS
847 &maintenanceprintlist);
848
1a966eab
AC
849 add_cmd ("symtabs", class_maintenance, maintenance_info_symtabs, _("\
850List the full symbol tables for all object files.\n\
44ea7b70
JB
851This does not include information about individual symbols, blocks, or\n\
852linetables --- just the symbol table structures themselves.\n\
1a966eab 853With an argument REGEXP, list the symbol tables whose names that match that."),
5e7b2f39 854 &maintenanceinfolist);
44ea7b70 855
1a966eab
AC
856 add_cmd ("psymtabs", class_maintenance, maintenance_info_psymtabs, _("\
857List the partial symbol tables for all object files.\n\
44ea7b70 858This does not include information about individual partial symbols,\n\
1a966eab 859just the symbol table structures themselves."),
5e7b2f39 860 &maintenanceinfolist);
44ea7b70 861
c906108c 862 add_cmd ("statistics", class_maintenance, maintenance_print_statistics,
1a966eab 863 _("Print statistics about internal gdb state."),
c906108c
SS
864 &maintenanceprintlist);
865
1a966eab
AC
866 add_cmd ("architecture", class_maintenance,
867 maintenance_print_architecture, _("\
868Print the internal architecture configuration.\n\
869Takes an optional file parameter."),
4b9b3959
AC
870 &maintenanceprintlist);
871
c906108c 872 add_cmd ("check-symtabs", class_maintenance, maintenance_check_symtabs,
1a966eab 873 _("Check consistency of psymtabs and symtabs."),
c906108c
SS
874 &maintenancelist);
875
876 add_cmd ("translate-address", class_maintenance, maintenance_translate_address,
1a966eab 877 _("Translate a section name and address to a symbol."),
c906108c
SS
878 &maintenancelist);
879
1a966eab
AC
880 add_cmd ("deprecate", class_maintenance, maintenance_deprecate, _("\
881Deprecate a command. Note that this is just in here so the \n\
ef4cb050 882testsuite can check the command deprecator. You probably shouldn't use this,\n\
56382845 883rather you should use the C function deprecate_cmd(). If you decide you \n\
6f122dc9 884want to use it: maintenance deprecate 'commandname' \"replacement\". The \n\
1a966eab 885replacement is optional."), &maintenancelist);
56382845 886
1a966eab
AC
887 add_cmd ("undeprecate", class_maintenance, maintenance_undeprecate, _("\
888Undeprecate a command. Note that this is just in here so the \n\
ef4cb050 889testsuite can check the command deprecator. You probably shouldn't use this,\n\
1a966eab 890If you decide you want to use it: maintenance undeprecate 'commandname'"),
33f91161 891 &maintenancelist);
56382845 892
85c07804
AC
893 add_setshow_zinteger_cmd ("watchdog", class_maintenance, &watchdog, _("\
894Set watchdog timer."), _("\
895Show watchdog timer."), _("\
cb1a6d5f
AC
896When non-zero, this timeout is used instead of waiting forever for a target\n\
897to finish a low-level step or continue operation. If the specified amount\n\
85c07804
AC
898of time passes without a response from the target, an error occurs."),
899 NULL,
920d2a44 900 show_watchdog,
85c07804 901 &setlist, &showlist);
4f337972 902
d28f9cdf 903 add_setshow_boolean_cmd ("profile", class_maintenance,
7915a72c
AC
904 &maintenance_profile_p, _("\
905Set internal profiling."), _("\
906Show internal profiling."), _("\
907When enabled GDB is profiled."),
2c5b56ce 908 maintenance_set_profile_cmd,
920d2a44 909 show_maintenance_profile_p,
d28f9cdf
DJ
910 &maintenance_set_cmdlist,
911 &maintenance_show_cmdlist);
c906108c 912}