gdb/ada-valprint.c - gdb
Functions defined
Source code
- #include "defs.h"
- #include <ctype.h>
- #include "symtab.h"
- #include "gdbtypes.h"
- #include "expression.h"
- #include "value.h"
- #include "demangle.h"
- #include "valprint.h"
- #include "language.h"
- #include "annotate.h"
- #include "ada-lang.h"
- #include "c-lang.h"
- #include "infcall.h"
- #include "objfiles.h"
- static int print_field_values (struct type *, const gdb_byte *,
- int,
- struct ui_file *, int,
- const struct value *,
- const struct value_print_options *,
- int, struct type *, int,
- const struct language_defn *);
- static void
- adjust_type_signedness (struct type *type)
- {
- if (type != NULL && TYPE_CODE (type) == TYPE_CODE_RANGE
- && TYPE_LOW_BOUND (type) >= 0)
- TYPE_UNSIGNED (type) = 1;
- }
- static int
- print_optional_low_bound (struct ui_file *stream, struct type *type,
- const struct value_print_options *options)
- {
- struct type *index_type;
- LONGEST low_bound;
- LONGEST high_bound;
- if (options->print_array_indexes)
- return 0;
- if (!get_array_bounds (type, &low_bound, &high_bound))
- return 0;
-
- if (low_bound > high_bound)
- return 0;
- index_type = TYPE_INDEX_TYPE (type);
- while (TYPE_CODE (index_type) == TYPE_CODE_RANGE)
- {
-
- index_type = TYPE_TARGET_TYPE (index_type);
- }
- switch (TYPE_CODE (index_type))
- {
- case TYPE_CODE_BOOL:
- if (low_bound == 0)
- return 0;
- break;
- case TYPE_CODE_ENUM:
- if (low_bound == TYPE_FIELD_ENUMVAL (index_type, 0))
- return 0;
- break;
- case TYPE_CODE_UNDEF:
- index_type = NULL;
-
- default:
- if (low_bound == 1)
- return 0;
- break;
- }
- ada_print_scalar (index_type, low_bound, stream);
- fprintf_filtered (stream, " => ");
- return 1;
- }
- static void
- val_print_packed_array_elements (struct type *type, const gdb_byte *valaddr,
- int offset,
- int bitoffset, struct ui_file *stream,
- int recurse,
- const struct value *val,
- const struct value_print_options *options)
- {
- unsigned int i;
- unsigned int things_printed = 0;
- unsigned len;
- struct type *elttype, *index_type;
- unsigned eltlen;
- unsigned long bitsize = TYPE_FIELD_BITSIZE (type, 0);
- struct value *mark = value_mark ();
- LONGEST low = 0;
- elttype = TYPE_TARGET_TYPE (type);
- eltlen = TYPE_LENGTH (check_typedef (elttype));
- index_type = TYPE_INDEX_TYPE (type);
- {
- LONGEST high;
- if (get_discrete_bounds (index_type, &low, &high) < 0)
- len = 1;
- else
- len = high - low + 1;
- }
- i = 0;
- annotate_array_section_begin (i, elttype);
- while (i < len && things_printed < options->print_max)
- {
- struct value *v0, *v1;
- int i0;
- if (i != 0)
- {
- if (options->prettyformat_arrays)
- {
- fprintf_filtered (stream, ",\n");
- print_spaces_filtered (2 + 2 * recurse, stream);
- }
- else
- {
- fprintf_filtered (stream, ", ");
- }
- }
- wrap_here (n_spaces (2 + 2 * recurse));
- maybe_print_array_index (index_type, i + low, stream, options);
- i0 = i;
- v0 = ada_value_primitive_packed_val (NULL, valaddr + offset,
- (i0 * bitsize) / HOST_CHAR_BIT,
- (i0 * bitsize) % HOST_CHAR_BIT,
- bitsize, elttype);
- while (1)
- {
- i += 1;
- if (i >= len)
- break;
- v1 = ada_value_primitive_packed_val (NULL, valaddr + offset,
- (i * bitsize) / HOST_CHAR_BIT,
- (i * bitsize) % HOST_CHAR_BIT,
- bitsize, elttype);
- if (!value_contents_eq (v0, value_embedded_offset (v0),
- v1, value_embedded_offset (v1),
- eltlen))
- break;
- }
- if (i - i0 > options->repeat_count_threshold)
- {
- struct value_print_options opts = *options;
- opts.deref_ref = 0;
- val_print (elttype, value_contents_for_printing (v0),
- value_embedded_offset (v0), 0, stream,
- recurse + 1, v0, &opts, current_language);
- annotate_elt_rep (i - i0);
- fprintf_filtered (stream, _(" <repeats %u times>"), i - i0);
- annotate_elt_rep_end ();
- }
- else
- {
- int j;
- struct value_print_options opts = *options;
- opts.deref_ref = 0;
- for (j = i0; j < i; j += 1)
- {
- if (j > i0)
- {
- if (options->prettyformat_arrays)
- {
- fprintf_filtered (stream, ",\n");
- print_spaces_filtered (2 + 2 * recurse, stream);
- }
- else
- {
- fprintf_filtered (stream, ", ");
- }
- wrap_here (n_spaces (2 + 2 * recurse));
- maybe_print_array_index (index_type, j + low,
- stream, options);
- }
- val_print (elttype, value_contents_for_printing (v0),
- value_embedded_offset (v0), 0, stream,
- recurse + 1, v0, &opts, current_language);
- annotate_elt ();
- }
- }
- things_printed += i - i0;
- }
- annotate_array_section_end ();
- if (i < len)
- {
- fprintf_filtered (stream, "...");
- }
- value_free_to_mark (mark);
- }
- static struct type *
- printable_val_type (struct type *type, const gdb_byte *valaddr)
- {
- return ada_to_fixed_type (ada_aligned_type (type), valaddr, 0, NULL, 1);
- }
- void
- ada_emit_char (int c, struct type *type, struct ui_file *stream,
- int quoter, int type_len)
- {
-
- if (c <= UCHAR_MAX && isascii (c) && isprint (c))
- {
- if (c == quoter && c == '"')
- fprintf_filtered (stream, "\"\"");
- else
- fprintf_filtered (stream, "%c", c);
- }
- else
- fprintf_filtered (stream, "[\"%0*x\"]", type_len * 2, c);
- }
- static int
- char_at (const gdb_byte *string, int i, int type_len,
- enum bfd_endian byte_order)
- {
- if (type_len == 1)
- return string[i];
- else
- return (int) extract_unsigned_integer (string + type_len * i,
- type_len, byte_order);
- }
- static void
- ada_print_floating (const gdb_byte *valaddr, struct type *type,
- struct ui_file *stream)
- {
- char *s, *result;
- struct ui_file *tmp_stream = mem_fileopen ();
- struct cleanup *cleanups = make_cleanup_ui_file_delete (tmp_stream);
- print_floating (valaddr, type, tmp_stream);
- result = ui_file_xstrdup (tmp_stream, NULL);
- make_cleanup (xfree, result);
-
- s = strstr (result, "inf");
- if (s == NULL)
- s = strstr (result, "Inf");
- if (s == NULL)
- s = strstr (result, "INF");
- if (s != NULL)
- strcpy (s, "Inf");
- if (s == NULL)
- {
- s = strstr (result, "nan");
- if (s == NULL)
- s = strstr (result, "NaN");
- if (s == NULL)
- s = strstr (result, "Nan");
- if (s != NULL)
- {
- s[0] = s[2] = 'N';
- if (result[0] == '-')
- result += 1;
- }
- }
- if (s == NULL && strchr (result, '.') == NULL)
- {
- s = strchr (result, 'e');
- if (s == NULL)
- fprintf_filtered (stream, "%s.0", result);
- else
- fprintf_filtered (stream, "%.*s.0%s", (int) (s-result), result, s);
- }
- else
- fprintf_filtered (stream, "%s", result);
- do_cleanups (cleanups);
- }
- void
- ada_printchar (int c, struct type *type, struct ui_file *stream)
- {
- fputs_filtered ("'", stream);
- ada_emit_char (c, type, stream, '\'', TYPE_LENGTH (type));
- fputs_filtered ("'", stream);
- }
- void
- ada_print_scalar (struct type *type, LONGEST val, struct ui_file *stream)
- {
- unsigned int i;
- unsigned len;
- if (!type)
- {
- print_longest (stream, 'd', 0, val);
- return;
- }
- type = ada_check_typedef (type);
- switch (TYPE_CODE (type))
- {
- case TYPE_CODE_ENUM:
- len = TYPE_NFIELDS (type);
- for (i = 0; i < len; i++)
- {
- if (TYPE_FIELD_ENUMVAL (type, i) == val)
- {
- break;
- }
- }
- if (i < len)
- {
- fputs_filtered (ada_enum_name (TYPE_FIELD_NAME (type, i)), stream);
- }
- else
- {
- print_longest (stream, 'd', 0, val);
- }
- break;
- case TYPE_CODE_INT:
- print_longest (stream, TYPE_UNSIGNED (type) ? 'u' : 'd', 0, val);
- break;
- case TYPE_CODE_CHAR:
- LA_PRINT_CHAR (val, type, stream);
- break;
- case TYPE_CODE_BOOL:
- fprintf_filtered (stream, val ? "true" : "false");
- break;
- case TYPE_CODE_RANGE:
- ada_print_scalar (TYPE_TARGET_TYPE (type), val, stream);
- return;
- case TYPE_CODE_UNDEF:
- case TYPE_CODE_PTR:
- case TYPE_CODE_ARRAY:
- case TYPE_CODE_STRUCT:
- case TYPE_CODE_UNION:
- case TYPE_CODE_FUNC:
- case TYPE_CODE_FLT:
- case TYPE_CODE_VOID:
- case TYPE_CODE_SET:
- case TYPE_CODE_STRING:
- case TYPE_CODE_ERROR:
- case TYPE_CODE_MEMBERPTR:
- case TYPE_CODE_METHODPTR:
- case TYPE_CODE_METHOD:
- case TYPE_CODE_REF:
- warning (_("internal error: unhandled type in ada_print_scalar"));
- break;
- default:
- error (_("Invalid type code in symbol table."));
- }
- gdb_flush (stream);
- }
- static void
- printstr (struct ui_file *stream, struct type *elttype, const gdb_byte *string,
- unsigned int length, int force_ellipses, int type_len,
- const struct value_print_options *options)
- {
- enum bfd_endian byte_order = gdbarch_byte_order (get_type_arch (elttype));
- unsigned int i;
- unsigned int things_printed = 0;
- int in_quotes = 0;
- int need_comma = 0;
- if (length == 0)
- {
- fputs_filtered ("\"\"", stream);
- return;
- }
- for (i = 0; i < length && things_printed < options->print_max; i += 1)
- {
-
- unsigned int rep1;
-
- unsigned int reps;
- QUIT;
- if (need_comma)
- {
- fputs_filtered (", ", stream);
- need_comma = 0;
- }
- rep1 = i + 1;
- reps = 1;
- while (rep1 < length
- && char_at (string, rep1, type_len, byte_order)
- == char_at (string, i, type_len, byte_order))
- {
- rep1 += 1;
- reps += 1;
- }
- if (reps > options->repeat_count_threshold)
- {
- if (in_quotes)
- {
- fputs_filtered ("\", ", stream);
- in_quotes = 0;
- }
- fputs_filtered ("'", stream);
- ada_emit_char (char_at (string, i, type_len, byte_order),
- elttype, stream, '\'', type_len);
- fputs_filtered ("'", stream);
- fprintf_filtered (stream, _(" <repeats %u times>"), reps);
- i = rep1 - 1;
- things_printed += options->repeat_count_threshold;
- need_comma = 1;
- }
- else
- {
- if (!in_quotes)
- {
- fputs_filtered ("\"", stream);
- in_quotes = 1;
- }
- ada_emit_char (char_at (string, i, type_len, byte_order),
- elttype, stream, '"', type_len);
- things_printed += 1;
- }
- }
-
- if (in_quotes)
- fputs_filtered ("\"", stream);
- if (force_ellipses || i < length)
- fputs_filtered ("...", stream);
- }
- void
- ada_printstr (struct ui_file *stream, struct type *type,
- const gdb_byte *string, unsigned int length,
- const char *encoding, int force_ellipses,
- const struct value_print_options *options)
- {
- printstr (stream, type, string, length, force_ellipses, TYPE_LENGTH (type),
- options);
- }
- static int
- print_variant_part (struct type *type, int field_num,
- const gdb_byte *valaddr, int offset,
- struct ui_file *stream, int recurse,
- const struct value *val,
- const struct value_print_options *options,
- int comma_needed,
- struct type *outer_type, int outer_offset,
- const struct language_defn *language)
- {
- struct type *var_type = TYPE_FIELD_TYPE (type, field_num);
- int which = ada_which_variant_applies (var_type, outer_type,
- valaddr + outer_offset);
- if (which < 0)
- return 0;
- else
- return print_field_values
- (TYPE_FIELD_TYPE (var_type, which),
- valaddr,
- offset + TYPE_FIELD_BITPOS (type, field_num) / HOST_CHAR_BIT
- + TYPE_FIELD_BITPOS (var_type, which) / HOST_CHAR_BIT,
- stream, recurse, val, options,
- comma_needed, outer_type, outer_offset, language);
- }
- static int
- print_field_values (struct type *type, const gdb_byte *valaddr,
- int offset, struct ui_file *stream, int recurse,
- const struct value *val,
- const struct value_print_options *options,
- int comma_needed,
- struct type *outer_type, int outer_offset,
- const struct language_defn *language)
- {
- int i, len;
- len = TYPE_NFIELDS (type);
- for (i = 0; i < len; i += 1)
- {
- if (ada_is_ignored_field (type, i))
- continue;
- if (ada_is_wrapper_field (type, i))
- {
- comma_needed =
- print_field_values (TYPE_FIELD_TYPE (type, i),
- valaddr,
- (offset
- + TYPE_FIELD_BITPOS (type, i) / HOST_CHAR_BIT),
- stream, recurse, val, options,
- comma_needed, type, offset, language);
- continue;
- }
- else if (ada_is_variant_part (type, i))
- {
- comma_needed =
- print_variant_part (type, i, valaddr,
- offset, stream, recurse, val,
- options, comma_needed,
- outer_type, outer_offset, language);
- continue;
- }
- if (comma_needed)
- fprintf_filtered (stream, ", ");
- comma_needed = 1;
- if (options->prettyformat)
- {
- fprintf_filtered (stream, "\n");
- print_spaces_filtered (2 + 2 * recurse, stream);
- }
- else
- {
- wrap_here (n_spaces (2 + 2 * recurse));
- }
- annotate_field_begin (TYPE_FIELD_TYPE (type, i));
- fprintf_filtered (stream, "%.*s",
- ada_name_prefix_len (TYPE_FIELD_NAME (type, i)),
- TYPE_FIELD_NAME (type, i));
- annotate_field_name_end ();
- fputs_filtered (" => ", stream);
- annotate_field_value ();
- if (TYPE_FIELD_PACKED (type, i))
- {
- struct value *v;
-
- if (HAVE_CPLUS_STRUCT (type) && TYPE_FIELD_IGNORE (type, i))
- {
- fputs_filtered (_("<optimized out or zero length>"), stream);
- }
- else
- {
- int bit_pos = TYPE_FIELD_BITPOS (type, i);
- int bit_size = TYPE_FIELD_BITSIZE (type, i);
- struct value_print_options opts;
- adjust_type_signedness (TYPE_FIELD_TYPE (type, i));
- v = ada_value_primitive_packed_val
- (NULL, valaddr,
- offset + bit_pos / HOST_CHAR_BIT,
- bit_pos % HOST_CHAR_BIT,
- bit_size, TYPE_FIELD_TYPE (type, i));
- opts = *options;
- opts.deref_ref = 0;
- val_print (TYPE_FIELD_TYPE (type, i),
- value_contents_for_printing (v),
- value_embedded_offset (v), 0,
- stream, recurse + 1, v,
- &opts, language);
- }
- }
- else
- {
- struct value_print_options opts = *options;
- opts.deref_ref = 0;
- val_print (TYPE_FIELD_TYPE (type, i), valaddr,
- (offset + TYPE_FIELD_BITPOS (type, i) / HOST_CHAR_BIT),
- 0, stream, recurse + 1, val, &opts, language);
- }
- annotate_field_end ();
- }
- return comma_needed;
- }
- static void
- ada_val_print_string (struct type *type, const gdb_byte *valaddr,
- int offset, int offset_aligned, CORE_ADDR address,
- struct ui_file *stream, int recurse,
- const struct value *original_value,
- const struct value_print_options *options)
- {
- enum bfd_endian byte_order = gdbarch_byte_order (get_type_arch (type));
- struct type *elttype = TYPE_TARGET_TYPE (type);
- unsigned int eltlen;
- unsigned int len;
-
- gdb_assert (elttype != NULL);
- gdb_assert (TYPE_LENGTH (elttype) != 0);
- eltlen = TYPE_LENGTH (elttype);
- len = TYPE_LENGTH (type) / eltlen;
- if (options->prettyformat_arrays)
- print_spaces_filtered (2 + 2 * recurse, stream);
-
- if (options->stop_print_at_null)
- {
- int temp_len;
-
- for (temp_len = 0;
- (temp_len < len
- && temp_len < options->print_max
- && char_at (valaddr + offset_aligned,
- temp_len, eltlen, byte_order) != 0);
- temp_len += 1);
- len = temp_len;
- }
- printstr (stream, elttype, valaddr + offset_aligned, len, 0,
- eltlen, options);
- }
- static void
- ada_val_print_gnat_array (struct type *type, const gdb_byte *valaddr,
- int offset, CORE_ADDR address,
- struct ui_file *stream, int recurse,
- const struct value *original_value,
- const struct value_print_options *options,
- const struct language_defn *language)
- {
- struct value *mark = value_mark ();
- struct value *val;
- val = value_from_contents_and_address (type, valaddr + offset, address);
-
- val = coerce_ref (val);
- if (TYPE_CODE (type) == TYPE_CODE_TYPEDEF)
- val = ada_coerce_to_simple_array_ptr (val);
- else
- val = ada_coerce_to_simple_array (val);
- if (val == NULL)
- {
- gdb_assert (TYPE_CODE (type) == TYPE_CODE_TYPEDEF);
- fprintf_filtered (stream, "0x0");
- }
- else
- val_print (value_type (val), value_contents_for_printing (val),
- value_embedded_offset (val), value_address (val),
- stream, recurse, val, options, language);
- value_free_to_mark (mark);
- }
- static void
- ada_val_print_ptr (struct type *type, const gdb_byte *valaddr,
- int offset, int offset_aligned, CORE_ADDR address,
- struct ui_file *stream, int recurse,
- const struct value *original_value,
- const struct value_print_options *options,
- const struct language_defn *language)
- {
- val_print (type, valaddr, offset, address, stream, recurse,
- original_value, options, language_def (language_c));
- if (ada_is_tag_type (type))
- {
- struct value *val =
- value_from_contents_and_address (type,
- valaddr + offset_aligned,
- address + offset_aligned);
- const char *name = ada_tag_name (val);
- if (name != NULL)
- fprintf_filtered (stream, " (%s)", name);
- }
- }
- static void
- ada_val_print_num (struct type *type, const gdb_byte *valaddr,
- int offset, int offset_aligned, CORE_ADDR address,
- struct ui_file *stream, int recurse,
- const struct value *original_value,
- const struct value_print_options *options,
- const struct language_defn *language)
- {
- if (ada_is_fixed_point_type (type))
- {
- LONGEST v = unpack_long (type, valaddr + offset_aligned);
- fprintf_filtered (stream, TYPE_LENGTH (type) < 4 ? "%.11g" : "%.17g",
- (double) ada_fixed_to_float (type, v));
- return;
- }
- else if (TYPE_CODE (type) == TYPE_CODE_RANGE)
- {
- struct type *target_type = TYPE_TARGET_TYPE (type);
- if (TYPE_LENGTH (type) != TYPE_LENGTH (target_type))
- {
-
- struct value *v1
- = value_from_contents_and_address (type, valaddr + offset, 0);
- struct value *v = value_cast (target_type, v1);
- val_print (target_type, value_contents_for_printing (v),
- value_embedded_offset (v), 0, stream,
- recurse + 1, v, options, language);
- }
- else
- val_print (TYPE_TARGET_TYPE (type), valaddr, offset,
- address, stream, recurse, original_value,
- options, language);
- return;
- }
- else
- {
- int format = (options->format ? options->format
- : options->output_format);
- if (format)
- {
- struct value_print_options opts = *options;
- opts.format = format;
- val_print_scalar_formatted (type, valaddr, offset_aligned,
- original_value, &opts, 0, stream);
- }
- else if (ada_is_system_address_type (type))
- {
- FIXME
- struct gdbarch *gdbarch = get_type_arch (type);
- struct type *ptr_type = builtin_type (gdbarch)->builtin_data_ptr;
- CORE_ADDR addr = extract_typed_address (valaddr + offset_aligned,
- ptr_type);
- fprintf_filtered (stream, "(");
- type_print (type, "", stream, -1);
- fprintf_filtered (stream, ") ");
- fputs_filtered (paddress (gdbarch, addr), stream);
- }
- else
- {
- val_print_type_code_int (type, valaddr + offset_aligned, stream);
- if (ada_is_character_type (type))
- {
- LONGEST c;
- fputs_filtered (" ", stream);
- c = unpack_long (type, valaddr + offset_aligned);
- ada_printchar (c, type, stream);
- }
- }
- return;
- }
- }
- static void
- ada_val_print_enum (struct type *type, const gdb_byte *valaddr,
- int offset, int offset_aligned, CORE_ADDR address,
- struct ui_file *stream, int recurse,
- const struct value *original_value,
- const struct value_print_options *options,
- const struct language_defn *language)
- {
- int i;
- unsigned int len;
- LONGEST val;
- if (options->format)
- {
- val_print_scalar_formatted (type, valaddr, offset_aligned,
- original_value, options, 0, stream);
- return;
- }
- len = TYPE_NFIELDS (type);
- val = unpack_long (type, valaddr + offset_aligned);
- for (i = 0; i < len; i++)
- {
- QUIT;
- if (val == TYPE_FIELD_ENUMVAL (type, i))
- break;
- }
- if (i < len)
- {
- const char *name = ada_enum_name (TYPE_FIELD_NAME (type, i));
- if (name[0] == '\'')
- fprintf_filtered (stream, "%ld %s", (long) val, name);
- else
- fputs_filtered (name, stream);
- }
- else
- print_longest (stream, 'd', 0, val);
- }
- static void
- ada_val_print_flt (struct type *type, const gdb_byte *valaddr,
- int offset, int offset_aligned, CORE_ADDR address,
- struct ui_file *stream, int recurse,
- const struct value *original_value,
- const struct value_print_options *options,
- const struct language_defn *language)
- {
- if (options->format)
- {
- val_print (type, valaddr, offset, address, stream, recurse,
- original_value, options, language_def (language_c));
- return;
- }
- ada_print_floating (valaddr + offset, type, stream);
- }
- static void
- ada_val_print_struct_union
- (struct type *type, const gdb_byte *valaddr, int offset,
- int offset_aligned, CORE_ADDR address, struct ui_file *stream,
- int recurse, const struct value *original_value,
- const struct value_print_options *options,
- const struct language_defn *language)
- {
- if (ada_is_bogus_array_descriptor (type))
- {
- fprintf_filtered (stream, "(...?)");
- return;
- }
- fprintf_filtered (stream, "(");
- if (print_field_values (type, valaddr, offset_aligned,
- stream, recurse, original_value, options,
- 0, type, offset_aligned, language) != 0
- && options->prettyformat)
- {
- fprintf_filtered (stream, "\n");
- print_spaces_filtered (2 * recurse, stream);
- }
- fprintf_filtered (stream, ")");
- }
- static void
- ada_val_print_array (struct type *type, const gdb_byte *valaddr,
- int offset, int offset_aligned, CORE_ADDR address,
- struct ui_file *stream, int recurse,
- const struct value *original_value,
- const struct value_print_options *options)
- {
-
- if (ada_is_string_type (type)
- && (options->format == 0 || options->format == 's'))
- {
- ada_val_print_string (type, valaddr, offset, offset_aligned,
- address, stream, recurse, original_value,
- options);
- return;
- }
- fprintf_filtered (stream, "(");
- print_optional_low_bound (stream, type, options);
- if (TYPE_FIELD_BITSIZE (type, 0) > 0)
- val_print_packed_array_elements (type, valaddr, offset_aligned,
- 0, stream, recurse,
- original_value, options);
- else
- val_print_array_elements (type, valaddr, offset_aligned, address,
- stream, recurse, original_value,
- options, 0);
- fprintf_filtered (stream, ")");
- }
- static void
- ada_val_print_ref (struct type *type, const gdb_byte *valaddr,
- int offset, int offset_aligned, CORE_ADDR address,
- struct ui_file *stream, int recurse,
- const struct value *original_value,
- const struct value_print_options *options,
- const struct language_defn *language)
- {
-
- struct type *elttype = check_typedef (TYPE_TARGET_TYPE (type));
- struct value *deref_val;
- CORE_ADDR deref_val_int;
- if (TYPE_CODE (elttype) == TYPE_CODE_UNDEF)
- {
- fputs_filtered ("<ref to undefined type>", stream);
- return;
- }
- deref_val = coerce_ref_if_computed (original_value);
- if (deref_val)
- {
- if (ada_is_tagged_type (value_type (deref_val), 1))
- deref_val = ada_tag_value_at_base_address (deref_val);
- common_val_print (deref_val, stream, recurse + 1, options,
- language);
- return;
- }
- deref_val_int = unpack_pointer (type, valaddr + offset_aligned);
- if (deref_val_int == 0)
- {
- fputs_filtered ("(null)", stream);
- return;
- }
- deref_val
- = ada_value_ind (value_from_pointer (lookup_pointer_type (elttype),
- deref_val_int));
- if (ada_is_tagged_type (value_type (deref_val), 1))
- deref_val = ada_tag_value_at_base_address (deref_val);
-
- ada_ensure_varsize_limit (value_type (deref_val));
- val_print (value_type (deref_val),
- value_contents_for_printing (deref_val),
- value_embedded_offset (deref_val),
- value_address (deref_val), stream, recurse + 1,
- deref_val, options, language);
- }
- static void
- ada_val_print_1 (struct type *type, const gdb_byte *valaddr,
- int offset, CORE_ADDR address,
- struct ui_file *stream, int recurse,
- const struct value *original_value,
- const struct value_print_options *options,
- const struct language_defn *language)
- {
- int offset_aligned;
- type = ada_check_typedef (type);
- 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 (type, valaddr, offset, address,
- stream, recurse, original_value,
- options, language);
- return;
- }
- offset_aligned = offset + ada_aligned_value_addr (type, valaddr) - valaddr;
- type = printable_val_type (type, valaddr + offset_aligned);
- switch (TYPE_CODE (type))
- {
- default:
- val_print (type, valaddr, offset, address, stream, recurse,
- original_value, options, language_def (language_c));
- break;
- case TYPE_CODE_PTR:
- ada_val_print_ptr (type, valaddr, offset, offset_aligned,
- address, stream, recurse, original_value,
- options, language);
- break;
- case TYPE_CODE_INT:
- case TYPE_CODE_RANGE:
- ada_val_print_num (type, valaddr, offset, offset_aligned,
- address, stream, recurse, original_value,
- options, language);
- break;
- case TYPE_CODE_ENUM:
- ada_val_print_enum (type, valaddr, offset, offset_aligned,
- address, stream, recurse, original_value,
- options, language);
- break;
- case TYPE_CODE_FLT:
- ada_val_print_flt (type, valaddr, offset, offset_aligned,
- address, stream, recurse, original_value,
- options, language);
- break;
- case TYPE_CODE_UNION:
- case TYPE_CODE_STRUCT:
- ada_val_print_struct_union (type, valaddr, offset, offset_aligned,
- address, stream, recurse,
- original_value, options, language);
- break;
- case TYPE_CODE_ARRAY:
- ada_val_print_array (type, valaddr, offset, offset_aligned,
- address, stream, recurse, original_value,
- options);
- return;
- case TYPE_CODE_REF:
- ada_val_print_ref (type, valaddr, offset, offset_aligned,
- address, stream, recurse, original_value,
- options, language);
- break;
- }
- }
- void
- ada_val_print (struct type *type, const gdb_byte *valaddr,
- int embedded_offset, CORE_ADDR address,
- struct ui_file *stream, int recurse,
- const struct value *val,
- const struct value_print_options *options)
- {
- volatile struct gdb_exception except;
- XXX
- TRY_CATCH (except, RETURN_MASK_ALL)
- {
- ada_val_print_1 (type, valaddr, embedded_offset, address,
- stream, recurse, val, options,
- current_language);
- }
- }
- void
- ada_value_print (struct value *val0, struct ui_file *stream,
- const struct value_print_options *options)
- {
- struct value *val = ada_to_fixed_value (val0);
- CORE_ADDR address = value_address (val);
- struct type *type = ada_check_typedef (value_enclosing_type (val));
- struct value_print_options opts;
-
- if (TYPE_CODE (type) == TYPE_CODE_PTR)
- {
-
- if (TYPE_LENGTH (TYPE_TARGET_TYPE (type)) != sizeof (char)
- || TYPE_CODE (TYPE_TARGET_TYPE (type)) != TYPE_CODE_INT
- || TYPE_UNSIGNED (TYPE_TARGET_TYPE (type)))
- {
- fprintf_filtered (stream, "(");
- type_print (type, "", stream, -1);
- fprintf_filtered (stream, ") ");
- }
- }
- else if (ada_is_array_descriptor_type (type))
- {
-
- if (TYPE_CODE (type) == TYPE_CODE_TYPEDEF)
- {
- fprintf_filtered (stream, "(");
- type_print (type, "", stream, -1);
- fprintf_filtered (stream, ") ");
- }
- }
- else if (ada_is_bogus_array_descriptor (type))
- {
- fprintf_filtered (stream, "(");
- type_print (type, "", stream, -1);
- fprintf_filtered (stream, ") (...?)");
- return;
- }
- opts = *options;
- opts.deref_ref = 1;
- val_print (type, value_contents_for_printing (val),
- value_embedded_offset (val), address,
- stream, 0, val, &opts, current_language);
- }