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