1 /* Support for printing Fortran values for GDB, the GNU debugger.
3 Copyright (C) 1993-2014 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/>. */
26 #include "expression.h"
35 #include "dictionary.h"
36 #include "exceptions.h"
38 extern void _initialize_f_valprint (void);
39 static void info_common_command (char *, int);
40 static void f77_create_arrayprint_offset_tbl (struct type *,
42 static void f77_get_dynamic_length_of_aggregate (struct type *);
44 int f77_array_offset_tbl[MAX_FORTRAN_DIMS + 1][2];
46 /* Array which holds offsets to be applied to get a row's elements
47 for a given array. Array also holds the size of each subarray. */
49 /* The following macro gives us the size of the nth dimension, Where
52 #define F77_DIM_SIZE(n) (f77_array_offset_tbl[n][1])
54 /* The following gives us the offset for row n where n is 1-based. */
56 #define F77_DIM_OFFSET(n) (f77_array_offset_tbl[n][0])
59 f77_get_lowerbound (struct type *type)
61 if (TYPE_ARRAY_LOWER_BOUND_IS_UNDEFINED (type))
62 error (_("Lower bound may not be '*' in F77"));
64 return TYPE_ARRAY_LOWER_BOUND_VALUE (type);
68 f77_get_upperbound (struct type *type)
70 if (TYPE_ARRAY_UPPER_BOUND_IS_UNDEFINED (type))
72 /* We have an assumed size array on our hands. Assume that
73 upper_bound == lower_bound so that we show at least 1 element.
74 If the user wants to see more elements, let him manually ask for 'em
75 and we'll subscript the array and show him. */
77 return f77_get_lowerbound (type);
80 return TYPE_ARRAY_UPPER_BOUND_VALUE (type);
83 /* Obtain F77 adjustable array dimensions. */
86 f77_get_dynamic_length_of_aggregate (struct type *type)
91 /* Recursively go all the way down into a possibly multi-dimensional
92 F77 array and get the bounds. For simple arrays, this is pretty
93 easy but when the bounds are dynamic, we must be very careful
94 to add up all the lengths correctly. Not doing this right
95 will lead to horrendous-looking arrays in parameter lists.
97 This function also works for strings which behave very
98 similarly to arrays. */
100 if (TYPE_CODE (TYPE_TARGET_TYPE (type)) == TYPE_CODE_ARRAY
101 || TYPE_CODE (TYPE_TARGET_TYPE (type)) == TYPE_CODE_STRING)
102 f77_get_dynamic_length_of_aggregate (TYPE_TARGET_TYPE (type));
104 /* Recursion ends here, start setting up lengths. */
105 lower_bound = f77_get_lowerbound (type);
106 upper_bound = f77_get_upperbound (type);
108 /* Patch in a valid length value. */
111 (upper_bound - lower_bound + 1)
112 * TYPE_LENGTH (check_typedef (TYPE_TARGET_TYPE (type)));
115 /* Function that sets up the array offset,size table for the array
119 f77_create_arrayprint_offset_tbl (struct type *type, struct ui_file *stream)
121 struct type *tmp_type;
128 while (TYPE_CODE (tmp_type) == TYPE_CODE_ARRAY)
130 upper = f77_get_upperbound (tmp_type);
131 lower = f77_get_lowerbound (tmp_type);
133 F77_DIM_SIZE (ndimen) = upper - lower + 1;
135 tmp_type = TYPE_TARGET_TYPE (tmp_type);
139 /* Now we multiply eltlen by all the offsets, so that later we
140 can print out array elements correctly. Up till now we
141 know an offset to apply to get the item but we also
142 have to know how much to add to get to the next item. */
145 eltlen = TYPE_LENGTH (tmp_type);
146 F77_DIM_OFFSET (ndimen) = eltlen;
149 eltlen *= F77_DIM_SIZE (ndimen + 1);
150 F77_DIM_OFFSET (ndimen) = eltlen;
156 /* Actual function which prints out F77 arrays, Valaddr == address in
157 the superior. Address == the address in the inferior. */
160 f77_print_array_1 (int nss, int ndimensions, struct type *type,
161 const gdb_byte *valaddr,
162 int embedded_offset, CORE_ADDR address,
163 struct ui_file *stream, int recurse,
164 const struct value *val,
165 const struct value_print_options *options,
170 if (nss != ndimensions)
173 (i < F77_DIM_SIZE (nss) && (*elts) < options->print_max);
176 fprintf_filtered (stream, "( ");
177 f77_print_array_1 (nss + 1, ndimensions, TYPE_TARGET_TYPE (type),
179 embedded_offset + i * F77_DIM_OFFSET (nss),
181 stream, recurse, val, options, elts);
182 fprintf_filtered (stream, ") ");
184 if (*elts >= options->print_max && i < F77_DIM_SIZE (nss))
185 fprintf_filtered (stream, "...");
189 for (i = 0; i < F77_DIM_SIZE (nss) && (*elts) < options->print_max;
192 val_print (TYPE_TARGET_TYPE (type),
194 embedded_offset + i * F77_DIM_OFFSET (ndimensions),
195 address, stream, recurse,
196 val, options, current_language);
198 if (i != (F77_DIM_SIZE (nss) - 1))
199 fprintf_filtered (stream, ", ");
201 if ((*elts == options->print_max - 1)
202 && (i != (F77_DIM_SIZE (nss) - 1)))
203 fprintf_filtered (stream, "...");
208 /* This function gets called to print an F77 array, we set up some
209 stuff and then immediately call f77_print_array_1(). */
212 f77_print_array (struct type *type, const gdb_byte *valaddr,
214 CORE_ADDR address, struct ui_file *stream,
216 const struct value *val,
217 const struct value_print_options *options)
222 ndimensions = calc_f77_array_dims (type);
224 if (ndimensions > MAX_FORTRAN_DIMS || ndimensions < 0)
226 Type node corrupt! F77 arrays cannot have %d subscripts (%d Max)"),
227 ndimensions, MAX_FORTRAN_DIMS);
229 /* Since F77 arrays are stored column-major, we set up an
230 offset table to get at the various row's elements. The
231 offset table contains entries for both offset and subarray size. */
233 f77_create_arrayprint_offset_tbl (type, stream);
235 f77_print_array_1 (1, ndimensions, type, valaddr, embedded_offset,
236 address, stream, recurse, val, options, &elts);
240 /* Decorations for Fortran. */
242 static const struct generic_val_print_decorations f_decorations =
252 /* See val_print for a description of the various parameters of this
253 function; they are identical. */
256 f_val_print (struct type *type, const gdb_byte *valaddr, int embedded_offset,
257 CORE_ADDR address, struct ui_file *stream, int recurse,
258 const struct value *original_value,
259 const struct value_print_options *options)
261 struct gdbarch *gdbarch = get_type_arch (type);
262 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
263 unsigned int i = 0; /* Number of characters printed. */
264 struct type *elttype;
268 CHECK_TYPEDEF (type);
269 switch (TYPE_CODE (type))
271 case TYPE_CODE_STRING:
272 f77_get_dynamic_length_of_aggregate (type);
273 LA_PRINT_STRING (stream, builtin_type (gdbarch)->builtin_char,
274 valaddr + embedded_offset,
275 TYPE_LENGTH (type), NULL, 0, options);
278 case TYPE_CODE_ARRAY:
279 if (TYPE_CODE (TYPE_TARGET_TYPE (type)) != TYPE_CODE_CHAR)
281 fprintf_filtered (stream, "(");
282 f77_print_array (type, valaddr, embedded_offset,
283 address, stream, recurse, original_value, options);
284 fprintf_filtered (stream, ")");
288 struct type *ch_type = TYPE_TARGET_TYPE (type);
290 f77_get_dynamic_length_of_aggregate (type);
291 LA_PRINT_STRING (stream, ch_type,
292 valaddr + embedded_offset,
293 TYPE_LENGTH (type) / TYPE_LENGTH (ch_type),
299 if (options->format && options->format != 's')
301 val_print_scalar_formatted (type, valaddr, embedded_offset,
302 original_value, options, 0, stream);
309 addr = unpack_pointer (type, valaddr + embedded_offset);
310 elttype = check_typedef (TYPE_TARGET_TYPE (type));
312 if (TYPE_CODE (elttype) == TYPE_CODE_FUNC)
314 /* Try to print what function it points to. */
315 print_function_pointer_address (options, gdbarch, addr, stream);
319 if (options->symbol_print)
320 want_space = print_address_demangle (options, gdbarch, addr,
322 else if (options->addressprint && options->format != 's')
324 fputs_filtered (paddress (gdbarch, addr), stream);
328 /* For a pointer to char or unsigned char, also print the string
329 pointed to, unless pointer is null. */
330 if (TYPE_LENGTH (elttype) == 1
331 && TYPE_CODE (elttype) == TYPE_CODE_INT
332 && (options->format == 0 || options->format == 's')
336 fputs_filtered (" ", stream);
337 i = val_print_string (TYPE_TARGET_TYPE (type), NULL, addr, -1,
345 if (options->format || options->output_format)
347 struct value_print_options opts = *options;
349 opts.format = (options->format ? options->format
350 : options->output_format);
351 val_print_scalar_formatted (type, valaddr, embedded_offset,
352 original_value, options, 0, stream);
356 val_print_type_code_int (type, valaddr + embedded_offset, stream);
357 /* C and C++ has no single byte int type, char is used instead.
358 Since we don't know whether the value is really intended to
359 be used as an integer or a character, print the character
360 equivalent as well. */
361 if (TYPE_LENGTH (type) == 1)
365 fputs_filtered (" ", stream);
366 c = unpack_long (type, valaddr + embedded_offset);
367 LA_PRINT_CHAR ((unsigned char) c, type, stream);
372 case TYPE_CODE_STRUCT:
373 case TYPE_CODE_UNION:
374 /* Starting from the Fortran 90 standard, Fortran supports derived
376 fprintf_filtered (stream, "( ");
377 for (index = 0; index < TYPE_NFIELDS (type); index++)
379 int offset = TYPE_FIELD_BITPOS (type, index) / 8;
381 val_print (TYPE_FIELD_TYPE (type, index), valaddr,
382 embedded_offset + offset,
383 address, stream, recurse + 1,
384 original_value, options, current_language);
385 if (index != TYPE_NFIELDS (type) - 1)
386 fputs_filtered (", ", stream);
388 fprintf_filtered (stream, " )");
393 case TYPE_CODE_FLAGS:
396 case TYPE_CODE_ERROR:
397 case TYPE_CODE_RANGE:
398 case TYPE_CODE_UNDEF:
399 case TYPE_CODE_COMPLEX:
403 generic_val_print (type, valaddr, embedded_offset, address,
404 stream, recurse, original_value, options,
412 info_common_command_for_block (const struct block *block, const char *comname,
415 struct block_iterator iter;
418 struct value_print_options opts;
420 get_user_print_options (&opts);
422 ALL_BLOCK_SYMBOLS (block, iter, sym)
423 if (SYMBOL_DOMAIN (sym) == COMMON_BLOCK_DOMAIN)
425 const struct common_block *common = SYMBOL_VALUE_COMMON_BLOCK (sym);
428 gdb_assert (SYMBOL_CLASS (sym) == LOC_COMMON_BLOCK);
430 if (comname && (!SYMBOL_LINKAGE_NAME (sym)
431 || strcmp (comname, SYMBOL_LINKAGE_NAME (sym)) != 0))
435 putchar_filtered ('\n');
438 if (SYMBOL_PRINT_NAME (sym))
439 printf_filtered (_("Contents of F77 COMMON block '%s':\n"),
440 SYMBOL_PRINT_NAME (sym));
442 printf_filtered (_("Contents of blank COMMON block:\n"));
444 for (index = 0; index < common->n_entries; index++)
446 struct value *val = NULL;
447 volatile struct gdb_exception except;
449 printf_filtered ("%s = ",
450 SYMBOL_PRINT_NAME (common->contents[index]));
452 TRY_CATCH (except, RETURN_MASK_ERROR)
454 val = value_of_variable (common->contents[index], block);
455 value_print (val, gdb_stdout, &opts);
458 if (except.reason < 0)
459 printf_filtered ("<error reading variable: %s>", except.message);
460 putchar_filtered ('\n');
465 /* This function is used to print out the values in a given COMMON
466 block. It will always use the most local common block of the
470 info_common_command (char *comname, int from_tty)
472 struct frame_info *fi;
473 const struct block *block;
474 int values_printed = 0;
476 /* We have been told to display the contents of F77 COMMON
477 block supposedly visible in this function. Let us
478 first make sure that it is visible and if so, let
479 us display its contents. */
481 fi = get_selected_frame (_("No frame selected"));
483 /* The following is generally ripped off from stack.c's routine
484 print_frame_info(). */
486 block = get_frame_block (fi, 0);
489 printf_filtered (_("No symbol table info available.\n"));
495 info_common_command_for_block (block, comname, &values_printed);
496 /* After handling the function's top-level block, stop. Don't
497 continue to its superblock, the block of per-file symbols. */
498 if (BLOCK_FUNCTION (block))
500 block = BLOCK_SUPERBLOCK (block);
506 printf_filtered (_("No common block '%s'.\n"), comname);
508 printf_filtered (_("No common blocks.\n"));
513 _initialize_f_valprint (void)
515 add_info ("common", info_common_command,
516 _("Print out the values contained in a Fortran COMMON block."));
518 add_com ("lc", class_info, info_common_command,
519 _("Print out the values contained in a Fortran COMMON block."));