X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;ds=sidebyside;f=gdb%2Ff-valprint.c;h=60611fef4948bb8f916ae7ba6de95967f11ffde3;hb=f3f8ece4b1c77c925d1f1566df0bf632790a4d24;hp=728bdafe5b020a1450f672a030fb60c29b879e22;hpb=dccbb60975cdbcd6a906a79d0c4308b040fdac1b;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/f-valprint.c b/gdb/f-valprint.c index 728bdafe5b..60611fef49 100644 --- a/gdb/f-valprint.c +++ b/gdb/f-valprint.c @@ -1,6 +1,6 @@ /* Support for printing Fortran values for GDB, the GNU debugger. - Copyright (C) 1993-2014 Free Software Foundation, Inc. + Copyright (C) 1993-2020 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. @@ -21,7 +21,6 @@ along with this program. If not, see . */ #include "defs.h" -#include #include "symtab.h" #include "gdbtypes.h" #include "expression.h" @@ -34,12 +33,9 @@ #include "command.h" #include "block.h" #include "dictionary.h" -#include "exceptions.h" +#include "cli/cli-style.h" +#include "gdbarch.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]; @@ -47,16 +43,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)) @@ -65,7 +52,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)) @@ -113,47 +100,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. */ @@ -166,41 +112,60 @@ 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); + struct gdbarch *gdbarch = get_type_arch (type); + size_t dim_size = type_length_units (TYPE_TARGET_TYPE (type)); + int unit_size = gdbarch_addressable_memory_unit_size (gdbarch); + size_t byte_stride = TYPE_ARRAY_BIT_STRIDE (type) / (unit_size * 8); + if (byte_stride == 0) + byte_stride = dim_size; + 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 += byte_stride; 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, "..."); } } @@ -227,12 +192,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); } @@ -247,26 +206,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: @@ -299,7 +260,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; } @@ -335,8 +296,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; } @@ -349,25 +310,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: @@ -377,15 +325,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; @@ -401,12 +368,11 @@ 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 @@ -415,7 +381,6 @@ info_common_command_for_block (const struct block *block, const char *comname, { struct block_iterator iter; struct symbol *sym; - const char *name; struct value_print_options opts; get_user_print_options (&opts); @@ -428,36 +393,40 @@ info_common_command_for_block (const struct block *block, const char *comname, gdb_assert (SYMBOL_CLASS (sym) == LOC_COMMON_BLOCK); - if (comname && (!SYMBOL_LINKAGE_NAME (sym) - || strcmp (comname, SYMBOL_LINKAGE_NAME (sym)) != 0)) + if (comname && (!sym->linkage_name () + || strcmp (comname, sym->linkage_name ()) != 0)) continue; if (*any_printed) putchar_filtered ('\n'); else *any_printed = 1; - if (SYMBOL_PRINT_NAME (sym)) + if (sym->print_name ()) printf_filtered (_("Contents of F77 COMMON block '%s':\n"), - SYMBOL_PRINT_NAME (sym)); + sym->print_name ()); else printf_filtered (_("Contents of blank COMMON block:\n")); 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])); + common->contents[index]->print_name ()); - 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) + { + fprintf_styled (gdb_stdout, metadata_style.style (), + "", + except.what ()); + } + putchar_filtered ('\n'); } } @@ -468,7 +437,7 @@ info_common_command_for_block (const 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; const struct block *block; @@ -515,7 +484,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.")); }