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