| Index: gdb/f-valprint.c
|
| diff --git a/gdb/f-valprint.c b/gdb/f-valprint.c
|
| index 87b2ed1a1abb4003e56d5a14d265603cac14e764..4359f6f62e9b4a45325f054e888a50aaeebbeea8 100644
|
| --- a/gdb/f-valprint.c
|
| +++ b/gdb/f-valprint.c
|
| @@ -41,7 +41,7 @@ static int there_is_a_visible_common_named (char *);
|
|
|
| extern void _initialize_f_valprint (void);
|
| static void info_common_command (char *, int);
|
| -static void list_all_visible_commons (char *);
|
| +static void list_all_visible_commons (const char *);
|
| static void f77_create_arrayprint_offset_tbl (struct type *,
|
| struct ui_file *);
|
| static void f77_get_dynamic_length_of_aggregate (struct type *);
|
| @@ -242,11 +242,22 @@ Type node corrupt! F77 arrays cannot have %d subscripts (%d Max)"),
|
| }
|
|
|
|
|
| +/* Decorations for Fortran. */
|
| +
|
| +static const struct generic_val_print_decorations f_decorations =
|
| +{
|
| + "(",
|
| + ",",
|
| + ")",
|
| + ".TRUE.",
|
| + ".FALSE.",
|
| + "VOID",
|
| +};
|
| +
|
| /* See 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 val_print. */
|
| + function; they are identical. */
|
|
|
| -int
|
| +void
|
| f_val_print (struct type *type, const gdb_byte *valaddr, int embedded_offset,
|
| CORE_ADDR address, struct ui_file *stream, int recurse,
|
| const struct value *original_value,
|
| @@ -256,7 +267,6 @@ f_val_print (struct type *type, const gdb_byte *valaddr, int embedded_offset,
|
| enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
|
| unsigned int i = 0; /* Number of characters printed. */
|
| struct type *elttype;
|
| - LONGEST val;
|
| CORE_ADDR addr;
|
| int index;
|
|
|
| @@ -299,19 +309,26 @@ f_val_print (struct type *type, const gdb_byte *valaddr, int embedded_offset,
|
| }
|
| else
|
| {
|
| + int want_space = 0;
|
| +
|
| addr = unpack_pointer (type, valaddr + embedded_offset);
|
| elttype = check_typedef (TYPE_TARGET_TYPE (type));
|
|
|
| if (TYPE_CODE (elttype) == TYPE_CODE_FUNC)
|
| {
|
| /* Try to print what function it points to. */
|
| - print_address_demangle (gdbarch, addr, stream, demangle);
|
| - /* Return value is irrelevant except for string pointers. */
|
| - return 0;
|
| + print_function_pointer_address (options, gdbarch, addr, stream);
|
| + return;
|
| }
|
|
|
| - if (options->addressprint && options->format != 's')
|
| - fputs_filtered (paddress (gdbarch, addr), stream);
|
| + if (options->symbol_print)
|
| + want_space = print_address_demangle (options, gdbarch, addr,
|
| + stream, demangle);
|
| + else if (options->addressprint && options->format != 's')
|
| + {
|
| + fputs_filtered (paddress (gdbarch, addr), stream);
|
| + want_space = 1;
|
| + }
|
|
|
| /* For a pointer to char or unsigned char, also print the string
|
| pointed to, unless pointer is null. */
|
| @@ -319,73 +336,17 @@ f_val_print (struct type *type, const gdb_byte *valaddr, int embedded_offset,
|
| && TYPE_CODE (elttype) == TYPE_CODE_INT
|
| && (options->format == 0 || options->format == 's')
|
| && addr != 0)
|
| - i = val_print_string (TYPE_TARGET_TYPE (type), NULL, addr, -1,
|
| - stream, options);
|
| -
|
| - /* Return number of characters printed, including the terminating
|
| - '\0' if we reached the end. val_print_string takes care including
|
| - the terminating '\0' if necessary. */
|
| - return i;
|
| - }
|
| - break;
|
| -
|
| - case TYPE_CODE_REF:
|
| - elttype = check_typedef (TYPE_TARGET_TYPE (type));
|
| - if (options->addressprint)
|
| - {
|
| - CORE_ADDR addr
|
| - = extract_typed_address (valaddr + embedded_offset, type);
|
| -
|
| - fprintf_filtered (stream, "@");
|
| - fputs_filtered (paddress (gdbarch, addr), stream);
|
| - if (options->deref_ref)
|
| - fputs_filtered (": ", stream);
|
| - }
|
| - /* De-reference the reference. */
|
| - if (options->deref_ref)
|
| - {
|
| - if (TYPE_CODE (elttype) != TYPE_CODE_UNDEF)
|
| {
|
| - struct value *deref_val;
|
| -
|
| - deref_val = coerce_ref_if_computed (original_value);
|
| - if (deref_val != NULL)
|
| - {
|
| - /* More complicated computed references are not supported. */
|
| - gdb_assert (embedded_offset == 0);
|
| - }
|
| - else
|
| - deref_val = value_at (TYPE_TARGET_TYPE (type),
|
| - unpack_pointer (type,
|
| - (valaddr
|
| - + embedded_offset)));
|
| -
|
| - common_val_print (deref_val, stream, recurse,
|
| - options, current_language);
|
| + if (want_space)
|
| + fputs_filtered (" ", stream);
|
| + i = val_print_string (TYPE_TARGET_TYPE (type), NULL, addr, -1,
|
| + stream, options);
|
| }
|
| - else
|
| - fputs_filtered ("???", stream);
|
| - }
|
| - break;
|
| -
|
| - case TYPE_CODE_FUNC:
|
| - if (options->format)
|
| - {
|
| - val_print_scalar_formatted (type, valaddr, embedded_offset,
|
| - original_value, options, 0, stream);
|
| - break;
|
| + return;
|
| }
|
| - /* FIXME, we should consider, at least for ANSI C language, eliminating
|
| - the distinction made between FUNCs and POINTERs to FUNCs. */
|
| - fprintf_filtered (stream, "{");
|
| - type_print (type, "", stream, -1);
|
| - fprintf_filtered (stream, "} ");
|
| - /* Try to print what function it points to, and its address. */
|
| - print_address_demangle (gdbarch, address, stream, demangle);
|
| break;
|
|
|
| case TYPE_CODE_INT:
|
| - case TYPE_CODE_CHAR:
|
| if (options->format || options->output_format)
|
| {
|
| struct value_print_options opts = *options;
|
| @@ -402,7 +363,7 @@ f_val_print (struct type *type, const gdb_byte *valaddr, int embedded_offset,
|
| 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 || TYPE_CODE (type) == TYPE_CODE_CHAR)
|
| + if (TYPE_LENGTH (type) == 1)
|
| {
|
| LONGEST c;
|
|
|
| @@ -413,84 +374,6 @@ f_val_print (struct type *type, const gdb_byte *valaddr, int embedded_offset,
|
| }
|
| break;
|
|
|
| - case TYPE_CODE_FLAGS:
|
| - if (options->format)
|
| - val_print_scalar_formatted (type, valaddr, embedded_offset,
|
| - original_value, options, 0, stream);
|
| - else
|
| - val_print_type_code_flags (type, valaddr + embedded_offset, stream);
|
| - break;
|
| -
|
| - case TYPE_CODE_FLT:
|
| - if (options->format)
|
| - val_print_scalar_formatted (type, valaddr, embedded_offset,
|
| - original_value, options, 0, stream);
|
| - else
|
| - print_floating (valaddr + embedded_offset, type, stream);
|
| - break;
|
| -
|
| - case TYPE_CODE_VOID:
|
| - fprintf_filtered (stream, "VOID");
|
| - break;
|
| -
|
| - case TYPE_CODE_ERROR:
|
| - fprintf_filtered (stream, "%s", TYPE_ERROR_NAME (type));
|
| - break;
|
| -
|
| - case TYPE_CODE_RANGE:
|
| - /* FIXME, we should not ever have to print one of these yet. */
|
| - fprintf_filtered (stream, "<range type>");
|
| - break;
|
| -
|
| - case TYPE_CODE_BOOL:
|
| - if (options->format || options->output_format)
|
| - {
|
| - struct value_print_options opts = *options;
|
| -
|
| - opts.format = (options->format ? options->format
|
| - : options->output_format);
|
| - val_print_scalar_formatted (type, valaddr, embedded_offset,
|
| - original_value, &opts, 0, stream);
|
| - }
|
| - else
|
| - {
|
| - val = extract_unsigned_integer (valaddr + embedded_offset,
|
| - TYPE_LENGTH (type), byte_order);
|
| - if (val == 0)
|
| - fprintf_filtered (stream, ".FALSE.");
|
| - else if (val == 1)
|
| - fprintf_filtered (stream, ".TRUE.");
|
| - else
|
| - /* Not a legitimate logical type, print as an integer. */
|
| - {
|
| - /* Bash the type code temporarily. */
|
| - TYPE_CODE (type) = TYPE_CODE_INT;
|
| - val_print (type, valaddr, embedded_offset,
|
| - address, stream, recurse,
|
| - original_value, options, current_language);
|
| - /* Restore the type code so later uses work as intended. */
|
| - TYPE_CODE (type) = TYPE_CODE_BOOL;
|
| - }
|
| - }
|
| - break;
|
| -
|
| - case TYPE_CODE_COMPLEX:
|
| - type = TYPE_TARGET_TYPE (type);
|
| - fputs_filtered ("(", stream);
|
| - print_floating (valaddr + embedded_offset, type, stream);
|
| - fputs_filtered (",", stream);
|
| - print_floating (valaddr + embedded_offset + TYPE_LENGTH (type),
|
| - type, stream);
|
| - fputs_filtered (")", stream);
|
| - break;
|
| -
|
| - case TYPE_CODE_UNDEF:
|
| - /* This happens (without TYPE_FLAG_STUB set) on systems which don't use
|
| - dbx xrefs (NO_DBX_XREFS in gcc) if a file has a "struct foo *bar"
|
| - and no complete type for struct foo in that file. */
|
| - fprintf_filtered (stream, "<incomplete type>");
|
| - break;
|
| -
|
| case TYPE_CODE_STRUCT:
|
| case TYPE_CODE_UNION:
|
| /* Starting from the Fortran 90 standard, Fortran supports derived
|
| @@ -510,15 +393,28 @@ f_val_print (struct type *type, const gdb_byte *valaddr, int embedded_offset,
|
| fprintf_filtered (stream, " )");
|
| break;
|
|
|
| + case TYPE_CODE_REF:
|
| + case TYPE_CODE_FUNC:
|
| + case TYPE_CODE_FLAGS:
|
| + case TYPE_CODE_FLT:
|
| + case TYPE_CODE_VOID:
|
| + case TYPE_CODE_ERROR:
|
| + case TYPE_CODE_RANGE:
|
| + case TYPE_CODE_UNDEF:
|
| + case TYPE_CODE_COMPLEX:
|
| + case TYPE_CODE_BOOL:
|
| + case TYPE_CODE_CHAR:
|
| default:
|
| - error (_("Invalid F77 type code %d in symbol table."), TYPE_CODE (type));
|
| + generic_val_print (type, valaddr, embedded_offset, address,
|
| + stream, recurse, original_value, options,
|
| + &f_decorations);
|
| + break;
|
| }
|
| gdb_flush (stream);
|
| - return 0;
|
| }
|
|
|
| static void
|
| -list_all_visible_commons (char *funname)
|
| +list_all_visible_commons (const char *funname)
|
| {
|
| SAVED_F77_COMMON_PTR tmp;
|
|
|
| @@ -545,7 +441,7 @@ info_common_command (char *comname, int from_tty)
|
| SAVED_F77_COMMON_PTR the_common;
|
| COMMON_ENTRY_PTR entry;
|
| struct frame_info *fi;
|
| - char *funname = 0;
|
| + const char *funname = 0;
|
| struct symbol *func;
|
|
|
| /* We have been told to display the contents of F77 COMMON
|
| @@ -609,6 +505,8 @@ info_common_command (char *comname, int from_tty)
|
|
|
| if (the_common)
|
| {
|
| + struct frame_id frame_id = get_frame_id (fi);
|
| +
|
| if (strcmp (comname, BLANK_COMMON_NAME_LOCAL) == 0)
|
| printf_filtered (_("Contents of blank COMMON block:\n"));
|
| else
|
| @@ -619,7 +517,18 @@ info_common_command (char *comname, int from_tty)
|
|
|
| while (entry != NULL)
|
| {
|
| + fi = frame_find_by_id (frame_id);
|
| + if (fi == NULL)
|
| + {
|
| + warning (_("Unable to restore previously selected frame."));
|
| + break;
|
| + }
|
| +
|
| print_variable_and_value (NULL, entry->symbol, fi, gdb_stdout, 0);
|
| +
|
| + /* print_variable_and_value invalidates FI. */
|
| + fi = NULL;
|
| +
|
| entry = entry->next;
|
| }
|
| }
|
|
|