Add assembler and disassembler support for the new Armv8.4-a registers for AArch64.
[deliverable/binutils-gdb.git] / gdb / f-valprint.c
CommitLineData
c906108c 1/* Support for printing Fortran values for GDB, the GNU debugger.
a2bd3dcd 2
61baf725 3 Copyright (C) 1993-2017 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 37static void f77_get_dynamic_length_of_aggregate (struct type *);
c906108c 38
c5aa993b 39int f77_array_offset_tbl[MAX_FORTRAN_DIMS + 1][2];
c906108c
SS
40
41/* Array which holds offsets to be applied to get a row's elements
0963b4bd 42 for a given array. Array also holds the size of each subarray. */
c906108c 43
c5aa993b 44int
d78df370 45f77_get_lowerbound (struct type *type)
c906108c 46{
d78df370
JK
47 if (TYPE_ARRAY_LOWER_BOUND_IS_UNDEFINED (type))
48 error (_("Lower bound may not be '*' in F77"));
c5aa993b 49
d78df370 50 return TYPE_ARRAY_LOWER_BOUND_VALUE (type);
c906108c
SS
51}
52
c5aa993b 53int
d78df370 54f77_get_upperbound (struct type *type)
c906108c 55{
d78df370 56 if (TYPE_ARRAY_UPPER_BOUND_IS_UNDEFINED (type))
c906108c 57 {
d78df370
JK
58 /* We have an assumed size array on our hands. Assume that
59 upper_bound == lower_bound so that we show at least 1 element.
60 If the user wants to see more elements, let him manually ask for 'em
61 and we'll subscript the array and show him. */
62
63 return f77_get_lowerbound (type);
c906108c 64 }
d78df370
JK
65
66 return TYPE_ARRAY_UPPER_BOUND_VALUE (type);
c906108c
SS
67}
68
0963b4bd 69/* Obtain F77 adjustable array dimensions. */
c906108c
SS
70
71static void
fba45db2 72f77_get_dynamic_length_of_aggregate (struct type *type)
c906108c
SS
73{
74 int upper_bound = -1;
c5aa993b 75 int lower_bound = 1;
c5aa993b 76
c906108c
SS
77 /* Recursively go all the way down into a possibly multi-dimensional
78 F77 array and get the bounds. For simple arrays, this is pretty
79 easy but when the bounds are dynamic, we must be very careful
80 to add up all the lengths correctly. Not doing this right
81 will lead to horrendous-looking arrays in parameter lists.
c5aa993b 82
c906108c 83 This function also works for strings which behave very
c5aa993b
JM
84 similarly to arrays. */
85
86 if (TYPE_CODE (TYPE_TARGET_TYPE (type)) == TYPE_CODE_ARRAY
87 || TYPE_CODE (TYPE_TARGET_TYPE (type)) == TYPE_CODE_STRING)
c906108c 88 f77_get_dynamic_length_of_aggregate (TYPE_TARGET_TYPE (type));
c5aa993b
JM
89
90 /* Recursion ends here, start setting up lengths. */
d78df370
JK
91 lower_bound = f77_get_lowerbound (type);
92 upper_bound = f77_get_upperbound (type);
c5aa993b 93
0963b4bd 94 /* Patch in a valid length value. */
c5aa993b 95
c906108c 96 TYPE_LENGTH (type) =
3e43a32a
MS
97 (upper_bound - lower_bound + 1)
98 * TYPE_LENGTH (check_typedef (TYPE_TARGET_TYPE (type)));
c5aa993b 99}
c906108c 100
c906108c
SS
101/* Actual function which prints out F77 arrays, Valaddr == address in
102 the superior. Address == the address in the inferior. */
7b0090c3 103
c5aa993b 104static void
a2bd3dcd 105f77_print_array_1 (int nss, int ndimensions, struct type *type,
490f124f
PA
106 const gdb_byte *valaddr,
107 int embedded_offset, CORE_ADDR address,
79a45b7d 108 struct ui_file *stream, int recurse,
0e03807e 109 const struct value *val,
79a45b7d 110 const struct value_print_options *options,
b3cacbee 111 int *elts)
c906108c 112{
3e2e34f8
KB
113 struct type *range_type = TYPE_INDEX_TYPE (check_typedef (type));
114 CORE_ADDR addr = address + embedded_offset;
115 LONGEST lowerbound, upperbound;
c906108c 116 int i;
c5aa993b 117
3e2e34f8
KB
118 get_discrete_bounds (range_type, &lowerbound, &upperbound);
119
c906108c
SS
120 if (nss != ndimensions)
121 {
3e2e34f8
KB
122 size_t dim_size = TYPE_LENGTH (TYPE_TARGET_TYPE (type));
123 size_t offs = 0;
124
125 for (i = lowerbound;
126 (i < upperbound + 1 && (*elts) < options->print_max);
3e43a32a 127 i++)
c906108c 128 {
3e2e34f8
KB
129 struct value *subarray = value_from_contents_and_address
130 (TYPE_TARGET_TYPE (type), value_contents_for_printing_const (val)
131 + offs, addr + offs);
132
c906108c 133 fprintf_filtered (stream, "( ");
3e2e34f8
KB
134 f77_print_array_1 (nss + 1, ndimensions, value_type (subarray),
135 value_contents_for_printing (subarray),
136 value_embedded_offset (subarray),
137 value_address (subarray),
138 stream, recurse, subarray, options, elts);
139 offs += dim_size;
c906108c
SS
140 fprintf_filtered (stream, ") ");
141 }
3e2e34f8 142 if (*elts >= options->print_max && i < upperbound)
b3cacbee 143 fprintf_filtered (stream, "...");
c906108c
SS
144 }
145 else
146 {
3e2e34f8 147 for (i = lowerbound; i < upperbound + 1 && (*elts) < options->print_max;
7b0090c3 148 i++, (*elts)++)
c906108c 149 {
3e2e34f8
KB
150 struct value *elt = value_subscript ((struct value *)val, i);
151
152 val_print (value_type (elt),
3e2e34f8
KB
153 value_embedded_offset (elt),
154 value_address (elt), stream, recurse,
155 elt, options, current_language);
c906108c 156
3e2e34f8 157 if (i != upperbound)
c5aa993b
JM
158 fprintf_filtered (stream, ", ");
159
79a45b7d 160 if ((*elts == options->print_max - 1)
3e2e34f8 161 && (i != upperbound))
c906108c
SS
162 fprintf_filtered (stream, "...");
163 }
164 }
165}
166
167/* This function gets called to print an F77 array, we set up some
0963b4bd 168 stuff and then immediately call f77_print_array_1(). */
c906108c 169
c5aa993b 170static void
fc1a4b47 171f77_print_array (struct type *type, const gdb_byte *valaddr,
490f124f 172 int embedded_offset,
a2bd3dcd 173 CORE_ADDR address, struct ui_file *stream,
0e03807e
TT
174 int recurse,
175 const struct value *val,
176 const struct value_print_options *options)
c906108c 177{
c5aa993b 178 int ndimensions;
b3cacbee 179 int elts = 0;
c5aa993b
JM
180
181 ndimensions = calc_f77_array_dims (type);
182
c906108c 183 if (ndimensions > MAX_FORTRAN_DIMS || ndimensions < 0)
3e43a32a
MS
184 error (_("\
185Type node corrupt! F77 arrays cannot have %d subscripts (%d Max)"),
c906108c 186 ndimensions, MAX_FORTRAN_DIMS);
c5aa993b 187
490f124f
PA
188 f77_print_array_1 (1, ndimensions, type, valaddr, embedded_offset,
189 address, stream, recurse, val, options, &elts);
c5aa993b 190}
c906108c 191\f
c5aa993b 192
e88acd96
TT
193/* Decorations for Fortran. */
194
195static const struct generic_val_print_decorations f_decorations =
196{
197 "(",
198 ",",
199 ")",
200 ".TRUE.",
201 ".FALSE.",
202 "VOID",
00272ec4
TT
203 "{",
204 "}"
e88acd96
TT
205};
206
32b72a42 207/* See val_print for a description of the various parameters of this
d3eab38a 208 function; they are identical. */
c906108c 209
d3eab38a 210void
e8b24d9f 211f_val_print (struct type *type, int embedded_offset,
79a45b7d 212 CORE_ADDR address, struct ui_file *stream, int recurse,
e8b24d9f 213 struct value *original_value,
79a45b7d 214 const struct value_print_options *options)
c906108c 215{
50810684 216 struct gdbarch *gdbarch = get_type_arch (type);
e17a4113 217 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
04d59df6 218 int printed_field = 0; /* Number of fields printed. */
c906108c 219 struct type *elttype;
c906108c 220 CORE_ADDR addr;
2a5e440c 221 int index;
e8b24d9f 222 const gdb_byte *valaddr =value_contents_for_printing (original_value);
c5aa993b 223
f168693b 224 type = check_typedef (type);
c906108c
SS
225 switch (TYPE_CODE (type))
226 {
c5aa993b 227 case TYPE_CODE_STRING:
c906108c 228 f77_get_dynamic_length_of_aggregate (type);
50810684 229 LA_PRINT_STRING (stream, builtin_type (gdbarch)->builtin_char,
490f124f
PA
230 valaddr + embedded_offset,
231 TYPE_LENGTH (type), NULL, 0, options);
c906108c 232 break;
c5aa993b 233
c906108c 234 case TYPE_CODE_ARRAY:
3b2b8fea
TT
235 if (TYPE_CODE (TYPE_TARGET_TYPE (type)) != TYPE_CODE_CHAR)
236 {
237 fprintf_filtered (stream, "(");
238 f77_print_array (type, valaddr, embedded_offset,
239 address, stream, recurse, original_value, options);
240 fprintf_filtered (stream, ")");
241 }
242 else
243 {
244 struct type *ch_type = TYPE_TARGET_TYPE (type);
245
246 f77_get_dynamic_length_of_aggregate (type);
247 LA_PRINT_STRING (stream, ch_type,
248 valaddr + embedded_offset,
249 TYPE_LENGTH (type) / TYPE_LENGTH (ch_type),
250 NULL, 0, options);
251 }
c906108c 252 break;
7e86466e 253
c906108c 254 case TYPE_CODE_PTR:
79a45b7d 255 if (options->format && options->format != 's')
c906108c 256 {
e8b24d9f 257 val_print_scalar_formatted (type, embedded_offset,
ab2188aa 258 original_value, options, 0, stream);
c906108c
SS
259 break;
260 }
261 else
262 {
b012acdd
TT
263 int want_space = 0;
264
490f124f 265 addr = unpack_pointer (type, valaddr + embedded_offset);
c906108c 266 elttype = check_typedef (TYPE_TARGET_TYPE (type));
c5aa993b 267
c906108c
SS
268 if (TYPE_CODE (elttype) == TYPE_CODE_FUNC)
269 {
270 /* Try to print what function it points to. */
edf0c1b7 271 print_function_pointer_address (options, gdbarch, addr, stream);
d3eab38a 272 return;
c906108c 273 }
c5aa993b 274
9cb709b6
TT
275 if (options->symbol_print)
276 want_space = print_address_demangle (options, gdbarch, addr,
277 stream, demangle);
278 else if (options->addressprint && options->format != 's')
b012acdd
TT
279 {
280 fputs_filtered (paddress (gdbarch, addr), stream);
281 want_space = 1;
282 }
c5aa993b 283
c906108c
SS
284 /* For a pointer to char or unsigned char, also print the string
285 pointed to, unless pointer is null. */
286 if (TYPE_LENGTH (elttype) == 1
287 && TYPE_CODE (elttype) == TYPE_CODE_INT
79a45b7d 288 && (options->format == 0 || options->format == 's')
c906108c 289 && addr != 0)
b012acdd
TT
290 {
291 if (want_space)
292 fputs_filtered (" ", stream);
78cc6c2d
TT
293 val_print_string (TYPE_TARGET_TYPE (type), NULL, addr, -1,
294 stream, options);
b012acdd 295 }
d3eab38a 296 return;
7e86466e
RH
297 }
298 break;
299
c906108c 300 case TYPE_CODE_INT:
79a45b7d
TT
301 if (options->format || options->output_format)
302 {
303 struct value_print_options opts = *options;
bb9bcb69 304
79a45b7d
TT
305 opts.format = (options->format ? options->format
306 : options->output_format);
e8b24d9f 307 val_print_scalar_formatted (type, embedded_offset,
eb0b0463 308 original_value, &opts, 0, stream);
79a45b7d 309 }
c906108c 310 else
469412dd
CW
311 val_print_scalar_formatted (type, embedded_offset,
312 original_value, options, 0, stream);
c906108c 313 break;
c5aa993b 314
2a5e440c 315 case TYPE_CODE_STRUCT:
9eec4d1e 316 case TYPE_CODE_UNION:
2a5e440c
WZ
317 /* Starting from the Fortran 90 standard, Fortran supports derived
318 types. */
9eec4d1e 319 fprintf_filtered (stream, "( ");
2a5e440c
WZ
320 for (index = 0; index < TYPE_NFIELDS (type); index++)
321 {
3e2e34f8
KB
322 struct value *field = value_field
323 ((struct value *)original_value, index);
324
04d59df6 325 struct type *field_type = check_typedef (TYPE_FIELD_TYPE (type, index));
bb9bcb69 326
04d59df6
WT
327
328 if (TYPE_CODE (field_type) != TYPE_CODE_FUNC)
329 {
330 const char *field_name;
331
332 if (printed_field > 0)
333 fputs_filtered (", ", stream);
334
335 field_name = TYPE_FIELD_NAME (type, index);
336 if (field_name != NULL)
337 {
338 fputs_filtered (field_name, stream);
339 fputs_filtered (" = ", stream);
340 }
341
342 val_print (value_type (field),
04d59df6
WT
343 value_embedded_offset (field),
344 value_address (field), stream, recurse + 1,
345 field, options, current_language);
346
347 ++printed_field;
348 }
349 }
9eec4d1e 350 fprintf_filtered (stream, " )");
2a5e440c
WZ
351 break;
352
e88acd96
TT
353 case TYPE_CODE_REF:
354 case TYPE_CODE_FUNC:
355 case TYPE_CODE_FLAGS:
356 case TYPE_CODE_FLT:
357 case TYPE_CODE_VOID:
358 case TYPE_CODE_ERROR:
359 case TYPE_CODE_RANGE:
360 case TYPE_CODE_UNDEF:
361 case TYPE_CODE_COMPLEX:
362 case TYPE_CODE_BOOL:
363 case TYPE_CODE_CHAR:
c906108c 364 default:
e8b24d9f 365 generic_val_print (type, embedded_offset, address,
e88acd96
TT
366 stream, recurse, original_value, options,
367 &f_decorations);
368 break;
c906108c
SS
369 }
370 gdb_flush (stream);
c906108c
SS
371}
372
373static void
3977b71f 374info_common_command_for_block (const struct block *block, const char *comname,
4357ac6c 375 int *any_printed)
c906108c 376{
4357ac6c
TT
377 struct block_iterator iter;
378 struct symbol *sym;
379 const char *name;
380 struct value_print_options opts;
381
382 get_user_print_options (&opts);
383
384 ALL_BLOCK_SYMBOLS (block, iter, sym)
385 if (SYMBOL_DOMAIN (sym) == COMMON_BLOCK_DOMAIN)
386 {
17a40b44 387 const struct common_block *common = SYMBOL_VALUE_COMMON_BLOCK (sym);
4357ac6c
TT
388 size_t index;
389
5a352474 390 gdb_assert (SYMBOL_CLASS (sym) == LOC_COMMON_BLOCK);
4357ac6c
TT
391
392 if (comname && (!SYMBOL_LINKAGE_NAME (sym)
393 || strcmp (comname, SYMBOL_LINKAGE_NAME (sym)) != 0))
394 continue;
395
396 if (*any_printed)
397 putchar_filtered ('\n');
398 else
399 *any_printed = 1;
400 if (SYMBOL_PRINT_NAME (sym))
401 printf_filtered (_("Contents of F77 COMMON block '%s':\n"),
402 SYMBOL_PRINT_NAME (sym));
403 else
404 printf_filtered (_("Contents of blank COMMON block:\n"));
405
406 for (index = 0; index < common->n_entries; index++)
407 {
408 struct value *val = NULL;
4357ac6c
TT
409
410 printf_filtered ("%s = ",
411 SYMBOL_PRINT_NAME (common->contents[index]));
412
492d29ea 413 TRY
4357ac6c
TT
414 {
415 val = value_of_variable (common->contents[index], block);
416 value_print (val, gdb_stdout, &opts);
417 }
418
492d29ea
PA
419 CATCH (except, RETURN_MASK_ERROR)
420 {
421 printf_filtered ("<error reading variable: %s>", except.message);
422 }
423 END_CATCH
424
4357ac6c
TT
425 putchar_filtered ('\n');
426 }
427 }
c906108c
SS
428}
429
430/* This function is used to print out the values in a given COMMON
0963b4bd
MS
431 block. It will always use the most local common block of the
432 given name. */
c906108c 433
c5aa993b 434static void
1d12d88f 435info_common_command (const char *comname, int from_tty)
c906108c 436{
c906108c 437 struct frame_info *fi;
3977b71f 438 const struct block *block;
4357ac6c 439 int values_printed = 0;
c5aa993b 440
c906108c
SS
441 /* We have been told to display the contents of F77 COMMON
442 block supposedly visible in this function. Let us
443 first make sure that it is visible and if so, let
0963b4bd 444 us display its contents. */
c5aa993b 445
206415a3 446 fi = get_selected_frame (_("No frame selected"));
c5aa993b 447
c906108c 448 /* The following is generally ripped off from stack.c's routine
0963b4bd 449 print_frame_info(). */
c5aa993b 450
4357ac6c
TT
451 block = get_frame_block (fi, 0);
452 if (block == NULL)
c906108c 453 {
4357ac6c
TT
454 printf_filtered (_("No symbol table info available.\n"));
455 return;
c906108c 456 }
c5aa993b 457
4357ac6c 458 while (block)
c906108c 459 {
4357ac6c
TT
460 info_common_command_for_block (block, comname, &values_printed);
461 /* After handling the function's top-level block, stop. Don't
462 continue to its superblock, the block of per-file symbols. */
463 if (BLOCK_FUNCTION (block))
464 break;
465 block = BLOCK_SUPERBLOCK (block);
c906108c 466 }
c5aa993b 467
4357ac6c 468 if (!values_printed)
c906108c 469 {
4357ac6c
TT
470 if (comname)
471 printf_filtered (_("No common block '%s'.\n"), comname);
c5aa993b 472 else
4357ac6c 473 printf_filtered (_("No common blocks.\n"));
c906108c 474 }
c906108c
SS
475}
476
c906108c 477void
fba45db2 478_initialize_f_valprint (void)
c906108c
SS
479{
480 add_info ("common", info_common_command,
1bedd215 481 _("Print out the values contained in a Fortran COMMON block."));
c906108c 482}
This page took 1.728928 seconds and 4 git commands to generate.