X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fvalprint.c;h=2f6ff94cb535bfc727495a1c5e810d80e9cbdf15;hb=2117c711ae07700adb57ea5b5ca61e4c32d7e3d2;hp=8600be03dce2fdb0d68fa8aede7bca546df0845c;hpb=0d63ecdad04d410698c905283d095505680ba907;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/valprint.c b/gdb/valprint.c index 8600be03dc..2f6ff94cb5 100644 --- a/gdb/valprint.c +++ b/gdb/valprint.c @@ -1,6 +1,6 @@ /* Print values for GDB, the GNU debugger. - Copyright (C) 1986, 1988-2012 Free Software Foundation, Inc. + Copyright (C) 1986-2014 Free Software Foundation, Inc. This file is part of GDB. @@ -18,7 +18,7 @@ along with this program. If not, see . */ #include "defs.h" -#include "gdb_string.h" +#include #include "symtab.h" #include "gdbtypes.h" #include "value.h" @@ -32,7 +32,7 @@ #include "doublest.h" #include "exceptions.h" #include "dfp.h" -#include "python/python.h" +#include "extension.h" #include "ada-lang.h" #include "gdb_obstack.h" #include "charset.h" @@ -76,11 +76,14 @@ struct converted_character typedef struct converted_character converted_character_d; DEF_VEC_O (converted_character_d); +/* Command lists for set/show print raw. */ +struct cmd_list_element *setprintrawlist; +struct cmd_list_element *showprintrawlist; /* Prototypes for local functions */ static int partial_memory_read (CORE_ADDR memaddr, gdb_byte *myaddr, - int len, int *errnoptr); + int len, int *errptr); static void show_print (char *, int); @@ -104,9 +107,9 @@ void _initialize_valprint (void); struct value_print_options user_print_options = { - Val_pretty_default, /* pretty */ - 0, /* prettyprint_arrays */ - 0, /* prettyprint_structs */ + Val_prettyformat_default, /* prettyformat */ + 0, /* prettyformat_arrays */ + 0, /* prettyformat_structs */ 0, /* vtblprint */ 1, /* unionprint */ 1, /* addressprint */ @@ -116,7 +119,6 @@ struct value_print_options user_print_options = 0, /* output_format */ 0, /* format */ 0, /* stop_print_at_null */ - 0, /* inspect_it */ 0, /* print_array_indexes */ 0, /* deref_ref */ 1, /* static_field_print */ @@ -134,12 +136,12 @@ get_user_print_options (struct value_print_options *opts) } /* Initialize *OPTS to be a copy of the user print options, but with - pretty-printing disabled. */ + pretty-formatting disabled. */ void -get_raw_print_options (struct value_print_options *opts) +get_no_prettyformat_print_options (struct value_print_options *opts) { *opts = user_print_options; - opts->pretty = Val_no_prettyprint; + opts->prettyformat = Val_no_prettyformat; } /* Initialize *OPTS to be a copy of the user print options, but using @@ -222,19 +224,19 @@ show_stop_print_at_null (struct ui_file *file, int from_tty, /* Controls pretty printing of structures. */ static void -show_prettyprint_structs (struct ui_file *file, int from_tty, +show_prettyformat_structs (struct ui_file *file, int from_tty, struct cmd_list_element *c, const char *value) { - fprintf_filtered (file, _("Prettyprinting of structures is %s.\n"), value); + fprintf_filtered (file, _("Pretty formatting of structures is %s.\n"), value); } /* Controls pretty printing of arrays. */ static void -show_prettyprint_arrays (struct ui_file *file, int from_tty, +show_prettyformat_arrays (struct ui_file *file, int from_tty, struct cmd_list_element *c, const char *value) { - fprintf_filtered (file, _("Prettyprinting of arrays is %s.\n"), value); + fprintf_filtered (file, _("Pretty formatting of arrays is %s.\n"), value); } /* If nonzero, causes unions inside structures or other unions to be @@ -273,8 +275,8 @@ show_symbol_print (struct ui_file *file, int from_tty, we want to print scalar arguments, but not aggregate arguments. This function distinguishes between the two. */ -static int -scalar_type_p (struct type *type) +int +val_print_scalar_type_p (struct type *type) { CHECK_TYPEDEF (type); while (TYPE_CODE (type) == TYPE_CODE_REF) @@ -312,7 +314,7 @@ valprint_check_validity (struct ui_file *stream, if (!value_bits_valid (val, TARGET_CHAR_BIT * embedded_offset, TARGET_CHAR_BIT * TYPE_LENGTH (type))) { - val_print_optimized_out (stream); + val_print_optimized_out (val, stream); return 0; } @@ -334,9 +336,18 @@ valprint_check_validity (struct ui_file *stream, } void -val_print_optimized_out (struct ui_file *stream) +val_print_optimized_out (const struct value *val, struct ui_file *stream) +{ + if (val != NULL && value_lval_const (val) == lval_register) + val_print_not_saved (stream); + else + fprintf_filtered (stream, _("")); +} + +void +val_print_not_saved (struct ui_file *stream) { - fprintf_filtered (stream, _("")); + fprintf_filtered (stream, _("")); } void @@ -371,7 +382,6 @@ generic_val_print (struct type *type, const gdb_byte *valaddr, const struct generic_val_print_decorations *decorations) { struct gdbarch *gdbarch = get_type_arch (type); - enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); unsigned int i = 0; /* Number of characters printed. */ unsigned len; struct type *elttype, *unresolved_elttype; @@ -392,7 +402,7 @@ generic_val_print (struct type *type, const gdb_byte *valaddr, if (!get_array_bounds (type, &low_bound, &high_bound)) error (_("Could not determine the array high bound")); - if (options->prettyprint_arrays) + if (options->prettyformat_arrays) { print_spaces_filtered (2 + 2 * recurse, stream); } @@ -738,9 +748,9 @@ val_print (struct type *type, const gdb_byte *valaddr, int embedded_offset, struct value_print_options local_opts = *options; struct type *real_type = check_typedef (type); - if (local_opts.pretty == Val_pretty_default) - local_opts.pretty = (local_opts.prettyprint_structs - ? Val_prettyprint : Val_no_prettyprint); + if (local_opts.prettyformat == Val_prettyformat_default) + local_opts.prettyformat = (local_opts.prettyformat_structs + ? Val_prettyformat : Val_no_prettyformat); QUIT; @@ -760,16 +770,16 @@ val_print (struct type *type, const gdb_byte *valaddr, int embedded_offset, if (!options->raw) { - ret = apply_val_pretty_printer (type, valaddr, embedded_offset, - address, stream, recurse, - val, options, language); + ret = apply_ext_lang_val_pretty_printer (type, valaddr, embedded_offset, + address, stream, recurse, + val, options, language); if (ret) return; } /* Handle summary mode. If the value is a scalar, print it; otherwise, print an ellipsis. */ - if (options->summary && !scalar_type_p (type)) + if (options->summary && !val_print_scalar_type_p (type)) { fprintf_filtered (stream, "..."); return; @@ -801,10 +811,19 @@ value_check_printable (struct value *val, struct ui_file *stream, if (value_entirely_optimized_out (val)) { - if (options->summary && !scalar_type_p (value_type (val))) + if (options->summary && !val_print_scalar_type_p (value_type (val))) + fprintf_filtered (stream, "..."); + else + val_print_optimized_out (val, stream); + return 0; + } + + if (value_entirely_unavailable (val)) + { + if (options->summary && !val_print_scalar_type_p (value_type (val))) fprintf_filtered (stream, "..."); else - val_print_optimized_out (stream); + val_print_unavailable (stream); return 0; } @@ -857,12 +876,13 @@ value_print (struct value *val, struct ui_file *stream, if (!options->raw) { - int r = apply_val_pretty_printer (value_type (val), - value_contents_for_printing (val), - value_embedded_offset (val), - value_address (val), - stream, 0, - val, options, current_language); + int r + = apply_ext_lang_val_pretty_printer (value_type (val), + value_contents_for_printing (val), + value_embedded_offset (val), + value_address (val), + stream, 0, + val, options, current_language); if (r) return; @@ -965,7 +985,7 @@ val_print_scalar_formatted (struct type *type, printed, because all bits contribute to its representation. */ if (!value_bits_valid (val, TARGET_CHAR_BIT * embedded_offset, TARGET_CHAR_BIT * TYPE_LENGTH (type))) - val_print_optimized_out (stream); + val_print_optimized_out (val, stream); else if (!value_bytes_available (val, embedded_offset, TYPE_LENGTH (type))) val_print_unavailable (stream); else @@ -1644,7 +1664,7 @@ val_print_array_elements (struct type *type, { if (i != 0) { - if (options->prettyprint_arrays) + if (options->prettyformat_arrays) { fprintf_filtered (stream, ",\n"); print_spaces_filtered (2 + 2 * recurse, stream); @@ -1707,15 +1727,15 @@ val_print_array_elements (struct type *type, /* Read LEN bytes of target memory at address MEMADDR, placing the results in GDB's memory at MYADDR. Returns a count of the bytes - actually read, and optionally an errno value in the location - pointed to by ERRNOPTR if ERRNOPTR is non-null. */ + actually read, and optionally a target_xfer_status value in the + location pointed to by ERRPTR if ERRPTR is non-null. */ /* FIXME: cagney/1999-10-14: Only used by val_print_string. Can this function be eliminated. */ static int partial_memory_read (CORE_ADDR memaddr, gdb_byte *myaddr, - int len, int *errnoptr) + int len, int *errptr) { int nread; /* Number of bytes actually read. */ int errcode; /* Error from last read. */ @@ -1740,9 +1760,9 @@ partial_memory_read (CORE_ADDR memaddr, gdb_byte *myaddr, nread--; } } - if (errnoptr != NULL) + if (errptr != NULL) { - *errnoptr = errcode; + *errptr = errcode; } return (nread); } @@ -1751,13 +1771,15 @@ partial_memory_read (CORE_ADDR memaddr, gdb_byte *myaddr, each. Fetch at most FETCHLIMIT characters. BUFFER will be set to a newly allocated buffer containing the string, which the caller is responsible to free, and BYTES_READ will be set to the number of bytes read. Returns 0 on - success, or errno on failure. + success, or a target_xfer_status on failure. + + If LEN > 0, reads the lesser of LEN or FETCHLIMIT characters + (including eventual NULs in the middle or end of the string). - If LEN > 0, reads exactly LEN characters (including eventual NULs in - the middle or end of the string). If LEN is -1, stops at the first - null character (not necessarily the first null byte) up to a maximum - of FETCHLIMIT characters. Set FETCHLIMIT to UINT_MAX to read as many - characters as possible from the string. + If LEN is -1, stops at the first null character (not necessarily + the first null byte) up to a maximum of FETCHLIMIT characters. Set + FETCHLIMIT to UINT_MAX to read as many characters as possible from + the string. Unless an exception is thrown, BUFFER will always be allocated, even on failure. In this case, some characters might have been read before the @@ -1803,10 +1825,12 @@ read_string (CORE_ADDR addr, int len, int width, unsigned int fetchlimit, if (len > 0) { - *buffer = (gdb_byte *) xmalloc (len * width); + unsigned int fetchlen = min (len, fetchlimit); + + *buffer = (gdb_byte *) xmalloc (fetchlen * width); bufptr = *buffer; - nfetch = partial_memory_read (addr, bufptr, len * width, &errcode) + nfetch = partial_memory_read (addr, bufptr, fetchlen * width, &errcode) / width; addr += nfetch * width; bufptr += nfetch * width; @@ -1974,9 +1998,10 @@ print_wchar (gdb_wint_t w, const gdb_byte *orig, /* If the value fits in 3 octal digits, print it that way. Otherwise, print it as a hex escape. */ if (value <= 0777) - sprintf (octal, "\\%.3o", (int) (value & 0777)); + xsnprintf (octal, sizeof (octal), "\\%.3o", + (int) (value & 0777)); else - sprintf (octal, "\\x%lx", (long) value); + xsnprintf (octal, sizeof (octal), "\\x%lx", (long) value); append_string_as_wide (octal, output); } /* If we somehow have extra bytes, print them now. */ @@ -1984,7 +2009,7 @@ print_wchar (gdb_wint_t w, const gdb_byte *orig, { char octal[5]; - sprintf (octal, "\\%.3o", orig[i] & 0xff); + xsnprintf (octal, sizeof (octal), "\\%.3o", orig[i] & 0xff); append_string_as_wide (octal, output); ++i; } @@ -2072,7 +2097,7 @@ generic_emit_char (int c, struct type *type, struct ui_file *stream, make_cleanup_obstack_free (&output); convert_between_encodings (INTERMEDIATE_ENCODING, host_charset (), - obstack_base (&wchar_buf), + (gdb_byte *) obstack_base (&wchar_buf), obstack_object_size (&wchar_buf), sizeof (gdb_wchar_t), &output, translit_char); obstack_1grow (&output, '\0'); @@ -2210,8 +2235,6 @@ print_converted_chars_to_obstack (struct obstack *obstack, must output and a comma and a quote. */ if (last != START) obstack_grow_wstr (obstack, LCST (", ")); - if (options->inspect_it) - obstack_grow_wstr (obstack, LCST ("\\")); obstack_grow (obstack, &wide_quote_char, sizeof (gdb_wchar_t)); } /* Output the character. */ @@ -2239,8 +2262,6 @@ print_converted_chars_to_obstack (struct obstack *obstack, { /* We were outputting a single string. Terminate the string. */ - if (options->inspect_it) - obstack_grow_wstr (obstack, LCST ("\\")); obstack_grow (obstack, &wide_quote_char, sizeof (gdb_wchar_t)); } if (last != START) @@ -2271,8 +2292,6 @@ print_converted_chars_to_obstack (struct obstack *obstack, { /* If we were outputting a string of SINGLE characters, terminate the quote. */ - if (options->inspect_it) - obstack_grow_wstr (obstack, LCST ("\\")); obstack_grow (obstack, &wide_quote_char, sizeof (gdb_wchar_t)); } if (last != START) @@ -2293,11 +2312,7 @@ print_converted_chars_to_obstack (struct obstack *obstack, characters, the string must be terminated. Otherwise, REPEAT and INCOMPLETE are always left properly terminated. */ if (last == SINGLE) - { - if (options->inspect_it) - obstack_grow_wstr (obstack, LCST ("\\")); - obstack_grow (obstack, &wide_quote_char, sizeof (gdb_wchar_t)); - } + obstack_grow (obstack, &wide_quote_char, sizeof (gdb_wchar_t)); return; } @@ -2437,7 +2452,7 @@ generic_printstr (struct ui_file *stream, struct type *type, make_cleanup_obstack_free (&output); convert_between_encodings (INTERMEDIATE_ENCODING, host_charset (), - obstack_base (&wchar_buf), + (gdb_byte *) obstack_base (&wchar_buf), obstack_object_size (&wchar_buf), sizeof (gdb_wchar_t), &output, translit_char); obstack_1grow (&output, '\0'); @@ -2529,18 +2544,14 @@ val_print_string (struct type *elttype, const char *encoding, if (errcode != 0) { - if (errcode == EIO) - { - fprintf_filtered (stream, "
"); - } - else - { - fprintf_filtered (stream, "", safe_strerror (errcode)); - } + char *str; + + str = memory_error_message (errcode, gdbarch, addr); + make_cleanup (xfree, str); + + fprintf_filtered (stream, ""); } gdb_flush (stream); @@ -2697,6 +2708,21 @@ show_print (char *args, int from_tty) { cmd_show_list (showprintlist, from_tty, ""); } + +static void +set_print_raw (char *arg, int from_tty) +{ + printf_unfiltered ( + "\"set print raw\" must be followed by the name of a \"print raw\" subcommand.\n"); + help_list (setprintrawlist, "set print raw ", -1, gdb_stdout); +} + +static void +show_print_raw (char *args, int from_tty) +{ + cmd_show_list (showprintrawlist, from_tty, ""); +} + void _initialize_valprint (void) @@ -2714,11 +2740,19 @@ _initialize_valprint (void) add_alias_cmd ("p", "print", no_class, 1, &showlist); add_alias_cmd ("pr", "print", no_class, 1, &showlist); + add_prefix_cmd ("raw", no_class, set_print_raw, + _("\ +Generic command for setting what things to print in \"raw\" mode."), + &setprintrawlist, "set print raw ", 0, &setprintlist); + add_prefix_cmd ("raw", no_class, show_print_raw, + _("Generic command for showing \"print raw\" settings."), + &showprintrawlist, "show print raw ", 0, &showprintlist); + add_setshow_uinteger_cmd ("elements", no_class, &user_print_options.print_max, _("\ Set limit on string chars or array elements to print."), _("\ Show limit on string chars or array elements to print."), _("\ -\"set print elements 0\" causes there to be no limit."), +\"set print elements unlimited\" causes there to be no limit."), NULL, show_print_max, &setprintlist, &showprintlist); @@ -2735,17 +2769,17 @@ Show printing of char arrays to stop at first null char."), NULL, &user_print_options.repeat_count_threshold, _("\ Set threshold for repeated print elements."), _("\ Show threshold for repeated print elements."), _("\ -\"set print repeats 0\" causes all elements to be individually printed."), +\"set print repeats unlimited\" causes all elements to be individually printed."), NULL, show_repeat_count_threshold, &setprintlist, &showprintlist); add_setshow_boolean_cmd ("pretty", class_support, - &user_print_options.prettyprint_structs, _("\ -Set prettyprinting of structures."), _("\ -Show prettyprinting of structures."), NULL, + &user_print_options.prettyformat_structs, _("\ +Set pretty formatting of structures."), _("\ +Show pretty formatting of structures."), NULL, NULL, - show_prettyprint_structs, + show_prettyformat_structs, &setprintlist, &showprintlist); add_setshow_boolean_cmd ("union", class_support, @@ -2757,11 +2791,11 @@ Show printing of unions interior to structures."), NULL, &setprintlist, &showprintlist); add_setshow_boolean_cmd ("array", class_support, - &user_print_options.prettyprint_arrays, _("\ -Set prettyprinting of arrays."), _("\ -Show prettyprinting of arrays."), NULL, + &user_print_options.prettyformat_arrays, _("\ +Set pretty formatting of arrays."), _("\ +Show pretty formatting of arrays."), NULL, NULL, - show_prettyprint_arrays, + show_prettyformat_arrays, &setprintlist, &showprintlist); add_setshow_boolean_cmd ("address", class_support,