summaryrefslogtreecommitdiff
path: root/gdb/ada-valprint.c
diff options
context:
space:
mode:
authorTom Tromey <tom@tromey.com>2020-03-13 17:39:52 -0600
committerTom Tromey <tom@tromey.com>2020-03-13 18:03:41 -0600
commit5b5e15ecddafc43de2da632aa68f935a879d9a91 (patch)
tree7699cb7efa83949f8a89fadfb7819406af78a0c3 /gdb/ada-valprint.c
parentfbf54e7554e0dcd60e18b1821c5c127fb3eb48ff (diff)
downloadbinutils-gdb-5b5e15ecddafc43de2da632aa68f935a879d9a91.tar.gz
Rewrite ada_value_print_inner
This rewrites ada_value_print_inner, introducing a new ada_value_print_1, an analogue of ada_val_print_1. Because it was simple to do, this also converts ada_val_print_gnat_array to be valued-based and updates the uses. gdb/ChangeLog 2020-03-13 Tom Tromey <tom@tromey.com> * ada-valprint.c (ada_val_print_gnat_array): Take a struct value; call common_val_print. (ada_val_print_1): Update. (ada_value_print_1): New function. (ada_value_print_inner): Rewrite.
Diffstat (limited to 'gdb/ada-valprint.c')
-rw-r--r--gdb/ada-valprint.c120
1 files changed, 104 insertions, 16 deletions
diff --git a/gdb/ada-valprint.c b/gdb/ada-valprint.c
index c983cbbab71..3c389d63536 100644
--- a/gdb/ada-valprint.c
+++ b/gdb/ada-valprint.c
@@ -762,16 +762,14 @@ ada_val_print_string (struct type *type, const gdb_byte *valaddr,
thin pointers, etc). */
static void
-ada_val_print_gnat_array (struct type *type, const gdb_byte *valaddr,
- int offset, CORE_ADDR address,
+ada_val_print_gnat_array (struct value *val,
struct ui_file *stream, int recurse,
- struct value *original_value,
const struct value_print_options *options)
{
- struct value *mark = value_mark ();
- struct value *val;
+ scoped_value_mark free_values;
+
+ struct type *type = ada_check_typedef (value_type (val));
- val = value_from_contents_and_address (type, valaddr + offset, address);
/* If this is a reference, coerce it now. This helps taking care
of the case where ADDRESS is meaningless because original_value
was not an lval. */
@@ -786,11 +784,8 @@ ada_val_print_gnat_array (struct type *type, const gdb_byte *valaddr,
fprintf_filtered (stream, "0x0");
}
else
- val_print (value_type (val),
- value_embedded_offset (val), value_address (val),
- stream, recurse, val, options,
- language_def (language_ada));
- value_free_to_mark (mark);
+ common_val_print (val, stream, recurse, options,
+ language_def (language_ada));
}
/* Implement Ada val_print'ing for the case where TYPE is
@@ -1135,9 +1130,10 @@ ada_val_print_1 (struct type *type,
|| (ada_is_constrained_packed_array_type (type)
&& TYPE_CODE (type) != TYPE_CODE_PTR))
{
- ada_val_print_gnat_array (type, valaddr, offset, address,
- stream, recurse, original_value,
- options);
+ struct value *val = value_from_contents_and_address (type,
+ valaddr + offset,
+ address);
+ ada_val_print_gnat_array (val, stream, recurse, options);
return;
}
@@ -1222,6 +1218,90 @@ ada_val_print (struct type *type,
}
}
+/* See the comment on ada_value_print. This function differs in that
+ it does not catch evaluation errors (leaving that to
+ ada_value_print). */
+
+static void
+ada_value_print_1 (struct value *val, struct ui_file *stream, int recurse,
+ const struct value_print_options *options)
+{
+ struct type *type = ada_check_typedef (value_type (val));
+
+ if (ada_is_array_descriptor_type (type)
+ || (ada_is_constrained_packed_array_type (type)
+ && TYPE_CODE (type) != TYPE_CODE_PTR))
+ {
+ ada_val_print_gnat_array (val, stream, recurse, options);
+ return;
+ }
+
+ val = ada_to_fixed_value (val);
+ type = value_type (val);
+ struct type *saved_type = type;
+
+ const gdb_byte *valaddr = value_contents_for_printing (val);
+ CORE_ADDR address = value_address (val);
+ type = ada_check_typedef (resolve_dynamic_type (type, valaddr, address));
+ if (type != saved_type)
+ {
+ val = value_copy (val);
+ deprecated_set_value_type (val, type);
+ }
+
+ switch (TYPE_CODE (type))
+ {
+ default:
+ common_val_print (val, stream, recurse, options,
+ language_def (language_c));
+ break;
+
+ case TYPE_CODE_PTR:
+ ada_val_print_ptr (type, valaddr, 0, 0,
+ address, stream, recurse, val,
+ options);
+ break;
+
+ case TYPE_CODE_INT:
+ case TYPE_CODE_RANGE:
+ ada_val_print_num (type, valaddr, 0, 0,
+ address, stream, recurse, val,
+ options);
+ break;
+
+ case TYPE_CODE_ENUM:
+ ada_val_print_enum (type, valaddr, 0, 0,
+ address, stream, recurse, val,
+ options);
+ break;
+
+ case TYPE_CODE_FLT:
+ ada_val_print_flt (type, valaddr, 0, 0,
+ address, stream, recurse, val,
+ options);
+ break;
+
+ case TYPE_CODE_UNION:
+ case TYPE_CODE_STRUCT:
+ ada_val_print_struct_union (type, valaddr, 0, 0,
+ address, stream, recurse,
+ val, options);
+ break;
+
+ case TYPE_CODE_ARRAY:
+ ada_val_print_array (type, valaddr, 0, 0,
+ address, stream, recurse, val,
+ options);
+ return;
+
+ case TYPE_CODE_REF:
+ ada_val_print_ref (type, valaddr, 0, 0,
+ address, stream, recurse, val,
+ options);
+ break;
+ }
+}
+
/* See ada-lang.h. */
void
@@ -1229,8 +1309,16 @@ ada_value_print_inner (struct value *val, struct ui_file *stream,
int recurse,
const struct value_print_options *options)
{
- ada_val_print (value_type (val), value_embedded_offset (val),
- value_address (val), stream, recurse, val, options);
+ try
+ {
+ ada_value_print_1 (val, stream, recurse, options);
+ }
+ catch (const gdb_exception_error &except)
+ {
+ fprintf_styled (stream, metadata_style.style (),
+ _("<error reading variable: %s>"),
+ except.what ());
+ }
}
void