/* Support for printing Fortran values for GDB, the GNU debugger.
- Copyright 1993, 1994, 1995 Free Software Foundation, Inc.
+ Copyright 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2003
+ Free Software Foundation, Inc.
Contributed by Motorola. Adapted from the C definitions by Farooq Butt
#include "gdbtypes.h"
#include "expression.h"
#include "value.h"
-#include "demangle.h"
#include "valprint.h"
#include "language.h"
#include "f-lang.h"
#include "frame.h"
#include "gdbcore.h"
#include "command.h"
+#include "block.h"
#if 0
-static int there_is_a_visible_common_named PARAMS ((char *));
+static int there_is_a_visible_common_named (char *);
#endif
-extern void _initialize_f_valprint PARAMS ((void));
-static void info_common_command PARAMS ((char *, int));
-static void list_all_visible_commons PARAMS ((char *));
-static void f77_print_array PARAMS ((struct type *, char *, CORE_ADDR,
- GDB_FILE *, int, int, int,
- enum val_prettyprint));
-static void f77_print_array_1 PARAMS ((int, int, struct type *, char *,
- CORE_ADDR, GDB_FILE *, int, int, int,
- enum val_prettyprint));
-static void f77_create_arrayprint_offset_tbl PARAMS ((struct type *,
- GDB_FILE *));
-static void f77_get_dynamic_length_of_aggregate PARAMS ((struct type *));
+extern void _initialize_f_valprint (void);
+static void info_common_command (char *, int);
+static void list_all_visible_commons (char *);
+static void f77_print_array (struct type *, char *, CORE_ADDR,
+ struct ui_file *, int, int, int,
+ enum val_prettyprint);
+static void f77_print_array_1 (int, int, struct type *, char *,
+ CORE_ADDR, struct ui_file *, int, int, int,
+ enum val_prettyprint,
+ int *elts);
+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];
#define F77_DIM_OFFSET(n) (f77_array_offset_tbl[n][0])
int
-f77_get_dynamic_lowerbound (type, lower_bound)
- struct type *type;
- int *lower_bound;
+f77_get_dynamic_lowerbound (struct type *type, int *lower_bound)
{
CORE_ADDR current_frame_addr;
CORE_ADDR ptr_to_lower_bound;
switch (TYPE_ARRAY_LOWER_BOUND_TYPE (type))
{
case BOUND_BY_VALUE_ON_STACK:
- current_frame_addr = selected_frame->frame;
+ current_frame_addr = get_frame_base (deprecated_selected_frame);
if (current_frame_addr > 0)
{
*lower_bound =
break;
case BOUND_BY_REF_ON_STACK:
- current_frame_addr = selected_frame->frame;
+ current_frame_addr = get_frame_base (deprecated_selected_frame);
if (current_frame_addr > 0)
{
ptr_to_lower_bound =
- read_memory_integer (current_frame_addr +
- TYPE_ARRAY_LOWER_BOUND_VALUE (type),
- 4);
+ read_memory_typed_address (current_frame_addr +
+ TYPE_ARRAY_LOWER_BOUND_VALUE (type),
+ builtin_type_void_data_ptr);
*lower_bound = read_memory_integer (ptr_to_lower_bound, 4);
}
else
}
int
-f77_get_dynamic_upperbound (type, upper_bound)
- struct type *type;
- int *upper_bound;
+f77_get_dynamic_upperbound (struct type *type, int *upper_bound)
{
CORE_ADDR current_frame_addr = 0;
CORE_ADDR ptr_to_upper_bound;
switch (TYPE_ARRAY_UPPER_BOUND_TYPE (type))
{
case BOUND_BY_VALUE_ON_STACK:
- current_frame_addr = selected_frame->frame;
+ current_frame_addr = get_frame_base (deprecated_selected_frame);
if (current_frame_addr > 0)
{
*upper_bound =
break;
case BOUND_BY_REF_ON_STACK:
- current_frame_addr = selected_frame->frame;
+ current_frame_addr = get_frame_base (deprecated_selected_frame);
if (current_frame_addr > 0)
{
ptr_to_upper_bound =
- read_memory_integer (current_frame_addr +
- TYPE_ARRAY_UPPER_BOUND_VALUE (type),
- 4);
+ read_memory_typed_address (current_frame_addr +
+ TYPE_ARRAY_UPPER_BOUND_VALUE (type),
+ builtin_type_void_data_ptr);
*upper_bound = read_memory_integer (ptr_to_upper_bound, 4);
}
else
/* Obtain F77 adjustable array dimensions */
static void
-f77_get_dynamic_length_of_aggregate (type)
- struct type *type;
+f77_get_dynamic_length_of_aggregate (struct type *type)
{
int upper_bound = -1;
int lower_bound = 1;
type "type". */
static void
-f77_create_arrayprint_offset_tbl (type, stream)
- struct type *type;
- GDB_FILE *stream;
+f77_create_arrayprint_offset_tbl (struct type *type, struct ui_file *stream)
{
struct type *tmp_type;
int eltlen;
}
}
+
+
/* Actual function which prints out F77 arrays, Valaddr == address in
the superior. Address == the address in the inferior. */
static void
-f77_print_array_1 (nss, ndimensions, type, valaddr, address,
- stream, format, deref_ref, recurse, pretty)
- int nss;
- int ndimensions;
- struct type *type;
- char *valaddr;
- CORE_ADDR address;
- GDB_FILE *stream;
- int format;
- int deref_ref;
- int recurse;
- enum val_prettyprint pretty;
+f77_print_array_1 (int nss, int ndimensions, struct type *type, char *valaddr,
+ CORE_ADDR address, struct ui_file *stream, int format,
+ int deref_ref, int recurse, enum val_prettyprint pretty,
+ int *elts)
{
int i;
if (nss != ndimensions)
{
- for (i = 0; i < F77_DIM_SIZE (nss); i++)
+ for (i = 0; (i < F77_DIM_SIZE (nss) && (*elts) < print_max); i++)
{
fprintf_filtered (stream, "( ");
f77_print_array_1 (nss + 1, ndimensions, TYPE_TARGET_TYPE (type),
valaddr + i * F77_DIM_OFFSET (nss),
address + i * F77_DIM_OFFSET (nss),
- stream, format, deref_ref, recurse, pretty);
+ stream, format, deref_ref, recurse, pretty, elts);
fprintf_filtered (stream, ") ");
}
+ if (*elts >= print_max && i < F77_DIM_SIZE (nss))
+ fprintf_filtered (stream, "...");
}
else
{
- for (i = 0; (i < F77_DIM_SIZE (nss) && i < print_max); i++)
+ for (i = 0; i < F77_DIM_SIZE (nss) && (*elts) < print_max;
+ i++, (*elts)++)
{
val_print (TYPE_TARGET_TYPE (type),
valaddr + i * F77_DIM_OFFSET (ndimensions),
if (i != (F77_DIM_SIZE (nss) - 1))
fprintf_filtered (stream, ", ");
- if (i == print_max - 1)
+ if ((*elts == print_max - 1) && (i != (F77_DIM_SIZE (nss) - 1)))
fprintf_filtered (stream, "...");
}
}
stuff and then immediately call f77_print_array_1() */
static void
-f77_print_array (type, valaddr, address, stream, format, deref_ref, recurse,
- pretty)
- struct type *type;
- char *valaddr;
- CORE_ADDR address;
- GDB_FILE *stream;
- int format;
- int deref_ref;
- int recurse;
- enum val_prettyprint pretty;
+f77_print_array (struct type *type, char *valaddr, CORE_ADDR address,
+ struct ui_file *stream, int format, int deref_ref, int recurse,
+ enum val_prettyprint pretty)
{
int ndimensions;
+ int elts = 0;
ndimensions = calc_f77_array_dims (type);
f77_create_arrayprint_offset_tbl (type, stream);
f77_print_array_1 (1, ndimensions, type, valaddr, address, stream, format,
- deref_ref, recurse, pretty);
+ deref_ref, recurse, pretty, &elts);
}
\f
The PRETTY parameter controls prettyprinting. */
int
-f_val_print (type, valaddr, embedded_offset, address, stream, format, deref_ref, recurse,
- pretty)
- struct type *type;
- char *valaddr;
- int embedded_offset;
- CORE_ADDR address;
- GDB_FILE *stream;
- int format;
- int deref_ref;
- int recurse;
- enum val_prettyprint pretty;
+f_val_print (struct type *type, char *valaddr, int embedded_offset,
+ CORE_ADDR address, struct ui_file *stream, int format,
+ int deref_ref, int recurse, enum val_prettyprint pretty)
{
- register unsigned int i = 0; /* Number of characters printed */
+ unsigned int i = 0; /* Number of characters printed */
struct type *elttype;
LONGEST val;
CORE_ADDR addr;
deref_ref, recurse, pretty);
fprintf_filtered (stream, ")");
break;
-#if 0
- /* Array of unspecified length: treat like pointer to first elt. */
- valaddr = (char *) &address;
- /* FALL THROUGH */
-#endif
+
case TYPE_CODE_PTR:
if (format && format != 's')
{
}
if (addressprint && format != 's')
- fprintf_filtered (stream, "0x%s", paddr_nz (addr));
+ print_address_numeric (addr, 1, stream);
/* For a pointer to char or unsigned char, also print the string
pointed to, unless pointer is null. */
&& addr != 0)
i = val_print_string (addr, -1, TYPE_LENGTH (elttype), stream);
- /* Return number of characters printed, plus one for the
- terminating null if we have "reached the end". */
- return (i + (print_max && i != print_max));
+ /* 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 (addressprint)
+ {
+ CORE_ADDR addr
+ = extract_typed_address (valaddr + embedded_offset, type);
+ fprintf_filtered (stream, "@");
+ print_address_numeric (addr, 1, stream);
+ if (deref_ref)
+ fputs_filtered (": ", stream);
+ }
+ /* De-reference the reference. */
+ if (deref_ref)
+ {
+ if (TYPE_CODE (elttype) != TYPE_CODE_UNDEF)
+ {
+ struct value *deref_val =
+ value_at
+ (TYPE_TARGET_TYPE (type),
+ unpack_pointer (lookup_pointer_type (builtin_type_void),
+ valaddr + embedded_offset),
+ NULL);
+ val_print (VALUE_TYPE (deref_val),
+ VALUE_CONTENTS (deref_val),
+ 0,
+ VALUE_ADDRESS (deref_val),
+ stream,
+ format,
+ deref_ref,
+ recurse,
+ pretty);
+ }
+ else
+ fputs_filtered ("???", stream);
}
break;
fputs_filtered ("(", stream);
print_floating (valaddr, type, stream);
fputs_filtered (",", stream);
- print_floating (valaddr, type, stream);
+ print_floating (valaddr + TYPE_LENGTH (type), type, stream);
fputs_filtered (")", stream);
break;
}
static void
-list_all_visible_commons (funname)
- char *funname;
+list_all_visible_commons (char *funname)
{
SAVED_F77_COMMON_PTR tmp;
while (tmp != NULL)
{
- if (STREQ (tmp->owning_function, funname))
+ if (strcmp (tmp->owning_function, funname) == 0)
printf_filtered ("%s\n", tmp->name);
tmp = tmp->next;
given name */
static void
-info_common_command (comname, from_tty)
- char *comname;
- int from_tty;
+info_common_command (char *comname, int from_tty)
{
SAVED_F77_COMMON_PTR the_common;
COMMON_ENTRY_PTR entry;
struct frame_info *fi;
- register char *funname = 0;
+ char *funname = 0;
struct symbol *func;
/* We have been told to display the contents of F77 COMMON
first make sure that it is visible and if so, let
us display its contents */
- fi = selected_frame;
+ fi = deprecated_selected_frame;
if (fi == NULL)
error ("No frame selected");
/* The following is generally ripped off from stack.c's routine
print_frame_info() */
- func = find_pc_function (fi->pc);
+ func = find_pc_function (get_frame_pc (fi));
if (func)
{
/* In certain pathological cases, the symtabs give the wrong
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);
+ 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_NAME (msymbol);
+ funname = DEPRECATED_SYMBOL_NAME (msymbol);
else
- funname = SYMBOL_NAME (func);
+ funname = DEPRECATED_SYMBOL_NAME (func);
}
else
{
- register struct minimal_symbol *msymbol =
- lookup_minimal_symbol_by_pc (fi->pc);
+ struct minimal_symbol *msymbol =
+ lookup_minimal_symbol_by_pc (get_frame_pc (fi));
if (msymbol != NULL)
- funname = SYMBOL_NAME (msymbol);
+ funname = DEPRECATED_SYMBOL_NAME (msymbol);
}
/* If comname is NULL, we assume the user wishes to see the
if (the_common)
{
- if (STREQ (comname, BLANK_COMMON_NAME_LOCAL))
+ 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);
while (entry != NULL)
{
- printf_filtered ("%s = ", SYMBOL_NAME (entry->symbol));
+ printf_filtered ("%s = ", DEPRECATED_SYMBOL_NAME (entry->symbol));
print_variable_value (entry->symbol, fi, gdb_stdout);
printf_filtered ("\n");
entry = entry->next;
#if 0
static int
-there_is_a_visible_common_named (comname)
- char *comname;
+there_is_a_visible_common_named (char *comname)
{
SAVED_F77_COMMON_PTR the_common;
struct frame_info *fi;
- register char *funname = 0;
+ char *funname = 0;
struct symbol *func;
if (comname == NULL)
error ("Cannot deal with NULL common name!");
- fi = selected_frame;
+ fi = deprecated_selected_frame;
if (fi == NULL)
error ("No frame selected");
if (msymbol != NULL
&& (SYMBOL_VALUE_ADDRESS (msymbol)
> BLOCK_START (SYMBOL_BLOCK_VALUE (func))))
- funname = SYMBOL_NAME (msymbol);
+ funname = DEPRECATED_SYMBOL_NAME (msymbol);
else
- funname = SYMBOL_NAME (func);
+ funname = DEPRECATED_SYMBOL_NAME (func);
}
else
{
- register struct minimal_symbol *msymbol =
+ struct minimal_symbol *msymbol =
lookup_minimal_symbol_by_pc (fi->pc);
if (msymbol != NULL)
- funname = SYMBOL_NAME (msymbol);
+ funname = DEPRECATED_SYMBOL_NAME (msymbol);
}
the_common = find_common_for_function (comname, funname);
#endif
void
-_initialize_f_valprint ()
+_initialize_f_valprint (void)
{
add_info ("common", info_common_command,
"Print out the values contained in a Fortran COMMON block.");