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; |
} |
} |