1 /* Support for printing Fortran values for GDB, the GNU debugger.
3 Copyright (C) 1993-2013 Free Software Foundation, Inc.
5 Contributed by Motorola. Adapted from the C definitions by Farooq Butt
6 (fmbutt@engage.sps.mot.com), additionally worked over by Stan Shebs.
8 This file is part of GDB.
10 This program is free software; you can redistribute it and/or modify
11 it under the terms of the GNU General Public License as published by
12 the Free Software Foundation; either version 3 of the License, or
13 (at your option) any later version.
15 This program is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License for more details.
20 You should have received a copy of the GNU General Public License
21 along with this program. If not, see <http://www.gnu.org/licenses/>. */
24 #include "gdb_string.h"
27 #include "expression.h"
36 #include "dictionary.h"
37 #include "gdb_assert.h"
38 #include "exceptions.h"
40 extern void _initialize_f_valprint (void);
41 static void info_common_command (char *, int);
42 static void f77_create_arrayprint_offset_tbl (struct type *,
44 static void f77_get_dynamic_length_of_aggregate (struct type *);
46 int f77_array_offset_tbl[MAX_FORTRAN_DIMS + 1][2];
48 /* Array which holds offsets to be applied to get a row's elements
49 for a given array. Array also holds the size of each subarray. */
51 /* The following macro gives us the size of the nth dimension, Where
54 #define F77_DIM_SIZE(n) (f77_array_offset_tbl[n][1])
56 /* The following gives us the offset for row n where n is 1-based. */
58 #define F77_DIM_OFFSET(n) (f77_array_offset_tbl[n][0])
61 f77_get_lowerbound (struct type *type)
63 if (TYPE_ARRAY_LOWER_BOUND_IS_UNDEFINED (type))
64 error (_("Lower bound may not be '*' in F77"));
66 return TYPE_ARRAY_LOWER_BOUND_VALUE (type);
70 f77_get_upperbound (struct type *type)
72 if (TYPE_ARRAY_UPPER_BOUND_IS_UNDEFINED (type))
74 /* We have an assumed size array on our hands. Assume that
75 upper_bound == lower_bound so that we show at least 1 element.
76 If the user wants to see more elements, let him manually ask for 'em
77 and we'll subscript the array and show him. */
79 return f77_get_lowerbound (type);
82 return TYPE_ARRAY_UPPER_BOUND_VALUE (type);
85 /* Obtain F77 adjustable array dimensions. */
88 f77_get_dynamic_length_of_aggregate (struct type *type)
93 /* Recursively go all the way down into a possibly multi-dimensional
94 F77 array and get the bounds. For simple arrays, this is pretty
95 easy but when the bounds are dynamic, we must be very careful
96 to add up all the lengths correctly. Not doing this right
97 will lead to horrendous-looking arrays in parameter lists.
99 This function also works for strings which behave very
100 similarly to arrays. */
102 if (TYPE_CODE (TYPE_TARGET_TYPE (type)) == TYPE_CODE_ARRAY
103 || TYPE_CODE (TYPE_TARGET_TYPE (type)) == TYPE_CODE_STRING)
104 f77_get_dynamic_length_of_aggregate (TYPE_TARGET_TYPE (type));
106 /* Recursion ends here, start setting up lengths. */
107 lower_bound = f77_get_lowerbound (type);
108 upper_bound = f77_get_upperbound (type);
110 /* Patch in a valid length value. */
113 (upper_bound - lower_bound + 1)
114 * TYPE_LENGTH (check_typedef (TYPE_TARGET_TYPE (type)));
117 /* Function that sets up the array offset,size table for the array
121 f77_create_arrayprint_offset_tbl (struct type *type, struct ui_file *stream)
123 struct type *tmp_type;
130 while (TYPE_CODE (tmp_type) == TYPE_CODE_ARRAY)
132 upper = f77_get_upperbound (tmp_type);
133 lower = f77_get_lowerbound (tmp_type);
135 F77_DIM_SIZE (ndimen) = upper - lower + 1;
137 tmp_type = TYPE_TARGET_TYPE (tmp_type);
141 /* Now we multiply eltlen by all the offsets, so that later we
142 can print out array elements correctly. Up till now we
143 know an offset to apply to get the item but we also
144 have to know how much to add to get to the next item. */
147 eltlen = TYPE_LENGTH (tmp_type);
148 F77_DIM_OFFSET (ndimen) = eltlen;
151 eltlen *= F77_DIM_SIZE (ndimen + 1);
152 F77_DIM_OFFSET (ndimen) = eltlen;
158 /* Actual function which prints out F77 arrays, Valaddr == address in
159 the superior. Address == the address in the inferior. */
162 f77_print_array_1 (int nss, int ndimensions, struct type *type,
163 const gdb_byte *valaddr,
164 int embedded_offset, CORE_ADDR address,
165 struct ui_file *stream, int recurse,
166 const struct value *val,
167 const struct value_print_options *options,
172 if (nss != ndimensions)
175 (i < F77_DIM_SIZE (nss) && (*elts) < options->print_max);
178 fprintf_filtered (stream, "( ");
179 f77_print_array_1 (nss + 1, ndimensions, TYPE_TARGET_TYPE (type),
181 embedded_offset + i * F77_DIM_OFFSET (nss),
183 stream, recurse, val, options, elts);
184 fprintf_filtered (stream, ") ");
186 if (*elts >= options->print_max && i < F77_DIM_SIZE (nss))
187 fprintf_filtered (stream, "...");
191 for (i = 0; i < F77_DIM_SIZE (nss) && (*elts) < options->print_max;
194 val_print (TYPE_TARGET_TYPE (type),
196 embedded_offset + i * F77_DIM_OFFSET (ndimensions),
197 address, stream, recurse,
198 val, options, current_language);
200 if (i != (F77_DIM_SIZE (nss) - 1))
201 fprintf_filtered (stream, ", ");
203 if ((*elts == options->print_max - 1)
204 && (i != (F77_DIM_SIZE (nss) - 1)))
205 fprintf_filtered (stream, "...");
210 /* This function gets called to print an F77 array, we set up some
211 stuff and then immediately call f77_print_array_1(). */
214 f77_print_array (struct type *type, const gdb_byte *valaddr,
216 CORE_ADDR address, struct ui_file *stream,
218 const struct value *val,
219 const struct value_print_options *options)
224 ndimensions = calc_f77_array_dims (type);
226 if (ndimensions > MAX_FORTRAN_DIMS || ndimensions < 0)
228 Type node corrupt! F77 arrays cannot have %d subscripts (%d Max)"),
229 ndimensions, MAX_FORTRAN_DIMS);
231 /* Since F77 arrays are stored column-major, we set up an
232 offset table to get at the various row's elements. The
233 offset table contains entries for both offset and subarray size. */
235 f77_create_arrayprint_offset_tbl (type, stream);
237 f77_print_array_1 (1, ndimensions, type, valaddr, embedded_offset,
238 address, stream, recurse, val, options, &elts);
242 /* Decorations for Fortran. */
244 static const struct generic_val_print_decorations f_decorations =
254 /* See val_print for a description of the various parameters of this
255 function; they are identical. */
258 f_val_print (struct type *type, const gdb_byte *valaddr, int embedded_offset,
259 CORE_ADDR address, struct ui_file *stream, int recurse,
260 const struct value *original_value,
261 const struct value_print_options *options)
263 struct gdbarch *gdbarch = get_type_arch (type);
264 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
265 unsigned int i = 0; /* Number of characters printed. */
266 struct type *elttype;
270 CHECK_TYPEDEF (type);
271 switch (TYPE_CODE (type))
273 case TYPE_CODE_STRING:
274 f77_get_dynamic_length_of_aggregate (type);
275 LA_PRINT_STRING (stream, builtin_type (gdbarch)->builtin_char,
276 valaddr + embedded_offset,
277 TYPE_LENGTH (type), NULL, 0, options);
280 case TYPE_CODE_ARRAY:
281 if (TYPE_CODE (TYPE_TARGET_TYPE (type)) != TYPE_CODE_CHAR)
283 fprintf_filtered (stream, "(");
284 f77_print_array (type, valaddr, embedded_offset,
285 address, stream, recurse, original_value, options);
286 fprintf_filtered (stream, ")");
290 struct type *ch_type = TYPE_TARGET_TYPE (type);
292 f77_get_dynamic_length_of_aggregate (type);
293 LA_PRINT_STRING (stream, ch_type,
294 valaddr + embedded_offset,
295 TYPE_LENGTH (type) / TYPE_LENGTH (ch_type),
301 if (options->format && options->format != 's')
303 val_print_scalar_formatted (type, valaddr, embedded_offset,
304 original_value, options, 0, stream);
311 addr = unpack_pointer (type, valaddr + embedded_offset);
312 elttype = check_typedef (TYPE_TARGET_TYPE (type));
314 if (TYPE_CODE (elttype) == TYPE_CODE_FUNC)
316 /* Try to print what function it points to. */
317 print_function_pointer_address (options, gdbarch, addr, stream);
321 if (options->symbol_print)
322 want_space = print_address_demangle (options, gdbarch, addr,
324 else if (options->addressprint && options->format != 's')
326 fputs_filtered (paddress (gdbarch, addr), stream);
330 /* For a pointer to char or unsigned char, also print the string
331 pointed to, unless pointer is null. */
332 if (TYPE_LENGTH (elttype) == 1
333 && TYPE_CODE (elttype) == TYPE_CODE_INT
334 && (options->format == 0 || options->format == 's')
338 fputs_filtered (" ", stream);
339 i = val_print_string (TYPE_TARGET_TYPE (type), NULL, addr, -1,
347 if (options->format || options->output_format)
349 struct value_print_options opts = *options;
351 opts.format = (options->format ? options->format
352 : options->output_format);
353 val_print_scalar_formatted (type, valaddr, embedded_offset,
354 original_value, options, 0, stream);
358 val_print_type_code_int (type, valaddr + embedded_offset, stream);
359 /* C and C++ has no single byte int type, char is used instead.
360 Since we don't know whether the value is really intended to
361 be used as an integer or a character, print the character
362 equivalent as well. */
363 if (TYPE_LENGTH (type) == 1)
367 fputs_filtered (" ", stream);
368 c = unpack_long (type, valaddr + embedded_offset);
369 LA_PRINT_CHAR ((unsigned char) c, type, stream);
374 case TYPE_CODE_STRUCT:
375 case TYPE_CODE_UNION:
376 /* Starting from the Fortran 90 standard, Fortran supports derived
378 fprintf_filtered (stream, "( ");
379 for (index = 0; index < TYPE_NFIELDS (type); index++)
381 int offset = TYPE_FIELD_BITPOS (type, index) / 8;
383 val_print (TYPE_FIELD_TYPE (type, index), valaddr,
384 embedded_offset + offset,
385 address, stream, recurse + 1,
386 original_value, options, current_language);
387 if (index != TYPE_NFIELDS (type) - 1)
388 fputs_filtered (", ", stream);
390 fprintf_filtered (stream, " )");
395 case TYPE_CODE_FLAGS:
398 case TYPE_CODE_ERROR:
399 case TYPE_CODE_RANGE:
400 case TYPE_CODE_UNDEF:
401 case TYPE_CODE_COMPLEX:
405 generic_val_print (type, valaddr, embedded_offset, address,
406 stream, recurse, original_value, options,
414 info_common_command_for_block (struct block *block, const char *comname,
417 struct block_iterator iter;
420 struct value_print_options opts;
422 get_user_print_options (&opts);
424 ALL_BLOCK_SYMBOLS (block, iter, sym)
425 if (SYMBOL_DOMAIN (sym) == COMMON_BLOCK_DOMAIN)
427 struct common_block *common = SYMBOL_VALUE_COMMON_BLOCK (sym);
430 gdb_assert (SYMBOL_CLASS (sym) == LOC_STATIC);
432 if (comname && (!SYMBOL_LINKAGE_NAME (sym)
433 || strcmp (comname, SYMBOL_LINKAGE_NAME (sym)) != 0))
437 putchar_filtered ('\n');
440 if (SYMBOL_PRINT_NAME (sym))
441 printf_filtered (_("Contents of F77 COMMON block '%s':\n"),
442 SYMBOL_PRINT_NAME (sym));
444 printf_filtered (_("Contents of blank COMMON block:\n"));
446 for (index = 0; index < common->n_entries; index++)
448 struct value *val = NULL;
449 volatile struct gdb_exception except;
451 printf_filtered ("%s = ",
452 SYMBOL_PRINT_NAME (common->contents[index]));
454 TRY_CATCH (except, RETURN_MASK_ERROR)
456 val = value_of_variable (common->contents[index], block);
457 value_print (val, gdb_stdout, &opts);
460 if (except.reason < 0)
461 printf_filtered ("<error reading variable: %s>", except.message);
462 putchar_filtered ('\n');
467 /* This function is used to print out the values in a given COMMON
468 block. It will always use the most local common block of the
472 info_common_command (char *comname, int from_tty)
474 struct frame_info *fi;
476 int values_printed = 0;
478 /* We have been told to display the contents of F77 COMMON
479 block supposedly visible in this function. Let us
480 first make sure that it is visible and if so, let
481 us display its contents. */
483 fi = get_selected_frame (_("No frame selected"));
485 /* The following is generally ripped off from stack.c's routine
486 print_frame_info(). */
488 block = get_frame_block (fi, 0);
491 printf_filtered (_("No symbol table info available.\n"));
497 info_common_command_for_block (block, comname, &values_printed);
498 /* After handling the function's top-level block, stop. Don't
499 continue to its superblock, the block of per-file symbols. */
500 if (BLOCK_FUNCTION (block))
502 block = BLOCK_SUPERBLOCK (block);
508 printf_filtered (_("No common block '%s'.\n"), comname);
510 printf_filtered (_("No common blocks.\n"));
515 _initialize_f_valprint (void)
517 add_info ("common", info_common_command,
518 _("Print out the values contained in a Fortran COMMON block."));
520 add_com ("lc", class_info, info_common_command,
521 _("Print out the values contained in a Fortran COMMON block."));