xref: /openbsd-src/gnu/usr.bin/binutils/gdb/printcmd.c (revision 63addd46c1e40ca0f49488ddcdc4ab598023b0c1)
1e93f7393Sniklas /* Print values for GNU debugger GDB.
2b725ae77Skettenis 
3b725ae77Skettenis    Copyright 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994,
4b725ae77Skettenis    1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004 Free Software
5b725ae77Skettenis    Foundation, Inc.
6e93f7393Sniklas 
7e93f7393Sniklas    This file is part of GDB.
8e93f7393Sniklas 
9e93f7393Sniklas    This program is free software; you can redistribute it and/or modify
10e93f7393Sniklas    it under the terms of the GNU General Public License as published by
11e93f7393Sniklas    the Free Software Foundation; either version 2 of the License, or
12e93f7393Sniklas    (at your option) any later version.
13e93f7393Sniklas 
14e93f7393Sniklas    This program is distributed in the hope that it will be useful,
15e93f7393Sniklas    but WITHOUT ANY WARRANTY; without even the implied warranty of
16e93f7393Sniklas    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17e93f7393Sniklas    GNU General Public License for more details.
18e93f7393Sniklas 
19e93f7393Sniklas    You should have received a copy of the GNU General Public License
20e93f7393Sniklas    along with this program; if not, write to the Free Software
21b725ae77Skettenis    Foundation, Inc., 59 Temple Place - Suite 330,
22b725ae77Skettenis    Boston, MA 02111-1307, USA.  */
23e93f7393Sniklas 
24e93f7393Sniklas #include "defs.h"
25e93f7393Sniklas #include "gdb_string.h"
26e93f7393Sniklas #include "frame.h"
27e93f7393Sniklas #include "symtab.h"
28e93f7393Sniklas #include "gdbtypes.h"
29e93f7393Sniklas #include "value.h"
30e93f7393Sniklas #include "language.h"
31e93f7393Sniklas #include "expression.h"
32e93f7393Sniklas #include "gdbcore.h"
33e93f7393Sniklas #include "gdbcmd.h"
34e93f7393Sniklas #include "target.h"
35e93f7393Sniklas #include "breakpoint.h"
36e93f7393Sniklas #include "demangle.h"
37e93f7393Sniklas #include "valprint.h"
38e93f7393Sniklas #include "annotate.h"
39b725ae77Skettenis #include "symfile.h"		/* for overlay functions */
40b725ae77Skettenis #include "objfiles.h"		/* ditto */
41b725ae77Skettenis #include "completer.h"		/* for completion functions */
42b725ae77Skettenis #include "ui-out.h"
43b725ae77Skettenis #include "gdb_assert.h"
44b725ae77Skettenis #include "block.h"
45b725ae77Skettenis #include "disasm.h"
46b725ae77Skettenis 
47b725ae77Skettenis #ifdef TUI
48b725ae77Skettenis #include "tui/tui.h"		/* For tui_active et.al.   */
49b725ae77Skettenis #endif
50e93f7393Sniklas 
51e93f7393Sniklas extern int asm_demangle;	/* Whether to demangle syms in asm printouts */
52e93f7393Sniklas extern int addressprint;	/* Whether to print hex addresses in HLL " */
53e93f7393Sniklas 
54e93f7393Sniklas struct format_data
55e93f7393Sniklas   {
56e93f7393Sniklas     int count;
57e93f7393Sniklas     char format;
58e93f7393Sniklas     char size;
59e93f7393Sniklas   };
60e93f7393Sniklas 
61e93f7393Sniklas /* Last specified output format.  */
62e93f7393Sniklas 
63e93f7393Sniklas static char last_format = 'x';
64e93f7393Sniklas 
65e93f7393Sniklas /* Last specified examination size.  'b', 'h', 'w' or `q'.  */
66e93f7393Sniklas 
67e93f7393Sniklas static char last_size = 'w';
68e93f7393Sniklas 
69e93f7393Sniklas /* Default address to examine next.  */
70e93f7393Sniklas 
71e93f7393Sniklas static CORE_ADDR next_address;
72e93f7393Sniklas 
73b725ae77Skettenis /* Default section to examine next. */
74b725ae77Skettenis 
75b725ae77Skettenis static asection *next_section;
76b725ae77Skettenis 
77e93f7393Sniklas /* Last address examined.  */
78e93f7393Sniklas 
79e93f7393Sniklas static CORE_ADDR last_examine_address;
80e93f7393Sniklas 
81e93f7393Sniklas /* Contents of last address examined.
82e93f7393Sniklas    This is not valid past the end of the `x' command!  */
83e93f7393Sniklas 
84b725ae77Skettenis static struct value *last_examine_value;
85e93f7393Sniklas 
86e93f7393Sniklas /* Largest offset between a symbolic value and an address, that will be
87e93f7393Sniklas    printed as `0x1234 <symbol+offset>'.  */
88e93f7393Sniklas 
89e93f7393Sniklas static unsigned int max_symbolic_offset = UINT_MAX;
90e93f7393Sniklas 
91e93f7393Sniklas /* Append the source filename and linenumber of the symbol when
92e93f7393Sniklas    printing a symbolic value as `<symbol at filename:linenum>' if set.  */
93e93f7393Sniklas static int print_symbol_filename = 0;
94e93f7393Sniklas 
95e93f7393Sniklas /* Number of auto-display expression currently being displayed.
96e93f7393Sniklas    So that we can disable it if we get an error or a signal within it.
97e93f7393Sniklas    -1 when not doing one.  */
98e93f7393Sniklas 
99e93f7393Sniklas int current_display_number;
100e93f7393Sniklas 
101e93f7393Sniklas /* Flag to low-level print routines that this value is being printed
102e93f7393Sniklas    in an epoch window.  We'd like to pass this as a parameter, but
103e93f7393Sniklas    every routine would need to take it.  Perhaps we can encapsulate
104e93f7393Sniklas    this in the I/O stream once we have GNU stdio. */
105e93f7393Sniklas 
106e93f7393Sniklas int inspect_it = 0;
107e93f7393Sniklas 
108e93f7393Sniklas struct display
109e93f7393Sniklas   {
110e93f7393Sniklas     /* Chain link to next auto-display item.  */
111e93f7393Sniklas     struct display *next;
112e93f7393Sniklas     /* Expression to be evaluated and displayed.  */
113e93f7393Sniklas     struct expression *exp;
114e93f7393Sniklas     /* Item number of this auto-display item.  */
115e93f7393Sniklas     int number;
116e93f7393Sniklas     /* Display format specified.  */
117e93f7393Sniklas     struct format_data format;
118e93f7393Sniklas     /* Innermost block required by this expression when evaluated */
119e93f7393Sniklas     struct block *block;
120e93f7393Sniklas     /* Status of this display (enabled or disabled) */
121b725ae77Skettenis     int enabled_p;
122e93f7393Sniklas   };
123e93f7393Sniklas 
124e93f7393Sniklas /* Chain of expressions whose values should be displayed
125e93f7393Sniklas    automatically each time the program stops.  */
126e93f7393Sniklas 
127e93f7393Sniklas static struct display *display_chain;
128e93f7393Sniklas 
129e93f7393Sniklas static int display_number;
130e93f7393Sniklas 
131b725ae77Skettenis /* Prototypes for exported functions. */
132e93f7393Sniklas 
133b725ae77Skettenis void output_command (char *, int);
134b725ae77Skettenis 
135b725ae77Skettenis void _initialize_printcmd (void);
136e93f7393Sniklas 
137e93f7393Sniklas /* Prototypes for local functions. */
138e93f7393Sniklas 
139b725ae77Skettenis static void delete_display (int);
140e93f7393Sniklas 
141b725ae77Skettenis static void enable_display (char *, int);
142e93f7393Sniklas 
143b725ae77Skettenis static void disable_display_command (char *, int);
144e93f7393Sniklas 
145b725ae77Skettenis static void printf_command (char *, int);
146e93f7393Sniklas 
147b725ae77Skettenis static void display_info (char *, int);
148e93f7393Sniklas 
149b725ae77Skettenis static void do_one_display (struct display *);
150e93f7393Sniklas 
151b725ae77Skettenis static void undisplay_command (char *, int);
152e93f7393Sniklas 
153b725ae77Skettenis static void free_display (struct display *);
154e93f7393Sniklas 
155b725ae77Skettenis static void display_command (char *, int);
156e93f7393Sniklas 
157b725ae77Skettenis void x_command (char *, int);
158e93f7393Sniklas 
159b725ae77Skettenis static void address_info (char *, int);
160e93f7393Sniklas 
161b725ae77Skettenis static void set_command (char *, int);
162e93f7393Sniklas 
163b725ae77Skettenis static void call_command (char *, int);
164e93f7393Sniklas 
165b725ae77Skettenis static void inspect_command (char *, int);
166e93f7393Sniklas 
167b725ae77Skettenis static void print_command (char *, int);
168e93f7393Sniklas 
169b725ae77Skettenis static void print_command_1 (char *, int, int);
170e93f7393Sniklas 
171b725ae77Skettenis static void validate_format (struct format_data, char *);
172e93f7393Sniklas 
173b725ae77Skettenis static void do_examine (struct format_data, CORE_ADDR addr,
174b725ae77Skettenis 			asection * section);
175e93f7393Sniklas 
176b725ae77Skettenis static void print_formatted (struct value *, int, int, struct ui_file *);
177e93f7393Sniklas 
178b725ae77Skettenis static struct format_data decode_format (char **, int, int);
179e93f7393Sniklas 
180b725ae77Skettenis static void sym_info (char *, int);
181e93f7393Sniklas 
182b725ae77Skettenis 
183e93f7393Sniklas /* Decode a format specification.  *STRING_PTR should point to it.
184e93f7393Sniklas    OFORMAT and OSIZE are used as defaults for the format and size
185e93f7393Sniklas    if none are given in the format specification.
186e93f7393Sniklas    If OSIZE is zero, then the size field of the returned value
187e93f7393Sniklas    should be set only if a size is explicitly specified by the
188e93f7393Sniklas    user.
189e93f7393Sniklas    The structure returned describes all the data
190e93f7393Sniklas    found in the specification.  In addition, *STRING_PTR is advanced
191e93f7393Sniklas    past the specification and past all whitespace following it.  */
192e93f7393Sniklas 
193e93f7393Sniklas static struct format_data
decode_format(char ** string_ptr,int oformat,int osize)194b725ae77Skettenis decode_format (char **string_ptr, int oformat, int osize)
195e93f7393Sniklas {
196e93f7393Sniklas   struct format_data val;
197b725ae77Skettenis   char *p = *string_ptr;
198e93f7393Sniklas 
199e93f7393Sniklas   val.format = '?';
200e93f7393Sniklas   val.size = '?';
201e93f7393Sniklas   val.count = 1;
202e93f7393Sniklas 
203e93f7393Sniklas   if (*p >= '0' && *p <= '9')
204e93f7393Sniklas     val.count = atoi (p);
205b725ae77Skettenis   while (*p >= '0' && *p <= '9')
206b725ae77Skettenis     p++;
207e93f7393Sniklas 
208e93f7393Sniklas   /* Now process size or format letters that follow.  */
209e93f7393Sniklas 
210e93f7393Sniklas   while (1)
211e93f7393Sniklas     {
212e93f7393Sniklas       if (*p == 'b' || *p == 'h' || *p == 'w' || *p == 'g')
213e93f7393Sniklas 	val.size = *p++;
214e93f7393Sniklas       else if (*p >= 'a' && *p <= 'z')
215e93f7393Sniklas 	val.format = *p++;
216e93f7393Sniklas       else
217e93f7393Sniklas 	break;
218e93f7393Sniklas     }
219e93f7393Sniklas 
220b725ae77Skettenis   while (*p == ' ' || *p == '\t')
221b725ae77Skettenis     p++;
222e93f7393Sniklas   *string_ptr = p;
223e93f7393Sniklas 
224e93f7393Sniklas   /* Set defaults for format and size if not specified.  */
225e93f7393Sniklas   if (val.format == '?')
226e93f7393Sniklas     {
227e93f7393Sniklas       if (val.size == '?')
228e93f7393Sniklas 	{
229e93f7393Sniklas 	  /* Neither has been specified.  */
230e93f7393Sniklas 	  val.format = oformat;
231e93f7393Sniklas 	  val.size = osize;
232e93f7393Sniklas 	}
233e93f7393Sniklas       else
234e93f7393Sniklas 	/* If a size is specified, any format makes a reasonable
235e93f7393Sniklas 	   default except 'i'.  */
236e93f7393Sniklas 	val.format = oformat == 'i' ? 'x' : oformat;
237e93f7393Sniklas     }
238e93f7393Sniklas   else if (val.size == '?')
239e93f7393Sniklas     switch (val.format)
240e93f7393Sniklas       {
241e93f7393Sniklas       case 'a':
242e93f7393Sniklas       case 's':
243e93f7393Sniklas 	/* Pick the appropriate size for an address.  */
244e93f7393Sniklas 	if (TARGET_PTR_BIT == 64)
245e93f7393Sniklas 	  val.size = osize ? 'g' : osize;
246e93f7393Sniklas 	else if (TARGET_PTR_BIT == 32)
247e93f7393Sniklas 	  val.size = osize ? 'w' : osize;
248e93f7393Sniklas 	else if (TARGET_PTR_BIT == 16)
249e93f7393Sniklas 	  val.size = osize ? 'h' : osize;
250e93f7393Sniklas 	else
251e93f7393Sniklas 	  /* Bad value for TARGET_PTR_BIT */
252b725ae77Skettenis 	  internal_error (__FILE__, __LINE__, "failed internal consistency check");
253e93f7393Sniklas 	break;
254e93f7393Sniklas       case 'f':
255e93f7393Sniklas 	/* Floating point has to be word or giantword.  */
256e93f7393Sniklas 	if (osize == 'w' || osize == 'g')
257e93f7393Sniklas 	  val.size = osize;
258e93f7393Sniklas 	else
259e93f7393Sniklas 	  /* Default it to giantword if the last used size is not
260e93f7393Sniklas 	     appropriate.  */
261e93f7393Sniklas 	  val.size = osize ? 'g' : osize;
262e93f7393Sniklas 	break;
263e93f7393Sniklas       case 'c':
264e93f7393Sniklas 	/* Characters default to one byte.  */
265e93f7393Sniklas 	val.size = osize ? 'b' : osize;
266e93f7393Sniklas 	break;
267e93f7393Sniklas       default:
268e93f7393Sniklas 	/* The default is the size most recently specified.  */
269e93f7393Sniklas 	val.size = osize;
270e93f7393Sniklas       }
271e93f7393Sniklas 
272e93f7393Sniklas   return val;
273e93f7393Sniklas }
274e93f7393Sniklas 
275b725ae77Skettenis /* Print value VAL on stream according to FORMAT, a letter or 0.
276e93f7393Sniklas    Do not end with a newline.
277e93f7393Sniklas    0 means print VAL according to its own type.
278e93f7393Sniklas    SIZE is the letter for the size of datum being printed.
279e93f7393Sniklas    This is used to pad hex numbers so they line up.  */
280e93f7393Sniklas 
281e93f7393Sniklas static void
print_formatted(struct value * val,int format,int size,struct ui_file * stream)282b725ae77Skettenis print_formatted (struct value *val, int format, int size,
283b725ae77Skettenis 		 struct ui_file *stream)
284e93f7393Sniklas {
285e93f7393Sniklas   struct type *type = check_typedef (VALUE_TYPE (val));
286e93f7393Sniklas   int len = TYPE_LENGTH (type);
287e93f7393Sniklas 
288e93f7393Sniklas   if (VALUE_LVAL (val) == lval_memory)
289b725ae77Skettenis     {
290e93f7393Sniklas       next_address = VALUE_ADDRESS (val) + len;
291b725ae77Skettenis       next_section = VALUE_BFD_SECTION (val);
292b725ae77Skettenis     }
293e93f7393Sniklas 
294e93f7393Sniklas   switch (format)
295e93f7393Sniklas     {
296e93f7393Sniklas     case 's':
297b725ae77Skettenis       /* FIXME: Need to handle wchar_t's here... */
298e93f7393Sniklas       next_address = VALUE_ADDRESS (val)
299b725ae77Skettenis 	+ val_print_string (VALUE_ADDRESS (val), -1, 1, stream);
300b725ae77Skettenis       next_section = VALUE_BFD_SECTION (val);
301e93f7393Sniklas       break;
302e93f7393Sniklas 
303e93f7393Sniklas     case 'i':
304e93f7393Sniklas       /* The old comment says
305e93f7393Sniklas          "Force output out, print_insn not using _filtered".
306e93f7393Sniklas          I'm not completely sure what that means, I suspect most print_insn
307b725ae77Skettenis          now do use _filtered, so I guess it's obsolete.
308b725ae77Skettenis          --Yes, it does filter now, and so this is obsolete.  -JB  */
309b725ae77Skettenis 
310e93f7393Sniklas       /* We often wrap here if there are long symbolic names.  */
311e93f7393Sniklas       wrap_here ("    ");
312e93f7393Sniklas       next_address = VALUE_ADDRESS (val)
313b725ae77Skettenis 	+ gdb_print_insn (VALUE_ADDRESS (val), stream);
314b725ae77Skettenis       next_section = VALUE_BFD_SECTION (val);
315e93f7393Sniklas       break;
316e93f7393Sniklas 
317e93f7393Sniklas     default:
318e93f7393Sniklas       if (format == 0
319e93f7393Sniklas 	  || TYPE_CODE (type) == TYPE_CODE_ARRAY
320e93f7393Sniklas 	  || TYPE_CODE (type) == TYPE_CODE_STRING
321e93f7393Sniklas 	  || TYPE_CODE (type) == TYPE_CODE_STRUCT
322b725ae77Skettenis 	  || TYPE_CODE (type) == TYPE_CODE_UNION
323b725ae77Skettenis 	  || TYPE_CODE (type) == TYPE_CODE_NAMESPACE)
324b725ae77Skettenis 	/* If format is 0, use the 'natural' format for
325b725ae77Skettenis 	 * that type of value.  If the type is non-scalar,
326b725ae77Skettenis 	 * we have to use language rules to print it as
327b725ae77Skettenis 	 * a series of scalars.
328b725ae77Skettenis 	 */
329b725ae77Skettenis 	value_print (val, stream, format, Val_pretty_default);
330e93f7393Sniklas       else
331b725ae77Skettenis 	/* User specified format, so don't look to the
332b725ae77Skettenis 	 * the type to tell us what to do.
333b725ae77Skettenis 	 */
334e93f7393Sniklas 	print_scalar_formatted (VALUE_CONTENTS (val), type,
335b725ae77Skettenis 				format, size, stream);
336e93f7393Sniklas     }
337e93f7393Sniklas }
338e93f7393Sniklas 
339e93f7393Sniklas /* Print a scalar of data of type TYPE, pointed to in GDB by VALADDR,
340e93f7393Sniklas    according to letters FORMAT and SIZE on STREAM.
341e93f7393Sniklas    FORMAT may not be zero.  Formats s and i are not supported at this level.
342e93f7393Sniklas 
343e93f7393Sniklas    This is how the elements of an array or structure are printed
344e93f7393Sniklas    with a format.  */
345e93f7393Sniklas 
346e93f7393Sniklas void
print_scalar_formatted(void * valaddr,struct type * type,int format,int size,struct ui_file * stream)347b725ae77Skettenis print_scalar_formatted (void *valaddr, struct type *type, int format, int size,
348b725ae77Skettenis 			struct ui_file *stream)
349e93f7393Sniklas {
350b725ae77Skettenis   LONGEST val_long = 0;
351e93f7393Sniklas   unsigned int len = TYPE_LENGTH (type);
352e93f7393Sniklas 
353b725ae77Skettenis   if (len > sizeof(LONGEST) &&
354b725ae77Skettenis       (TYPE_CODE (type) == TYPE_CODE_INT
355b725ae77Skettenis        || TYPE_CODE (type) == TYPE_CODE_ENUM))
356e93f7393Sniklas     {
357b725ae77Skettenis       switch (format)
358e93f7393Sniklas 	{
359b725ae77Skettenis 	case 'o':
360b725ae77Skettenis 	  print_octal_chars (stream, valaddr, len);
361e93f7393Sniklas 	  return;
362b725ae77Skettenis 	case 'u':
363b725ae77Skettenis 	case 'd':
364b725ae77Skettenis 	  print_decimal_chars (stream, valaddr, len);
365b725ae77Skettenis 	  return;
366b725ae77Skettenis 	case 't':
367b725ae77Skettenis 	  print_binary_chars (stream, valaddr, len);
368b725ae77Skettenis 	  return;
369b725ae77Skettenis 	case 'x':
370b725ae77Skettenis 	  print_hex_chars (stream, valaddr, len);
371b725ae77Skettenis 	  return;
372b725ae77Skettenis 	case 'c':
373b725ae77Skettenis 	  print_char_chars (stream, valaddr, len);
374b725ae77Skettenis 	  return;
375b725ae77Skettenis 	default:
376b725ae77Skettenis 	  break;
377b725ae77Skettenis 	};
378e93f7393Sniklas     }
379e93f7393Sniklas 
380b725ae77Skettenis   if (format != 'f')
381e93f7393Sniklas     val_long = unpack_long (type, valaddr);
382e93f7393Sniklas 
383b725ae77Skettenis   /* If the value is a pointer, and pointers and addresses are not the
384b725ae77Skettenis      same, then at this point, the value's length (in target bytes) is
385b725ae77Skettenis      TARGET_ADDR_BIT/TARGET_CHAR_BIT, not TYPE_LENGTH (type).  */
386b725ae77Skettenis   if (TYPE_CODE (type) == TYPE_CODE_PTR)
387b725ae77Skettenis     len = TARGET_ADDR_BIT / TARGET_CHAR_BIT;
388b725ae77Skettenis 
389e93f7393Sniklas   /* If we are printing it as unsigned, truncate it in case it is actually
390e93f7393Sniklas      a negative signed value (e.g. "print/u (short)-1" should print 65535
391e93f7393Sniklas      (if shorts are 16 bits) instead of 4294967295).  */
392e93f7393Sniklas   if (format != 'd')
393e93f7393Sniklas     {
394e93f7393Sniklas       if (len < sizeof (LONGEST))
395e93f7393Sniklas 	val_long &= ((LONGEST) 1 << HOST_CHAR_BIT * len) - 1;
396e93f7393Sniklas     }
397e93f7393Sniklas 
398e93f7393Sniklas   switch (format)
399e93f7393Sniklas     {
400e93f7393Sniklas     case 'x':
401e93f7393Sniklas       if (!size)
402e93f7393Sniklas 	{
403e93f7393Sniklas 	  /* no size specified, like in print.  Print varying # of digits. */
404e93f7393Sniklas 	  print_longest (stream, 'x', 1, val_long);
405e93f7393Sniklas 	}
406e93f7393Sniklas       else
407e93f7393Sniklas 	switch (size)
408e93f7393Sniklas 	  {
409e93f7393Sniklas 	  case 'b':
410e93f7393Sniklas 	  case 'h':
411e93f7393Sniklas 	  case 'w':
412e93f7393Sniklas 	  case 'g':
413e93f7393Sniklas 	    print_longest (stream, size, 1, val_long);
414e93f7393Sniklas 	    break;
415e93f7393Sniklas 	  default:
416e93f7393Sniklas 	    error ("Undefined output size \"%c\".", size);
417e93f7393Sniklas 	  }
418e93f7393Sniklas       break;
419e93f7393Sniklas 
420e93f7393Sniklas     case 'd':
421e93f7393Sniklas       print_longest (stream, 'd', 1, val_long);
422e93f7393Sniklas       break;
423e93f7393Sniklas 
424e93f7393Sniklas     case 'u':
425e93f7393Sniklas       print_longest (stream, 'u', 0, val_long);
426e93f7393Sniklas       break;
427e93f7393Sniklas 
428e93f7393Sniklas     case 'o':
429e93f7393Sniklas       if (val_long)
430e93f7393Sniklas 	print_longest (stream, 'o', 1, val_long);
431e93f7393Sniklas       else
432e93f7393Sniklas 	fprintf_filtered (stream, "0");
433e93f7393Sniklas       break;
434e93f7393Sniklas 
435e93f7393Sniklas     case 'a':
436b725ae77Skettenis       {
437b725ae77Skettenis 	CORE_ADDR addr = unpack_pointer (type, valaddr);
438b725ae77Skettenis 	print_address (addr, stream);
439b725ae77Skettenis       }
440e93f7393Sniklas       break;
441e93f7393Sniklas 
442e93f7393Sniklas     case 'c':
443b725ae77Skettenis       value_print (value_from_longest (builtin_type_true_char, val_long),
444b725ae77Skettenis 		   stream, 0, Val_pretty_default);
445e93f7393Sniklas       break;
446e93f7393Sniklas 
447e93f7393Sniklas     case 'f':
448b725ae77Skettenis       if (len == TYPE_LENGTH (builtin_type_float))
449e93f7393Sniklas         type = builtin_type_float;
450b725ae77Skettenis       else if (len == TYPE_LENGTH (builtin_type_double))
451e93f7393Sniklas         type = builtin_type_double;
452b725ae77Skettenis       else if (len == TYPE_LENGTH (builtin_type_long_double))
453b725ae77Skettenis         type = builtin_type_long_double;
454e93f7393Sniklas       print_floating (valaddr, type, stream);
455e93f7393Sniklas       break;
456e93f7393Sniklas 
457e93f7393Sniklas     case 0:
458b725ae77Skettenis       internal_error (__FILE__, __LINE__, "failed internal consistency check");
459e93f7393Sniklas 
460e93f7393Sniklas     case 't':
461e93f7393Sniklas       /* Binary; 't' stands for "two".  */
462e93f7393Sniklas       {
463e93f7393Sniklas 	char bits[8 * (sizeof val_long) + 1];
464b725ae77Skettenis 	char buf[8 * (sizeof val_long) + 32];
465e93f7393Sniklas 	char *cp = bits;
466e93f7393Sniklas 	int width;
467e93f7393Sniklas 
468e93f7393Sniklas 	if (!size)
469e93f7393Sniklas 	  width = 8 * (sizeof val_long);
470e93f7393Sniklas 	else
471e93f7393Sniklas 	  switch (size)
472e93f7393Sniklas 	    {
473e93f7393Sniklas 	    case 'b':
474e93f7393Sniklas 	      width = 8;
475e93f7393Sniklas 	      break;
476e93f7393Sniklas 	    case 'h':
477e93f7393Sniklas 	      width = 16;
478e93f7393Sniklas 	      break;
479e93f7393Sniklas 	    case 'w':
480e93f7393Sniklas 	      width = 32;
481e93f7393Sniklas 	      break;
482e93f7393Sniklas 	    case 'g':
483e93f7393Sniklas 	      width = 64;
484e93f7393Sniklas 	      break;
485e93f7393Sniklas 	    default:
486e93f7393Sniklas 	      error ("Undefined output size \"%c\".", size);
487e93f7393Sniklas 	    }
488e93f7393Sniklas 
489e93f7393Sniklas 	bits[width] = '\0';
490e93f7393Sniklas 	while (width-- > 0)
491e93f7393Sniklas 	  {
492e93f7393Sniklas 	    bits[width] = (val_long & 1) ? '1' : '0';
493e93f7393Sniklas 	    val_long >>= 1;
494e93f7393Sniklas 	  }
495e93f7393Sniklas 	if (!size)
496e93f7393Sniklas 	  {
497e93f7393Sniklas 	    while (*cp && *cp == '0')
498e93f7393Sniklas 	      cp++;
499e93f7393Sniklas 	    if (*cp == '\0')
500e93f7393Sniklas 	      cp--;
501e93f7393Sniklas 	  }
502*63addd46Skettenis 	strcpy (buf, cp);
503b725ae77Skettenis 	fputs_filtered (buf, stream);
504e93f7393Sniklas       }
505e93f7393Sniklas       break;
506e93f7393Sniklas 
507e93f7393Sniklas     default:
508e93f7393Sniklas       error ("Undefined output format \"%c\".", format);
509e93f7393Sniklas     }
510e93f7393Sniklas }
511e93f7393Sniklas 
512e93f7393Sniklas /* Specify default address for `x' command.
513e93f7393Sniklas    `info lines' uses this.  */
514e93f7393Sniklas 
515e93f7393Sniklas void
set_next_address(CORE_ADDR addr)516b725ae77Skettenis set_next_address (CORE_ADDR addr)
517e93f7393Sniklas {
518e93f7393Sniklas   next_address = addr;
519e93f7393Sniklas 
520e93f7393Sniklas   /* Make address available to the user as $_.  */
521e93f7393Sniklas   set_internalvar (lookup_internalvar ("_"),
522b725ae77Skettenis 		   value_from_pointer (lookup_pointer_type (builtin_type_void),
523b725ae77Skettenis 				       addr));
524e93f7393Sniklas }
525e93f7393Sniklas 
526e93f7393Sniklas /* Optionally print address ADDR symbolically as <SYMBOL+OFFSET> on STREAM,
527e93f7393Sniklas    after LEADIN.  Print nothing if no symbolic name is found nearby.
528e93f7393Sniklas    Optionally also print source file and line number, if available.
529e93f7393Sniklas    DO_DEMANGLE controls whether to print a symbol in its native "raw" form,
530e93f7393Sniklas    or to interpret it as a possible C++ name and convert it back to source
531e93f7393Sniklas    form.  However note that DO_DEMANGLE can be overridden by the specific
532e93f7393Sniklas    settings of the demangle and asm_demangle variables.  */
533e93f7393Sniklas 
534e93f7393Sniklas void
print_address_symbolic(CORE_ADDR addr,struct ui_file * stream,int do_demangle,char * leadin)535b725ae77Skettenis print_address_symbolic (CORE_ADDR addr, struct ui_file *stream, int do_demangle,
536b725ae77Skettenis 			char *leadin)
537b725ae77Skettenis {
538b725ae77Skettenis   char *name = NULL;
539b725ae77Skettenis   char *filename = NULL;
540b725ae77Skettenis   int unmapped = 0;
541b725ae77Skettenis   int offset = 0;
542b725ae77Skettenis   int line = 0;
543b725ae77Skettenis 
544b725ae77Skettenis   /* throw away both name and filename */
545b725ae77Skettenis   struct cleanup *cleanup_chain = make_cleanup (free_current_contents, &name);
546b725ae77Skettenis   make_cleanup (free_current_contents, &filename);
547b725ae77Skettenis 
548b725ae77Skettenis   if (build_address_symbolic (addr, do_demangle, &name, &offset, &filename, &line, &unmapped))
549b725ae77Skettenis     {
550b725ae77Skettenis       do_cleanups (cleanup_chain);
551b725ae77Skettenis       return;
552b725ae77Skettenis     }
553b725ae77Skettenis 
554b725ae77Skettenis   fputs_filtered (leadin, stream);
555b725ae77Skettenis   if (unmapped)
556b725ae77Skettenis     fputs_filtered ("<*", stream);
557b725ae77Skettenis   else
558b725ae77Skettenis     fputs_filtered ("<", stream);
559b725ae77Skettenis   fputs_filtered (name, stream);
560b725ae77Skettenis   if (offset != 0)
561b725ae77Skettenis     fprintf_filtered (stream, "+%u", (unsigned int) offset);
562b725ae77Skettenis 
563b725ae77Skettenis   /* Append source filename and line number if desired.  Give specific
564b725ae77Skettenis      line # of this addr, if we have it; else line # of the nearest symbol.  */
565b725ae77Skettenis   if (print_symbol_filename && filename != NULL)
566b725ae77Skettenis     {
567b725ae77Skettenis       if (line != -1)
568b725ae77Skettenis 	fprintf_filtered (stream, " at %s:%d", filename, line);
569b725ae77Skettenis       else
570b725ae77Skettenis 	fprintf_filtered (stream, " in %s", filename);
571b725ae77Skettenis     }
572b725ae77Skettenis   if (unmapped)
573b725ae77Skettenis     fputs_filtered ("*>", stream);
574b725ae77Skettenis   else
575b725ae77Skettenis     fputs_filtered (">", stream);
576b725ae77Skettenis 
577b725ae77Skettenis   do_cleanups (cleanup_chain);
578b725ae77Skettenis }
579b725ae77Skettenis 
580b725ae77Skettenis /* Given an address ADDR return all the elements needed to print the
581b725ae77Skettenis    address in a symbolic form. NAME can be mangled or not depending
582b725ae77Skettenis    on DO_DEMANGLE (and also on the asm_demangle global variable,
583b725ae77Skettenis    manipulated via ''set print asm-demangle''). Return 0 in case of
584b725ae77Skettenis    success, when all the info in the OUT paramters is valid. Return 1
585b725ae77Skettenis    otherwise. */
586b725ae77Skettenis int
build_address_symbolic(CORE_ADDR addr,int do_demangle,char ** name,int * offset,char ** filename,int * line,int * unmapped)587b725ae77Skettenis build_address_symbolic (CORE_ADDR addr,  /* IN */
588b725ae77Skettenis 			int do_demangle, /* IN */
589b725ae77Skettenis 			char **name,     /* OUT */
590b725ae77Skettenis 			int *offset,     /* OUT */
591b725ae77Skettenis 			char **filename, /* OUT */
592b725ae77Skettenis 			int *line,       /* OUT */
593b725ae77Skettenis 			int *unmapped)   /* OUT */
594e93f7393Sniklas {
595e93f7393Sniklas   struct minimal_symbol *msymbol;
596e93f7393Sniklas   struct symbol *symbol;
597e93f7393Sniklas   struct symtab *symtab = 0;
598e93f7393Sniklas   CORE_ADDR name_location = 0;
599b725ae77Skettenis   asection *section = 0;
600b725ae77Skettenis   char *name_temp = "";
601b725ae77Skettenis 
602b725ae77Skettenis   /* Let's say it is unmapped. */
603b725ae77Skettenis   *unmapped = 0;
604b725ae77Skettenis 
605b725ae77Skettenis   /* Determine if the address is in an overlay, and whether it is
606b725ae77Skettenis      mapped. */
607b725ae77Skettenis   if (overlay_debugging)
608b725ae77Skettenis     {
609b725ae77Skettenis       section = find_pc_overlay (addr);
610b725ae77Skettenis       if (pc_in_unmapped_range (addr, section))
611b725ae77Skettenis 	{
612b725ae77Skettenis 	  *unmapped = 1;
613b725ae77Skettenis 	  addr = overlay_mapped_address (addr, section);
614b725ae77Skettenis 	}
615b725ae77Skettenis     }
616e93f7393Sniklas 
617e93f7393Sniklas   /* First try to find the address in the symbol table, then
618e93f7393Sniklas      in the minsyms.  Take the closest one.  */
619e93f7393Sniklas 
620e93f7393Sniklas   /* This is defective in the sense that it only finds text symbols.  So
621e93f7393Sniklas      really this is kind of pointless--we should make sure that the
622e93f7393Sniklas      minimal symbols have everything we need (by changing that we could
623e93f7393Sniklas      save some memory, but for many debug format--ELF/DWARF or
624e93f7393Sniklas      anything/stabs--it would be inconvenient to eliminate those minimal
625e93f7393Sniklas      symbols anyway).  */
626b725ae77Skettenis   msymbol = lookup_minimal_symbol_by_pc_section (addr, section);
627b725ae77Skettenis   symbol = find_pc_sect_function (addr, section);
628e93f7393Sniklas 
629e93f7393Sniklas   if (symbol)
630e93f7393Sniklas     {
631b725ae77Skettenis       name_location = BLOCK_START (SYMBOL_BLOCK_VALUE (symbol));
632b725ae77Skettenis       if (do_demangle || asm_demangle)
633b725ae77Skettenis 	name_temp = SYMBOL_PRINT_NAME (symbol);
634e93f7393Sniklas       else
635b725ae77Skettenis 	name_temp = DEPRECATED_SYMBOL_NAME (symbol);
636e93f7393Sniklas     }
637e93f7393Sniklas 
638e93f7393Sniklas   if (msymbol != NULL)
639e93f7393Sniklas     {
640e93f7393Sniklas       if (SYMBOL_VALUE_ADDRESS (msymbol) > name_location || symbol == NULL)
641e93f7393Sniklas 	{
642e93f7393Sniklas 	  /* The msymbol is closer to the address than the symbol;
643e93f7393Sniklas 	     use the msymbol instead.  */
644e93f7393Sniklas 	  symbol = 0;
645e93f7393Sniklas 	  symtab = 0;
646e93f7393Sniklas 	  name_location = SYMBOL_VALUE_ADDRESS (msymbol);
647b725ae77Skettenis 	  if (do_demangle || asm_demangle)
648b725ae77Skettenis 	    name_temp = SYMBOL_PRINT_NAME (msymbol);
649e93f7393Sniklas 	  else
650b725ae77Skettenis 	    name_temp = DEPRECATED_SYMBOL_NAME (msymbol);
651e93f7393Sniklas 	}
652e93f7393Sniklas     }
653e93f7393Sniklas   if (symbol == NULL && msymbol == NULL)
654b725ae77Skettenis     return 1;
655e93f7393Sniklas 
656e93f7393Sniklas   /* If the nearest symbol is too far away, don't print anything symbolic.  */
657e93f7393Sniklas 
658e93f7393Sniklas   /* For when CORE_ADDR is larger than unsigned int, we do math in
659e93f7393Sniklas      CORE_ADDR.  But when we detect unsigned wraparound in the
660e93f7393Sniklas      CORE_ADDR math, we ignore this test and print the offset,
661e93f7393Sniklas      because addr+max_symbolic_offset has wrapped through the end
662e93f7393Sniklas      of the address space back to the beginning, giving bogus comparison.  */
663e93f7393Sniklas   if (addr > name_location + max_symbolic_offset
664e93f7393Sniklas       && name_location + max_symbolic_offset > name_location)
665b725ae77Skettenis     return 1;
666e93f7393Sniklas 
667b725ae77Skettenis   *offset = addr - name_location;
668e93f7393Sniklas 
669b725ae77Skettenis   *name = xstrdup (name_temp);
670b725ae77Skettenis 
671e93f7393Sniklas   if (print_symbol_filename)
672e93f7393Sniklas     {
673e93f7393Sniklas       struct symtab_and_line sal;
674e93f7393Sniklas 
675b725ae77Skettenis       sal = find_pc_sect_line (addr, section, 0);
676b725ae77Skettenis 
677e93f7393Sniklas       if (sal.symtab)
678b725ae77Skettenis 	{
679b725ae77Skettenis 	  *filename = xstrdup (sal.symtab->filename);
680b725ae77Skettenis 	  *line = sal.line;
681e93f7393Sniklas 	}
682b725ae77Skettenis       else if (symtab && symbol && symbol->line)
683b725ae77Skettenis 	{
684b725ae77Skettenis 	  *filename = xstrdup (symtab->filename);
685b725ae77Skettenis 	  *line = symbol->line;
686b725ae77Skettenis 	}
687b725ae77Skettenis       else if (symtab)
688b725ae77Skettenis 	{
689b725ae77Skettenis 	  *filename = xstrdup (symtab->filename);
690b725ae77Skettenis 	  *line = -1;
691b725ae77Skettenis 	}
692b725ae77Skettenis     }
693b725ae77Skettenis   return 0;
694e93f7393Sniklas }
695e93f7393Sniklas 
696e93f7393Sniklas /* Print address ADDR on STREAM.  USE_LOCAL means the same thing as for
697e93f7393Sniklas    print_longest.  */
698e93f7393Sniklas void
print_address_numeric(CORE_ADDR addr,int use_local,struct ui_file * stream)699b725ae77Skettenis print_address_numeric (CORE_ADDR addr, int use_local, struct ui_file *stream)
700e93f7393Sniklas {
701b725ae77Skettenis   /* Truncate address to the size of a target address, avoiding shifts
702b725ae77Skettenis      larger or equal than the width of a CORE_ADDR.  The local
703b725ae77Skettenis      variable ADDR_BIT stops the compiler reporting a shift overflow
704b725ae77Skettenis      when it won't occur. */
705b725ae77Skettenis   /* NOTE: This assumes that the significant address information is
706b725ae77Skettenis      kept in the least significant bits of ADDR - the upper bits were
707b725ae77Skettenis      either zero or sign extended.  Should ADDRESS_TO_POINTER() or
708b725ae77Skettenis      some ADDRESS_TO_PRINTABLE() be used to do the conversion?  */
709b725ae77Skettenis 
710b725ae77Skettenis   int addr_bit = TARGET_ADDR_BIT;
711b725ae77Skettenis 
712b725ae77Skettenis   if (addr_bit < (sizeof (CORE_ADDR) * HOST_CHAR_BIT))
713b725ae77Skettenis     addr &= ((CORE_ADDR) 1 << addr_bit) - 1;
714b725ae77Skettenis   print_longest (stream, 'x', use_local, (ULONGEST) addr);
715e93f7393Sniklas }
716e93f7393Sniklas 
717e93f7393Sniklas /* Print address ADDR symbolically on STREAM.
718e93f7393Sniklas    First print it as a number.  Then perhaps print
719e93f7393Sniklas    <SYMBOL + OFFSET> after the number.  */
720e93f7393Sniklas 
721e93f7393Sniklas void
print_address(CORE_ADDR addr,struct ui_file * stream)722b725ae77Skettenis print_address (CORE_ADDR addr, struct ui_file *stream)
723e93f7393Sniklas {
724e93f7393Sniklas   print_address_numeric (addr, 1, stream);
725e93f7393Sniklas   print_address_symbolic (addr, stream, asm_demangle, " ");
726e93f7393Sniklas }
727e93f7393Sniklas 
728e93f7393Sniklas /* Print address ADDR symbolically on STREAM.  Parameter DEMANGLE
729e93f7393Sniklas    controls whether to print the symbolic name "raw" or demangled.
730e93f7393Sniklas    Global setting "addressprint" controls whether to print hex address
731e93f7393Sniklas    or not.  */
732e93f7393Sniklas 
733e93f7393Sniklas void
print_address_demangle(CORE_ADDR addr,struct ui_file * stream,int do_demangle)734b725ae77Skettenis print_address_demangle (CORE_ADDR addr, struct ui_file *stream, int do_demangle)
735e93f7393Sniklas {
736e93f7393Sniklas   if (addr == 0)
737e93f7393Sniklas     {
738e93f7393Sniklas       fprintf_filtered (stream, "0");
739e93f7393Sniklas     }
740e93f7393Sniklas   else if (addressprint)
741e93f7393Sniklas     {
742e93f7393Sniklas       print_address_numeric (addr, 1, stream);
743e93f7393Sniklas       print_address_symbolic (addr, stream, do_demangle, " ");
744e93f7393Sniklas     }
745e93f7393Sniklas   else
746e93f7393Sniklas     {
747e93f7393Sniklas       print_address_symbolic (addr, stream, do_demangle, "");
748e93f7393Sniklas     }
749e93f7393Sniklas }
750e93f7393Sniklas 
751e93f7393Sniklas 
752e93f7393Sniklas /* These are the types that $__ will get after an examine command of one
753e93f7393Sniklas    of these sizes.  */
754e93f7393Sniklas 
755b725ae77Skettenis static struct type *examine_i_type;
756b725ae77Skettenis 
757e93f7393Sniklas static struct type *examine_b_type;
758e93f7393Sniklas static struct type *examine_h_type;
759e93f7393Sniklas static struct type *examine_w_type;
760e93f7393Sniklas static struct type *examine_g_type;
761e93f7393Sniklas 
762e93f7393Sniklas /* Examine data at address ADDR in format FMT.
763e93f7393Sniklas    Fetch it from memory and print on gdb_stdout.  */
764e93f7393Sniklas 
765e93f7393Sniklas static void
do_examine(struct format_data fmt,CORE_ADDR addr,asection * sect)766b725ae77Skettenis do_examine (struct format_data fmt, CORE_ADDR addr, asection *sect)
767e93f7393Sniklas {
768b725ae77Skettenis   char format = 0;
769b725ae77Skettenis   char size;
770b725ae77Skettenis   int count = 1;
771e93f7393Sniklas   struct type *val_type = NULL;
772b725ae77Skettenis   int i;
773b725ae77Skettenis   int maxelts;
774e93f7393Sniklas 
775e93f7393Sniklas   format = fmt.format;
776e93f7393Sniklas   size = fmt.size;
777e93f7393Sniklas   count = fmt.count;
778e93f7393Sniklas   next_address = addr;
779b725ae77Skettenis   next_section = sect;
780e93f7393Sniklas 
781e93f7393Sniklas   /* String or instruction format implies fetch single bytes
782e93f7393Sniklas      regardless of the specified size.  */
783e93f7393Sniklas   if (format == 's' || format == 'i')
784e93f7393Sniklas     size = 'b';
785e93f7393Sniklas 
786b725ae77Skettenis   if (format == 'i')
787b725ae77Skettenis     val_type = examine_i_type;
788b725ae77Skettenis   else if (size == 'b')
789e93f7393Sniklas     val_type = examine_b_type;
790e93f7393Sniklas   else if (size == 'h')
791e93f7393Sniklas     val_type = examine_h_type;
792e93f7393Sniklas   else if (size == 'w')
793e93f7393Sniklas     val_type = examine_w_type;
794e93f7393Sniklas   else if (size == 'g')
795e93f7393Sniklas     val_type = examine_g_type;
796e93f7393Sniklas 
797e93f7393Sniklas   maxelts = 8;
798e93f7393Sniklas   if (size == 'w')
799e93f7393Sniklas     maxelts = 4;
800e93f7393Sniklas   if (size == 'g')
801e93f7393Sniklas     maxelts = 2;
802e93f7393Sniklas   if (format == 's' || format == 'i')
803e93f7393Sniklas     maxelts = 1;
804e93f7393Sniklas 
805e93f7393Sniklas   /* Print as many objects as specified in COUNT, at most maxelts per line,
806e93f7393Sniklas      with the address of the next one at the start of each line.  */
807e93f7393Sniklas 
808e93f7393Sniklas   while (count > 0)
809e93f7393Sniklas     {
810e93f7393Sniklas       QUIT;
811e93f7393Sniklas       print_address (next_address, gdb_stdout);
812e93f7393Sniklas       printf_filtered (":");
813e93f7393Sniklas       for (i = maxelts;
814e93f7393Sniklas 	   i > 0 && count > 0;
815e93f7393Sniklas 	   i--, count--)
816e93f7393Sniklas 	{
817e93f7393Sniklas 	  printf_filtered ("\t");
818e93f7393Sniklas 	  /* Note that print_formatted sets next_address for the next
819e93f7393Sniklas 	     object.  */
820e93f7393Sniklas 	  last_examine_address = next_address;
821b725ae77Skettenis 
822b725ae77Skettenis 	  if (last_examine_value)
823b725ae77Skettenis 	    value_free (last_examine_value);
824b725ae77Skettenis 
825b725ae77Skettenis 	  /* The value to be displayed is not fetched greedily.
826b725ae77Skettenis 	     Instead, to avoid the posibility of a fetched value not
827b725ae77Skettenis 	     being used, its retreval is delayed until the print code
828b725ae77Skettenis 	     uses it.  When examining an instruction stream, the
829b725ae77Skettenis 	     disassembler will perform its own memory fetch using just
830b725ae77Skettenis 	     the address stored in LAST_EXAMINE_VALUE.  FIXME: Should
831b725ae77Skettenis 	     the disassembler be modified so that LAST_EXAMINE_VALUE
832b725ae77Skettenis 	     is left with the byte sequence from the last complete
833b725ae77Skettenis 	     instruction fetched from memory? */
834b725ae77Skettenis 	  last_examine_value = value_at_lazy (val_type, next_address, sect);
835b725ae77Skettenis 
836b725ae77Skettenis 	  if (last_examine_value)
837b725ae77Skettenis 	    release_value (last_examine_value);
838b725ae77Skettenis 
839b725ae77Skettenis 	  print_formatted (last_examine_value, format, size, gdb_stdout);
840e93f7393Sniklas 	}
841e93f7393Sniklas       printf_filtered ("\n");
842e93f7393Sniklas       gdb_flush (gdb_stdout);
843e93f7393Sniklas     }
844e93f7393Sniklas }
845e93f7393Sniklas 
846e93f7393Sniklas static void
validate_format(struct format_data fmt,char * cmdname)847b725ae77Skettenis validate_format (struct format_data fmt, char *cmdname)
848e93f7393Sniklas {
849e93f7393Sniklas   if (fmt.size != 0)
850e93f7393Sniklas     error ("Size letters are meaningless in \"%s\" command.", cmdname);
851e93f7393Sniklas   if (fmt.count != 1)
852e93f7393Sniklas     error ("Item count other than 1 is meaningless in \"%s\" command.",
853e93f7393Sniklas 	   cmdname);
854e93f7393Sniklas   if (fmt.format == 'i' || fmt.format == 's')
855e93f7393Sniklas     error ("Format letter \"%c\" is meaningless in \"%s\" command.",
856e93f7393Sniklas 	   fmt.format, cmdname);
857e93f7393Sniklas }
858e93f7393Sniklas 
859e93f7393Sniklas /*  Evaluate string EXP as an expression in the current language and
860e93f7393Sniklas    print the resulting value.  EXP may contain a format specifier as the
861e93f7393Sniklas    first argument ("/x myvar" for example, to print myvar in hex).
862e93f7393Sniklas  */
863e93f7393Sniklas 
864e93f7393Sniklas static void
print_command_1(char * exp,int inspect,int voidprint)865b725ae77Skettenis print_command_1 (char *exp, int inspect, int voidprint)
866e93f7393Sniklas {
867e93f7393Sniklas   struct expression *expr;
868b725ae77Skettenis   struct cleanup *old_chain = 0;
869b725ae77Skettenis   char format = 0;
870b725ae77Skettenis   struct value *val;
871e93f7393Sniklas   struct format_data fmt;
872e93f7393Sniklas   int cleanup = 0;
873e93f7393Sniklas 
874e93f7393Sniklas   /* Pass inspect flag to the rest of the print routines in a global (sigh). */
875e93f7393Sniklas   inspect_it = inspect;
876e93f7393Sniklas 
877e93f7393Sniklas   if (exp && *exp == '/')
878e93f7393Sniklas     {
879e93f7393Sniklas       exp++;
880e93f7393Sniklas       fmt = decode_format (&exp, last_format, 0);
881e93f7393Sniklas       validate_format (fmt, "print");
882e93f7393Sniklas       last_format = format = fmt.format;
883e93f7393Sniklas     }
884e93f7393Sniklas   else
885e93f7393Sniklas     {
886e93f7393Sniklas       fmt.count = 1;
887e93f7393Sniklas       fmt.format = 0;
888e93f7393Sniklas       fmt.size = 0;
889e93f7393Sniklas     }
890e93f7393Sniklas 
891e93f7393Sniklas   if (exp && *exp)
892e93f7393Sniklas     {
893e93f7393Sniklas       struct type *type;
894e93f7393Sniklas       expr = parse_expression (exp);
895e93f7393Sniklas       old_chain = make_cleanup (free_current_contents, &expr);
896e93f7393Sniklas       cleanup = 1;
897e93f7393Sniklas       val = evaluate_expression (expr);
898e93f7393Sniklas     }
899e93f7393Sniklas   else
900e93f7393Sniklas     val = access_value_history (0);
901e93f7393Sniklas 
902e93f7393Sniklas   if (voidprint || (val && VALUE_TYPE (val) &&
903e93f7393Sniklas 		    TYPE_CODE (VALUE_TYPE (val)) != TYPE_CODE_VOID))
904e93f7393Sniklas     {
905e93f7393Sniklas       int histindex = record_latest_value (val);
906e93f7393Sniklas 
907e93f7393Sniklas       if (histindex >= 0)
908e93f7393Sniklas 	annotate_value_history_begin (histindex, VALUE_TYPE (val));
909e93f7393Sniklas       else
910e93f7393Sniklas 	annotate_value_begin (VALUE_TYPE (val));
911e93f7393Sniklas 
912e93f7393Sniklas       if (inspect)
913e93f7393Sniklas 	printf_unfiltered ("\031(gdb-makebuffer \"%s\"  %d '(\"", exp, histindex);
914b725ae77Skettenis       else if (histindex >= 0)
915b725ae77Skettenis 	printf_filtered ("$%d = ", histindex);
916e93f7393Sniklas 
917e93f7393Sniklas       if (histindex >= 0)
918e93f7393Sniklas 	annotate_value_history_value ();
919e93f7393Sniklas 
920b725ae77Skettenis       print_formatted (val, format, fmt.size, gdb_stdout);
921e93f7393Sniklas       printf_filtered ("\n");
922e93f7393Sniklas 
923e93f7393Sniklas       if (histindex >= 0)
924e93f7393Sniklas 	annotate_value_history_end ();
925e93f7393Sniklas       else
926e93f7393Sniklas 	annotate_value_end ();
927e93f7393Sniklas 
928e93f7393Sniklas       if (inspect)
929e93f7393Sniklas 	printf_unfiltered ("\") )\030");
930e93f7393Sniklas     }
931e93f7393Sniklas 
932e93f7393Sniklas   if (cleanup)
933e93f7393Sniklas     do_cleanups (old_chain);
934e93f7393Sniklas   inspect_it = 0;		/* Reset print routines to normal */
935e93f7393Sniklas }
936e93f7393Sniklas 
937e93f7393Sniklas static void
print_command(char * exp,int from_tty)938b725ae77Skettenis print_command (char *exp, int from_tty)
939e93f7393Sniklas {
940e93f7393Sniklas   print_command_1 (exp, 0, 1);
941e93f7393Sniklas }
942e93f7393Sniklas 
943e93f7393Sniklas /* Same as print, except in epoch, it gets its own window */
944e93f7393Sniklas static void
inspect_command(char * exp,int from_tty)945b725ae77Skettenis inspect_command (char *exp, int from_tty)
946e93f7393Sniklas {
947e93f7393Sniklas   extern int epoch_interface;
948e93f7393Sniklas 
949e93f7393Sniklas   print_command_1 (exp, epoch_interface, 1);
950e93f7393Sniklas }
951e93f7393Sniklas 
952e93f7393Sniklas /* Same as print, except it doesn't print void results. */
953e93f7393Sniklas static void
call_command(char * exp,int from_tty)954b725ae77Skettenis call_command (char *exp, int from_tty)
955e93f7393Sniklas {
956e93f7393Sniklas   print_command_1 (exp, 0, 0);
957e93f7393Sniklas }
958e93f7393Sniklas 
959b725ae77Skettenis void
output_command(char * exp,int from_tty)960b725ae77Skettenis output_command (char *exp, int from_tty)
961e93f7393Sniklas {
962e93f7393Sniklas   struct expression *expr;
963b725ae77Skettenis   struct cleanup *old_chain;
964b725ae77Skettenis   char format = 0;
965b725ae77Skettenis   struct value *val;
966e93f7393Sniklas   struct format_data fmt;
967e93f7393Sniklas 
968e93f7393Sniklas   if (exp && *exp == '/')
969e93f7393Sniklas     {
970e93f7393Sniklas       exp++;
971e93f7393Sniklas       fmt = decode_format (&exp, 0, 0);
972e93f7393Sniklas       validate_format (fmt, "output");
973e93f7393Sniklas       format = fmt.format;
974e93f7393Sniklas     }
975e93f7393Sniklas 
976e93f7393Sniklas   expr = parse_expression (exp);
977e93f7393Sniklas   old_chain = make_cleanup (free_current_contents, &expr);
978e93f7393Sniklas 
979e93f7393Sniklas   val = evaluate_expression (expr);
980e93f7393Sniklas 
981e93f7393Sniklas   annotate_value_begin (VALUE_TYPE (val));
982e93f7393Sniklas 
983b725ae77Skettenis   print_formatted (val, format, fmt.size, gdb_stdout);
984e93f7393Sniklas 
985e93f7393Sniklas   annotate_value_end ();
986e93f7393Sniklas 
987b725ae77Skettenis   wrap_here ("");
988b725ae77Skettenis   gdb_flush (gdb_stdout);
989b725ae77Skettenis 
990e93f7393Sniklas   do_cleanups (old_chain);
991e93f7393Sniklas }
992e93f7393Sniklas 
993e93f7393Sniklas static void
set_command(char * exp,int from_tty)994b725ae77Skettenis set_command (char *exp, int from_tty)
995e93f7393Sniklas {
996e93f7393Sniklas   struct expression *expr = parse_expression (exp);
997b725ae77Skettenis   struct cleanup *old_chain =
998b725ae77Skettenis     make_cleanup (free_current_contents, &expr);
999e93f7393Sniklas   evaluate_expression (expr);
1000e93f7393Sniklas   do_cleanups (old_chain);
1001e93f7393Sniklas }
1002e93f7393Sniklas 
1003e93f7393Sniklas static void
sym_info(char * arg,int from_tty)1004b725ae77Skettenis sym_info (char *arg, int from_tty)
1005e93f7393Sniklas {
1006b725ae77Skettenis   struct minimal_symbol *msymbol;
1007b725ae77Skettenis   struct objfile *objfile;
1008b725ae77Skettenis   struct obj_section *osect;
1009b725ae77Skettenis   asection *sect;
1010b725ae77Skettenis   CORE_ADDR addr, sect_addr;
1011b725ae77Skettenis   int matches = 0;
1012b725ae77Skettenis   unsigned int offset;
1013b725ae77Skettenis 
1014b725ae77Skettenis   if (!arg)
1015b725ae77Skettenis     error_no_arg ("address");
1016b725ae77Skettenis 
1017b725ae77Skettenis   addr = parse_and_eval_address (arg);
1018b725ae77Skettenis   ALL_OBJSECTIONS (objfile, osect)
1019b725ae77Skettenis   {
1020b725ae77Skettenis     sect = osect->the_bfd_section;
1021b725ae77Skettenis     sect_addr = overlay_mapped_address (addr, sect);
1022b725ae77Skettenis 
1023b725ae77Skettenis     if (osect->addr <= sect_addr && sect_addr < osect->endaddr &&
1024b725ae77Skettenis 	(msymbol = lookup_minimal_symbol_by_pc_section (sect_addr, sect)))
1025b725ae77Skettenis       {
1026b725ae77Skettenis 	matches = 1;
1027b725ae77Skettenis 	offset = sect_addr - SYMBOL_VALUE_ADDRESS (msymbol);
1028b725ae77Skettenis 	if (offset)
1029b725ae77Skettenis 	  printf_filtered ("%s + %u in ",
1030b725ae77Skettenis 			   SYMBOL_PRINT_NAME (msymbol), offset);
1031b725ae77Skettenis 	else
1032b725ae77Skettenis 	  printf_filtered ("%s in ",
1033b725ae77Skettenis 			   SYMBOL_PRINT_NAME (msymbol));
1034b725ae77Skettenis 	if (pc_in_unmapped_range (addr, sect))
1035b725ae77Skettenis 	  printf_filtered ("load address range of ");
1036b725ae77Skettenis 	if (section_is_overlay (sect))
1037b725ae77Skettenis 	  printf_filtered ("%s overlay ",
1038b725ae77Skettenis 			   section_is_mapped (sect) ? "mapped" : "unmapped");
1039b725ae77Skettenis 	printf_filtered ("section %s", sect->name);
1040b725ae77Skettenis 	printf_filtered ("\n");
1041b725ae77Skettenis       }
1042b725ae77Skettenis   }
1043b725ae77Skettenis   if (matches == 0)
1044b725ae77Skettenis     printf_filtered ("No symbol matches %s.\n", arg);
1045b725ae77Skettenis }
1046b725ae77Skettenis 
1047b725ae77Skettenis static void
address_info(char * exp,int from_tty)1048b725ae77Skettenis address_info (char *exp, int from_tty)
1049b725ae77Skettenis {
1050b725ae77Skettenis   struct symbol *sym;
1051b725ae77Skettenis   struct minimal_symbol *msymbol;
1052b725ae77Skettenis   long val;
1053b725ae77Skettenis   long basereg;
1054b725ae77Skettenis   asection *section;
1055b725ae77Skettenis   CORE_ADDR load_addr;
1056e93f7393Sniklas   int is_a_field_of_this;	/* C++: lookup_symbol sets this to nonzero
1057e93f7393Sniklas 				   if exp is a field of `this'. */
1058e93f7393Sniklas 
1059e93f7393Sniklas   if (exp == 0)
1060e93f7393Sniklas     error ("Argument required.");
1061e93f7393Sniklas 
1062b725ae77Skettenis   sym = lookup_symbol (exp, get_selected_block (0), VAR_DOMAIN,
1063e93f7393Sniklas 		       &is_a_field_of_this, (struct symtab **) NULL);
1064e93f7393Sniklas   if (sym == NULL)
1065e93f7393Sniklas     {
1066e93f7393Sniklas       if (is_a_field_of_this)
1067e93f7393Sniklas 	{
1068e93f7393Sniklas 	  printf_filtered ("Symbol \"");
1069e93f7393Sniklas 	  fprintf_symbol_filtered (gdb_stdout, exp,
1070e93f7393Sniklas 				   current_language->la_language, DMGL_ANSI);
1071b725ae77Skettenis 	  printf_filtered ("\" is a field of the local class variable ");
1072b725ae77Skettenis 	  if (current_language->la_language == language_objc)
1073b725ae77Skettenis 	    printf_filtered ("`self'\n");	/* ObjC equivalent of "this" */
1074b725ae77Skettenis 	  else
1075b725ae77Skettenis 	    printf_filtered ("`this'\n");
1076e93f7393Sniklas 	  return;
1077e93f7393Sniklas 	}
1078e93f7393Sniklas 
1079e93f7393Sniklas       msymbol = lookup_minimal_symbol (exp, NULL, NULL);
1080e93f7393Sniklas 
1081e93f7393Sniklas       if (msymbol != NULL)
1082e93f7393Sniklas 	{
1083b725ae77Skettenis 	  load_addr = SYMBOL_VALUE_ADDRESS (msymbol);
1084b725ae77Skettenis 
1085e93f7393Sniklas 	  printf_filtered ("Symbol \"");
1086e93f7393Sniklas 	  fprintf_symbol_filtered (gdb_stdout, exp,
1087e93f7393Sniklas 				   current_language->la_language, DMGL_ANSI);
1088e93f7393Sniklas 	  printf_filtered ("\" is at ");
1089b725ae77Skettenis 	  print_address_numeric (load_addr, 1, gdb_stdout);
1090b725ae77Skettenis 	  printf_filtered (" in a file compiled without debugging");
1091b725ae77Skettenis 	  section = SYMBOL_BFD_SECTION (msymbol);
1092b725ae77Skettenis 	  if (section_is_overlay (section))
1093b725ae77Skettenis 	    {
1094b725ae77Skettenis 	      load_addr = overlay_unmapped_address (load_addr, section);
1095b725ae77Skettenis 	      printf_filtered (",\n -- loaded at ");
1096b725ae77Skettenis 	      print_address_numeric (load_addr, 1, gdb_stdout);
1097b725ae77Skettenis 	      printf_filtered (" in overlay section %s", section->name);
1098b725ae77Skettenis 	    }
1099b725ae77Skettenis 	  printf_filtered (".\n");
1100e93f7393Sniklas 	}
1101e93f7393Sniklas       else
1102e93f7393Sniklas 	error ("No symbol \"%s\" in current context.", exp);
1103e93f7393Sniklas       return;
1104e93f7393Sniklas     }
1105e93f7393Sniklas 
1106e93f7393Sniklas   printf_filtered ("Symbol \"");
1107b725ae77Skettenis   fprintf_symbol_filtered (gdb_stdout, DEPRECATED_SYMBOL_NAME (sym),
1108e93f7393Sniklas 			   current_language->la_language, DMGL_ANSI);
1109e93f7393Sniklas   printf_filtered ("\" is ");
1110e93f7393Sniklas   val = SYMBOL_VALUE (sym);
1111e93f7393Sniklas   basereg = SYMBOL_BASEREG (sym);
1112b725ae77Skettenis   section = SYMBOL_BFD_SECTION (sym);
1113e93f7393Sniklas 
1114e93f7393Sniklas   switch (SYMBOL_CLASS (sym))
1115e93f7393Sniklas     {
1116e93f7393Sniklas     case LOC_CONST:
1117e93f7393Sniklas     case LOC_CONST_BYTES:
1118e93f7393Sniklas       printf_filtered ("constant");
1119e93f7393Sniklas       break;
1120e93f7393Sniklas 
1121e93f7393Sniklas     case LOC_LABEL:
1122e93f7393Sniklas       printf_filtered ("a label at address ");
1123b725ae77Skettenis       print_address_numeric (load_addr = SYMBOL_VALUE_ADDRESS (sym),
1124b725ae77Skettenis 			     1, gdb_stdout);
1125b725ae77Skettenis       if (section_is_overlay (section))
1126b725ae77Skettenis 	{
1127b725ae77Skettenis 	  load_addr = overlay_unmapped_address (load_addr, section);
1128b725ae77Skettenis 	  printf_filtered (",\n -- loaded at ");
1129b725ae77Skettenis 	  print_address_numeric (load_addr, 1, gdb_stdout);
1130b725ae77Skettenis 	  printf_filtered (" in overlay section %s", section->name);
1131b725ae77Skettenis 	}
1132b725ae77Skettenis       break;
1133b725ae77Skettenis 
1134b725ae77Skettenis     case LOC_COMPUTED:
1135b725ae77Skettenis     case LOC_COMPUTED_ARG:
1136b725ae77Skettenis       /* FIXME: cagney/2004-01-26: It should be possible to
1137b725ae77Skettenis 	 unconditionally call the SYMBOL_OPS method when available.
1138b725ae77Skettenis 	 Unfortunately DWARF 2 stores the frame-base (instead of the
1139b725ae77Skettenis 	 function) location in a function's symbol.  Oops!  For the
1140b725ae77Skettenis 	 moment enable this when/where applicable.  */
1141b725ae77Skettenis       SYMBOL_OPS (sym)->describe_location (sym, gdb_stdout);
1142e93f7393Sniklas       break;
1143e93f7393Sniklas 
1144e93f7393Sniklas     case LOC_REGISTER:
1145b725ae77Skettenis       printf_filtered ("a variable in register %s", REGISTER_NAME (val));
1146e93f7393Sniklas       break;
1147e93f7393Sniklas 
1148e93f7393Sniklas     case LOC_STATIC:
1149e93f7393Sniklas       printf_filtered ("static storage at address ");
1150b725ae77Skettenis       print_address_numeric (load_addr = SYMBOL_VALUE_ADDRESS (sym),
1151b725ae77Skettenis 			     1, gdb_stdout);
1152b725ae77Skettenis       if (section_is_overlay (section))
1153b725ae77Skettenis 	{
1154b725ae77Skettenis 	  load_addr = overlay_unmapped_address (load_addr, section);
1155b725ae77Skettenis 	  printf_filtered (",\n -- loaded at ");
1156b725ae77Skettenis 	  print_address_numeric (load_addr, 1, gdb_stdout);
1157b725ae77Skettenis 	  printf_filtered (" in overlay section %s", section->name);
1158b725ae77Skettenis 	}
1159b725ae77Skettenis       break;
1160b725ae77Skettenis 
1161b725ae77Skettenis     case LOC_INDIRECT:
1162b725ae77Skettenis       printf_filtered ("external global (indirect addressing), at address *(");
1163b725ae77Skettenis       print_address_numeric (load_addr = SYMBOL_VALUE_ADDRESS (sym),
1164b725ae77Skettenis 			     1, gdb_stdout);
1165b725ae77Skettenis       printf_filtered (")");
1166b725ae77Skettenis       if (section_is_overlay (section))
1167b725ae77Skettenis 	{
1168b725ae77Skettenis 	  load_addr = overlay_unmapped_address (load_addr, section);
1169b725ae77Skettenis 	  printf_filtered (",\n -- loaded at ");
1170b725ae77Skettenis 	  print_address_numeric (load_addr, 1, gdb_stdout);
1171b725ae77Skettenis 	  printf_filtered (" in overlay section %s", section->name);
1172b725ae77Skettenis 	}
1173e93f7393Sniklas       break;
1174e93f7393Sniklas 
1175e93f7393Sniklas     case LOC_REGPARM:
1176b725ae77Skettenis       printf_filtered ("an argument in register %s", REGISTER_NAME (val));
1177e93f7393Sniklas       break;
1178e93f7393Sniklas 
1179e93f7393Sniklas     case LOC_REGPARM_ADDR:
1180b725ae77Skettenis       printf_filtered ("address of an argument in register %s", REGISTER_NAME (val));
1181e93f7393Sniklas       break;
1182e93f7393Sniklas 
1183e93f7393Sniklas     case LOC_ARG:
1184e93f7393Sniklas       printf_filtered ("an argument at offset %ld", val);
1185e93f7393Sniklas       break;
1186e93f7393Sniklas 
1187e93f7393Sniklas     case LOC_LOCAL_ARG:
1188e93f7393Sniklas       printf_filtered ("an argument at frame offset %ld", val);
1189e93f7393Sniklas       break;
1190e93f7393Sniklas 
1191e93f7393Sniklas     case LOC_LOCAL:
1192e93f7393Sniklas       printf_filtered ("a local variable at frame offset %ld", val);
1193e93f7393Sniklas       break;
1194e93f7393Sniklas 
1195e93f7393Sniklas     case LOC_REF_ARG:
1196e93f7393Sniklas       printf_filtered ("a reference argument at offset %ld", val);
1197e93f7393Sniklas       break;
1198e93f7393Sniklas 
1199e93f7393Sniklas     case LOC_BASEREG:
1200e93f7393Sniklas       printf_filtered ("a variable at offset %ld from register %s",
1201b725ae77Skettenis 		       val, REGISTER_NAME (basereg));
1202e93f7393Sniklas       break;
1203e93f7393Sniklas 
1204e93f7393Sniklas     case LOC_BASEREG_ARG:
1205e93f7393Sniklas       printf_filtered ("an argument at offset %ld from register %s",
1206b725ae77Skettenis 		       val, REGISTER_NAME (basereg));
1207e93f7393Sniklas       break;
1208e93f7393Sniklas 
1209e93f7393Sniklas     case LOC_TYPEDEF:
1210e93f7393Sniklas       printf_filtered ("a typedef");
1211e93f7393Sniklas       break;
1212e93f7393Sniklas 
1213e93f7393Sniklas     case LOC_BLOCK:
1214e93f7393Sniklas       printf_filtered ("a function at address ");
1215b725ae77Skettenis       print_address_numeric (load_addr = BLOCK_START (SYMBOL_BLOCK_VALUE (sym)),
1216b725ae77Skettenis 			     1, gdb_stdout);
1217b725ae77Skettenis       if (section_is_overlay (section))
1218b725ae77Skettenis 	{
1219b725ae77Skettenis 	  load_addr = overlay_unmapped_address (load_addr, section);
1220b725ae77Skettenis 	  printf_filtered (",\n -- loaded at ");
1221b725ae77Skettenis 	  print_address_numeric (load_addr, 1, gdb_stdout);
1222b725ae77Skettenis 	  printf_filtered (" in overlay section %s", section->name);
1223b725ae77Skettenis 	}
1224e93f7393Sniklas       break;
1225e93f7393Sniklas 
1226e93f7393Sniklas     case LOC_UNRESOLVED:
1227e93f7393Sniklas       {
1228e93f7393Sniklas 	struct minimal_symbol *msym;
1229e93f7393Sniklas 
1230b725ae77Skettenis 	msym = lookup_minimal_symbol (DEPRECATED_SYMBOL_NAME (sym), NULL, NULL);
1231e93f7393Sniklas 	if (msym == NULL)
1232e93f7393Sniklas 	  printf_filtered ("unresolved");
1233e93f7393Sniklas 	else
1234e93f7393Sniklas 	  {
1235b725ae77Skettenis 	    section = SYMBOL_BFD_SECTION (msym);
1236e93f7393Sniklas 	    printf_filtered ("static storage at address ");
1237b725ae77Skettenis 	    print_address_numeric (load_addr = SYMBOL_VALUE_ADDRESS (msym),
1238b725ae77Skettenis 				   1, gdb_stdout);
1239b725ae77Skettenis 	    if (section_is_overlay (section))
1240b725ae77Skettenis 	      {
1241b725ae77Skettenis 		load_addr = overlay_unmapped_address (load_addr, section);
1242b725ae77Skettenis 		printf_filtered (",\n -- loaded at ");
1243b725ae77Skettenis 		print_address_numeric (load_addr, 1, gdb_stdout);
1244b725ae77Skettenis 		printf_filtered (" in overlay section %s", section->name);
1245e93f7393Sniklas 	      }
1246e93f7393Sniklas 	  }
1247b725ae77Skettenis       }
1248b725ae77Skettenis       break;
1249b725ae77Skettenis 
1250b725ae77Skettenis     case LOC_HP_THREAD_LOCAL_STATIC:
1251b725ae77Skettenis       printf_filtered (
1252b725ae77Skettenis 			"a thread-local variable at offset %ld from the thread base register %s",
1253b725ae77Skettenis 			val, REGISTER_NAME (basereg));
1254e93f7393Sniklas       break;
1255e93f7393Sniklas 
1256e93f7393Sniklas     case LOC_OPTIMIZED_OUT:
1257e93f7393Sniklas       printf_filtered ("optimized out");
1258e93f7393Sniklas       break;
1259e93f7393Sniklas 
1260e93f7393Sniklas     default:
1261e93f7393Sniklas       printf_filtered ("of unknown (botched) type");
1262e93f7393Sniklas       break;
1263e93f7393Sniklas     }
1264e93f7393Sniklas   printf_filtered (".\n");
1265e93f7393Sniklas }
1266e93f7393Sniklas 
1267b725ae77Skettenis void
x_command(char * exp,int from_tty)1268b725ae77Skettenis x_command (char *exp, int from_tty)
1269e93f7393Sniklas {
1270e93f7393Sniklas   struct expression *expr;
1271e93f7393Sniklas   struct format_data fmt;
1272e93f7393Sniklas   struct cleanup *old_chain;
1273e93f7393Sniklas   struct value *val;
1274e93f7393Sniklas 
1275e93f7393Sniklas   fmt.format = last_format;
1276e93f7393Sniklas   fmt.size = last_size;
1277e93f7393Sniklas   fmt.count = 1;
1278e93f7393Sniklas 
1279e93f7393Sniklas   if (exp && *exp == '/')
1280e93f7393Sniklas     {
1281e93f7393Sniklas       exp++;
1282e93f7393Sniklas       fmt = decode_format (&exp, last_format, last_size);
1283e93f7393Sniklas     }
1284e93f7393Sniklas 
1285e93f7393Sniklas   /* If we have an expression, evaluate it and use it as the address.  */
1286e93f7393Sniklas 
1287e93f7393Sniklas   if (exp != 0 && *exp != 0)
1288e93f7393Sniklas     {
1289e93f7393Sniklas       expr = parse_expression (exp);
1290e93f7393Sniklas       /* Cause expression not to be there any more
1291e93f7393Sniklas          if this command is repeated with Newline.
1292e93f7393Sniklas          But don't clobber a user-defined command's definition.  */
1293e93f7393Sniklas       if (from_tty)
1294e93f7393Sniklas 	*exp = 0;
1295e93f7393Sniklas       old_chain = make_cleanup (free_current_contents, &expr);
1296e93f7393Sniklas       val = evaluate_expression (expr);
1297e93f7393Sniklas       if (TYPE_CODE (VALUE_TYPE (val)) == TYPE_CODE_REF)
1298e93f7393Sniklas 	val = value_ind (val);
1299e93f7393Sniklas       /* In rvalue contexts, such as this, functions are coerced into
1300e93f7393Sniklas          pointers to functions.  This makes "x/i main" work.  */
1301b725ae77Skettenis       if (/* last_format == 'i'  && */
1302b725ae77Skettenis 	  TYPE_CODE (VALUE_TYPE (val)) == TYPE_CODE_FUNC
1303e93f7393Sniklas 	   && VALUE_LVAL (val) == lval_memory)
1304e93f7393Sniklas 	next_address = VALUE_ADDRESS (val);
1305e93f7393Sniklas       else
1306b725ae77Skettenis 	next_address = value_as_address (val);
1307b725ae77Skettenis       if (VALUE_BFD_SECTION (val))
1308b725ae77Skettenis 	next_section = VALUE_BFD_SECTION (val);
1309e93f7393Sniklas       do_cleanups (old_chain);
1310e93f7393Sniklas     }
1311e93f7393Sniklas 
1312b725ae77Skettenis   do_examine (fmt, next_address, next_section);
1313e93f7393Sniklas 
1314e93f7393Sniklas   /* If the examine succeeds, we remember its size and format for next time.  */
1315e93f7393Sniklas   last_size = fmt.size;
1316e93f7393Sniklas   last_format = fmt.format;
1317e93f7393Sniklas 
1318e93f7393Sniklas   /* Set a couple of internal variables if appropriate. */
1319e93f7393Sniklas   if (last_examine_value)
1320e93f7393Sniklas     {
1321e93f7393Sniklas       /* Make last address examined available to the user as $_.  Use
1322e93f7393Sniklas          the correct pointer type.  */
1323b725ae77Skettenis       struct type *pointer_type
1324b725ae77Skettenis 	= lookup_pointer_type (VALUE_TYPE (last_examine_value));
1325e93f7393Sniklas       set_internalvar (lookup_internalvar ("_"),
1326b725ae77Skettenis 		       value_from_pointer (pointer_type,
1327b725ae77Skettenis 					   last_examine_address));
1328e93f7393Sniklas 
1329e93f7393Sniklas       /* Make contents of last address examined available to the user as $__. */
1330b725ae77Skettenis       /* If the last value has not been fetched from memory then don't
1331b725ae77Skettenis          fetch it now - instead mark it by voiding the $__ variable. */
1332b725ae77Skettenis       if (VALUE_LAZY (last_examine_value))
1333b725ae77Skettenis 	set_internalvar (lookup_internalvar ("__"),
1334b725ae77Skettenis 			 allocate_value (builtin_type_void));
1335b725ae77Skettenis       else
1336e93f7393Sniklas 	set_internalvar (lookup_internalvar ("__"), last_examine_value);
1337e93f7393Sniklas     }
1338e93f7393Sniklas }
1339e93f7393Sniklas 
1340b725ae77Skettenis 
1341e93f7393Sniklas /* Add an expression to the auto-display chain.
1342e93f7393Sniklas    Specify the expression.  */
1343e93f7393Sniklas 
1344e93f7393Sniklas static void
display_command(char * exp,int from_tty)1345b725ae77Skettenis display_command (char *exp, int from_tty)
1346e93f7393Sniklas {
1347e93f7393Sniklas   struct format_data fmt;
1348b725ae77Skettenis   struct expression *expr;
1349b725ae77Skettenis   struct display *new;
1350b725ae77Skettenis   int display_it = 1;
1351e93f7393Sniklas 
1352b725ae77Skettenis #if defined(TUI)
1353b725ae77Skettenis   /* NOTE: cagney/2003-02-13 The `tui_active' was previously
1354b725ae77Skettenis      `tui_version'.  */
1355b725ae77Skettenis   if (tui_active && exp != NULL && *exp == '$')
1356b725ae77Skettenis     display_it = (tui_set_layout_for_display_command (exp) == TUI_FAILURE);
1357b725ae77Skettenis #endif
1358b725ae77Skettenis 
1359b725ae77Skettenis   if (display_it)
1360b725ae77Skettenis     {
1361e93f7393Sniklas       if (exp == 0)
1362e93f7393Sniklas 	{
1363e93f7393Sniklas 	  do_displays ();
1364e93f7393Sniklas 	  return;
1365e93f7393Sniklas 	}
1366e93f7393Sniklas 
1367e93f7393Sniklas       if (*exp == '/')
1368e93f7393Sniklas 	{
1369e93f7393Sniklas 	  exp++;
1370e93f7393Sniklas 	  fmt = decode_format (&exp, 0, 0);
1371e93f7393Sniklas 	  if (fmt.size && fmt.format == 0)
1372e93f7393Sniklas 	    fmt.format = 'x';
1373e93f7393Sniklas 	  if (fmt.format == 'i' || fmt.format == 's')
1374e93f7393Sniklas 	    fmt.size = 'b';
1375e93f7393Sniklas 	}
1376e93f7393Sniklas       else
1377e93f7393Sniklas 	{
1378e93f7393Sniklas 	  fmt.format = 0;
1379e93f7393Sniklas 	  fmt.size = 0;
1380e93f7393Sniklas 	  fmt.count = 0;
1381e93f7393Sniklas 	}
1382e93f7393Sniklas 
1383e93f7393Sniklas       innermost_block = 0;
1384e93f7393Sniklas       expr = parse_expression (exp);
1385e93f7393Sniklas 
1386e93f7393Sniklas       new = (struct display *) xmalloc (sizeof (struct display));
1387e93f7393Sniklas 
1388e93f7393Sniklas       new->exp = expr;
1389e93f7393Sniklas       new->block = innermost_block;
1390e93f7393Sniklas       new->next = display_chain;
1391e93f7393Sniklas       new->number = ++display_number;
1392e93f7393Sniklas       new->format = fmt;
1393b725ae77Skettenis       new->enabled_p = 1;
1394e93f7393Sniklas       display_chain = new;
1395e93f7393Sniklas 
1396e93f7393Sniklas       if (from_tty && target_has_execution)
1397e93f7393Sniklas 	do_one_display (new);
1398e93f7393Sniklas 
1399e93f7393Sniklas       dont_repeat ();
1400e93f7393Sniklas     }
1401b725ae77Skettenis }
1402e93f7393Sniklas 
1403e93f7393Sniklas static void
free_display(struct display * d)1404b725ae77Skettenis free_display (struct display *d)
1405e93f7393Sniklas {
1406b725ae77Skettenis   xfree (d->exp);
1407b725ae77Skettenis   xfree (d);
1408e93f7393Sniklas }
1409e93f7393Sniklas 
1410e93f7393Sniklas /* Clear out the display_chain.
1411e93f7393Sniklas    Done when new symtabs are loaded, since this invalidates
1412e93f7393Sniklas    the types stored in many expressions.  */
1413e93f7393Sniklas 
1414e93f7393Sniklas void
clear_displays(void)1415b725ae77Skettenis clear_displays (void)
1416e93f7393Sniklas {
1417b725ae77Skettenis   struct display *d;
1418e93f7393Sniklas 
1419e93f7393Sniklas   while ((d = display_chain) != NULL)
1420e93f7393Sniklas     {
1421b725ae77Skettenis       xfree (d->exp);
1422e93f7393Sniklas       display_chain = d->next;
1423b725ae77Skettenis       xfree (d);
1424e93f7393Sniklas     }
1425e93f7393Sniklas }
1426e93f7393Sniklas 
1427e93f7393Sniklas /* Delete the auto-display number NUM.  */
1428e93f7393Sniklas 
1429e93f7393Sniklas static void
delete_display(int num)1430b725ae77Skettenis delete_display (int num)
1431e93f7393Sniklas {
1432b725ae77Skettenis   struct display *d1, *d;
1433e93f7393Sniklas 
1434e93f7393Sniklas   if (!display_chain)
1435e93f7393Sniklas     error ("No display number %d.", num);
1436e93f7393Sniklas 
1437e93f7393Sniklas   if (display_chain->number == num)
1438e93f7393Sniklas     {
1439e93f7393Sniklas       d1 = display_chain;
1440e93f7393Sniklas       display_chain = d1->next;
1441e93f7393Sniklas       free_display (d1);
1442e93f7393Sniklas     }
1443e93f7393Sniklas   else
1444e93f7393Sniklas     for (d = display_chain;; d = d->next)
1445e93f7393Sniklas       {
1446e93f7393Sniklas 	if (d->next == 0)
1447e93f7393Sniklas 	  error ("No display number %d.", num);
1448e93f7393Sniklas 	if (d->next->number == num)
1449e93f7393Sniklas 	  {
1450e93f7393Sniklas 	    d1 = d->next;
1451e93f7393Sniklas 	    d->next = d1->next;
1452e93f7393Sniklas 	    free_display (d1);
1453e93f7393Sniklas 	    break;
1454e93f7393Sniklas 	  }
1455e93f7393Sniklas       }
1456e93f7393Sniklas }
1457e93f7393Sniklas 
1458e93f7393Sniklas /* Delete some values from the auto-display chain.
1459e93f7393Sniklas    Specify the element numbers.  */
1460e93f7393Sniklas 
1461e93f7393Sniklas static void
undisplay_command(char * args,int from_tty)1462b725ae77Skettenis undisplay_command (char *args, int from_tty)
1463e93f7393Sniklas {
1464b725ae77Skettenis   char *p = args;
1465b725ae77Skettenis   char *p1;
1466b725ae77Skettenis   int num;
1467e93f7393Sniklas 
1468e93f7393Sniklas   if (args == 0)
1469e93f7393Sniklas     {
1470e93f7393Sniklas       if (query ("Delete all auto-display expressions? "))
1471e93f7393Sniklas 	clear_displays ();
1472e93f7393Sniklas       dont_repeat ();
1473e93f7393Sniklas       return;
1474e93f7393Sniklas     }
1475e93f7393Sniklas 
1476e93f7393Sniklas   while (*p)
1477e93f7393Sniklas     {
1478e93f7393Sniklas       p1 = p;
1479b725ae77Skettenis       while (*p1 >= '0' && *p1 <= '9')
1480b725ae77Skettenis 	p1++;
1481e93f7393Sniklas       if (*p1 && *p1 != ' ' && *p1 != '\t')
1482e93f7393Sniklas 	error ("Arguments must be display numbers.");
1483e93f7393Sniklas 
1484e93f7393Sniklas       num = atoi (p);
1485e93f7393Sniklas 
1486e93f7393Sniklas       delete_display (num);
1487e93f7393Sniklas 
1488e93f7393Sniklas       p = p1;
1489b725ae77Skettenis       while (*p == ' ' || *p == '\t')
1490b725ae77Skettenis 	p++;
1491e93f7393Sniklas     }
1492e93f7393Sniklas   dont_repeat ();
1493e93f7393Sniklas }
1494e93f7393Sniklas 
1495e93f7393Sniklas /* Display a single auto-display.
1496e93f7393Sniklas    Do nothing if the display cannot be printed in the current context,
1497e93f7393Sniklas    or if the display is disabled. */
1498e93f7393Sniklas 
1499e93f7393Sniklas static void
do_one_display(struct display * d)1500b725ae77Skettenis do_one_display (struct display *d)
1501e93f7393Sniklas {
1502e93f7393Sniklas   int within_current_scope;
1503e93f7393Sniklas 
1504b725ae77Skettenis   if (d->enabled_p == 0)
1505e93f7393Sniklas     return;
1506e93f7393Sniklas 
1507e93f7393Sniklas   if (d->block)
1508b725ae77Skettenis     within_current_scope = contained_in (get_selected_block (0), d->block);
1509e93f7393Sniklas   else
1510e93f7393Sniklas     within_current_scope = 1;
1511e93f7393Sniklas   if (!within_current_scope)
1512e93f7393Sniklas     return;
1513e93f7393Sniklas 
1514e93f7393Sniklas   current_display_number = d->number;
1515e93f7393Sniklas 
1516e93f7393Sniklas   annotate_display_begin ();
1517e93f7393Sniklas   printf_filtered ("%d", d->number);
1518e93f7393Sniklas   annotate_display_number_end ();
1519e93f7393Sniklas   printf_filtered (": ");
1520e93f7393Sniklas   if (d->format.size)
1521e93f7393Sniklas     {
1522e93f7393Sniklas       CORE_ADDR addr;
1523b725ae77Skettenis       struct value *val;
1524e93f7393Sniklas 
1525e93f7393Sniklas       annotate_display_format ();
1526e93f7393Sniklas 
1527e93f7393Sniklas       printf_filtered ("x/");
1528e93f7393Sniklas       if (d->format.count != 1)
1529e93f7393Sniklas 	printf_filtered ("%d", d->format.count);
1530e93f7393Sniklas       printf_filtered ("%c", d->format.format);
1531e93f7393Sniklas       if (d->format.format != 'i' && d->format.format != 's')
1532e93f7393Sniklas 	printf_filtered ("%c", d->format.size);
1533e93f7393Sniklas       printf_filtered (" ");
1534e93f7393Sniklas 
1535e93f7393Sniklas       annotate_display_expression ();
1536e93f7393Sniklas 
1537e93f7393Sniklas       print_expression (d->exp, gdb_stdout);
1538e93f7393Sniklas       annotate_display_expression_end ();
1539e93f7393Sniklas 
1540e93f7393Sniklas       if (d->format.count != 1)
1541e93f7393Sniklas 	printf_filtered ("\n");
1542e93f7393Sniklas       else
1543e93f7393Sniklas 	printf_filtered ("  ");
1544e93f7393Sniklas 
1545b725ae77Skettenis       val = evaluate_expression (d->exp);
1546b725ae77Skettenis       addr = value_as_address (val);
1547e93f7393Sniklas       if (d->format.format == 'i')
1548e93f7393Sniklas 	addr = ADDR_BITS_REMOVE (addr);
1549e93f7393Sniklas 
1550e93f7393Sniklas       annotate_display_value ();
1551e93f7393Sniklas 
1552b725ae77Skettenis       do_examine (d->format, addr, VALUE_BFD_SECTION (val));
1553e93f7393Sniklas     }
1554e93f7393Sniklas   else
1555e93f7393Sniklas     {
1556e93f7393Sniklas       annotate_display_format ();
1557e93f7393Sniklas 
1558e93f7393Sniklas       if (d->format.format)
1559e93f7393Sniklas 	printf_filtered ("/%c ", d->format.format);
1560e93f7393Sniklas 
1561e93f7393Sniklas       annotate_display_expression ();
1562e93f7393Sniklas 
1563e93f7393Sniklas       print_expression (d->exp, gdb_stdout);
1564e93f7393Sniklas       annotate_display_expression_end ();
1565e93f7393Sniklas 
1566e93f7393Sniklas       printf_filtered (" = ");
1567e93f7393Sniklas 
1568e93f7393Sniklas       annotate_display_expression ();
1569e93f7393Sniklas 
1570e93f7393Sniklas       print_formatted (evaluate_expression (d->exp),
1571b725ae77Skettenis 		       d->format.format, d->format.size, gdb_stdout);
1572e93f7393Sniklas       printf_filtered ("\n");
1573e93f7393Sniklas     }
1574e93f7393Sniklas 
1575e93f7393Sniklas   annotate_display_end ();
1576e93f7393Sniklas 
1577e93f7393Sniklas   gdb_flush (gdb_stdout);
1578e93f7393Sniklas   current_display_number = -1;
1579e93f7393Sniklas }
1580e93f7393Sniklas 
1581e93f7393Sniklas /* Display all of the values on the auto-display chain which can be
1582e93f7393Sniklas    evaluated in the current scope.  */
1583e93f7393Sniklas 
1584e93f7393Sniklas void
do_displays(void)1585b725ae77Skettenis do_displays (void)
1586e93f7393Sniklas {
1587b725ae77Skettenis   struct display *d;
1588e93f7393Sniklas 
1589e93f7393Sniklas   for (d = display_chain; d; d = d->next)
1590e93f7393Sniklas     do_one_display (d);
1591e93f7393Sniklas }
1592e93f7393Sniklas 
1593e93f7393Sniklas /* Delete the auto-display which we were in the process of displaying.
1594e93f7393Sniklas    This is done when there is an error or a signal.  */
1595e93f7393Sniklas 
1596e93f7393Sniklas void
disable_display(int num)1597b725ae77Skettenis disable_display (int num)
1598e93f7393Sniklas {
1599b725ae77Skettenis   struct display *d;
1600e93f7393Sniklas 
1601e93f7393Sniklas   for (d = display_chain; d; d = d->next)
1602e93f7393Sniklas     if (d->number == num)
1603e93f7393Sniklas       {
1604b725ae77Skettenis 	d->enabled_p = 0;
1605e93f7393Sniklas 	return;
1606e93f7393Sniklas       }
1607e93f7393Sniklas   printf_unfiltered ("No display number %d.\n", num);
1608e93f7393Sniklas }
1609e93f7393Sniklas 
1610e93f7393Sniklas void
disable_current_display(void)1611b725ae77Skettenis disable_current_display (void)
1612e93f7393Sniklas {
1613e93f7393Sniklas   if (current_display_number >= 0)
1614e93f7393Sniklas     {
1615e93f7393Sniklas       disable_display (current_display_number);
1616e93f7393Sniklas       fprintf_unfiltered (gdb_stderr, "Disabling display %d to avoid infinite recursion.\n",
1617e93f7393Sniklas 			  current_display_number);
1618e93f7393Sniklas     }
1619e93f7393Sniklas   current_display_number = -1;
1620e93f7393Sniklas }
1621e93f7393Sniklas 
1622e93f7393Sniklas static void
display_info(char * ignore,int from_tty)1623b725ae77Skettenis display_info (char *ignore, int from_tty)
1624e93f7393Sniklas {
1625b725ae77Skettenis   struct display *d;
1626e93f7393Sniklas 
1627e93f7393Sniklas   if (!display_chain)
1628e93f7393Sniklas     printf_unfiltered ("There are no auto-display expressions now.\n");
1629e93f7393Sniklas   else
1630e93f7393Sniklas     printf_filtered ("Auto-display expressions now in effect:\n\
1631e93f7393Sniklas Num Enb Expression\n");
1632e93f7393Sniklas 
1633e93f7393Sniklas   for (d = display_chain; d; d = d->next)
1634e93f7393Sniklas     {
1635b725ae77Skettenis       printf_filtered ("%d:   %c  ", d->number, "ny"[(int) d->enabled_p]);
1636e93f7393Sniklas       if (d->format.size)
1637e93f7393Sniklas 	printf_filtered ("/%d%c%c ", d->format.count, d->format.size,
1638e93f7393Sniklas 			 d->format.format);
1639e93f7393Sniklas       else if (d->format.format)
1640e93f7393Sniklas 	printf_filtered ("/%c ", d->format.format);
1641e93f7393Sniklas       print_expression (d->exp, gdb_stdout);
1642b725ae77Skettenis       if (d->block && !contained_in (get_selected_block (0), d->block))
1643e93f7393Sniklas 	printf_filtered (" (cannot be evaluated in the current context)");
1644e93f7393Sniklas       printf_filtered ("\n");
1645e93f7393Sniklas       gdb_flush (gdb_stdout);
1646e93f7393Sniklas     }
1647e93f7393Sniklas }
1648e93f7393Sniklas 
1649e93f7393Sniklas static void
enable_display(char * args,int from_tty)1650b725ae77Skettenis enable_display (char *args, int from_tty)
1651e93f7393Sniklas {
1652b725ae77Skettenis   char *p = args;
1653b725ae77Skettenis   char *p1;
1654b725ae77Skettenis   int num;
1655b725ae77Skettenis   struct display *d;
1656e93f7393Sniklas 
1657e93f7393Sniklas   if (p == 0)
1658e93f7393Sniklas     {
1659e93f7393Sniklas       for (d = display_chain; d; d = d->next)
1660b725ae77Skettenis 	d->enabled_p = 1;
1661e93f7393Sniklas     }
1662e93f7393Sniklas   else
1663e93f7393Sniklas     while (*p)
1664e93f7393Sniklas       {
1665e93f7393Sniklas 	p1 = p;
1666e93f7393Sniklas 	while (*p1 >= '0' && *p1 <= '9')
1667e93f7393Sniklas 	  p1++;
1668e93f7393Sniklas 	if (*p1 && *p1 != ' ' && *p1 != '\t')
1669e93f7393Sniklas 	  error ("Arguments must be display numbers.");
1670e93f7393Sniklas 
1671e93f7393Sniklas 	num = atoi (p);
1672e93f7393Sniklas 
1673e93f7393Sniklas 	for (d = display_chain; d; d = d->next)
1674e93f7393Sniklas 	  if (d->number == num)
1675e93f7393Sniklas 	    {
1676b725ae77Skettenis 	      d->enabled_p = 1;
1677e93f7393Sniklas 	      goto win;
1678e93f7393Sniklas 	    }
1679e93f7393Sniklas 	printf_unfiltered ("No display number %d.\n", num);
1680e93f7393Sniklas       win:
1681e93f7393Sniklas 	p = p1;
1682e93f7393Sniklas 	while (*p == ' ' || *p == '\t')
1683e93f7393Sniklas 	  p++;
1684e93f7393Sniklas       }
1685e93f7393Sniklas }
1686e93f7393Sniklas 
1687e93f7393Sniklas static void
disable_display_command(char * args,int from_tty)1688b725ae77Skettenis disable_display_command (char *args, int from_tty)
1689e93f7393Sniklas {
1690b725ae77Skettenis   char *p = args;
1691b725ae77Skettenis   char *p1;
1692b725ae77Skettenis   struct display *d;
1693e93f7393Sniklas 
1694e93f7393Sniklas   if (p == 0)
1695e93f7393Sniklas     {
1696e93f7393Sniklas       for (d = display_chain; d; d = d->next)
1697b725ae77Skettenis 	d->enabled_p = 0;
1698e93f7393Sniklas     }
1699e93f7393Sniklas   else
1700e93f7393Sniklas     while (*p)
1701e93f7393Sniklas       {
1702e93f7393Sniklas 	p1 = p;
1703e93f7393Sniklas 	while (*p1 >= '0' && *p1 <= '9')
1704e93f7393Sniklas 	  p1++;
1705e93f7393Sniklas 	if (*p1 && *p1 != ' ' && *p1 != '\t')
1706e93f7393Sniklas 	  error ("Arguments must be display numbers.");
1707e93f7393Sniklas 
1708e93f7393Sniklas 	disable_display (atoi (p));
1709e93f7393Sniklas 
1710e93f7393Sniklas 	p = p1;
1711e93f7393Sniklas 	while (*p == ' ' || *p == '\t')
1712e93f7393Sniklas 	  p++;
1713e93f7393Sniklas       }
1714e93f7393Sniklas }
1715e93f7393Sniklas 
1716b725ae77Skettenis 
1717e93f7393Sniklas /* Print the value in stack frame FRAME of a variable
1718e93f7393Sniklas    specified by a struct symbol.  */
1719e93f7393Sniklas 
1720e93f7393Sniklas void
print_variable_value(struct symbol * var,struct frame_info * frame,struct ui_file * stream)1721b725ae77Skettenis print_variable_value (struct symbol *var, struct frame_info *frame,
1722b725ae77Skettenis 		      struct ui_file *stream)
1723e93f7393Sniklas {
1724b725ae77Skettenis   struct value *val = read_var_value (var, frame);
1725e93f7393Sniklas 
1726e93f7393Sniklas   value_print (val, stream, 0, Val_pretty_default);
1727e93f7393Sniklas }
1728e93f7393Sniklas 
1729e93f7393Sniklas static void
printf_command(char * arg,int from_tty)1730b725ae77Skettenis printf_command (char *arg, int from_tty)
1731e93f7393Sniklas {
1732b725ae77Skettenis   char *f = NULL;
1733b725ae77Skettenis   char *s = arg;
1734b725ae77Skettenis   char *string = NULL;
1735b725ae77Skettenis   struct value **val_args;
1736e93f7393Sniklas   char *substrings;
1737e93f7393Sniklas   char *current_substring;
1738e93f7393Sniklas   int nargs = 0;
1739e93f7393Sniklas   int allocated_args = 20;
1740e93f7393Sniklas   struct cleanup *old_cleanups;
1741e93f7393Sniklas 
1742b725ae77Skettenis   val_args = (struct value **) xmalloc (allocated_args
1743b725ae77Skettenis 					* sizeof (struct value *));
1744e93f7393Sniklas   old_cleanups = make_cleanup (free_current_contents, &val_args);
1745e93f7393Sniklas 
1746e93f7393Sniklas   if (s == 0)
1747e93f7393Sniklas     error_no_arg ("format-control string and values to print");
1748e93f7393Sniklas 
1749e93f7393Sniklas   /* Skip white space before format string */
1750b725ae77Skettenis   while (*s == ' ' || *s == '\t')
1751b725ae77Skettenis     s++;
1752e93f7393Sniklas 
1753e93f7393Sniklas   /* A format string should follow, enveloped in double quotes */
1754e93f7393Sniklas   if (*s++ != '"')
1755e93f7393Sniklas     error ("Bad format string, missing '\"'.");
1756e93f7393Sniklas 
1757e93f7393Sniklas   /* Parse the format-control string and copy it into the string STRING,
1758e93f7393Sniklas      processing some kinds of escape sequence.  */
1759e93f7393Sniklas 
1760e93f7393Sniklas   f = string = (char *) alloca (strlen (s) + 1);
1761e93f7393Sniklas 
1762e93f7393Sniklas   while (*s != '"')
1763e93f7393Sniklas     {
1764e93f7393Sniklas       int c = *s++;
1765e93f7393Sniklas       switch (c)
1766e93f7393Sniklas 	{
1767e93f7393Sniklas 	case '\0':
1768e93f7393Sniklas 	  error ("Bad format string, non-terminated '\"'.");
1769e93f7393Sniklas 
1770e93f7393Sniklas 	case '\\':
1771e93f7393Sniklas 	  switch (c = *s++)
1772e93f7393Sniklas 	    {
1773e93f7393Sniklas 	    case '\\':
1774e93f7393Sniklas 	      *f++ = '\\';
1775e93f7393Sniklas 	      break;
1776e93f7393Sniklas 	    case 'a':
1777e93f7393Sniklas 	      *f++ = '\a';
1778e93f7393Sniklas 	      break;
1779e93f7393Sniklas 	    case 'b':
1780e93f7393Sniklas 	      *f++ = '\b';
1781e93f7393Sniklas 	      break;
1782e93f7393Sniklas 	    case 'f':
1783e93f7393Sniklas 	      *f++ = '\f';
1784e93f7393Sniklas 	      break;
1785e93f7393Sniklas 	    case 'n':
1786e93f7393Sniklas 	      *f++ = '\n';
1787e93f7393Sniklas 	      break;
1788e93f7393Sniklas 	    case 'r':
1789e93f7393Sniklas 	      *f++ = '\r';
1790e93f7393Sniklas 	      break;
1791e93f7393Sniklas 	    case 't':
1792e93f7393Sniklas 	      *f++ = '\t';
1793e93f7393Sniklas 	      break;
1794e93f7393Sniklas 	    case 'v':
1795e93f7393Sniklas 	      *f++ = '\v';
1796e93f7393Sniklas 	      break;
1797e93f7393Sniklas 	    case '"':
1798e93f7393Sniklas 	      *f++ = '"';
1799e93f7393Sniklas 	      break;
1800e93f7393Sniklas 	    default:
1801e93f7393Sniklas 	      /* ??? TODO: handle other escape sequences */
1802e93f7393Sniklas 	      error ("Unrecognized escape character \\%c in format string.",
1803e93f7393Sniklas 		     c);
1804e93f7393Sniklas 	    }
1805e93f7393Sniklas 	  break;
1806e93f7393Sniklas 
1807e93f7393Sniklas 	default:
1808e93f7393Sniklas 	  *f++ = c;
1809e93f7393Sniklas 	}
1810e93f7393Sniklas     }
1811e93f7393Sniklas 
1812e93f7393Sniklas   /* Skip over " and following space and comma.  */
1813e93f7393Sniklas   s++;
1814e93f7393Sniklas   *f++ = '\0';
1815b725ae77Skettenis   while (*s == ' ' || *s == '\t')
1816b725ae77Skettenis     s++;
1817e93f7393Sniklas 
1818e93f7393Sniklas   if (*s != ',' && *s != 0)
1819e93f7393Sniklas     error ("Invalid argument syntax");
1820e93f7393Sniklas 
1821b725ae77Skettenis   if (*s == ',')
1822b725ae77Skettenis     s++;
1823b725ae77Skettenis   while (*s == ' ' || *s == '\t')
1824b725ae77Skettenis     s++;
1825e93f7393Sniklas 
1826e93f7393Sniklas   /* Need extra space for the '\0's.  Doubling the size is sufficient.  */
1827e93f7393Sniklas   substrings = alloca (strlen (string) * 2);
1828e93f7393Sniklas   current_substring = substrings;
1829e93f7393Sniklas 
1830e93f7393Sniklas   {
1831e93f7393Sniklas     /* Now scan the string for %-specs and see what kinds of args they want.
1832e93f7393Sniklas        argclass[I] classifies the %-specs so we can give printf_filtered
1833e93f7393Sniklas        something of the right size.  */
1834e93f7393Sniklas 
1835b725ae77Skettenis     enum argclass
1836b725ae77Skettenis       {
1837b725ae77Skettenis 	no_arg, int_arg, string_arg, double_arg, long_long_arg
1838b725ae77Skettenis       };
1839e93f7393Sniklas     enum argclass *argclass;
1840e93f7393Sniklas     enum argclass this_argclass;
1841e93f7393Sniklas     char *last_arg;
1842e93f7393Sniklas     int nargs_wanted;
1843e93f7393Sniklas     int lcount;
1844e93f7393Sniklas     int i;
1845e93f7393Sniklas 
1846e93f7393Sniklas     argclass = (enum argclass *) alloca (strlen (s) * sizeof *argclass);
1847e93f7393Sniklas     nargs_wanted = 0;
1848e93f7393Sniklas     f = string;
1849e93f7393Sniklas     last_arg = string;
1850e93f7393Sniklas     while (*f)
1851e93f7393Sniklas       if (*f++ == '%')
1852e93f7393Sniklas 	{
1853e93f7393Sniklas 	  lcount = 0;
1854e93f7393Sniklas 	  while (strchr ("0123456789.hlL-+ #", *f))
1855e93f7393Sniklas 	    {
1856e93f7393Sniklas 	      if (*f == 'l' || *f == 'L')
1857e93f7393Sniklas 		lcount++;
1858e93f7393Sniklas 	      f++;
1859e93f7393Sniklas 	    }
1860e93f7393Sniklas 	  switch (*f)
1861e93f7393Sniklas 	    {
1862e93f7393Sniklas 	    case 's':
1863e93f7393Sniklas 	      this_argclass = string_arg;
1864e93f7393Sniklas 	      break;
1865e93f7393Sniklas 
1866e93f7393Sniklas 	    case 'e':
1867e93f7393Sniklas 	    case 'f':
1868e93f7393Sniklas 	    case 'g':
1869e93f7393Sniklas 	      this_argclass = double_arg;
1870e93f7393Sniklas 	      break;
1871e93f7393Sniklas 
1872e93f7393Sniklas 	    case '*':
1873e93f7393Sniklas 	      error ("`*' not supported for precision or width in printf");
1874e93f7393Sniklas 
1875e93f7393Sniklas 	    case 'n':
1876e93f7393Sniklas 	      error ("Format specifier `n' not supported in printf");
1877e93f7393Sniklas 
1878e93f7393Sniklas 	    case '%':
1879e93f7393Sniklas 	      this_argclass = no_arg;
1880e93f7393Sniklas 	      break;
1881e93f7393Sniklas 
1882e93f7393Sniklas 	    default:
1883e93f7393Sniklas 	      if (lcount > 1)
1884e93f7393Sniklas 		this_argclass = long_long_arg;
1885e93f7393Sniklas 	      else
1886e93f7393Sniklas 		this_argclass = int_arg;
1887e93f7393Sniklas 	      break;
1888e93f7393Sniklas 	    }
1889e93f7393Sniklas 	  f++;
1890e93f7393Sniklas 	  if (this_argclass != no_arg)
1891e93f7393Sniklas 	    {
1892e93f7393Sniklas 	      strncpy (current_substring, last_arg, f - last_arg);
1893e93f7393Sniklas 	      current_substring += f - last_arg;
1894e93f7393Sniklas 	      *current_substring++ = '\0';
1895e93f7393Sniklas 	      last_arg = f;
1896e93f7393Sniklas 	      argclass[nargs_wanted++] = this_argclass;
1897e93f7393Sniklas 	    }
1898e93f7393Sniklas 	}
1899e93f7393Sniklas 
1900e93f7393Sniklas     /* Now, parse all arguments and evaluate them.
1901e93f7393Sniklas        Store the VALUEs in VAL_ARGS.  */
1902e93f7393Sniklas 
1903e93f7393Sniklas     while (*s != '\0')
1904e93f7393Sniklas       {
1905e93f7393Sniklas 	char *s1;
1906e93f7393Sniklas 	if (nargs == allocated_args)
1907b725ae77Skettenis 	  val_args = (struct value **) xrealloc ((char *) val_args,
1908e93f7393Sniklas 						 (allocated_args *= 2)
1909b725ae77Skettenis 						 * sizeof (struct value *));
1910e93f7393Sniklas 	s1 = s;
1911e93f7393Sniklas 	val_args[nargs] = parse_to_comma_and_eval (&s1);
1912e93f7393Sniklas 
1913e93f7393Sniklas 	/* If format string wants a float, unchecked-convert the value to
1914e93f7393Sniklas 	   floating point of the same size */
1915e93f7393Sniklas 
1916e93f7393Sniklas 	if (argclass[nargs] == double_arg)
1917e93f7393Sniklas 	  {
1918e93f7393Sniklas 	    struct type *type = VALUE_TYPE (val_args[nargs]);
1919e93f7393Sniklas 	    if (TYPE_LENGTH (type) == sizeof (float))
1920e93f7393Sniklas 	        VALUE_TYPE (val_args[nargs]) = builtin_type_float;
1921e93f7393Sniklas 	    if (TYPE_LENGTH (type) == sizeof (double))
1922e93f7393Sniklas 	        VALUE_TYPE (val_args[nargs]) = builtin_type_double;
1923e93f7393Sniklas 	  }
1924e93f7393Sniklas 	nargs++;
1925e93f7393Sniklas 	s = s1;
1926e93f7393Sniklas 	if (*s == ',')
1927e93f7393Sniklas 	  s++;
1928e93f7393Sniklas       }
1929e93f7393Sniklas 
1930e93f7393Sniklas     if (nargs != nargs_wanted)
1931e93f7393Sniklas       error ("Wrong number of arguments for specified format-string");
1932e93f7393Sniklas 
1933e93f7393Sniklas     /* Now actually print them.  */
1934e93f7393Sniklas     current_substring = substrings;
1935e93f7393Sniklas     for (i = 0; i < nargs; i++)
1936e93f7393Sniklas       {
1937e93f7393Sniklas 	switch (argclass[i])
1938e93f7393Sniklas 	  {
1939e93f7393Sniklas 	  case string_arg:
1940e93f7393Sniklas 	    {
1941e93f7393Sniklas 	      char *str;
1942e93f7393Sniklas 	      CORE_ADDR tem;
1943e93f7393Sniklas 	      int j;
1944b725ae77Skettenis 	      tem = value_as_address (val_args[i]);
1945e93f7393Sniklas 
1946e93f7393Sniklas 	      /* This is a %s argument.  Find the length of the string.  */
1947e93f7393Sniklas 	      for (j = 0;; j++)
1948e93f7393Sniklas 		{
1949e93f7393Sniklas 		  char c;
1950e93f7393Sniklas 		  QUIT;
1951e93f7393Sniklas 		  read_memory (tem + j, &c, 1);
1952e93f7393Sniklas 		  if (c == 0)
1953e93f7393Sniklas 		    break;
1954e93f7393Sniklas 		}
1955e93f7393Sniklas 
1956e93f7393Sniklas 	      /* Copy the string contents into a string inside GDB.  */
1957e93f7393Sniklas 	      str = (char *) alloca (j + 1);
1958b725ae77Skettenis 	      if (j != 0)
1959e93f7393Sniklas 		read_memory (tem, str, j);
1960e93f7393Sniklas 	      str[j] = 0;
1961e93f7393Sniklas 
1962e93f7393Sniklas 	      printf_filtered (current_substring, str);
1963e93f7393Sniklas 	    }
1964e93f7393Sniklas 	    break;
1965e93f7393Sniklas 	  case double_arg:
1966e93f7393Sniklas 	    {
1967e93f7393Sniklas 	      double val = value_as_double (val_args[i]);
1968e93f7393Sniklas 	      printf_filtered (current_substring, val);
1969e93f7393Sniklas 	      break;
1970e93f7393Sniklas 	    }
1971e93f7393Sniklas 	  case long_long_arg:
1972e93f7393Sniklas #if defined (CC_HAS_LONG_LONG) && defined (PRINTF_HAS_LONG_LONG)
1973e93f7393Sniklas 	    {
1974e93f7393Sniklas 	      long long val = value_as_long (val_args[i]);
1975e93f7393Sniklas 	      printf_filtered (current_substring, val);
1976e93f7393Sniklas 	      break;
1977e93f7393Sniklas 	    }
1978e93f7393Sniklas #else
1979e93f7393Sniklas 	    error ("long long not supported in printf");
1980e93f7393Sniklas #endif
1981e93f7393Sniklas 	  case int_arg:
1982e93f7393Sniklas 	    {
1983e93f7393Sniklas 	      /* FIXME: there should be separate int_arg and long_arg.  */
1984e93f7393Sniklas 	      long val = value_as_long (val_args[i]);
1985e93f7393Sniklas 	      printf_filtered (current_substring, val);
1986e93f7393Sniklas 	      break;
1987e93f7393Sniklas 	    }
1988b725ae77Skettenis 	  default:		/* purecov: deadcode */
1989b725ae77Skettenis 	    error ("internal error in printf_command");		/* purecov: deadcode */
1990e93f7393Sniklas 	  }
1991e93f7393Sniklas 	/* Skip to the next substring.  */
1992e93f7393Sniklas 	current_substring += strlen (current_substring) + 1;
1993e93f7393Sniklas       }
1994e93f7393Sniklas     /* Print the portion of the format string after the last argument.  */
1995b725ae77Skettenis     puts_filtered (last_arg);
1996e93f7393Sniklas   }
1997e93f7393Sniklas   do_cleanups (old_cleanups);
1998e93f7393Sniklas }
1999e93f7393Sniklas 
2000e93f7393Sniklas void
_initialize_printcmd(void)2001b725ae77Skettenis _initialize_printcmd (void)
2002e93f7393Sniklas {
2003b725ae77Skettenis   struct cmd_list_element *c;
2004b725ae77Skettenis 
2005e93f7393Sniklas   current_display_number = -1;
2006e93f7393Sniklas 
2007e93f7393Sniklas   add_info ("address", address_info,
2008b725ae77Skettenis 	    "Describe where symbol SYM is stored.");
2009b725ae77Skettenis 
2010b725ae77Skettenis   add_info ("symbol", sym_info,
2011b725ae77Skettenis 	    "Describe what symbol is at location ADDR.\n\
2012b725ae77Skettenis Only for symbols with fixed locations (global or static scope).");
2013e93f7393Sniklas 
2014e93f7393Sniklas   add_com ("x", class_vars, x_command,
2015e93f7393Sniklas 	   concat ("Examine memory: x/FMT ADDRESS.\n\
2016e93f7393Sniklas ADDRESS is an expression for the memory address to examine.\n\
2017e93f7393Sniklas FMT is a repeat count followed by a format letter and a size letter.\n\
2018e93f7393Sniklas Format letters are o(octal), x(hex), d(decimal), u(unsigned decimal),\n\
2019e93f7393Sniklas   t(binary), f(float), a(address), i(instruction), c(char) and s(string).\n",
2020e93f7393Sniklas 		   "Size letters are b(byte), h(halfword), w(word), g(giant, 8 bytes).\n\
2021e93f7393Sniklas The specified number of objects of the specified size are printed\n\
2022e93f7393Sniklas according to the format.\n\n\
2023e93f7393Sniklas Defaults for format and size letters are those previously used.\n\
2024e93f7393Sniklas Default count is 1.  Default address is following last thing printed\n\
2025e93f7393Sniklas with this command or \"print\".", NULL));
2026e93f7393Sniklas 
2027e93f7393Sniklas #if 0
2028e93f7393Sniklas   add_com ("whereis", class_vars, whereis_command,
2029e93f7393Sniklas 	   "Print line number and file of definition of variable.");
2030e93f7393Sniklas #endif
2031e93f7393Sniklas 
2032e93f7393Sniklas   add_info ("display", display_info,
2033e93f7393Sniklas 	    "Expressions to display when program stops, with code numbers.");
2034e93f7393Sniklas 
2035e93f7393Sniklas   add_cmd ("undisplay", class_vars, undisplay_command,
2036e93f7393Sniklas 	   "Cancel some expressions to be displayed when program stops.\n\
2037e93f7393Sniklas Arguments are the code numbers of the expressions to stop displaying.\n\
2038e93f7393Sniklas No argument means cancel all automatic-display expressions.\n\
2039e93f7393Sniklas \"delete display\" has the same effect as this command.\n\
2040e93f7393Sniklas Do \"info display\" to see current list of code numbers.",
2041e93f7393Sniklas 	   &cmdlist);
2042e93f7393Sniklas 
2043e93f7393Sniklas   add_com ("display", class_vars, display_command,
2044e93f7393Sniklas 	   "Print value of expression EXP each time the program stops.\n\
2045e93f7393Sniklas /FMT may be used before EXP as in the \"print\" command.\n\
2046e93f7393Sniklas /FMT \"i\" or \"s\" or including a size-letter is allowed,\n\
2047e93f7393Sniklas as in the \"x\" command, and then EXP is used to get the address to examine\n\
2048e93f7393Sniklas and examining is done as in the \"x\" command.\n\n\
2049e93f7393Sniklas With no argument, display all currently requested auto-display expressions.\n\
2050e93f7393Sniklas Use \"undisplay\" to cancel display requests previously made."
2051e93f7393Sniklas     );
2052e93f7393Sniklas 
2053e93f7393Sniklas   add_cmd ("display", class_vars, enable_display,
2054e93f7393Sniklas 	   "Enable some expressions to be displayed when program stops.\n\
2055e93f7393Sniklas Arguments are the code numbers of the expressions to resume displaying.\n\
2056e93f7393Sniklas No argument means enable all automatic-display expressions.\n\
2057e93f7393Sniklas Do \"info display\" to see current list of code numbers.", &enablelist);
2058e93f7393Sniklas 
2059e93f7393Sniklas   add_cmd ("display", class_vars, disable_display_command,
2060e93f7393Sniklas 	   "Disable some expressions to be displayed when program stops.\n\
2061e93f7393Sniklas Arguments are the code numbers of the expressions to stop displaying.\n\
2062e93f7393Sniklas No argument means disable all automatic-display expressions.\n\
2063e93f7393Sniklas Do \"info display\" to see current list of code numbers.", &disablelist);
2064e93f7393Sniklas 
2065e93f7393Sniklas   add_cmd ("display", class_vars, undisplay_command,
2066e93f7393Sniklas 	   "Cancel some expressions to be displayed when program stops.\n\
2067e93f7393Sniklas Arguments are the code numbers of the expressions to stop displaying.\n\
2068e93f7393Sniklas No argument means cancel all automatic-display expressions.\n\
2069e93f7393Sniklas Do \"info display\" to see current list of code numbers.", &deletelist);
2070e93f7393Sniklas 
2071e93f7393Sniklas   add_com ("printf", class_vars, printf_command,
2072e93f7393Sniklas 	   "printf \"printf format string\", arg1, arg2, arg3, ..., argn\n\
2073e93f7393Sniklas This is useful for formatted output in user-defined commands.");
2074e93f7393Sniklas 
2075e93f7393Sniklas   add_com ("output", class_vars, output_command,
2076e93f7393Sniklas 	   "Like \"print\" but don't put in value history and don't print newline.\n\
2077e93f7393Sniklas This is useful in user-defined commands.");
2078e93f7393Sniklas 
2079e93f7393Sniklas   add_prefix_cmd ("set", class_vars, set_command,
2080e93f7393Sniklas 		  concat ("Evaluate expression EXP and assign result to variable VAR, using assignment\n\
2081e93f7393Sniklas syntax appropriate for the current language (VAR = EXP or VAR := EXP for\n\
2082e93f7393Sniklas example).  VAR may be a debugger \"convenience\" variable (names starting\n\
2083e93f7393Sniklas with $), a register (a few standard names starting with $), or an actual\n\
2084e93f7393Sniklas variable in the program being debugged.  EXP is any valid expression.\n",
2085e93f7393Sniklas 			  "Use \"set variable\" for variables with names identical to set subcommands.\n\
2086e93f7393Sniklas \nWith a subcommand, this command modifies parts of the gdb environment.\n\
2087e93f7393Sniklas You can see these environment settings with the \"show\" command.", NULL),
2088e93f7393Sniklas 		  &setlist, "set ", 1, &cmdlist);
2089b725ae77Skettenis   if (dbx_commands)
2090b725ae77Skettenis     add_com ("assign", class_vars, set_command, concat ("Evaluate expression \
2091b725ae77Skettenis EXP and assign result to variable VAR, using assignment\n\
2092b725ae77Skettenis syntax appropriate for the current language (VAR = EXP or VAR := EXP for\n\
2093b725ae77Skettenis example).  VAR may be a debugger \"convenience\" variable (names starting\n\
2094b725ae77Skettenis with $), a register (a few standard names starting with $), or an actual\n\
2095b725ae77Skettenis variable in the program being debugged.  EXP is any valid expression.\n",
2096b725ae77Skettenis 							"Use \"set variable\" for variables with names identical to set subcommands.\n\
2097b725ae77Skettenis \nWith a subcommand, this command modifies parts of the gdb environment.\n\
2098b725ae77Skettenis You can see these environment settings with the \"show\" command.", NULL));
2099e93f7393Sniklas 
2100e93f7393Sniklas   /* "call" is the same as "set", but handy for dbx users to call fns. */
2101b725ae77Skettenis   c = add_com ("call", class_vars, call_command,
2102e93f7393Sniklas 	       "Call a function in the program.\n\
2103e93f7393Sniklas The argument is the function name and arguments, in the notation of the\n\
2104e93f7393Sniklas current working language.  The result is printed and saved in the value\n\
2105e93f7393Sniklas history, if it is not void.");
2106b725ae77Skettenis   set_cmd_completer (c, location_completer);
2107e93f7393Sniklas 
2108e93f7393Sniklas   add_cmd ("variable", class_vars, set_command,
2109e93f7393Sniklas 	   "Evaluate expression EXP and assign result to variable VAR, using assignment\n\
2110e93f7393Sniklas syntax appropriate for the current language (VAR = EXP or VAR := EXP for\n\
2111e93f7393Sniklas example).  VAR may be a debugger \"convenience\" variable (names starting\n\
2112e93f7393Sniklas with $), a register (a few standard names starting with $), or an actual\n\
2113e93f7393Sniklas variable in the program being debugged.  EXP is any valid expression.\n\
2114e93f7393Sniklas This may usually be abbreviated to simply \"set\".",
2115e93f7393Sniklas 	   &setlist);
2116e93f7393Sniklas 
2117b725ae77Skettenis   c = add_com ("print", class_vars, print_command,
2118e93f7393Sniklas 	   concat ("Print value of expression EXP.\n\
2119e93f7393Sniklas Variables accessible are those of the lexical environment of the selected\n\
2120e93f7393Sniklas stack frame, plus all those whose scope is global or an entire file.\n\
2121e93f7393Sniklas \n\
2122e93f7393Sniklas $NUM gets previous value number NUM.  $ and $$ are the last two values.\n\
2123e93f7393Sniklas $$NUM refers to NUM'th value back from the last one.\n\
2124e93f7393Sniklas Names starting with $ refer to registers (with the values they would have\n",
2125e93f7393Sniklas 		   "if the program were to return to the stack frame now selected, restoring\n\
2126e93f7393Sniklas all registers saved by frames farther in) or else to debugger\n\
2127e93f7393Sniklas \"convenience\" variables (any such name not a known register).\n\
2128e93f7393Sniklas Use assignment expressions to give values to convenience variables.\n",
2129e93f7393Sniklas 		   "\n\
2130e93f7393Sniklas {TYPE}ADREXP refers to a datum of data type TYPE, located at address ADREXP.\n\
2131e93f7393Sniklas @ is a binary operator for treating consecutive data objects\n\
2132e93f7393Sniklas anywhere in memory as an array.  FOO@NUM gives an array whose first\n\
2133e93f7393Sniklas element is FOO, whose second element is stored in the space following\n\
2134e93f7393Sniklas where FOO is stored, etc.  FOO must be an expression whose value\n\
2135e93f7393Sniklas resides in memory.\n",
2136e93f7393Sniklas 		   "\n\
2137e93f7393Sniklas EXP may be preceded with /FMT, where FMT is a format letter\n\
2138e93f7393Sniklas but no count or size letter (see \"x\" command).", NULL));
2139b725ae77Skettenis   set_cmd_completer (c, location_completer);
2140e93f7393Sniklas   add_com_alias ("p", "print", class_vars, 1);
2141e93f7393Sniklas 
2142b725ae77Skettenis   c = add_com ("inspect", class_vars, inspect_command,
2143e93f7393Sniklas 	   "Same as \"print\" command, except that if you are running in the epoch\n\
2144e93f7393Sniklas environment, the value is printed in its own window.");
2145b725ae77Skettenis   set_cmd_completer (c, location_completer);
2146e93f7393Sniklas 
2147*63addd46Skettenis   deprecated_add_show_from_set
2148*63addd46Skettenis     (add_set_cmd ("max-symbolic-offset", no_class, var_uinteger,
2149e93f7393Sniklas 		  (char *) &max_symbolic_offset,
2150e93f7393Sniklas        "Set the largest offset that will be printed in <symbol+1234> form.",
2151e93f7393Sniklas 		  &setprintlist),
2152e93f7393Sniklas      &showprintlist);
2153*63addd46Skettenis   deprecated_add_show_from_set
2154*63addd46Skettenis     (add_set_cmd ("symbol-filename", no_class, var_boolean,
2155*63addd46Skettenis 		  (char *) &print_symbol_filename, "\
2156*63addd46Skettenis Set printing of source filename and line number with <symbol>.",
2157e93f7393Sniklas 		  &setprintlist),
2158e93f7393Sniklas      &showprintlist);
2159e93f7393Sniklas 
2160b725ae77Skettenis   /* For examine/instruction a single byte quantity is specified as
2161b725ae77Skettenis      the data.  This avoids problems with value_at_lazy() requiring a
2162b725ae77Skettenis      valid data type (and rejecting VOID). */
2163b725ae77Skettenis   examine_i_type = init_type (TYPE_CODE_INT, 1, 0, "examine_i_type", NULL);
2164b725ae77Skettenis 
2165e93f7393Sniklas   examine_b_type = init_type (TYPE_CODE_INT, 1, 0, "examine_b_type", NULL);
2166e93f7393Sniklas   examine_h_type = init_type (TYPE_CODE_INT, 2, 0, "examine_h_type", NULL);
2167e93f7393Sniklas   examine_w_type = init_type (TYPE_CODE_INT, 4, 0, "examine_w_type", NULL);
2168e93f7393Sniklas   examine_g_type = init_type (TYPE_CODE_INT, 8, 0, "examine_g_type", NULL);
2169e93f7393Sniklas 
2170e93f7393Sniklas }
2171