From 4f9ae810130bc4202ec1c5eae934900c542a9016 Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Fri, 13 Mar 2020 17:39:52 -0600 Subject: [PATCH] Introduce value_print_scalar_formatted This introduces a value_print_scalar_formatted, which is an analogue of val_print_scalar_formatted that uses the value API. gdb/ChangeLog 2020-03-13 Tom Tromey * valprint.h (value_print_scalar_formatted): Declare. * valprint.c (value_print_scalar_formatted): New function. --- gdb/ChangeLog | 5 +++++ gdb/valprint.c | 40 ++++++++++++++++++++++++++++++++++++++++ gdb/valprint.h | 10 ++++++++++ 3 files changed, 55 insertions(+) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 48572cb4d2..264565edf1 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,8 @@ +2020-03-13 Tom Tromey + + * valprint.h (value_print_scalar_formatted): Declare. + * valprint.c (value_print_scalar_formatted): New function. + 2020-03-13 Tom Tromey * valprint.h (generic_value_print): Declare. diff --git a/gdb/valprint.c b/gdb/valprint.c index 7b0365a3ba..9cdf18ee86 100644 --- a/gdb/valprint.c +++ b/gdb/valprint.c @@ -1394,6 +1394,46 @@ val_print_scalar_formatted (struct type *type, options, size, stream); } +/* See valprint.h. */ + +void +value_print_scalar_formatted (struct value *val, + const struct value_print_options *options, + int size, + struct ui_file *stream) +{ + struct type *type = check_typedef (value_type (val)); + + gdb_assert (val != NULL); + + /* If we get here with a string format, try again without it. Go + all the way back to the language printers, which may call us + again. */ + if (options->format == 's') + { + struct value_print_options opts = *options; + opts.format = 0; + opts.deref_ref = 0; + common_val_print (val, stream, 0, &opts, current_language); + return; + } + + /* value_contents_for_printing fetches all VAL's contents. They are + needed to check whether VAL is optimized-out or unavailable + below. */ + const gdb_byte *valaddr = value_contents_for_printing (val); + + /* A scalar object that does not have all bits available can't be + printed, because all bits contribute to its representation. */ + if (value_bits_any_optimized_out (val, 0, + TARGET_CHAR_BIT * TYPE_LENGTH (type))) + val_print_optimized_out (val, stream); + else if (!value_bytes_available (val, 0, TYPE_LENGTH (type))) + val_print_unavailable (stream); + else + print_scalar_formatted (valaddr, type, options, size, stream); +} + /* Print a number according to FORMAT which is one of d,u,x,o,b,h,w,g. The raison d'etre of this function is to consolidate printing of LONG_LONG's into this one function. The format chars b,h,w,g are diff --git a/gdb/valprint.h b/gdb/valprint.h index 1aca29463f..90df12dbd7 100644 --- a/gdb/valprint.h +++ b/gdb/valprint.h @@ -141,6 +141,16 @@ extern void val_print_scalar_formatted (struct type *, int, struct ui_file *); +/* Print a scalar according to OPTIONS and SIZE on STREAM. Format 'i' + is not supported at this level. + + This is how the elements of an array or structure are printed + with a format. */ + +extern void value_print_scalar_formatted + (struct value *val, const struct value_print_options *options, + int size, struct ui_file *stream); + extern void print_binary_chars (struct ui_file *, const gdb_byte *, unsigned int, enum bfd_endian, bool); -- 2.34.1