s390-vregs.exp: Avoid compile errors with older GCCs and on 31-bit targets
[binutils-gdb.git] / gdb / f-valprint.c
blob8d74f03574c2147a5a98da9fa931cdd881f84cfa
1 /* Support for printing Fortran values for GDB, the GNU debugger.
3 Copyright (C) 1993-2015 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/>. */
23 #include "defs.h"
24 #include "symtab.h"
25 #include "gdbtypes.h"
26 #include "expression.h"
27 #include "value.h"
28 #include "valprint.h"
29 #include "language.h"
30 #include "f-lang.h"
31 #include "frame.h"
32 #include "gdbcore.h"
33 #include "command.h"
34 #include "block.h"
35 #include "dictionary.h"
37 extern void _initialize_f_valprint (void);
38 static void info_common_command (char *, int);
39 static void f77_create_arrayprint_offset_tbl (struct type *,
40 struct ui_file *);
41 static void f77_get_dynamic_length_of_aggregate (struct type *);
43 int f77_array_offset_tbl[MAX_FORTRAN_DIMS + 1][2];
45 /* Array which holds offsets to be applied to get a row's elements
46 for a given array. Array also holds the size of each subarray. */
48 /* The following macro gives us the size of the nth dimension, Where
49 n is 1 based. */
51 #define F77_DIM_SIZE(n) (f77_array_offset_tbl[n][1])
53 /* The following gives us the offset for row n where n is 1-based. */
55 #define F77_DIM_OFFSET(n) (f77_array_offset_tbl[n][0])
57 int
58 f77_get_lowerbound (struct type *type)
60 if (TYPE_ARRAY_LOWER_BOUND_IS_UNDEFINED (type))
61 error (_("Lower bound may not be '*' in F77"));
63 return TYPE_ARRAY_LOWER_BOUND_VALUE (type);
66 int
67 f77_get_upperbound (struct type *type)
69 if (TYPE_ARRAY_UPPER_BOUND_IS_UNDEFINED (type))
71 /* We have an assumed size array on our hands. Assume that
72 upper_bound == lower_bound so that we show at least 1 element.
73 If the user wants to see more elements, let him manually ask for 'em
74 and we'll subscript the array and show him. */
76 return f77_get_lowerbound (type);
79 return TYPE_ARRAY_UPPER_BOUND_VALUE (type);
82 /* Obtain F77 adjustable array dimensions. */
84 static void
85 f77_get_dynamic_length_of_aggregate (struct type *type)
87 int upper_bound = -1;
88 int lower_bound = 1;
90 /* Recursively go all the way down into a possibly multi-dimensional
91 F77 array and get the bounds. For simple arrays, this is pretty
92 easy but when the bounds are dynamic, we must be very careful
93 to add up all the lengths correctly. Not doing this right
94 will lead to horrendous-looking arrays in parameter lists.
96 This function also works for strings which behave very
97 similarly to arrays. */
99 if (TYPE_CODE (TYPE_TARGET_TYPE (type)) == TYPE_CODE_ARRAY
100 || TYPE_CODE (TYPE_TARGET_TYPE (type)) == TYPE_CODE_STRING)
101 f77_get_dynamic_length_of_aggregate (TYPE_TARGET_TYPE (type));
103 /* Recursion ends here, start setting up lengths. */
104 lower_bound = f77_get_lowerbound (type);
105 upper_bound = f77_get_upperbound (type);
107 /* Patch in a valid length value. */
109 TYPE_LENGTH (type) =
110 (upper_bound - lower_bound + 1)
111 * TYPE_LENGTH (check_typedef (TYPE_TARGET_TYPE (type)));
114 /* Function that sets up the array offset,size table for the array
115 type "type". */
117 static void
118 f77_create_arrayprint_offset_tbl (struct type *type, struct ui_file *stream)
120 struct type *tmp_type;
121 int eltlen;
122 int ndimen = 1;
123 int upper, lower;
125 tmp_type = type;
127 while (TYPE_CODE (tmp_type) == TYPE_CODE_ARRAY)
129 upper = f77_get_upperbound (tmp_type);
130 lower = f77_get_lowerbound (tmp_type);
132 F77_DIM_SIZE (ndimen) = upper - lower + 1;
134 tmp_type = TYPE_TARGET_TYPE (tmp_type);
135 ndimen++;
138 /* Now we multiply eltlen by all the offsets, so that later we
139 can print out array elements correctly. Up till now we
140 know an offset to apply to get the item but we also
141 have to know how much to add to get to the next item. */
143 ndimen--;
144 eltlen = TYPE_LENGTH (tmp_type);
145 F77_DIM_OFFSET (ndimen) = eltlen;
146 while (--ndimen > 0)
148 eltlen *= F77_DIM_SIZE (ndimen + 1);
149 F77_DIM_OFFSET (ndimen) = eltlen;
155 /* Actual function which prints out F77 arrays, Valaddr == address in
156 the superior. Address == the address in the inferior. */
158 static void
159 f77_print_array_1 (int nss, int ndimensions, struct type *type,
160 const gdb_byte *valaddr,
161 int embedded_offset, CORE_ADDR address,
162 struct ui_file *stream, int recurse,
163 const struct value *val,
164 const struct value_print_options *options,
165 int *elts)
167 int i;
169 if (nss != ndimensions)
171 for (i = 0;
172 (i < F77_DIM_SIZE (nss) && (*elts) < options->print_max);
173 i++)
175 fprintf_filtered (stream, "( ");
176 f77_print_array_1 (nss + 1, ndimensions, TYPE_TARGET_TYPE (type),
177 valaddr,
178 embedded_offset + i * F77_DIM_OFFSET (nss),
179 address,
180 stream, recurse, val, options, elts);
181 fprintf_filtered (stream, ") ");
183 if (*elts >= options->print_max && i < F77_DIM_SIZE (nss))
184 fprintf_filtered (stream, "...");
186 else
188 for (i = 0; i < F77_DIM_SIZE (nss) && (*elts) < options->print_max;
189 i++, (*elts)++)
191 val_print (TYPE_TARGET_TYPE (type),
192 valaddr,
193 embedded_offset + i * F77_DIM_OFFSET (ndimensions),
194 address, stream, recurse,
195 val, options, current_language);
197 if (i != (F77_DIM_SIZE (nss) - 1))
198 fprintf_filtered (stream, ", ");
200 if ((*elts == options->print_max - 1)
201 && (i != (F77_DIM_SIZE (nss) - 1)))
202 fprintf_filtered (stream, "...");
207 /* This function gets called to print an F77 array, we set up some
208 stuff and then immediately call f77_print_array_1(). */
210 static void
211 f77_print_array (struct type *type, const gdb_byte *valaddr,
212 int embedded_offset,
213 CORE_ADDR address, struct ui_file *stream,
214 int recurse,
215 const struct value *val,
216 const struct value_print_options *options)
218 int ndimensions;
219 int elts = 0;
221 ndimensions = calc_f77_array_dims (type);
223 if (ndimensions > MAX_FORTRAN_DIMS || ndimensions < 0)
224 error (_("\
225 Type node corrupt! F77 arrays cannot have %d subscripts (%d Max)"),
226 ndimensions, MAX_FORTRAN_DIMS);
228 /* Since F77 arrays are stored column-major, we set up an
229 offset table to get at the various row's elements. The
230 offset table contains entries for both offset and subarray size. */
232 f77_create_arrayprint_offset_tbl (type, stream);
234 f77_print_array_1 (1, ndimensions, type, valaddr, embedded_offset,
235 address, stream, recurse, val, options, &elts);
239 /* Decorations for Fortran. */
241 static const struct generic_val_print_decorations f_decorations =
243 "(",
244 ",",
245 ")",
246 ".TRUE.",
247 ".FALSE.",
248 "VOID",
251 /* See val_print for a description of the various parameters of this
252 function; they are identical. */
254 void
255 f_val_print (struct type *type, const gdb_byte *valaddr, int embedded_offset,
256 CORE_ADDR address, struct ui_file *stream, int recurse,
257 const struct value *original_value,
258 const struct value_print_options *options)
260 struct gdbarch *gdbarch = get_type_arch (type);
261 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
262 unsigned int i = 0; /* Number of characters printed. */
263 struct type *elttype;
264 CORE_ADDR addr;
265 int index;
267 CHECK_TYPEDEF (type);
268 switch (TYPE_CODE (type))
270 case TYPE_CODE_STRING:
271 f77_get_dynamic_length_of_aggregate (type);
272 LA_PRINT_STRING (stream, builtin_type (gdbarch)->builtin_char,
273 valaddr + embedded_offset,
274 TYPE_LENGTH (type), NULL, 0, options);
275 break;
277 case TYPE_CODE_ARRAY:
278 if (TYPE_CODE (TYPE_TARGET_TYPE (type)) != TYPE_CODE_CHAR)
280 fprintf_filtered (stream, "(");
281 f77_print_array (type, valaddr, embedded_offset,
282 address, stream, recurse, original_value, options);
283 fprintf_filtered (stream, ")");
285 else
287 struct type *ch_type = TYPE_TARGET_TYPE (type);
289 f77_get_dynamic_length_of_aggregate (type);
290 LA_PRINT_STRING (stream, ch_type,
291 valaddr + embedded_offset,
292 TYPE_LENGTH (type) / TYPE_LENGTH (ch_type),
293 NULL, 0, options);
295 break;
297 case TYPE_CODE_PTR:
298 if (options->format && options->format != 's')
300 val_print_scalar_formatted (type, valaddr, embedded_offset,
301 original_value, options, 0, stream);
302 break;
304 else
306 int want_space = 0;
308 addr = unpack_pointer (type, valaddr + embedded_offset);
309 elttype = check_typedef (TYPE_TARGET_TYPE (type));
311 if (TYPE_CODE (elttype) == TYPE_CODE_FUNC)
313 /* Try to print what function it points to. */
314 print_function_pointer_address (options, gdbarch, addr, stream);
315 return;
318 if (options->symbol_print)
319 want_space = print_address_demangle (options, gdbarch, addr,
320 stream, demangle);
321 else if (options->addressprint && options->format != 's')
323 fputs_filtered (paddress (gdbarch, addr), stream);
324 want_space = 1;
327 /* For a pointer to char or unsigned char, also print the string
328 pointed to, unless pointer is null. */
329 if (TYPE_LENGTH (elttype) == 1
330 && TYPE_CODE (elttype) == TYPE_CODE_INT
331 && (options->format == 0 || options->format == 's')
332 && addr != 0)
334 if (want_space)
335 fputs_filtered (" ", stream);
336 i = val_print_string (TYPE_TARGET_TYPE (type), NULL, addr, -1,
337 stream, options);
339 return;
341 break;
343 case TYPE_CODE_INT:
344 if (options->format || options->output_format)
346 struct value_print_options opts = *options;
348 opts.format = (options->format ? options->format
349 : options->output_format);
350 val_print_scalar_formatted (type, valaddr, embedded_offset,
351 original_value, &opts, 0, stream);
353 else
355 val_print_type_code_int (type, valaddr + embedded_offset, stream);
356 /* C and C++ has no single byte int type, char is used instead.
357 Since we don't know whether the value is really intended to
358 be used as an integer or a character, print the character
359 equivalent as well. */
360 if (TYPE_LENGTH (type) == 1)
362 LONGEST c;
364 fputs_filtered (" ", stream);
365 c = unpack_long (type, valaddr + embedded_offset);
366 LA_PRINT_CHAR ((unsigned char) c, type, stream);
369 break;
371 case TYPE_CODE_STRUCT:
372 case TYPE_CODE_UNION:
373 /* Starting from the Fortran 90 standard, Fortran supports derived
374 types. */
375 fprintf_filtered (stream, "( ");
376 for (index = 0; index < TYPE_NFIELDS (type); index++)
378 int offset = TYPE_FIELD_BITPOS (type, index) / 8;
380 val_print (TYPE_FIELD_TYPE (type, index), valaddr,
381 embedded_offset + offset,
382 address, stream, recurse + 1,
383 original_value, options, current_language);
384 if (index != TYPE_NFIELDS (type) - 1)
385 fputs_filtered (", ", stream);
387 fprintf_filtered (stream, " )");
388 break;
390 case TYPE_CODE_REF:
391 case TYPE_CODE_FUNC:
392 case TYPE_CODE_FLAGS:
393 case TYPE_CODE_FLT:
394 case TYPE_CODE_VOID:
395 case TYPE_CODE_ERROR:
396 case TYPE_CODE_RANGE:
397 case TYPE_CODE_UNDEF:
398 case TYPE_CODE_COMPLEX:
399 case TYPE_CODE_BOOL:
400 case TYPE_CODE_CHAR:
401 default:
402 generic_val_print (type, valaddr, embedded_offset, address,
403 stream, recurse, original_value, options,
404 &f_decorations);
405 break;
407 gdb_flush (stream);
410 static void
411 info_common_command_for_block (const struct block *block, const char *comname,
412 int *any_printed)
414 struct block_iterator iter;
415 struct symbol *sym;
416 const char *name;
417 struct value_print_options opts;
419 get_user_print_options (&opts);
421 ALL_BLOCK_SYMBOLS (block, iter, sym)
422 if (SYMBOL_DOMAIN (sym) == COMMON_BLOCK_DOMAIN)
424 const struct common_block *common = SYMBOL_VALUE_COMMON_BLOCK (sym);
425 size_t index;
427 gdb_assert (SYMBOL_CLASS (sym) == LOC_COMMON_BLOCK);
429 if (comname && (!SYMBOL_LINKAGE_NAME (sym)
430 || strcmp (comname, SYMBOL_LINKAGE_NAME (sym)) != 0))
431 continue;
433 if (*any_printed)
434 putchar_filtered ('\n');
435 else
436 *any_printed = 1;
437 if (SYMBOL_PRINT_NAME (sym))
438 printf_filtered (_("Contents of F77 COMMON block '%s':\n"),
439 SYMBOL_PRINT_NAME (sym));
440 else
441 printf_filtered (_("Contents of blank COMMON block:\n"));
443 for (index = 0; index < common->n_entries; index++)
445 struct value *val = NULL;
447 printf_filtered ("%s = ",
448 SYMBOL_PRINT_NAME (common->contents[index]));
452 val = value_of_variable (common->contents[index], block);
453 value_print (val, gdb_stdout, &opts);
456 CATCH (except, RETURN_MASK_ERROR)
458 printf_filtered ("<error reading variable: %s>", except.message);
460 END_CATCH
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
469 given name. */
471 static void
472 info_common_command (char *comname, int from_tty)
474 struct frame_info *fi;
475 const struct block *block;
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);
489 if (block == NULL)
491 printf_filtered (_("No symbol table info available.\n"));
492 return;
495 while (block)
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))
501 break;
502 block = BLOCK_SUPERBLOCK (block);
505 if (!values_printed)
507 if (comname)
508 printf_filtered (_("No common block '%s'.\n"), comname);
509 else
510 printf_filtered (_("No common blocks.\n"));
514 void
515 _initialize_f_valprint (void)
517 add_info ("common", info_common_command,
518 _("Print out the values contained in a Fortran COMMON block."));