| Index: gdb/f-valprint.c
|
| diff --git a/gdb/f-valprint.c b/gdb/f-valprint.c
|
| index 4359f6f62e9b4a45325f054e888a50aaeebbeea8..751f7fa05efdd0ad6ee2c8ff289218731b3561d7 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-2013 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,7 @@
|
| along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
|
|
| #include "defs.h"
|
| -#include "gdb_string.h"
|
| +#include <string.h>
|
| #include "symtab.h"
|
| #include "gdbtypes.h"
|
| #include "expression.h"
|
| @@ -34,14 +33,12 @@
|
| #include "gdbcore.h"
|
| #include "command.h"
|
| #include "block.h"
|
| -
|
| -#if 0
|
| -static int there_is_a_visible_common_named (char *);
|
| -#endif
|
| +#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 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 *);
|
| @@ -130,7 +127,7 @@ f77_create_arrayprint_offset_tbl (struct type *type, struct ui_file *stream)
|
|
|
| tmp_type = type;
|
|
|
| - while ((TYPE_CODE (tmp_type) == TYPE_CODE_ARRAY))
|
| + while (TYPE_CODE (tmp_type) == TYPE_CODE_ARRAY)
|
| {
|
| upper = f77_get_upperbound (tmp_type);
|
| lower = f77_get_lowerbound (tmp_type);
|
| @@ -414,21 +411,57 @@ f_val_print (struct type *type, const gdb_byte *valaddr, int embedded_offset,
|
| }
|
|
|
| static void
|
| -list_all_visible_commons (const char *funname)
|
| +info_common_command_for_block (struct block *block, const char *comname,
|
| + int *any_printed)
|
| {
|
| - SAVED_F77_COMMON_PTR tmp;
|
| -
|
| - tmp = head_common_list;
|
| -
|
| - printf_filtered (_("All COMMON blocks visible at this level:\n\n"));
|
| -
|
| - while (tmp != NULL)
|
| - {
|
| - if (strcmp (tmp->owning_function, funname) == 0)
|
| - printf_filtered ("%s\n", tmp->name);
|
| -
|
| - tmp = tmp->next;
|
| - }
|
| + struct block_iterator iter;
|
| + struct symbol *sym;
|
| + const char *name;
|
| + struct value_print_options opts;
|
| +
|
| + get_user_print_options (&opts);
|
| +
|
| + ALL_BLOCK_SYMBOLS (block, iter, sym)
|
| + if (SYMBOL_DOMAIN (sym) == COMMON_BLOCK_DOMAIN)
|
| + {
|
| + struct common_block *common = SYMBOL_VALUE_COMMON_BLOCK (sym);
|
| + size_t index;
|
| +
|
| + gdb_assert (SYMBOL_CLASS (sym) == LOC_COMMON_BLOCK);
|
| +
|
| + if (comname && (!SYMBOL_LINKAGE_NAME (sym)
|
| + || strcmp (comname, SYMBOL_LINKAGE_NAME (sym)) != 0))
|
| + continue;
|
| +
|
| + if (*any_printed)
|
| + putchar_filtered ('\n');
|
| + else
|
| + *any_printed = 1;
|
| + if (SYMBOL_PRINT_NAME (sym))
|
| + printf_filtered (_("Contents of F77 COMMON block '%s':\n"),
|
| + SYMBOL_PRINT_NAME (sym));
|
| + 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]));
|
| +
|
| + TRY_CATCH (except, RETURN_MASK_ERROR)
|
| + {
|
| + val = value_of_variable (common->contents[index], block);
|
| + value_print (val, gdb_stdout, &opts);
|
| + }
|
| +
|
| + if (except.reason < 0)
|
| + printf_filtered ("<error reading variable: %s>", except.message);
|
| + putchar_filtered ('\n');
|
| + }
|
| + }
|
| }
|
|
|
| /* This function is used to print out the values in a given COMMON
|
| @@ -438,11 +471,9 @@ list_all_visible_commons (const char *funname)
|
| static void
|
| info_common_command (char *comname, int from_tty)
|
| {
|
| - SAVED_F77_COMMON_PTR the_common;
|
| - COMMON_ENTRY_PTR entry;
|
| struct frame_info *fi;
|
| - const char *funname = 0;
|
| - struct symbol *func;
|
| + struct block *block;
|
| + int values_printed = 0;
|
|
|
| /* We have been told to display the contents of F77 COMMON
|
| block supposedly visible in this function. Let us
|
| @@ -454,149 +485,31 @@ info_common_command (char *comname, int from_tty)
|
| /* The following is generally ripped off from stack.c's routine
|
| print_frame_info(). */
|
|
|
| - func = find_pc_function (get_frame_pc (fi));
|
| - if (func)
|
| - {
|
| - /* In certain pathological cases, the symtabs give the wrong
|
| - function (when we are in the first function in a file which
|
| - is compiled without debugging symbols, the previous function
|
| - is compiled with debugging symbols, and the "foo.o" symbol
|
| - that is supposed to tell us where the file with debugging symbols
|
| - ends has been truncated by ar because it is longer than 15
|
| - characters).
|
| -
|
| - So look in the minimal symbol tables as well, and if it comes
|
| - up with a larger address for the function use that instead.
|
| - I don't think this can ever cause any problems; there shouldn't
|
| - be any minimal symbols in the middle of a function.
|
| - FIXME: (Not necessarily true. What about text labels?) */
|
| -
|
| - struct minimal_symbol *msymbol =
|
| - lookup_minimal_symbol_by_pc (get_frame_pc (fi));
|
| -
|
| - if (msymbol != NULL
|
| - && (SYMBOL_VALUE_ADDRESS (msymbol)
|
| - > BLOCK_START (SYMBOL_BLOCK_VALUE (func))))
|
| - funname = SYMBOL_LINKAGE_NAME (msymbol);
|
| - else
|
| - funname = SYMBOL_LINKAGE_NAME (func);
|
| - }
|
| - else
|
| + block = get_frame_block (fi, 0);
|
| + if (block == NULL)
|
| {
|
| - struct minimal_symbol *msymbol =
|
| - lookup_minimal_symbol_by_pc (get_frame_pc (fi));
|
| -
|
| - if (msymbol != NULL)
|
| - funname = SYMBOL_LINKAGE_NAME (msymbol);
|
| - else /* Got no 'funname', code below will fail. */
|
| - error (_("No function found for frame."));
|
| - }
|
| -
|
| - /* If comname is NULL, we assume the user wishes to see the
|
| - which COMMON blocks are visible here and then return. */
|
| -
|
| - if (comname == 0)
|
| - {
|
| - list_all_visible_commons (funname);
|
| + printf_filtered (_("No symbol table info available.\n"));
|
| return;
|
| }
|
|
|
| - the_common = find_common_for_function (comname, funname);
|
| -
|
| - if (the_common)
|
| + while (block)
|
| {
|
| - 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
|
| - printf_filtered (_("Contents of F77 COMMON block '%s':\n"), comname);
|
| -
|
| - printf_filtered ("\n");
|
| - entry = the_common->entries;
|
| -
|
| - 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;
|
| - }
|
| + info_common_command_for_block (block, comname, &values_printed);
|
| + /* After handling the function's top-level block, stop. Don't
|
| + continue to its superblock, the block of per-file symbols. */
|
| + if (BLOCK_FUNCTION (block))
|
| + break;
|
| + block = BLOCK_SUPERBLOCK (block);
|
| }
|
| - else
|
| - printf_filtered (_("Cannot locate the common block %s in function '%s'\n"),
|
| - comname, funname);
|
| -}
|
| -
|
| -/* This function is used to determine whether there is a
|
| - F77 common block visible at the current scope called 'comname'. */
|
| -
|
| -#if 0
|
| -static int
|
| -there_is_a_visible_common_named (char *comname)
|
| -{
|
| - SAVED_F77_COMMON_PTR the_common;
|
| - struct frame_info *fi;
|
| - char *funname = 0;
|
| - struct symbol *func;
|
| -
|
| - if (comname == NULL)
|
| - error (_("Cannot deal with NULL common name!"));
|
|
|
| - fi = get_selected_frame (_("No frame selected"));
|
| -
|
| - /* The following is generally ripped off from stack.c's routine
|
| - print_frame_info(). */
|
| -
|
| - func = find_pc_function (fi->pc);
|
| - if (func)
|
| + if (!values_printed)
|
| {
|
| - /* In certain pathological cases, the symtabs give the wrong
|
| - function (when we are in the first function in a file which
|
| - is compiled without debugging symbols, the previous function
|
| - is compiled with debugging symbols, and the "foo.o" symbol
|
| - that is supposed to tell us where the file with debugging symbols
|
| - ends has been truncated by ar because it is longer than 15
|
| - characters).
|
| -
|
| - So look in the minimal symbol tables as well, and if it comes
|
| - up with a larger address for the function use that instead.
|
| - I don't think this can ever cause any problems; there shouldn't
|
| - be any minimal symbols in the middle of a function.
|
| - FIXME: (Not necessarily true. What about text labels?) */
|
| -
|
| - struct minimal_symbol *msymbol = lookup_minimal_symbol_by_pc (fi->pc);
|
| -
|
| - if (msymbol != NULL
|
| - && (SYMBOL_VALUE_ADDRESS (msymbol)
|
| - > BLOCK_START (SYMBOL_BLOCK_VALUE (func))))
|
| - funname = SYMBOL_LINKAGE_NAME (msymbol);
|
| + if (comname)
|
| + printf_filtered (_("No common block '%s'.\n"), comname);
|
| else
|
| - funname = SYMBOL_LINKAGE_NAME (func);
|
| + printf_filtered (_("No common blocks.\n"));
|
| }
|
| - else
|
| - {
|
| - struct minimal_symbol *msymbol =
|
| - lookup_minimal_symbol_by_pc (fi->pc);
|
| -
|
| - if (msymbol != NULL)
|
| - funname = SYMBOL_LINKAGE_NAME (msymbol);
|
| - }
|
| -
|
| - the_common = find_common_for_function (comname, funname);
|
| -
|
| - return (the_common ? 1 : 0);
|
| }
|
| -#endif
|
|
|
| void
|
| _initialize_f_valprint (void)
|
|
|