X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Ff-valprint.c;h=264416ec5408e1c763ad40b21af7c8966d854a6d;hb=cafb34387d063fa47bc2cdb33fc3fe2f13e6cec0;hp=c3d23833173f8ed255e565179a3f46f83425753b;hpb=4357ac6c6f95606fff49f976d9ebc11965967bc3;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/f-valprint.c b/gdb/f-valprint.c index c3d2383317..264416ec54 100644 --- a/gdb/f-valprint.c +++ b/gdb/f-valprint.c @@ -1,7 +1,6 @@ /* Support for printing Fortran values for GDB, the GNU debugger. - Copyright (C) 1993-1996, 1998-2000, 2003, 2005-2012 Free Software - Foundation, Inc. + Copyright (C) 1993-2019 Free Software Foundation, Inc. Contributed by Motorola. Adapted from the C definitions by Farooq Butt (fmbutt@engage.sps.mot.com), additionally worked over by Stan Shebs. @@ -22,7 +21,6 @@ along with this program. If not, see . */ #include "defs.h" -#include "gdb_string.h" #include "symtab.h" #include "gdbtypes.h" #include "expression.h" @@ -35,13 +33,7 @@ #include "command.h" #include "block.h" #include "dictionary.h" -#include "gdb_assert.h" -#include "exceptions.h" -extern void _initialize_f_valprint (void); -static void info_common_command (char *, int); -static void f77_create_arrayprint_offset_tbl (struct type *, - struct ui_file *); static void f77_get_dynamic_length_of_aggregate (struct type *); int f77_array_offset_tbl[MAX_FORTRAN_DIMS + 1][2]; @@ -49,16 +41,7 @@ int f77_array_offset_tbl[MAX_FORTRAN_DIMS + 1][2]; /* Array which holds offsets to be applied to get a row's elements for a given array. Array also holds the size of each subarray. */ -/* The following macro gives us the size of the nth dimension, Where - n is 1 based. */ - -#define F77_DIM_SIZE(n) (f77_array_offset_tbl[n][1]) - -/* The following gives us the offset for row n where n is 1-based. */ - -#define F77_DIM_OFFSET(n) (f77_array_offset_tbl[n][0]) - -int +LONGEST f77_get_lowerbound (struct type *type) { if (TYPE_ARRAY_LOWER_BOUND_IS_UNDEFINED (type)) @@ -67,7 +50,7 @@ f77_get_lowerbound (struct type *type) return TYPE_ARRAY_LOWER_BOUND_VALUE (type); } -int +LONGEST f77_get_upperbound (struct type *type) { if (TYPE_ARRAY_UPPER_BOUND_IS_UNDEFINED (type)) @@ -115,47 +98,6 @@ f77_get_dynamic_length_of_aggregate (struct type *type) * TYPE_LENGTH (check_typedef (TYPE_TARGET_TYPE (type))); } -/* Function that sets up the array offset,size table for the array - type "type". */ - -static void -f77_create_arrayprint_offset_tbl (struct type *type, struct ui_file *stream) -{ - struct type *tmp_type; - int eltlen; - int ndimen = 1; - int upper, lower; - - tmp_type = type; - - while ((TYPE_CODE (tmp_type) == TYPE_CODE_ARRAY)) - { - upper = f77_get_upperbound (tmp_type); - lower = f77_get_lowerbound (tmp_type); - - F77_DIM_SIZE (ndimen) = upper - lower + 1; - - tmp_type = TYPE_TARGET_TYPE (tmp_type); - ndimen++; - } - - /* Now we multiply eltlen by all the offsets, so that later we - can print out array elements correctly. Up till now we - know an offset to apply to get the item but we also - have to know how much to add to get to the next item. */ - - ndimen--; - eltlen = TYPE_LENGTH (tmp_type); - F77_DIM_OFFSET (ndimen) = eltlen; - while (--ndimen > 0) - { - eltlen *= F77_DIM_SIZE (ndimen + 1); - F77_DIM_OFFSET (ndimen) = eltlen; - } -} - - - /* Actual function which prints out F77 arrays, Valaddr == address in the superior. Address == the address in the inferior. */ @@ -168,41 +110,55 @@ f77_print_array_1 (int nss, int ndimensions, struct type *type, const struct value_print_options *options, int *elts) { + struct type *range_type = TYPE_INDEX_TYPE (check_typedef (type)); + CORE_ADDR addr = address + embedded_offset; + LONGEST lowerbound, upperbound; int i; + get_discrete_bounds (range_type, &lowerbound, &upperbound); + if (nss != ndimensions) { - for (i = 0; - (i < F77_DIM_SIZE (nss) && (*elts) < options->print_max); + size_t dim_size = TYPE_LENGTH (TYPE_TARGET_TYPE (type)); + size_t offs = 0; + + for (i = lowerbound; + (i < upperbound + 1 && (*elts) < options->print_max); i++) { + struct value *subarray = value_from_contents_and_address + (TYPE_TARGET_TYPE (type), value_contents_for_printing_const (val) + + offs, addr + offs); + fprintf_filtered (stream, "( "); - f77_print_array_1 (nss + 1, ndimensions, TYPE_TARGET_TYPE (type), - valaddr, - embedded_offset + i * F77_DIM_OFFSET (nss), - address, - stream, recurse, val, options, elts); + f77_print_array_1 (nss + 1, ndimensions, value_type (subarray), + value_contents_for_printing (subarray), + value_embedded_offset (subarray), + value_address (subarray), + stream, recurse, subarray, options, elts); + offs += dim_size; fprintf_filtered (stream, ") "); } - if (*elts >= options->print_max && i < F77_DIM_SIZE (nss)) + if (*elts >= options->print_max && i < upperbound) fprintf_filtered (stream, "..."); } else { - for (i = 0; i < F77_DIM_SIZE (nss) && (*elts) < options->print_max; + for (i = lowerbound; i < upperbound + 1 && (*elts) < options->print_max; i++, (*elts)++) { - val_print (TYPE_TARGET_TYPE (type), - valaddr, - embedded_offset + i * F77_DIM_OFFSET (ndimensions), - address, stream, recurse, - val, options, current_language); + struct value *elt = value_subscript ((struct value *)val, i); + + val_print (value_type (elt), + value_embedded_offset (elt), + value_address (elt), stream, recurse, + elt, options, current_language); - if (i != (F77_DIM_SIZE (nss) - 1)) + if (i != upperbound) fprintf_filtered (stream, ", "); if ((*elts == options->print_max - 1) - && (i != (F77_DIM_SIZE (nss) - 1))) + && (i != upperbound)) fprintf_filtered (stream, "..."); } } @@ -229,12 +185,6 @@ f77_print_array (struct type *type, const gdb_byte *valaddr, Type node corrupt! F77 arrays cannot have %d subscripts (%d Max)"), ndimensions, MAX_FORTRAN_DIMS); - /* Since F77 arrays are stored column-major, we set up an - offset table to get at the various row's elements. The - offset table contains entries for both offset and subarray size. */ - - f77_create_arrayprint_offset_tbl (type, stream); - f77_print_array_1 (1, ndimensions, type, valaddr, embedded_offset, address, stream, recurse, val, options, &elts); } @@ -249,26 +199,28 @@ static const struct generic_val_print_decorations f_decorations = ")", ".TRUE.", ".FALSE.", - "VOID", + "void", + "{", + "}" }; /* See val_print for a description of the various parameters of this function; they are identical. */ void -f_val_print (struct type *type, const gdb_byte *valaddr, int embedded_offset, +f_val_print (struct type *type, int embedded_offset, CORE_ADDR address, struct ui_file *stream, int recurse, - const struct value *original_value, + struct value *original_value, const struct value_print_options *options) { struct gdbarch *gdbarch = get_type_arch (type); - enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); - unsigned int i = 0; /* Number of characters printed. */ + int printed_field = 0; /* Number of fields printed. */ struct type *elttype; CORE_ADDR addr; int index; + const gdb_byte *valaddr =value_contents_for_printing (original_value); - CHECK_TYPEDEF (type); + type = check_typedef (type); switch (TYPE_CODE (type)) { case TYPE_CODE_STRING: @@ -301,7 +253,7 @@ f_val_print (struct type *type, const gdb_byte *valaddr, int embedded_offset, case TYPE_CODE_PTR: if (options->format && options->format != 's') { - val_print_scalar_formatted (type, valaddr, embedded_offset, + val_print_scalar_formatted (type, embedded_offset, original_value, options, 0, stream); break; } @@ -337,8 +289,8 @@ f_val_print (struct type *type, const gdb_byte *valaddr, int embedded_offset, { if (want_space) fputs_filtered (" ", stream); - i = val_print_string (TYPE_TARGET_TYPE (type), NULL, addr, -1, - stream, options); + val_print_string (TYPE_TARGET_TYPE (type), NULL, addr, -1, + stream, options); } return; } @@ -351,25 +303,12 @@ f_val_print (struct type *type, const gdb_byte *valaddr, int embedded_offset, opts.format = (options->format ? options->format : options->output_format); - val_print_scalar_formatted (type, valaddr, embedded_offset, - original_value, options, 0, stream); + val_print_scalar_formatted (type, embedded_offset, + original_value, &opts, 0, stream); } else - { - val_print_type_code_int (type, valaddr + embedded_offset, stream); - /* C and C++ has no single byte int type, char is used instead. - Since we don't know whether the value is really intended to - be used as an integer or a character, print the character - equivalent as well. */ - if (TYPE_LENGTH (type) == 1) - { - LONGEST c; - - fputs_filtered (" ", stream); - c = unpack_long (type, valaddr + embedded_offset); - LA_PRINT_CHAR ((unsigned char) c, type, stream); - } - } + val_print_scalar_formatted (type, embedded_offset, + original_value, options, 0, stream); break; case TYPE_CODE_STRUCT: @@ -379,15 +318,34 @@ f_val_print (struct type *type, const gdb_byte *valaddr, int embedded_offset, fprintf_filtered (stream, "( "); for (index = 0; index < TYPE_NFIELDS (type); index++) { - int offset = TYPE_FIELD_BITPOS (type, index) / 8; - - val_print (TYPE_FIELD_TYPE (type, index), valaddr, - embedded_offset + offset, - address, stream, recurse + 1, - original_value, options, current_language); - if (index != TYPE_NFIELDS (type) - 1) - fputs_filtered (", ", stream); - } + struct value *field = value_field + ((struct value *)original_value, index); + + struct type *field_type = check_typedef (TYPE_FIELD_TYPE (type, index)); + + + if (TYPE_CODE (field_type) != TYPE_CODE_FUNC) + { + const char *field_name; + + if (printed_field > 0) + fputs_filtered (", ", stream); + + field_name = TYPE_FIELD_NAME (type, index); + if (field_name != NULL) + { + fputs_filtered (field_name, stream); + fputs_filtered (" = ", stream); + } + + val_print (value_type (field), + value_embedded_offset (field), + value_address (field), stream, recurse + 1, + field, options, current_language); + + ++printed_field; + } + } fprintf_filtered (stream, " )"); break; @@ -403,21 +361,19 @@ f_val_print (struct type *type, const gdb_byte *valaddr, int embedded_offset, case TYPE_CODE_BOOL: case TYPE_CODE_CHAR: default: - generic_val_print (type, valaddr, embedded_offset, address, + generic_val_print (type, embedded_offset, address, stream, recurse, original_value, options, &f_decorations); break; } - gdb_flush (stream); } static void -info_common_command_for_block (struct block *block, const char *comname, +info_common_command_for_block (const struct block *block, const char *comname, int *any_printed) { struct block_iterator iter; struct symbol *sym; - const char *name; struct value_print_options opts; get_user_print_options (&opts); @@ -425,10 +381,10 @@ info_common_command_for_block (struct block *block, const char *comname, ALL_BLOCK_SYMBOLS (block, iter, sym) if (SYMBOL_DOMAIN (sym) == COMMON_BLOCK_DOMAIN) { - struct common_block *common = SYMBOL_VALUE_COMMON_BLOCK (sym); + const struct common_block *common = SYMBOL_VALUE_COMMON_BLOCK (sym); size_t index; - gdb_assert (SYMBOL_CLASS (sym) == LOC_STATIC); + gdb_assert (SYMBOL_CLASS (sym) == LOC_COMMON_BLOCK); if (comname && (!SYMBOL_LINKAGE_NAME (sym) || strcmp (comname, SYMBOL_LINKAGE_NAME (sym)) != 0)) @@ -447,19 +403,22 @@ info_common_command_for_block (struct block *block, const char *comname, for (index = 0; index < common->n_entries; index++) { struct value *val = NULL; - volatile struct gdb_exception except; printf_filtered ("%s = ", SYMBOL_PRINT_NAME (common->contents[index])); - TRY_CATCH (except, RETURN_MASK_ERROR) + try { val = value_of_variable (common->contents[index], block); value_print (val, gdb_stdout, &opts); } - if (except.reason < 0) - printf_filtered ("", except.message); + catch (const gdb_exception_error &except) + { + printf_filtered ("", + except.what ()); + } + putchar_filtered ('\n'); } } @@ -470,10 +429,10 @@ info_common_command_for_block (struct block *block, const char *comname, given name. */ static void -info_common_command (char *comname, int from_tty) +info_common_command (const char *comname, int from_tty) { struct frame_info *fi; - struct block *block; + const struct block *block; int values_printed = 0; /* We have been told to display the contents of F77 COMMON @@ -517,7 +476,4 @@ _initialize_f_valprint (void) { add_info ("common", info_common_command, _("Print out the values contained in a Fortran COMMON block.")); - if (xdb_commands) - add_com ("lc", class_info, info_common_command, - _("Print out the values contained in a Fortran COMMON block.")); }