/* Print values for GNU debugger GDB.
Copyright 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994,
- 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003 Free Software
+ 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004 Free Software
Foundation, Inc.
This file is part of GDB.
#include "block.h"
#include "disasm.h"
+#ifdef TUI
+#include "tui/tui.h" /* For tui_active et.al. */
+#endif
+
extern int asm_demangle; /* Whether to demangle syms in asm printouts */
extern int addressprint; /* Whether to print hex addresses in HLL " */
static CORE_ADDR next_address;
-/* Default section to examine next. */
-
-static asection *next_section;
-
/* Last address examined. */
static CORE_ADDR last_examine_address;
static void validate_format (struct format_data, char *);
-static void do_examine (struct format_data, CORE_ADDR addr,
- asection * section);
-
static void print_formatted (struct value *, int, int, struct ui_file *);
static struct format_data decode_format (char **, int, int);
decode_format (char **string_ptr, int oformat, int osize)
{
struct format_data val;
- register char *p = *string_ptr;
+ char *p = *string_ptr;
val.format = '?';
val.size = '?';
This is used to pad hex numbers so they line up. */
static void
-print_formatted (struct value *val, register int format, int size,
+print_formatted (struct value *val, int format, int size,
struct ui_file *stream)
{
- struct type *type = check_typedef (VALUE_TYPE (val));
+ struct type *type = check_typedef (value_type (val));
int len = TYPE_LENGTH (type);
if (VALUE_LVAL (val) == lval_memory)
{
next_address = VALUE_ADDRESS (val) + len;
- next_section = VALUE_BFD_SECTION (val);
}
switch (format)
/* FIXME: Need to handle wchar_t's here... */
next_address = VALUE_ADDRESS (val)
+ val_print_string (VALUE_ADDRESS (val), -1, 1, stream);
- next_section = VALUE_BFD_SECTION (val);
break;
case 'i':
wrap_here (" ");
next_address = VALUE_ADDRESS (val)
+ gdb_print_insn (VALUE_ADDRESS (val), stream);
- next_section = VALUE_BFD_SECTION (val);
break;
default:
|| TYPE_CODE (type) == TYPE_CODE_ARRAY
|| TYPE_CODE (type) == TYPE_CODE_STRING
|| TYPE_CODE (type) == TYPE_CODE_STRUCT
- || TYPE_CODE (type) == TYPE_CODE_UNION)
+ || TYPE_CODE (type) == TYPE_CODE_UNION
+ || TYPE_CODE (type) == TYPE_CODE_NAMESPACE)
/* If format is 0, use the 'natural' format for
* that type of value. If the type is non-scalar,
* we have to use language rules to print it as
print_scalar_formatted (void *valaddr, struct type *type, int format, int size,
struct ui_file *stream)
{
- LONGEST val_long;
+ LONGEST val_long = 0;
unsigned int len = TYPE_LENGTH (type);
- if (len > sizeof (LONGEST)
- && (format == 't'
- || format == 'c'
- || format == 'o'
- || format == 'u'
- || format == 'd'
- || format == 'x'))
+ if (len > sizeof(LONGEST) &&
+ (TYPE_CODE (type) == TYPE_CODE_INT
+ || TYPE_CODE (type) == TYPE_CODE_ENUM))
{
- if (!TYPE_UNSIGNED (type)
- || !extract_long_unsigned_integer (valaddr, len, &val_long))
+ switch (format)
{
- /* We can't print it normally, but we can print it in hex.
- Printing it in the wrong radix is more useful than saying
- "use /x, you dummy". */
- /* FIXME: we could also do octal or binary if that was the
- desired format. */
- /* FIXME: we should be using the size field to give us a
- minimum field width to print. */
-
- if (format == 'o')
- print_octal_chars (stream, valaddr, len);
- else if (format == 'd')
- print_decimal_chars (stream, valaddr, len);
- else if (format == 't')
- print_binary_chars (stream, valaddr, len);
- else
- /* replace with call to print_hex_chars? Looks
- like val_print_type_code_int is redoing
- work. - edie */
-
- val_print_type_code_int (type, valaddr, stream);
-
+ case 'o':
+ print_octal_chars (stream, valaddr, len);
return;
- }
-
- /* If we get here, extract_long_unsigned_integer set val_long. */
+ case 'u':
+ case 'd':
+ print_decimal_chars (stream, valaddr, len);
+ return;
+ case 't':
+ print_binary_chars (stream, valaddr, len);
+ return;
+ case 'x':
+ print_hex_chars (stream, valaddr, len);
+ return;
+ case 'c':
+ print_char_chars (stream, valaddr, len);
+ return;
+ default:
+ break;
+ };
}
- else if (format != 'f')
+
+ if (format != 'f')
val_long = unpack_long (type, valaddr);
/* If the value is a pointer, and pointers and addresses are not the
if (*cp == '\0')
cp--;
}
- strcpy (buf, local_binary_format_prefix ());
- strcat (buf, cp);
- strcat (buf, local_binary_format_suffix ());
- fprintf_filtered (stream, buf);
+ strcpy (buf, cp);
+ fputs_filtered (buf, stream);
}
break;
Fetch it from memory and print on gdb_stdout. */
static void
-do_examine (struct format_data fmt, CORE_ADDR addr, asection *sect)
+do_examine (struct format_data fmt, CORE_ADDR addr)
{
- register char format = 0;
- register char size;
- register int count = 1;
+ char format = 0;
+ char size;
+ int count = 1;
struct type *val_type = NULL;
- register int i;
- register int maxelts;
+ int i;
+ int maxelts;
format = fmt.format;
size = fmt.size;
count = fmt.count;
next_address = addr;
- next_section = sect;
/* String or instruction format implies fetch single bytes
regardless of the specified size. */
the disassembler be modified so that LAST_EXAMINE_VALUE
is left with the byte sequence from the last complete
instruction fetched from memory? */
- last_examine_value = value_at_lazy (val_type, next_address, sect);
+ last_examine_value = value_at_lazy (val_type, next_address);
if (last_examine_value)
release_value (last_examine_value);
print_command_1 (char *exp, int inspect, int voidprint)
{
struct expression *expr;
- register struct cleanup *old_chain = 0;
- register char format = 0;
+ struct cleanup *old_chain = 0;
+ char format = 0;
struct value *val;
struct format_data fmt;
int cleanup = 0;
else
val = access_value_history (0);
- if (voidprint || (val && VALUE_TYPE (val) &&
- TYPE_CODE (VALUE_TYPE (val)) != TYPE_CODE_VOID))
+ if (voidprint || (val && value_type (val) &&
+ TYPE_CODE (value_type (val)) != TYPE_CODE_VOID))
{
int histindex = record_latest_value (val);
if (histindex >= 0)
- annotate_value_history_begin (histindex, VALUE_TYPE (val));
+ annotate_value_history_begin (histindex, value_type (val));
else
- annotate_value_begin (VALUE_TYPE (val));
+ annotate_value_begin (value_type (val));
if (inspect)
printf_unfiltered ("\031(gdb-makebuffer \"%s\" %d '(\"", exp, histindex);
inspect_it = 0; /* Reset print routines to normal */
}
-/* ARGSUSED */
static void
print_command (char *exp, int from_tty)
{
}
/* Same as print, except in epoch, it gets its own window */
-/* ARGSUSED */
static void
inspect_command (char *exp, int from_tty)
{
}
/* Same as print, except it doesn't print void results. */
-/* ARGSUSED */
static void
call_command (char *exp, int from_tty)
{
print_command_1 (exp, 0, 0);
}
-/* ARGSUSED */
void
output_command (char *exp, int from_tty)
{
struct expression *expr;
- register struct cleanup *old_chain;
- register char format = 0;
+ struct cleanup *old_chain;
+ char format = 0;
struct value *val;
struct format_data fmt;
val = evaluate_expression (expr);
- annotate_value_begin (VALUE_TYPE (val));
+ annotate_value_begin (value_type (val));
print_formatted (val, format, fmt.size, gdb_stdout);
do_cleanups (old_chain);
}
-/* ARGSUSED */
static void
set_command (char *exp, int from_tty)
{
struct expression *expr = parse_expression (exp);
- register struct cleanup *old_chain =
+ struct cleanup *old_chain =
make_cleanup (free_current_contents, &expr);
evaluate_expression (expr);
do_cleanups (old_chain);
}
-/* ARGSUSED */
static void
sym_info (char *arg, int from_tty)
{
printf_filtered ("No symbol matches %s.\n", arg);
}
-/* ARGSUSED */
static void
address_info (char *exp, int from_tty)
{
- register struct symbol *sym;
- register struct minimal_symbol *msymbol;
- register long val;
- register long basereg;
+ struct symbol *sym;
+ struct minimal_symbol *msymbol;
+ long val;
+ long basereg;
asection *section;
CORE_ADDR load_addr;
int is_a_field_of_this; /* C++: lookup_symbol sets this to nonzero
case LOC_COMPUTED:
case LOC_COMPUTED_ARG:
- (SYMBOL_LOCATION_FUNCS (sym)->describe_location) (sym, gdb_stdout);
+ /* FIXME: cagney/2004-01-26: It should be possible to
+ unconditionally call the SYMBOL_OPS method when available.
+ Unfortunately DWARF 2 stores the frame-base (instead of the
+ function) location in a function's symbol. Oops! For the
+ moment enable this when/where applicable. */
+ SYMBOL_OPS (sym)->describe_location (sym, gdb_stdout);
break;
case LOC_REGISTER:
val, REGISTER_NAME (basereg));
break;
- case LOC_THREAD_LOCAL_STATIC:
- printf_filtered ("a thread-local variable at offset %ld in the "
- "thread-local storage for `%s'",
- val, SYMBOL_OBJFILE (sym)->name);
- break;
-
case LOC_OPTIMIZED_OUT:
printf_filtered ("optimized out");
break;
*exp = 0;
old_chain = make_cleanup (free_current_contents, &expr);
val = evaluate_expression (expr);
- if (TYPE_CODE (VALUE_TYPE (val)) == TYPE_CODE_REF)
+ if (TYPE_CODE (value_type (val)) == TYPE_CODE_REF)
val = value_ind (val);
/* In rvalue contexts, such as this, functions are coerced into
pointers to functions. This makes "x/i main" work. */
if (/* last_format == 'i' && */
- TYPE_CODE (VALUE_TYPE (val)) == TYPE_CODE_FUNC
+ TYPE_CODE (value_type (val)) == TYPE_CODE_FUNC
&& VALUE_LVAL (val) == lval_memory)
next_address = VALUE_ADDRESS (val);
else
next_address = value_as_address (val);
- if (VALUE_BFD_SECTION (val))
- next_section = VALUE_BFD_SECTION (val);
do_cleanups (old_chain);
}
- do_examine (fmt, next_address, next_section);
+ do_examine (fmt, next_address);
/* If the examine succeeds, we remember its size and format for next time. */
last_size = fmt.size;
/* Make last address examined available to the user as $_. Use
the correct pointer type. */
struct type *pointer_type
- = lookup_pointer_type (VALUE_TYPE (last_examine_value));
+ = lookup_pointer_type (value_type (last_examine_value));
set_internalvar (lookup_internalvar ("_"),
value_from_pointer (pointer_type,
last_examine_address));
display_command (char *exp, int from_tty)
{
struct format_data fmt;
- register struct expression *expr;
- register struct display *new;
+ struct expression *expr;
+ struct display *new;
int display_it = 1;
#if defined(TUI)
/* NOTE: cagney/2003-02-13 The `tui_active' was previously
`tui_version'. */
- if (tui_active && *exp == '$')
- display_it = (tui_set_layout (exp) == TUI_FAILURE);
+ if (tui_active && exp != NULL && *exp == '$')
+ display_it = (tui_set_layout_for_display_command (exp) == TUI_FAILURE);
#endif
if (display_it)
void
clear_displays (void)
{
- register struct display *d;
+ struct display *d;
while ((d = display_chain) != NULL)
{
static void
delete_display (int num)
{
- register struct display *d1, *d;
+ struct display *d1, *d;
if (!display_chain)
error ("No display number %d.", num);
static void
undisplay_command (char *args, int from_tty)
{
- register char *p = args;
- register char *p1;
- register int num;
+ char *p = args;
+ char *p1;
+ int num;
if (args == 0)
{
annotate_display_value ();
- do_examine (d->format, addr, VALUE_BFD_SECTION (val));
+ do_examine (d->format, addr);
}
else
{
void
do_displays (void)
{
- register struct display *d;
+ struct display *d;
for (d = display_chain; d; d = d->next)
do_one_display (d);
void
disable_display (int num)
{
- register struct display *d;
+ struct display *d;
for (d = display_chain; d; d = d->next)
if (d->number == num)
static void
display_info (char *ignore, int from_tty)
{
- register struct display *d;
+ struct display *d;
if (!display_chain)
printf_unfiltered ("There are no auto-display expressions now.\n");
static void
enable_display (char *args, int from_tty)
{
- register char *p = args;
- register char *p1;
- register int num;
- register struct display *d;
+ char *p = args;
+ char *p1;
+ int num;
+ struct display *d;
if (p == 0)
{
}
}
-/* ARGSUSED */
static void
disable_display_command (char *args, int from_tty)
{
- register char *p = args;
- register char *p1;
- register struct display *d;
+ char *p = args;
+ char *p1;
+ struct display *d;
if (p == 0)
{
value_print (val, stream, 0, Val_pretty_default);
}
-/* ARGSUSED */
static void
printf_command (char *arg, int from_tty)
{
- register char *f = NULL;
- register char *s = arg;
+ char *f = NULL;
+ char *s = arg;
char *string = NULL;
struct value **val_args;
char *substrings;
if (argclass[nargs] == double_arg)
{
- struct type *type = VALUE_TYPE (val_args[nargs]);
+ struct type *type = value_type (val_args[nargs]);
if (TYPE_LENGTH (type) == sizeof (float))
- VALUE_TYPE (val_args[nargs]) = builtin_type_float;
+ val_args[nargs]->type = builtin_type_float;
if (TYPE_LENGTH (type) == sizeof (double))
- VALUE_TYPE (val_args[nargs]) = builtin_type_double;
+ val_args[nargs]->type = builtin_type_double;
}
nargs++;
s = s1;
current_substring += strlen (current_substring) + 1;
}
/* Print the portion of the format string after the last argument. */
- printf_filtered (last_arg);
+ puts_filtered (last_arg);
}
do_cleanups (old_cleanups);
}
environment, the value is printed in its own window.");
set_cmd_completer (c, location_completer);
- add_show_from_set (
- add_set_cmd ("max-symbolic-offset", no_class, var_uinteger,
- (char *) &max_symbolic_offset,
+ deprecated_add_show_from_set
+ (add_set_cmd ("max-symbolic-offset", no_class, var_uinteger,
+ (char *) &max_symbolic_offset,
"Set the largest offset that will be printed in <symbol+1234> form.",
- &setprintlist),
- &showprintlist);
- add_show_from_set (
- add_set_cmd ("symbol-filename", no_class, var_boolean,
- (char *) &print_symbol_filename,
- "Set printing of source filename and line number with <symbol>.",
- &setprintlist),
- &showprintlist);
+ &setprintlist),
+ &showprintlist);
+ deprecated_add_show_from_set
+ (add_set_cmd ("symbol-filename", no_class, var_boolean,
+ (char *) &print_symbol_filename, "\
+Set printing of source filename and line number with <symbol>.",
+ &setprintlist),
+ &showprintlist);
/* For examine/instruction a single byte quantity is specified as
the data. This avoids problems with value_at_lazy() requiring a