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