Introduce value_print_scalar_formatted
authorTom Tromey <tom@tromey.com>
Fri, 13 Mar 2020 23:39:52 +0000 (17:39 -0600)
committerTom Tromey <tom@tromey.com>
Sat, 14 Mar 2020 00:03:40 +0000 (18:03 -0600)
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  <tom@tromey.com>

* valprint.h (value_print_scalar_formatted): Declare.
* valprint.c (value_print_scalar_formatted): New function.

gdb/ChangeLog
gdb/valprint.c
gdb/valprint.h

index 48572cb4d2a8e1c0e537969db2542be2d07810f2..264565edf19c73e407dae33cbe94465b228242da 100644 (file)
@@ -1,3 +1,8 @@
+2020-03-13  Tom Tromey  <tom@tromey.com>
+
+       * valprint.h (value_print_scalar_formatted): Declare.
+       * valprint.c (value_print_scalar_formatted): New function.
+
 2020-03-13  Tom Tromey  <tom@tromey.com>
 
        * valprint.h (generic_value_print): Declare.
index 7b0365a3ba8321aaae52f378885854a165b904f4..9cdf18ee864dc212c2c66a817a9dffb2037100c9 100644 (file)
@@ -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 
index 1aca29463f44687af62c556446add9c849935e7a..90df12dbd7e2719d265795a91db8b9acebfe425a 100644 (file)
@@ -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);