daily update
[deliverable/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,
4c38e0a4 4 2003, 2004, 2007, 2008, 2009, 2010 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,
5af949e3 309 unsigned long filepos, int addr_size)
43155bc1 310{
5af949e3
UW
311 printf_filtered (" %s", hex_string_custom (addr, addr_size));
312 printf_filtered ("->%s", hex_string_custom (endaddr, addr_size));
3ab13650 313 printf_filtered (" at %s",
bb599908 314 hex_string_custom ((unsigned long) filepos, 8));
e3d3bfda
MS
315 printf_filtered (": %s", name);
316 print_bfd_flags (flags);
317 printf_filtered ("\n");
318}
c906108c 319
e3d3bfda
MS
320static void
321print_bfd_section_info (bfd *abfd,
322 asection *asect,
323 void *arg)
324{
325 flagword flags = bfd_get_section_flags (abfd, asect);
326 const char *name = bfd_section_name (abfd, asect);
327
b01d807c
MS
328 if (arg == NULL || *((char *) arg) == '\0'
329 || match_substring ((char *) arg, name)
330 || match_bfd_flags ((char *) arg, flags))
e3d3bfda 331 {
5af949e3
UW
332 struct gdbarch *gdbarch = gdbarch_from_bfd (abfd);
333 int addr_size = gdbarch_addr_bit (gdbarch) / 8;
e3d3bfda
MS
334 CORE_ADDR addr, endaddr;
335
336 addr = bfd_section_vma (abfd, asect);
337 endaddr = addr + bfd_section_size (abfd, asect);
5af949e3
UW
338 maint_print_section_info (name, flags, addr, endaddr,
339 asect->filepos, addr_size);
e3d3bfda
MS
340 }
341}
342
343static void
344print_objfile_section_info (bfd *abfd,
345 struct obj_section *asect,
346 char *string)
347{
348 flagword flags = bfd_get_section_flags (abfd, asect->the_bfd_section);
349 const char *name = bfd_section_name (abfd, asect->the_bfd_section);
43155bc1 350
b01d807c
MS
351 if (string == NULL || *string == '\0'
352 || match_substring (string, name)
353 || match_bfd_flags (string, flags))
43155bc1 354 {
5af949e3
UW
355 struct gdbarch *gdbarch = gdbarch_from_bfd (abfd);
356 int addr_size = gdbarch_addr_bit (gdbarch) / 8;
b8d56208 357
f1f6aadf
PA
358 maint_print_section_info (name, flags,
359 obj_section_addr (asect),
360 obj_section_endaddr (asect),
5af949e3
UW
361 asect->the_bfd_section->filepos,
362 addr_size);
43155bc1 363 }
c906108c
SS
364}
365
c906108c 366static void
fba45db2 367maintenance_info_sections (char *arg, int from_tty)
c906108c
SS
368{
369 if (exec_bfd)
370 {
a3f17187 371 printf_filtered (_("Exec file:\n"));
c5aa993b 372 printf_filtered (" `%s', ", bfd_get_filename (exec_bfd));
c906108c 373 wrap_here (" ");
a3f17187 374 printf_filtered (_("file type %s.\n"), bfd_get_target (exec_bfd));
a532ca62 375 if (arg && *arg && match_substring (arg, "ALLOBJ"))
e3d3bfda
MS
376 {
377 struct objfile *ofile;
378 struct obj_section *osect;
379
380 /* Only this function cares about the 'ALLOBJ' argument;
381 if 'ALLOBJ' is the only argument, discard it rather than
382 passing it down to print_objfile_section_info (which
383 wouldn't know how to handle it). */
384 if (strcmp (arg, "ALLOBJ") == 0)
385 arg = NULL;
386
387 ALL_OBJFILES (ofile)
388 {
a3f17187 389 printf_filtered (_(" Object file: %s\n"),
e3d3bfda
MS
390 bfd_get_filename (ofile->obfd));
391 ALL_OBJFILE_OSECTIONS (ofile, osect)
392 {
393 print_objfile_section_info (ofile->obfd, osect, arg);
394 }
395 }
396 }
397 else
398 bfd_map_over_sections (exec_bfd, print_bfd_section_info, arg);
c906108c
SS
399 }
400
401 if (core_bfd)
402 {
a3f17187 403 printf_filtered (_("Core file:\n"));
c5aa993b 404 printf_filtered (" `%s', ", bfd_get_filename (core_bfd));
c906108c 405 wrap_here (" ");
a3f17187 406 printf_filtered (_("file type %s.\n"), bfd_get_target (core_bfd));
e3d3bfda 407 bfd_map_over_sections (core_bfd, print_bfd_section_info, arg);
c906108c
SS
408 }
409}
410
c906108c 411void
fba45db2 412maintenance_print_statistics (char *args, int from_tty)
c906108c
SS
413{
414 print_objfile_statistics ();
415 print_symbol_bcache_statistics ();
416}
417
b9362cc7 418static void
4b9b3959
AC
419maintenance_print_architecture (char *args, int from_tty)
420{
e17c207e
UW
421 struct gdbarch *gdbarch = get_current_arch ();
422
4b9b3959 423 if (args == NULL)
e17c207e 424 gdbarch_dump (gdbarch, gdb_stdout);
4b9b3959
AC
425 else
426 {
724b958c 427 struct cleanup *cleanups;
4b9b3959 428 struct ui_file *file = gdb_fopen (args, "w");
b8d56208 429
4b9b3959 430 if (file == NULL)
e2e0b3e5 431 perror_with_name (_("maintenance print architecture"));
724b958c 432 cleanups = make_cleanup_ui_file_delete (file);
e17c207e 433 gdbarch_dump (gdbarch, file);
724b958c 434 do_cleanups (cleanups);
4b9b3959
AC
435 }
436}
437
33f91161
AC
438/* The "maintenance print" command is defined as a prefix, with
439 allow_unknown 0. Therefore, its own definition is called only for
440 "maintenance print" with no args. */
c906108c 441
c906108c 442static void
fba45db2 443maintenance_print_command (char *arg, int from_tty)
c906108c 444{
a3f17187 445 printf_unfiltered (_("\"maintenance print\" must be followed by the name of a print command.\n"));
c906108c
SS
446 help_list (maintenanceprintlist, "maintenance print ", -1, gdb_stdout);
447}
448
449/* The "maintenance translate-address" command converts a section and address
450 to a symbol. This can be called in two ways:
c5aa993b
JM
451 maintenance translate-address <secname> <addr>
452 or maintenance translate-address <addr>
453 */
c906108c
SS
454
455static void
fba45db2 456maintenance_translate_address (char *arg, int from_tty)
c906108c
SS
457{
458 CORE_ADDR address;
714835d5 459 struct obj_section *sect;
c906108c
SS
460 char *p;
461 struct minimal_symbol *sym;
462 struct objfile *objfile;
463
464 if (arg == NULL || *arg == 0)
8a3fe4f8 465 error (_("requires argument (address or section + address)"));
c906108c
SS
466
467 sect = NULL;
468 p = arg;
469
470 if (!isdigit (*p))
471 { /* See if we have a valid section name */
c5aa993b 472 while (*p && !isspace (*p)) /* Find end of section name */
c906108c
SS
473 p++;
474 if (*p == '\000') /* End of command? */
8a3fe4f8 475 error (_("Need to specify <section-name> and <address>"));
c906108c 476 *p++ = '\000';
c5aa993b
JM
477 while (isspace (*p))
478 p++; /* Skip whitespace */
c906108c 479
714835d5 480 ALL_OBJSECTIONS (objfile, sect)
c5aa993b 481 {
714835d5 482 if (strcmp (sect->the_bfd_section->name, arg) == 0)
c5aa993b
JM
483 break;
484 }
c906108c 485
15c99a44 486 if (!objfile)
8a3fe4f8 487 error (_("Unknown section %s."), arg);
c906108c
SS
488 }
489
490 address = parse_and_eval_address (p);
491
492 if (sect)
493 sym = lookup_minimal_symbol_by_pc_section (address, sect);
494 else
495 sym = lookup_minimal_symbol_by_pc (address);
496
497 if (sym)
c14c28ba
PP
498 {
499 const char *symbol_name = SYMBOL_PRINT_NAME (sym);
500 const char *symbol_offset = pulongest (address - SYMBOL_VALUE_ADDRESS (sym));
501
502 sect = SYMBOL_OBJ_SECTION(sym);
503 if (sect != NULL)
504 {
505 const char *section_name;
506 const char *obj_name;
507
508 gdb_assert (sect->the_bfd_section && sect->the_bfd_section->name);
509 section_name = sect->the_bfd_section->name;
510
511 gdb_assert (sect->objfile && sect->objfile->name);
512 obj_name = sect->objfile->name;
513
514 if (MULTI_OBJFILE_P ())
515 printf_filtered (_("%s + %s in section %s of %s\n"),
516 symbol_name, symbol_offset, section_name, obj_name);
517 else
518 printf_filtered (_("%s + %s in section %s\n"),
519 symbol_name, symbol_offset, section_name);
520 }
521 else
522 printf_filtered (_("%s + %s\n"), symbol_name, symbol_offset);
523 }
c906108c 524 else if (sect)
5af949e3
UW
525 printf_filtered (_("no symbol at %s:%s\n"),
526 sect->the_bfd_section->name, hex_string (address));
c906108c 527 else
5af949e3 528 printf_filtered (_("no symbol at %s\n"), hex_string (address));
c906108c
SS
529
530 return;
531}
532
56382845 533
c114dcd5 534/* When a command is deprecated the user will be warned the first time
33f91161
AC
535 the command is used. If possible, a replacement will be
536 offered. */
56382845
FN
537
538static void
539maintenance_deprecate (char *args, int from_tty)
540{
541 if (args == NULL || *args == '\0')
542 {
a3f17187 543 printf_unfiltered (_("\"maintenance deprecate\" takes an argument, \n\
56382845 544the command you want to deprecate, and optionally the replacement command \n\
a3f17187 545enclosed in quotes.\n"));
56382845 546 }
33f91161 547
56382845
FN
548 maintenance_do_deprecate (args, 1);
549
550}
551
552
553static void
554maintenance_undeprecate (char *args, int from_tty)
555{
556 if (args == NULL || *args == '\0')
557 {
a3f17187
AC
558 printf_unfiltered (_("\"maintenance undeprecate\" takes an argument, \n\
559the command you want to undeprecate.\n"));
56382845 560 }
33f91161 561
56382845 562 maintenance_do_deprecate (args, 0);
33f91161 563
56382845
FN
564}
565
33f91161
AC
566/* You really shouldn't be using this. It is just for the testsuite.
567 Rather, you should use deprecate_cmd() when the command is created
568 in _initialize_blah().
569
570 This function deprecates a command and optionally assigns it a
571 replacement. */
572
8399535b 573static void
33f91161
AC
574maintenance_do_deprecate (char *text, int deprecate)
575{
33f91161
AC
576 struct cmd_list_element *alias = NULL;
577 struct cmd_list_element *prefix_cmd = NULL;
578 struct cmd_list_element *cmd = NULL;
579
580 char *start_ptr = NULL;
581 char *end_ptr = NULL;
56382845 582 int len;
33f91161
AC
583 char *replacement = NULL;
584
1c689132
DB
585 if (text == NULL)
586 return;
56382845 587
33f91161
AC
588 if (!lookup_cmd_composition (text, &alias, &prefix_cmd, &cmd))
589 {
a3f17187 590 printf_filtered (_("Can't find command '%s' to deprecate.\n"), text);
33f91161
AC
591 return;
592 }
56382845 593
56382845
FN
594 if (deprecate)
595 {
596 /* look for a replacement command */
80ce1ecb
AC
597 start_ptr = strchr (text, '\"');
598 if (start_ptr != NULL)
33f91161
AC
599 {
600 start_ptr++;
80ce1ecb
AC
601 end_ptr = strrchr (start_ptr, '\"');
602 if (end_ptr != NULL)
33f91161
AC
603 {
604 len = end_ptr - start_ptr;
605 start_ptr[len] = '\0';
606 replacement = xstrdup (start_ptr);
607 }
608 }
56382845 609 }
33f91161 610
56382845
FN
611 if (!start_ptr || !end_ptr)
612 replacement = NULL;
33f91161
AC
613
614
56382845 615 /* If they used an alias, we only want to deprecate the alias.
33f91161 616
56382845
FN
617 Note the MALLOCED_REPLACEMENT test. If the command's replacement
618 string was allocated at compile time we don't want to free the
33f91161 619 memory. */
56382845
FN
620 if (alias)
621 {
56382845 622 if (alias->flags & MALLOCED_REPLACEMENT)
b8c9b27d 623 xfree (alias->replacement);
33f91161 624
56382845 625 if (deprecate)
33f91161 626 alias->flags |= (DEPRECATED_WARN_USER | CMD_DEPRECATED);
56382845 627 else
33f91161
AC
628 alias->flags &= ~(DEPRECATED_WARN_USER | CMD_DEPRECATED);
629 alias->replacement = replacement;
56382845
FN
630 alias->flags |= MALLOCED_REPLACEMENT;
631 return;
632 }
633 else if (cmd)
634 {
635 if (cmd->flags & MALLOCED_REPLACEMENT)
b8c9b27d 636 xfree (cmd->replacement);
56382845
FN
637
638 if (deprecate)
33f91161 639 cmd->flags |= (DEPRECATED_WARN_USER | CMD_DEPRECATED);
56382845 640 else
33f91161
AC
641 cmd->flags &= ~(DEPRECATED_WARN_USER | CMD_DEPRECATED);
642 cmd->replacement = replacement;
56382845
FN
643 cmd->flags |= MALLOCED_REPLACEMENT;
644 return;
645 }
646}
647
4f337972
AC
648/* Maintenance set/show framework. */
649
ae038cb0
DJ
650struct cmd_list_element *maintenance_set_cmdlist;
651struct cmd_list_element *maintenance_show_cmdlist;
4f337972
AC
652
653static void
654maintenance_set_cmd (char *args, int from_tty)
655{
a3f17187 656 printf_unfiltered (_("\"maintenance set\" must be followed by the name of a set command.\n"));
4f337972
AC
657 help_list (maintenance_set_cmdlist, "maintenance set ", -1, gdb_stdout);
658}
659
660static void
661maintenance_show_cmd (char *args, int from_tty)
662{
663 cmd_show_list (maintenance_show_cmdlist, from_tty, "");
664}
665
4f337972
AC
666/* Profiling support. */
667
668static int maintenance_profile_p;
920d2a44
AC
669static void
670show_maintenance_profile_p (struct ui_file *file, int from_tty,
671 struct cmd_list_element *c, const char *value)
672{
673 fprintf_filtered (file, _("Internal profiling is %s.\n"), value);
674}
d9feb4e7 675
b0b1c2c0
MK
676#ifdef HAVE__ETEXT
677extern char _etext;
678#define TEXTEND &_etext
01fe12f6 679#elif defined (HAVE_ETEXT)
b0b1c2c0
MK
680extern char etext;
681#define TEXTEND &etext
682#endif
683
01fe12f6
JB
684#if defined (HAVE_MONSTARTUP) && defined (HAVE__MCLEANUP) && defined (TEXTEND)
685
d28f9cdf
DJ
686static int profiling_state;
687
688static void
689mcleanup_wrapper (void)
690{
691 extern void _mcleanup (void);
692
693 if (profiling_state)
694 _mcleanup ();
695}
4f337972
AC
696
697static void
698maintenance_set_profile_cmd (char *args, int from_tty, struct cmd_list_element *c)
699{
d28f9cdf
DJ
700 if (maintenance_profile_p == profiling_state)
701 return;
702
703 profiling_state = maintenance_profile_p;
704
705 if (maintenance_profile_p)
706 {
707 static int profiling_initialized;
708
709 extern void monstartup (unsigned long, unsigned long);
d28f9cdf
DJ
710 extern int main();
711
712 if (!profiling_initialized)
713 {
714 atexit (mcleanup_wrapper);
715 profiling_initialized = 1;
716 }
717
718 /* "main" is now always the first function in the text segment, so use
719 its address for monstartup. */
b0b1c2c0 720 monstartup ((unsigned long) &main, (unsigned long) TEXTEND);
d28f9cdf
DJ
721 }
722 else
723 {
724 extern void _mcleanup (void);
b8d56208 725
d28f9cdf
DJ
726 _mcleanup ();
727 }
4f337972 728}
d9feb4e7
DJ
729#else
730static void
731maintenance_set_profile_cmd (char *args, int from_tty, struct cmd_list_element *c)
732{
8a3fe4f8 733 error (_("Profiling support is not available on this system."));
d9feb4e7
DJ
734}
735#endif
56382845 736
c906108c 737void
fba45db2 738_initialize_maint_cmds (void)
c906108c 739{
1bedd215
AC
740 add_prefix_cmd ("maintenance", class_maintenance, maintenance_command, _("\
741Commands for use by GDB maintainers.\n\
c906108c
SS
742Includes commands to dump specific internal GDB structures in\n\
743a human readable form, to cause GDB to deliberately dump core,\n\
1bedd215 744to test internal functions such as the C++/ObjC demangler, etc."),
c906108c
SS
745 &maintenancelist, "maintenance ", 0,
746 &cmdlist);
747
748 add_com_alias ("mt", "maintenance", class_maintenance, 1);
749
1bedd215
AC
750 add_prefix_cmd ("info", class_maintenance, maintenance_info_command, _("\
751Commands for showing internal info about the program being debugged."),
c906108c
SS
752 &maintenanceinfolist, "maintenance info ", 0,
753 &maintenancelist);
90515c23 754 add_alias_cmd ("i", "info", class_maintenance, 1, &maintenancelist);
c906108c 755
1a966eab
AC
756 add_cmd ("sections", class_maintenance, maintenance_info_sections, _("\
757List the BFD sections of the exec and core files. \n\
e3d3bfda
MS
758Arguments may be any combination of:\n\
759 [one or more section names]\n\
760 ALLOC LOAD RELOC READONLY CODE DATA ROM CONSTRUCTOR\n\
761 HAS_CONTENTS NEVER_LOAD COFF_SHARED_LIBRARY IS_COMMON\n\
762Sections matching any argument will be listed (no argument\n\
763implies all sections). In addition, the special argument\n\
764 ALLOBJ\n\
1a966eab 765lists all sections from all object files, including shared libraries."),
c906108c
SS
766 &maintenanceinfolist);
767
768 add_prefix_cmd ("print", class_maintenance, maintenance_print_command,
1bedd215 769 _("Maintenance command for printing GDB internal state."),
c906108c
SS
770 &maintenanceprintlist, "maintenance print ", 0,
771 &maintenancelist);
772
1bedd215 773 add_prefix_cmd ("set", class_maintenance, maintenance_set_cmd, _("\
4f337972 774Set GDB internal variables used by the GDB maintainer.\n\
1bedd215 775Configure variables internal to GDB that aid in GDB's maintenance"),
4f337972
AC
776 &maintenance_set_cmdlist, "maintenance set ",
777 0/*allow-unknown*/,
778 &maintenancelist);
779
1bedd215 780 add_prefix_cmd ("show", class_maintenance, maintenance_show_cmd, _("\
4f337972 781Show GDB internal variables used by the GDB maintainer.\n\
1bedd215 782Configure variables internal to GDB that aid in GDB's maintenance"),
4f337972
AC
783 &maintenance_show_cmdlist, "maintenance show ",
784 0/*allow-unknown*/,
785 &maintenancelist);
786
c906108c 787#ifndef _WIN32
1a966eab
AC
788 add_cmd ("dump-me", class_maintenance, maintenance_dump_me, _("\
789Get fatal error; make debugger dump its core.\n\
8308e54c 790GDB sets its handling of SIGQUIT back to SIG_DFL and then sends\n\
1a966eab 791itself a SIGQUIT signal."),
c906108c
SS
792 &maintenancelist);
793#endif
794
1a966eab
AC
795 add_cmd ("internal-error", class_maintenance,
796 maintenance_internal_error, _("\
797Give GDB an internal error.\n\
798Cause GDB to behave as if an internal error was detected."),
7be570e7
JM
799 &maintenancelist);
800
1a966eab
AC
801 add_cmd ("internal-warning", class_maintenance,
802 maintenance_internal_warning, _("\
803Give GDB an internal warning.\n\
804Cause GDB to behave as if an internal warning was reported."),
dec43320
AC
805 &maintenancelist);
806
1a966eab
AC
807 add_cmd ("demangle", class_maintenance, maintenance_demangle, _("\
808Demangle a C++/ObjC mangled name.\n\
c906108c 809Call internal GDB demangler routine to demangle a C++ link name\n\
1a966eab 810and prints the result."),
c906108c
SS
811 &maintenancelist);
812
1a966eab
AC
813 add_cmd ("time", class_maintenance, maintenance_time_display, _("\
814Set the display of time usage.\n\
c906108c 815If nonzero, will cause the execution time for each command to be\n\
1a966eab 816displayed, following the command's output."),
c906108c
SS
817 &maintenancelist);
818
1a966eab
AC
819 add_cmd ("space", class_maintenance, maintenance_space_display, _("\
820Set the display of space usage.\n\
c906108c 821If nonzero, will cause the execution space for each command to be\n\
1a966eab 822displayed, following the command's output."),
c906108c
SS
823 &maintenancelist);
824
1a966eab
AC
825 add_cmd ("type", class_maintenance, maintenance_print_type, _("\
826Print a type chain for a given symbol.\n\
c906108c 827For each node in a type chain, print the raw data for each member of\n\
1a966eab 828the type structure, and the interpretation of the data."),
c906108c
SS
829 &maintenanceprintlist);
830
1a966eab
AC
831 add_cmd ("symbols", class_maintenance, maintenance_print_symbols, _("\
832Print dump of current symbol definitions.\n\
c906108c 833Entries in the full symbol table are dumped to file OUTFILE.\n\
1a966eab 834If a SOURCE file is specified, dump only that file's symbols."),
c906108c
SS
835 &maintenanceprintlist);
836
1a966eab
AC
837 add_cmd ("msymbols", class_maintenance, maintenance_print_msymbols, _("\
838Print dump of current minimal symbol definitions.\n\
c906108c 839Entries in the minimal symbol table are dumped to file OUTFILE.\n\
1a966eab 840If a SOURCE file is specified, dump only that file's minimal symbols."),
c906108c
SS
841 &maintenanceprintlist);
842
1a966eab
AC
843 add_cmd ("psymbols", class_maintenance, maintenance_print_psymbols, _("\
844Print dump of current partial symbol definitions.\n\
c906108c 845Entries in the partial symbol table are dumped to file OUTFILE.\n\
1a966eab 846If a SOURCE file is specified, dump only that file's partial symbols."),
c906108c
SS
847 &maintenanceprintlist);
848
849 add_cmd ("objfiles", class_maintenance, maintenance_print_objfiles,
1a966eab 850 _("Print dump of current object file definitions."),
c906108c
SS
851 &maintenanceprintlist);
852
1a966eab
AC
853 add_cmd ("symtabs", class_maintenance, maintenance_info_symtabs, _("\
854List the full symbol tables for all object files.\n\
44ea7b70
JB
855This does not include information about individual symbols, blocks, or\n\
856linetables --- just the symbol table structures themselves.\n\
1a966eab 857With an argument REGEXP, list the symbol tables whose names that match that."),
5e7b2f39 858 &maintenanceinfolist);
44ea7b70 859
1a966eab
AC
860 add_cmd ("psymtabs", class_maintenance, maintenance_info_psymtabs, _("\
861List the partial symbol tables for all object files.\n\
44ea7b70 862This does not include information about individual partial symbols,\n\
1a966eab 863just the symbol table structures themselves."),
5e7b2f39 864 &maintenanceinfolist);
44ea7b70 865
c906108c 866 add_cmd ("statistics", class_maintenance, maintenance_print_statistics,
1a966eab 867 _("Print statistics about internal gdb state."),
c906108c
SS
868 &maintenanceprintlist);
869
1a966eab
AC
870 add_cmd ("architecture", class_maintenance,
871 maintenance_print_architecture, _("\
872Print the internal architecture configuration.\n\
873Takes an optional file parameter."),
4b9b3959
AC
874 &maintenanceprintlist);
875
c906108c 876 add_cmd ("check-symtabs", class_maintenance, maintenance_check_symtabs,
1a966eab 877 _("Check consistency of psymtabs and symtabs."),
c906108c
SS
878 &maintenancelist);
879
880 add_cmd ("translate-address", class_maintenance, maintenance_translate_address,
1a966eab 881 _("Translate a section name and address to a symbol."),
c906108c
SS
882 &maintenancelist);
883
1a966eab
AC
884 add_cmd ("deprecate", class_maintenance, maintenance_deprecate, _("\
885Deprecate a command. Note that this is just in here so the \n\
ef4cb050 886testsuite can check the command deprecator. You probably shouldn't use this,\n\
56382845 887rather you should use the C function deprecate_cmd(). If you decide you \n\
6f122dc9 888want to use it: maintenance deprecate 'commandname' \"replacement\". The \n\
1a966eab 889replacement is optional."), &maintenancelist);
56382845 890
1a966eab
AC
891 add_cmd ("undeprecate", class_maintenance, maintenance_undeprecate, _("\
892Undeprecate a command. Note that this is just in here so the \n\
ef4cb050 893testsuite can check the command deprecator. You probably shouldn't use this,\n\
1a966eab 894If you decide you want to use it: maintenance undeprecate 'commandname'"),
33f91161 895 &maintenancelist);
56382845 896
85c07804
AC
897 add_setshow_zinteger_cmd ("watchdog", class_maintenance, &watchdog, _("\
898Set watchdog timer."), _("\
899Show watchdog timer."), _("\
cb1a6d5f
AC
900When non-zero, this timeout is used instead of waiting forever for a target\n\
901to finish a low-level step or continue operation. If the specified amount\n\
85c07804
AC
902of time passes without a response from the target, an error occurs."),
903 NULL,
920d2a44 904 show_watchdog,
85c07804 905 &setlist, &showlist);
4f337972 906
d28f9cdf 907 add_setshow_boolean_cmd ("profile", class_maintenance,
7915a72c
AC
908 &maintenance_profile_p, _("\
909Set internal profiling."), _("\
910Show internal profiling."), _("\
911When enabled GDB is profiled."),
2c5b56ce 912 maintenance_set_profile_cmd,
920d2a44 913 show_maintenance_profile_p,
d28f9cdf
DJ
914 &maintenance_set_cmdlist,
915 &maintenance_show_cmdlist);
c906108c 916}
This page took 0.873702 seconds and 4 git commands to generate.