]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gdb/f-valprint.c
Make exceptions use std::string and be self-managing
[thirdparty/binutils-gdb.git] / gdb / f-valprint.c
CommitLineData
c906108c 1/* Support for printing Fortran values for GDB, the GNU debugger.
a2bd3dcd 2
42a4f53d 3 Copyright (C) 1993-2019 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"
4de283e4
TT
24#include "symtab.h"
25#include "gdbtypes.h"
c906108c 26#include "expression.h"
4de283e4
TT
27#include "value.h"
28#include "valprint.h"
29#include "language.h"
c5aa993b 30#include "f-lang.h"
c906108c
SS
31#include "frame.h"
32#include "gdbcore.h"
4de283e4
TT
33#include "command.h"
34#include "block.h"
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
2880242d 44LONGEST
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
2880242d 53LONGEST
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);
04d59df6 217 int printed_field = 0; /* Number of fields printed. */
c906108c 218 struct type *elttype;
c906108c 219 CORE_ADDR addr;
2a5e440c 220 int index;
e8b24d9f 221 const gdb_byte *valaddr =value_contents_for_printing (original_value);
c5aa993b 222
f168693b 223 type = check_typedef (type);
c906108c
SS
224 switch (TYPE_CODE (type))
225 {
c5aa993b 226 case TYPE_CODE_STRING:
c906108c 227 f77_get_dynamic_length_of_aggregate (type);
50810684 228 LA_PRINT_STRING (stream, builtin_type (gdbarch)->builtin_char,
490f124f
PA
229 valaddr + embedded_offset,
230 TYPE_LENGTH (type), NULL, 0, options);
c906108c 231 break;
c5aa993b 232
c906108c 233 case TYPE_CODE_ARRAY:
3b2b8fea
TT
234 if (TYPE_CODE (TYPE_TARGET_TYPE (type)) != TYPE_CODE_CHAR)
235 {
236 fprintf_filtered (stream, "(");
237 f77_print_array (type, valaddr, embedded_offset,
238 address, stream, recurse, original_value, options);
239 fprintf_filtered (stream, ")");
240 }
241 else
242 {
243 struct type *ch_type = TYPE_TARGET_TYPE (type);
244
245 f77_get_dynamic_length_of_aggregate (type);
246 LA_PRINT_STRING (stream, ch_type,
247 valaddr + embedded_offset,
248 TYPE_LENGTH (type) / TYPE_LENGTH (ch_type),
249 NULL, 0, options);
250 }
c906108c 251 break;
7e86466e 252
c906108c 253 case TYPE_CODE_PTR:
79a45b7d 254 if (options->format && options->format != 's')
c906108c 255 {
e8b24d9f 256 val_print_scalar_formatted (type, embedded_offset,
ab2188aa 257 original_value, options, 0, stream);
c906108c
SS
258 break;
259 }
260 else
261 {
b012acdd
TT
262 int want_space = 0;
263
490f124f 264 addr = unpack_pointer (type, valaddr + embedded_offset);
c906108c 265 elttype = check_typedef (TYPE_TARGET_TYPE (type));
c5aa993b 266
c906108c
SS
267 if (TYPE_CODE (elttype) == TYPE_CODE_FUNC)
268 {
269 /* Try to print what function it points to. */
edf0c1b7 270 print_function_pointer_address (options, gdbarch, addr, stream);
d3eab38a 271 return;
c906108c 272 }
c5aa993b 273
9cb709b6
TT
274 if (options->symbol_print)
275 want_space = print_address_demangle (options, gdbarch, addr,
276 stream, demangle);
277 else if (options->addressprint && options->format != 's')
b012acdd
TT
278 {
279 fputs_filtered (paddress (gdbarch, addr), stream);
280 want_space = 1;
281 }
c5aa993b 282
c906108c
SS
283 /* For a pointer to char or unsigned char, also print the string
284 pointed to, unless pointer is null. */
285 if (TYPE_LENGTH (elttype) == 1
286 && TYPE_CODE (elttype) == TYPE_CODE_INT
79a45b7d 287 && (options->format == 0 || options->format == 's')
c906108c 288 && addr != 0)
b012acdd
TT
289 {
290 if (want_space)
291 fputs_filtered (" ", stream);
78cc6c2d
TT
292 val_print_string (TYPE_TARGET_TYPE (type), NULL, addr, -1,
293 stream, options);
b012acdd 294 }
d3eab38a 295 return;
7e86466e
RH
296 }
297 break;
298
c906108c 299 case TYPE_CODE_INT:
79a45b7d
TT
300 if (options->format || options->output_format)
301 {
302 struct value_print_options opts = *options;
bb9bcb69 303
79a45b7d
TT
304 opts.format = (options->format ? options->format
305 : options->output_format);
e8b24d9f 306 val_print_scalar_formatted (type, embedded_offset,
eb0b0463 307 original_value, &opts, 0, stream);
79a45b7d 308 }
c906108c 309 else
469412dd
CW
310 val_print_scalar_formatted (type, embedded_offset,
311 original_value, options, 0, stream);
c906108c 312 break;
c5aa993b 313
2a5e440c 314 case TYPE_CODE_STRUCT:
9eec4d1e 315 case TYPE_CODE_UNION:
2a5e440c
WZ
316 /* Starting from the Fortran 90 standard, Fortran supports derived
317 types. */
9eec4d1e 318 fprintf_filtered (stream, "( ");
2a5e440c
WZ
319 for (index = 0; index < TYPE_NFIELDS (type); index++)
320 {
3e2e34f8
KB
321 struct value *field = value_field
322 ((struct value *)original_value, index);
323
04d59df6 324 struct type *field_type = check_typedef (TYPE_FIELD_TYPE (type, index));
bb9bcb69 325
04d59df6
WT
326
327 if (TYPE_CODE (field_type) != TYPE_CODE_FUNC)
328 {
329 const char *field_name;
330
331 if (printed_field > 0)
332 fputs_filtered (", ", stream);
333
334 field_name = TYPE_FIELD_NAME (type, index);
335 if (field_name != NULL)
336 {
337 fputs_filtered (field_name, stream);
338 fputs_filtered (" = ", stream);
339 }
340
341 val_print (value_type (field),
04d59df6
WT
342 value_embedded_offset (field),
343 value_address (field), stream, recurse + 1,
344 field, options, current_language);
345
346 ++printed_field;
347 }
348 }
9eec4d1e 349 fprintf_filtered (stream, " )");
2a5e440c
WZ
350 break;
351
e88acd96
TT
352 case TYPE_CODE_REF:
353 case TYPE_CODE_FUNC:
354 case TYPE_CODE_FLAGS:
355 case TYPE_CODE_FLT:
356 case TYPE_CODE_VOID:
357 case TYPE_CODE_ERROR:
358 case TYPE_CODE_RANGE:
359 case TYPE_CODE_UNDEF:
360 case TYPE_CODE_COMPLEX:
361 case TYPE_CODE_BOOL:
362 case TYPE_CODE_CHAR:
c906108c 363 default:
e8b24d9f 364 generic_val_print (type, embedded_offset, address,
e88acd96
TT
365 stream, recurse, original_value, options,
366 &f_decorations);
367 break;
c906108c 368 }
c906108c
SS
369}
370
371static void
3977b71f 372info_common_command_for_block (const struct block *block, const char *comname,
4357ac6c 373 int *any_printed)
c906108c 374{
4357ac6c
TT
375 struct block_iterator iter;
376 struct symbol *sym;
4357ac6c
TT
377 struct value_print_options opts;
378
379 get_user_print_options (&opts);
380
381 ALL_BLOCK_SYMBOLS (block, iter, sym)
382 if (SYMBOL_DOMAIN (sym) == COMMON_BLOCK_DOMAIN)
383 {
17a40b44 384 const struct common_block *common = SYMBOL_VALUE_COMMON_BLOCK (sym);
4357ac6c
TT
385 size_t index;
386
5a352474 387 gdb_assert (SYMBOL_CLASS (sym) == LOC_COMMON_BLOCK);
4357ac6c
TT
388
389 if (comname && (!SYMBOL_LINKAGE_NAME (sym)
390 || strcmp (comname, SYMBOL_LINKAGE_NAME (sym)) != 0))
391 continue;
392
393 if (*any_printed)
394 putchar_filtered ('\n');
395 else
396 *any_printed = 1;
397 if (SYMBOL_PRINT_NAME (sym))
398 printf_filtered (_("Contents of F77 COMMON block '%s':\n"),
399 SYMBOL_PRINT_NAME (sym));
400 else
401 printf_filtered (_("Contents of blank COMMON block:\n"));
402
403 for (index = 0; index < common->n_entries; index++)
404 {
405 struct value *val = NULL;
4357ac6c
TT
406
407 printf_filtered ("%s = ",
408 SYMBOL_PRINT_NAME (common->contents[index]));
409
492d29ea 410 TRY
4357ac6c
TT
411 {
412 val = value_of_variable (common->contents[index], block);
413 value_print (val, gdb_stdout, &opts);
414 }
415
492d29ea
PA
416 CATCH (except, RETURN_MASK_ERROR)
417 {
3d6e9d23
TT
418 printf_filtered ("<error reading variable: %s>",
419 except.what ());
492d29ea
PA
420 }
421 END_CATCH
422
4357ac6c
TT
423 putchar_filtered ('\n');
424 }
425 }
c906108c
SS
426}
427
428/* This function is used to print out the values in a given COMMON
0963b4bd
MS
429 block. It will always use the most local common block of the
430 given name. */
c906108c 431
c5aa993b 432static void
1d12d88f 433info_common_command (const char *comname, int from_tty)
c906108c 434{
c906108c 435 struct frame_info *fi;
3977b71f 436 const struct block *block;
4357ac6c 437 int values_printed = 0;
c5aa993b 438
c906108c
SS
439 /* We have been told to display the contents of F77 COMMON
440 block supposedly visible in this function. Let us
441 first make sure that it is visible and if so, let
0963b4bd 442 us display its contents. */
c5aa993b 443
206415a3 444 fi = get_selected_frame (_("No frame selected"));
c5aa993b 445
c906108c 446 /* The following is generally ripped off from stack.c's routine
0963b4bd 447 print_frame_info(). */
c5aa993b 448
4357ac6c
TT
449 block = get_frame_block (fi, 0);
450 if (block == NULL)
c906108c 451 {
4357ac6c
TT
452 printf_filtered (_("No symbol table info available.\n"));
453 return;
c906108c 454 }
c5aa993b 455
4357ac6c 456 while (block)
c906108c 457 {
4357ac6c
TT
458 info_common_command_for_block (block, comname, &values_printed);
459 /* After handling the function's top-level block, stop. Don't
460 continue to its superblock, the block of per-file symbols. */
461 if (BLOCK_FUNCTION (block))
462 break;
463 block = BLOCK_SUPERBLOCK (block);
c906108c 464 }
c5aa993b 465
4357ac6c 466 if (!values_printed)
c906108c 467 {
4357ac6c
TT
468 if (comname)
469 printf_filtered (_("No common block '%s'.\n"), comname);
c5aa993b 470 else
4357ac6c 471 printf_filtered (_("No common blocks.\n"));
c906108c 472 }
c906108c
SS
473}
474
c906108c 475void
fba45db2 476_initialize_f_valprint (void)
c906108c
SS
477{
478 add_info ("common", info_common_command,
1bedd215 479 _("Print out the values contained in a Fortran COMMON block."));
c906108c 480}