X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Fada-valprint.c;h=2e44898ca01754c0c36d148bd17d3c2f57eecf2d;hb=d3eab38a48ec521922e7d07595fd693df7ff3510;hp=bd297c6c1f03929347914cf3f54ab19b499901e9;hpb=ab2188aa2a7958d3954f98229002036867278636;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/ada-valprint.c b/gdb/ada-valprint.c index bd297c6c1f..2e44898ca0 100644 --- a/gdb/ada-valprint.c +++ b/gdb/ada-valprint.c @@ -1,8 +1,7 @@ /* Support for printing Ada values for GDB, the GNU debugger. - Copyright (C) 1986, 1988, 1989, 1991, 1992, 1993, 1994, 1997, 2001, 2002, - 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 - Free Software Foundation, Inc. + Copyright (C) 1986, 1988-1989, 1991-1994, 1997, 2001-2012 Free + Software Foundation, Inc. This file is part of GDB. @@ -51,10 +50,10 @@ static int print_field_values (struct type *, const gdb_byte *, static void adjust_type_signedness (struct type *); -static int ada_val_print_1 (struct type *, const gdb_byte *, int, CORE_ADDR, - struct ui_file *, int, - const struct value *, - const struct value_print_options *); +static void ada_val_print_1 (struct type *, const gdb_byte *, int, CORE_ADDR, + struct ui_file *, int, + const struct value *, + const struct value_print_options *); /* Make TYPE unsigned if its range of values includes no negatives. */ @@ -200,7 +199,9 @@ val_print_packed_array_elements (struct type *type, const gdb_byte *valaddr, (i * bitsize) / HOST_CHAR_BIT, (i * bitsize) % HOST_CHAR_BIT, bitsize, elttype); - if (memcmp (value_contents (v0), value_contents (v1), eltlen) != 0) + if (!value_available_contents_eq (v0, value_embedded_offset (v0), + v1, value_embedded_offset (v1), + eltlen)) break; } @@ -564,17 +565,10 @@ ada_printstr (struct ui_file *stream, struct type *type, } -/* Print data of type TYPE located at VALADDR (within GDB), which came from - the inferior at address ADDRESS, onto stdio stream STREAM according to - OPTIONS. The data at VALADDR is in target byte order. +/* See val_print for a description of the various parameters of this + function; they are identical. */ - If the data is printed as a string, returns the number of string characters - printed. - - RECURSE indicates the amount of indentation to supply before - continuation lines; this amount is roughly twice the value of RECURSE. */ - -int +void ada_val_print (struct type *type, const gdb_byte *valaddr, int embedded_offset, CORE_ADDR address, struct ui_file *stream, int recurse, @@ -582,52 +576,43 @@ ada_val_print (struct type *type, const gdb_byte *valaddr, const struct value_print_options *options) { volatile struct gdb_exception except; - int result = 0; /* XXX: this catches QUIT/ctrl-c as well. Isn't that busted? */ TRY_CATCH (except, RETURN_MASK_ALL) { - result = ada_val_print_1 (type, valaddr, embedded_offset, address, - stream, recurse, val, options); + ada_val_print_1 (type, valaddr, embedded_offset, address, + stream, recurse, val, options); } - - if (except.reason < 0) - result = 0; - - return result; } /* Assuming TYPE is a simple array, print the value of this array located - at VALADDR. See ada_val_print for a description of the various - parameters of this function; they are identical. The semantics - of the return value is also identical to ada_val_print. */ + at VALADDR + OFFSET. See ada_val_print for a description of the various + parameters of this function; they are identical. */ -static int +static void ada_val_print_array (struct type *type, const gdb_byte *valaddr, int offset, CORE_ADDR address, struct ui_file *stream, int recurse, const struct value *val, 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); - int result = 0; - /* For an array of chars, print with string syntax. */ if (ada_is_string_type (type) && (options->format == 0 || options->format == 's')) { + 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; - if (elttype == NULL) - eltlen = 0; - else - eltlen = TYPE_LENGTH (elttype); - if (eltlen == 0) - len = 0; - else - len = TYPE_LENGTH (type) / eltlen; + /* We know that ELTTYPE cannot possibly be null, because we found + that TYPE is a string-like type. Similarly, the size of ELTTYPE + should also be non-null, since it's a character-like type. */ + gdb_assert (elttype != NULL); + gdb_assert (TYPE_LENGTH (elttype) != 0); + + eltlen = TYPE_LENGTH (elttype); + len = TYPE_LENGTH (type) / eltlen; if (options->prettyprint_arrays) print_spaces_filtered (2 + 2 * recurse, stream); @@ -649,7 +634,6 @@ ada_val_print_array (struct type *type, const gdb_byte *valaddr, } printstr (stream, elttype, valaddr + offset, len, 0, eltlen, options); - result = len; } else { @@ -663,14 +647,12 @@ ada_val_print_array (struct type *type, const gdb_byte *valaddr, stream, recurse, val, options, 0); fprintf_filtered (stream, ")"); } - - return result; } /* See the comment on ada_val_print. This function differs in that it does not catch evaluation errors (leaving that to ada_val_print). */ -static int +static void ada_val_print_1 (struct type *type, const gdb_byte *valaddr, int offset, CORE_ADDR address, struct ui_file *stream, int recurse, @@ -686,13 +668,17 @@ ada_val_print_1 (struct type *type, const gdb_byte *valaddr, type = ada_check_typedef (type); if (ada_is_array_descriptor_type (type) - || ada_is_constrained_packed_array_type (type)) + || (ada_is_constrained_packed_array_type (type) + && TYPE_CODE (type) != TYPE_CODE_PTR)) { - int retn; struct value *mark = value_mark (); struct value *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. */ + val = coerce_ref (val); if (TYPE_CODE (type) == TYPE_CODE_TYPEDEF) /* array access type. */ val = ada_coerce_to_simple_array_ptr (val); else @@ -701,16 +687,15 @@ ada_val_print_1 (struct type *type, const gdb_byte *valaddr, { gdb_assert (TYPE_CODE (type) == TYPE_CODE_TYPEDEF); fprintf_filtered (stream, "0x0"); - retn = 0; } else - retn = ada_val_print_1 (value_type (val), - value_contents_for_printing (val), - value_embedded_offset (val), - value_address (val), stream, recurse, - val, options); + ada_val_print_1 (value_type (val), + value_contents_for_printing (val), + value_embedded_offset (val), + value_address (val), stream, recurse, + val, options); value_free_to_mark (mark); - return retn; + return; } offset_aligned = offset + ada_aligned_value_addr (type, valaddr) - valaddr; @@ -719,13 +704,14 @@ ada_val_print_1 (struct type *type, const gdb_byte *valaddr, switch (TYPE_CODE (type)) { default: - return c_val_print (type, valaddr, offset, address, stream, - recurse, original_value, options); + c_val_print (type, valaddr, offset, address, stream, + recurse, original_value, options); + break; case TYPE_CODE_PTR: { - int ret = c_val_print (type, valaddr, offset, address, - stream, recurse, original_value, options); + c_val_print (type, valaddr, offset, address, + stream, recurse, original_value, options); if (ada_is_tag_type (type)) { @@ -737,9 +723,8 @@ ada_val_print_1 (struct type *type, const gdb_byte *valaddr, if (name != NULL) fprintf_filtered (stream, " (%s)", name); - return 0; - } - return ret; + } + return; } case TYPE_CODE_INT: @@ -751,7 +736,7 @@ ada_val_print_1 (struct type *type, const gdb_byte *valaddr, fprintf_filtered (stream, len < 4 ? "%.11g" : "%.17g", (double) ada_fixed_to_float (type, v)); - return 0; + return; } else if (TYPE_CODE (type) == TYPE_CODE_RANGE) { @@ -767,16 +752,17 @@ ada_val_print_1 (struct type *type, const gdb_byte *valaddr, = value_from_contents_and_address (type, valaddr + offset, 0); struct value *v = value_cast (target_type, v1); - return ada_val_print_1 (target_type, - value_contents_for_printing (v), - value_embedded_offset (v), 0, - stream, recurse + 1, v, options); + ada_val_print_1 (target_type, + value_contents_for_printing (v), + value_embedded_offset (v), 0, + stream, recurse + 1, v, options); } else - return ada_val_print_1 (TYPE_TARGET_TYPE (type), - valaddr, offset, - address, stream, recurse, - original_value, options); + ada_val_print_1 (TYPE_TARGET_TYPE (type), + valaddr, offset, + address, stream, recurse, + original_value, options); + return; } else { @@ -821,7 +807,7 @@ ada_val_print_1 (struct type *type, const gdb_byte *valaddr, ada_printchar (c, type, stream); } } - return 0; + return; } case TYPE_CODE_ENUM: @@ -866,8 +852,11 @@ ada_val_print_1 (struct type *type, const gdb_byte *valaddr, case TYPE_CODE_FLT: if (options->format) - return c_val_print (type, valaddr, offset, address, stream, - recurse, original_value, options); + { + c_val_print (type, valaddr, offset, address, stream, + recurse, original_value, options); + return; + } else ada_print_floating (valaddr + offset, type, stream); break; @@ -877,19 +866,20 @@ ada_val_print_1 (struct type *type, const gdb_byte *valaddr, if (ada_is_bogus_array_descriptor (type)) { fprintf_filtered (stream, "(...?)"); - return 0; + return; } else { print_record (type, valaddr, offset_aligned, stream, recurse, original_value, options); - return 0; + return; } case TYPE_CODE_ARRAY: - return ada_val_print_array (type, valaddr, offset_aligned, - address, stream, recurse, original_value, - options); + ada_val_print_array (type, valaddr, offset_aligned, + address, stream, recurse, original_value, + options); + return; case TYPE_CODE_REF: /* For references, the debugger is expected to print the value as @@ -901,9 +891,18 @@ ada_val_print_1 (struct type *type, const gdb_byte *valaddr, if (TYPE_CODE (elttype) != TYPE_CODE_UNDEF) { - CORE_ADDR deref_val_int - = unpack_pointer (type, valaddr + offset_aligned); + CORE_ADDR deref_val_int; + struct value *deref_val; + deref_val = coerce_ref_if_computed (original_value); + if (deref_val) + { + common_val_print (deref_val, stream, recurse + 1, options, + current_language); + break; + } + + deref_val_int = unpack_pointer (type, valaddr + offset_aligned); if (deref_val_int != 0) { struct value *deref_val = @@ -926,7 +925,6 @@ ada_val_print_1 (struct type *type, const gdb_byte *valaddr, break; } gdb_flush (stream); - return 0; } static int @@ -954,13 +952,13 @@ print_variant_part (struct type *type, int field_num, comma_needed, outer_type, outer_offset); } -int +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 = value_type (val); + struct type *type = ada_check_typedef (value_type (val)); struct value_print_options opts; /* If it is a pointer, indicate what it points to. */ @@ -994,14 +992,14 @@ ada_value_print (struct value *val0, struct ui_file *stream, fprintf_filtered (stream, "("); type_print (type, "", stream, -1); fprintf_filtered (stream, ") (...?)"); - return 0; + return; } opts = *options; opts.deref_ref = 1; - return (val_print (type, value_contents_for_printing (val), - value_embedded_offset (val), address, - stream, 0, val, &opts, current_language)); + val_print (type, value_contents_for_printing (val), + value_embedded_offset (val), address, + stream, 0, val, &opts, current_language); } static void @@ -1026,13 +1024,14 @@ print_record (struct type *type, const gdb_byte *valaddr, fprintf_filtered (stream, ")"); } -/* Print out fields of value at VALADDR having structure type TYPE. +/* Print out fields of value at VALADDR + OFFSET having structure type TYPE. - TYPE, VALADDR, STREAM, RECURSE, and OPTIONS have the - same meanings as in ada_print_value and ada_val_print. + TYPE, VALADDR, OFFSET, STREAM, RECURSE, and OPTIONS have the same + meanings as in ada_print_value and ada_val_print. - OUTER_TYPE and OUTER_VALADDR give type and address of enclosing record - (used to get discriminant values when printing variant parts). + OUTER_TYPE and OUTER_OFFSET give type and address of enclosing + record (used to get discriminant values when printing variant + parts). COMMA_NEEDED is 1 if fields have been printed at the current recursion level, so that a comma is needed before any field printed by this