]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gdb/f-valprint.c
Update year range in copyright notice of all files owned by the GDB project.
[thirdparty/binutils-gdb.git] / gdb / f-valprint.c
CommitLineData
c906108c 1/* Support for printing Fortran values for GDB, the GNU debugger.
a2bd3dcd 2
32d0add0 3 Copyright (C) 1993-2015 Free Software Foundation, Inc.
a2bd3dcd 4
c906108c
SS
5 Contributed by Motorola. Adapted from the C definitions by Farooq Butt
6 (fmbutt@engage.sps.mot.com), additionally worked over by Stan Shebs.
7
c5aa993b 8 This file is part of GDB.
c906108c 9
c5aa993b
JM
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
a9762ec7 12 the Free Software Foundation; either version 3 of the License, or
c5aa993b 13 (at your option) any later version.
c906108c 14
c5aa993b
JM
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.
c906108c 19
c5aa993b 20 You should have received a copy of the GNU General Public License
a9762ec7 21 along with this program. If not, see <http://www.gnu.org/licenses/>. */
c906108c
SS
22
23#include "defs.h"
c906108c
SS
24#include "symtab.h"
25#include "gdbtypes.h"
26#include "expression.h"
27#include "value.h"
c906108c
SS
28#include "valprint.h"
29#include "language.h"
c5aa993b 30#include "f-lang.h"
c906108c
SS
31#include "frame.h"
32#include "gdbcore.h"
33#include "command.h"
fe898f56 34#include "block.h"
4357ac6c 35#include "dictionary.h"
c906108c 36
a14ed312
KB
37extern void _initialize_f_valprint (void);
38static void info_common_command (char *, int);
d9fcf2fb
JM
39static void f77_create_arrayprint_offset_tbl (struct type *,
40 struct ui_file *);
a14ed312 41static void f77_get_dynamic_length_of_aggregate (struct type *);
c906108c 42
c5aa993b 43int f77_array_offset_tbl[MAX_FORTRAN_DIMS + 1][2];
c906108c
SS
44
45/* Array which holds offsets to be applied to get a row's elements
0963b4bd 46 for a given array. Array also holds the size of each subarray. */
c906108c
SS
47
48/* The following macro gives us the size of the nth dimension, Where
0963b4bd 49 n is 1 based. */
c906108c
SS
50
51#define F77_DIM_SIZE(n) (f77_array_offset_tbl[n][1])
52
0963b4bd 53/* The following gives us the offset for row n where n is 1-based. */
c906108c
SS
54
55#define F77_DIM_OFFSET(n) (f77_array_offset_tbl[n][0])
56
c5aa993b 57int
d78df370 58f77_get_lowerbound (struct type *type)
c906108c 59{
d78df370
JK
60 if (TYPE_ARRAY_LOWER_BOUND_IS_UNDEFINED (type))
61 error (_("Lower bound may not be '*' in F77"));
c5aa993b 62
d78df370 63 return TYPE_ARRAY_LOWER_BOUND_VALUE (type);
c906108c
SS
64}
65
c5aa993b 66int
d78df370 67f77_get_upperbound (struct type *type)
c906108c 68{
d78df370 69 if (TYPE_ARRAY_UPPER_BOUND_IS_UNDEFINED (type))
c906108c 70 {
d78df370
JK
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. */
75
76 return f77_get_lowerbound (type);
c906108c 77 }
d78df370
JK
78
79 return TYPE_ARRAY_UPPER_BOUND_VALUE (type);
c906108c
SS
80}
81
0963b4bd 82/* Obtain F77 adjustable array dimensions. */
c906108c
SS
83
84static void
fba45db2 85f77_get_dynamic_length_of_aggregate (struct type *type)
c906108c
SS
86{
87 int upper_bound = -1;
c5aa993b 88 int lower_bound = 1;
c5aa993b 89
c906108c
SS
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.
c5aa993b 95
c906108c 96 This function also works for strings which behave very
c5aa993b
JM
97 similarly to arrays. */
98
99 if (TYPE_CODE (TYPE_TARGET_TYPE (type)) == TYPE_CODE_ARRAY
100 || TYPE_CODE (TYPE_TARGET_TYPE (type)) == TYPE_CODE_STRING)
c906108c 101 f77_get_dynamic_length_of_aggregate (TYPE_TARGET_TYPE (type));
c5aa993b
JM
102
103 /* Recursion ends here, start setting up lengths. */
d78df370
JK
104 lower_bound = f77_get_lowerbound (type);
105 upper_bound = f77_get_upperbound (type);
c5aa993b 106
0963b4bd 107 /* Patch in a valid length value. */
c5aa993b 108
c906108c 109 TYPE_LENGTH (type) =
3e43a32a
MS
110 (upper_bound - lower_bound + 1)
111 * TYPE_LENGTH (check_typedef (TYPE_TARGET_TYPE (type)));
c5aa993b 112}
c906108c
SS
113
114/* Function that sets up the array offset,size table for the array
c5aa993b 115 type "type". */
c906108c 116
c5aa993b 117static void
fba45db2 118f77_create_arrayprint_offset_tbl (struct type *type, struct ui_file *stream)
c906108c
SS
119{
120 struct type *tmp_type;
121 int eltlen;
122 int ndimen = 1;
9216103f 123 int upper, lower;
c5aa993b
JM
124
125 tmp_type = type;
126
9c16be9a 127 while (TYPE_CODE (tmp_type) == TYPE_CODE_ARRAY)
c906108c 128 {
d78df370
JK
129 upper = f77_get_upperbound (tmp_type);
130 lower = f77_get_lowerbound (tmp_type);
c5aa993b 131
c906108c 132 F77_DIM_SIZE (ndimen) = upper - lower + 1;
c5aa993b 133
c906108c 134 tmp_type = TYPE_TARGET_TYPE (tmp_type);
c5aa993b 135 ndimen++;
c906108c 136 }
c5aa993b 137
c906108c
SS
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
0963b4bd 141 have to know how much to add to get to the next item. */
c5aa993b 142
c906108c 143 ndimen--;
c5aa993b 144 eltlen = TYPE_LENGTH (tmp_type);
c906108c
SS
145 F77_DIM_OFFSET (ndimen) = eltlen;
146 while (--ndimen > 0)
147 {
148 eltlen *= F77_DIM_SIZE (ndimen + 1);
149 F77_DIM_OFFSET (ndimen) = eltlen;
150 }
151}
152
b3cacbee
DL
153
154
c906108c
SS
155/* Actual function which prints out F77 arrays, Valaddr == address in
156 the superior. Address == the address in the inferior. */
7b0090c3 157
c5aa993b 158static void
a2bd3dcd 159f77_print_array_1 (int nss, int ndimensions, struct type *type,
490f124f
PA
160 const gdb_byte *valaddr,
161 int embedded_offset, CORE_ADDR address,
79a45b7d 162 struct ui_file *stream, int recurse,
0e03807e 163 const struct value *val,
79a45b7d 164 const struct value_print_options *options,
b3cacbee 165 int *elts)
c906108c
SS
166{
167 int i;
c5aa993b 168
c906108c
SS
169 if (nss != ndimensions)
170 {
3e43a32a
MS
171 for (i = 0;
172 (i < F77_DIM_SIZE (nss) && (*elts) < options->print_max);
173 i++)
c906108c
SS
174 {
175 fprintf_filtered (stream, "( ");
176 f77_print_array_1 (nss + 1, ndimensions, TYPE_TARGET_TYPE (type),
490f124f
PA
177 valaddr,
178 embedded_offset + i * F77_DIM_OFFSET (nss),
179 address,
0e03807e 180 stream, recurse, val, options, elts);
c906108c
SS
181 fprintf_filtered (stream, ") ");
182 }
79a45b7d 183 if (*elts >= options->print_max && i < F77_DIM_SIZE (nss))
b3cacbee 184 fprintf_filtered (stream, "...");
c906108c
SS
185 }
186 else
187 {
79a45b7d 188 for (i = 0; i < F77_DIM_SIZE (nss) && (*elts) < options->print_max;
7b0090c3 189 i++, (*elts)++)
c906108c
SS
190 {
191 val_print (TYPE_TARGET_TYPE (type),
490f124f
PA
192 valaddr,
193 embedded_offset + i * F77_DIM_OFFSET (ndimensions),
194 address, stream, recurse,
195 val, options, current_language);
c906108c
SS
196
197 if (i != (F77_DIM_SIZE (nss) - 1))
c5aa993b
JM
198 fprintf_filtered (stream, ", ");
199
79a45b7d
TT
200 if ((*elts == options->print_max - 1)
201 && (i != (F77_DIM_SIZE (nss) - 1)))
c906108c
SS
202 fprintf_filtered (stream, "...");
203 }
204 }
205}
206
207/* This function gets called to print an F77 array, we set up some
0963b4bd 208 stuff and then immediately call f77_print_array_1(). */
c906108c 209
c5aa993b 210static void
fc1a4b47 211f77_print_array (struct type *type, const gdb_byte *valaddr,
490f124f 212 int embedded_offset,
a2bd3dcd 213 CORE_ADDR address, struct ui_file *stream,
0e03807e
TT
214 int recurse,
215 const struct value *val,
216 const struct value_print_options *options)
c906108c 217{
c5aa993b 218 int ndimensions;
b3cacbee 219 int elts = 0;
c5aa993b
JM
220
221 ndimensions = calc_f77_array_dims (type);
222
c906108c 223 if (ndimensions > MAX_FORTRAN_DIMS || ndimensions < 0)
3e43a32a
MS
224 error (_("\
225Type node corrupt! F77 arrays cannot have %d subscripts (%d Max)"),
c906108c 226 ndimensions, MAX_FORTRAN_DIMS);
c5aa993b 227
c906108c 228 /* Since F77 arrays are stored column-major, we set up an
0963b4bd
MS
229 offset table to get at the various row's elements. The
230 offset table contains entries for both offset and subarray size. */
c906108c 231
c5aa993b
JM
232 f77_create_arrayprint_offset_tbl (type, stream);
233
490f124f
PA
234 f77_print_array_1 (1, ndimensions, type, valaddr, embedded_offset,
235 address, stream, recurse, val, options, &elts);
c5aa993b 236}
c906108c 237\f
c5aa993b 238
e88acd96
TT
239/* Decorations for Fortran. */
240
241static const struct generic_val_print_decorations f_decorations =
242{
243 "(",
244 ",",
245 ")",
246 ".TRUE.",
247 ".FALSE.",
248 "VOID",
249};
250
32b72a42 251/* See val_print for a description of the various parameters of this
d3eab38a 252 function; they are identical. */
c906108c 253
d3eab38a 254void
fc1a4b47 255f_val_print (struct type *type, const gdb_byte *valaddr, int embedded_offset,
79a45b7d 256 CORE_ADDR address, struct ui_file *stream, int recurse,
0e03807e 257 const struct value *original_value,
79a45b7d 258 const struct value_print_options *options)
c906108c 259{
50810684 260 struct gdbarch *gdbarch = get_type_arch (type);
e17a4113 261 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
0963b4bd 262 unsigned int i = 0; /* Number of characters printed. */
c906108c 263 struct type *elttype;
c906108c 264 CORE_ADDR addr;
2a5e440c 265 int index;
c5aa993b 266
c906108c
SS
267 CHECK_TYPEDEF (type);
268 switch (TYPE_CODE (type))
269 {
c5aa993b 270 case TYPE_CODE_STRING:
c906108c 271 f77_get_dynamic_length_of_aggregate (type);
50810684 272 LA_PRINT_STRING (stream, builtin_type (gdbarch)->builtin_char,
490f124f
PA
273 valaddr + embedded_offset,
274 TYPE_LENGTH (type), NULL, 0, options);
c906108c 275 break;
c5aa993b 276
c906108c 277 case TYPE_CODE_ARRAY:
3b2b8fea
TT
278 if (TYPE_CODE (TYPE_TARGET_TYPE (type)) != TYPE_CODE_CHAR)
279 {
280 fprintf_filtered (stream, "(");
281 f77_print_array (type, valaddr, embedded_offset,
282 address, stream, recurse, original_value, options);
283 fprintf_filtered (stream, ")");
284 }
285 else
286 {
287 struct type *ch_type = TYPE_TARGET_TYPE (type);
288
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);
294 }
c906108c 295 break;
7e86466e 296
c906108c 297 case TYPE_CODE_PTR:
79a45b7d 298 if (options->format && options->format != 's')
c906108c 299 {
ab2188aa
PA
300 val_print_scalar_formatted (type, valaddr, embedded_offset,
301 original_value, options, 0, stream);
c906108c
SS
302 break;
303 }
304 else
305 {
b012acdd
TT
306 int want_space = 0;
307
490f124f 308 addr = unpack_pointer (type, valaddr + embedded_offset);
c906108c 309 elttype = check_typedef (TYPE_TARGET_TYPE (type));
c5aa993b 310
c906108c
SS
311 if (TYPE_CODE (elttype) == TYPE_CODE_FUNC)
312 {
313 /* Try to print what function it points to. */
edf0c1b7 314 print_function_pointer_address (options, gdbarch, addr, stream);
d3eab38a 315 return;
c906108c 316 }
c5aa993b 317
9cb709b6
TT
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')
b012acdd
TT
322 {
323 fputs_filtered (paddress (gdbarch, addr), stream);
324 want_space = 1;
325 }
c5aa993b 326
c906108c
SS
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
79a45b7d 331 && (options->format == 0 || options->format == 's')
c906108c 332 && addr != 0)
b012acdd
TT
333 {
334 if (want_space)
335 fputs_filtered (" ", stream);
336 i = val_print_string (TYPE_TARGET_TYPE (type), NULL, addr, -1,
337 stream, options);
338 }
d3eab38a 339 return;
7e86466e
RH
340 }
341 break;
342
c906108c 343 case TYPE_CODE_INT:
79a45b7d
TT
344 if (options->format || options->output_format)
345 {
346 struct value_print_options opts = *options;
bb9bcb69 347
79a45b7d
TT
348 opts.format = (options->format ? options->format
349 : options->output_format);
ab2188aa 350 val_print_scalar_formatted (type, valaddr, embedded_offset,
eb0b0463 351 original_value, &opts, 0, stream);
79a45b7d 352 }
c906108c
SS
353 else
354 {
490f124f 355 val_print_type_code_int (type, valaddr + embedded_offset, stream);
c906108c
SS
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
0963b4bd 359 equivalent as well. */
e88acd96 360 if (TYPE_LENGTH (type) == 1)
c906108c 361 {
490f124f
PA
362 LONGEST c;
363
c906108c 364 fputs_filtered (" ", stream);
490f124f
PA
365 c = unpack_long (type, valaddr + embedded_offset);
366 LA_PRINT_CHAR ((unsigned char) c, type, stream);
c906108c
SS
367 }
368 }
369 break;
c5aa993b 370
2a5e440c 371 case TYPE_CODE_STRUCT:
9eec4d1e 372 case TYPE_CODE_UNION:
2a5e440c
WZ
373 /* Starting from the Fortran 90 standard, Fortran supports derived
374 types. */
9eec4d1e 375 fprintf_filtered (stream, "( ");
2a5e440c
WZ
376 for (index = 0; index < TYPE_NFIELDS (type); index++)
377 {
378 int offset = TYPE_FIELD_BITPOS (type, index) / 8;
bb9bcb69 379
490f124f
PA
380 val_print (TYPE_FIELD_TYPE (type, index), valaddr,
381 embedded_offset + offset,
382 address, stream, recurse + 1,
0e03807e 383 original_value, options, current_language);
2a5e440c
WZ
384 if (index != TYPE_NFIELDS (type) - 1)
385 fputs_filtered (", ", stream);
386 }
9eec4d1e 387 fprintf_filtered (stream, " )");
2a5e440c
WZ
388 break;
389
e88acd96
TT
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:
c906108c 401 default:
e88acd96
TT
402 generic_val_print (type, valaddr, embedded_offset, address,
403 stream, recurse, original_value, options,
404 &f_decorations);
405 break;
c906108c
SS
406 }
407 gdb_flush (stream);
c906108c
SS
408}
409
410static void
3977b71f 411info_common_command_for_block (const struct block *block, const char *comname,
4357ac6c 412 int *any_printed)
c906108c 413{
4357ac6c
TT
414 struct block_iterator iter;
415 struct symbol *sym;
416 const char *name;
417 struct value_print_options opts;
418
419 get_user_print_options (&opts);
420
421 ALL_BLOCK_SYMBOLS (block, iter, sym)
422 if (SYMBOL_DOMAIN (sym) == COMMON_BLOCK_DOMAIN)
423 {
17a40b44 424 const struct common_block *common = SYMBOL_VALUE_COMMON_BLOCK (sym);
4357ac6c
TT
425 size_t index;
426
5a352474 427 gdb_assert (SYMBOL_CLASS (sym) == LOC_COMMON_BLOCK);
4357ac6c
TT
428
429 if (comname && (!SYMBOL_LINKAGE_NAME (sym)
430 || strcmp (comname, SYMBOL_LINKAGE_NAME (sym)) != 0))
431 continue;
432
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"));
442
443 for (index = 0; index < common->n_entries; index++)
444 {
445 struct value *val = NULL;
446 volatile struct gdb_exception except;
447
448 printf_filtered ("%s = ",
449 SYMBOL_PRINT_NAME (common->contents[index]));
450
451 TRY_CATCH (except, RETURN_MASK_ERROR)
452 {
453 val = value_of_variable (common->contents[index], block);
454 value_print (val, gdb_stdout, &opts);
455 }
456
457 if (except.reason < 0)
458 printf_filtered ("<error reading variable: %s>", except.message);
459 putchar_filtered ('\n');
460 }
461 }
c906108c
SS
462}
463
464/* This function is used to print out the values in a given COMMON
0963b4bd
MS
465 block. It will always use the most local common block of the
466 given name. */
c906108c 467
c5aa993b 468static void
fba45db2 469info_common_command (char *comname, int from_tty)
c906108c 470{
c906108c 471 struct frame_info *fi;
3977b71f 472 const struct block *block;
4357ac6c 473 int values_printed = 0;
c5aa993b 474
c906108c
SS
475 /* We have been told to display the contents of F77 COMMON
476 block supposedly visible in this function. Let us
477 first make sure that it is visible and if so, let
0963b4bd 478 us display its contents. */
c5aa993b 479
206415a3 480 fi = get_selected_frame (_("No frame selected"));
c5aa993b 481
c906108c 482 /* The following is generally ripped off from stack.c's routine
0963b4bd 483 print_frame_info(). */
c5aa993b 484
4357ac6c
TT
485 block = get_frame_block (fi, 0);
486 if (block == NULL)
c906108c 487 {
4357ac6c
TT
488 printf_filtered (_("No symbol table info available.\n"));
489 return;
c906108c 490 }
c5aa993b 491
4357ac6c 492 while (block)
c906108c 493 {
4357ac6c
TT
494 info_common_command_for_block (block, comname, &values_printed);
495 /* After handling the function's top-level block, stop. Don't
496 continue to its superblock, the block of per-file symbols. */
497 if (BLOCK_FUNCTION (block))
498 break;
499 block = BLOCK_SUPERBLOCK (block);
c906108c 500 }
c5aa993b 501
4357ac6c 502 if (!values_printed)
c906108c 503 {
4357ac6c
TT
504 if (comname)
505 printf_filtered (_("No common block '%s'.\n"), comname);
c5aa993b 506 else
4357ac6c 507 printf_filtered (_("No common blocks.\n"));
c906108c 508 }
c906108c
SS
509}
510
c906108c 511void
fba45db2 512_initialize_f_valprint (void)
c906108c
SS
513{
514 add_info ("common", info_common_command,
1bedd215 515 _("Print out the values contained in a Fortran COMMON block."));
c906108c 516 if (xdb_commands)
c5aa993b 517 add_com ("lc", class_info, info_common_command,
1bedd215 518 _("Print out the values contained in a Fortran COMMON block."));
c906108c 519}