public inbox for gdb-cvs@sourceware.org
help / color / mirror / Atom feed
* [binutils-gdb] Introduce value_print_scalar_formatted
@ 2020-03-14  0:05 Tom Tromey
  0 siblings, 0 replies; only message in thread
From: Tom Tromey @ 2020-03-14  0:05 UTC (permalink / raw)
  To: gdb-cvs

https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=4f9ae810130bc4202ec1c5eae934900c542a9016

commit 4f9ae810130bc4202ec1c5eae934900c542a9016
Author: Tom Tromey <tom@tromey.com>
Date:   Fri Mar 13 17:39:52 2020 -0600

    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  <tom@tromey.com>
    
            * valprint.h (value_print_scalar_formatted): Declare.
            * valprint.c (value_print_scalar_formatted): New function.

Diff:
---
 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 48572cb4d2a..264565edf19 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -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.
diff --git a/gdb/valprint.c b/gdb/valprint.c
index 7b0365a3ba8..9cdf18ee864 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 1aca29463f4..90df12dbd7e 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);


^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2020-03-14  0:05 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-03-14  0:05 [binutils-gdb] Introduce value_print_scalar_formatted Tom Tromey

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).