fort_dyn_array: Use value constructor instead of raw-buffer manipulation.
[deliverable/binutils-gdb.git] / gdb / f-valprint.c
CommitLineData
c906108c 1/* Support for printing Fortran values for GDB, the GNU debugger.
a2bd3dcd 2
618f726f 3 Copyright (C) 1993-2016 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);
a14ed312 39static void f77_get_dynamic_length_of_aggregate (struct type *);
c906108c 40
c5aa993b 41int f77_array_offset_tbl[MAX_FORTRAN_DIMS + 1][2];
c906108c
SS
42
43/* Array which holds offsets to be applied to get a row's elements
0963b4bd 44 for a given array. Array also holds the size of each subarray. */
c906108c 45
c5aa993b 46int
d78df370 47f77_get_lowerbound (struct type *type)
c906108c 48{
d78df370
JK
49 if (TYPE_ARRAY_LOWER_BOUND_IS_UNDEFINED (type))
50 error (_("Lower bound may not be '*' in F77"));
c5aa993b 51
d78df370 52 return TYPE_ARRAY_LOWER_BOUND_VALUE (type);
c906108c
SS
53}
54
c5aa993b 55int
d78df370 56f77_get_upperbound (struct type *type)
c906108c 57{
d78df370 58 if (TYPE_ARRAY_UPPER_BOUND_IS_UNDEFINED (type))
c906108c 59 {
d78df370
JK
60 /* We have an assumed size array on our hands. Assume that
61 upper_bound == lower_bound so that we show at least 1 element.
62 If the user wants to see more elements, let him manually ask for 'em
63 and we'll subscript the array and show him. */
64
65 return f77_get_lowerbound (type);
c906108c 66 }
d78df370
JK
67
68 return TYPE_ARRAY_UPPER_BOUND_VALUE (type);
c906108c
SS
69}
70
0963b4bd 71/* Obtain F77 adjustable array dimensions. */
c906108c
SS
72
73static void
fba45db2 74f77_get_dynamic_length_of_aggregate (struct type *type)
c906108c
SS
75{
76 int upper_bound = -1;
c5aa993b 77 int lower_bound = 1;
c5aa993b 78
c906108c
SS
79 /* Recursively go all the way down into a possibly multi-dimensional
80 F77 array and get the bounds. For simple arrays, this is pretty
81 easy but when the bounds are dynamic, we must be very careful
82 to add up all the lengths correctly. Not doing this right
83 will lead to horrendous-looking arrays in parameter lists.
c5aa993b 84
c906108c 85 This function also works for strings which behave very
c5aa993b
JM
86 similarly to arrays. */
87
88 if (TYPE_CODE (TYPE_TARGET_TYPE (type)) == TYPE_CODE_ARRAY
89 || TYPE_CODE (TYPE_TARGET_TYPE (type)) == TYPE_CODE_STRING)
c906108c 90 f77_get_dynamic_length_of_aggregate (TYPE_TARGET_TYPE (type));
c5aa993b
JM
91
92 /* Recursion ends here, start setting up lengths. */
d78df370
JK
93 lower_bound = f77_get_lowerbound (type);
94 upper_bound = f77_get_upperbound (type);
c5aa993b 95
0963b4bd 96 /* Patch in a valid length value. */
c5aa993b 97
c906108c 98 TYPE_LENGTH (type) =
3e43a32a
MS
99 (upper_bound - lower_bound + 1)
100 * TYPE_LENGTH (check_typedef (TYPE_TARGET_TYPE (type)));
c5aa993b 101}
c906108c 102
c906108c
SS
103/* Actual function which prints out F77 arrays, Valaddr == address in
104 the superior. Address == the address in the inferior. */
7b0090c3 105
c5aa993b 106static void
a2bd3dcd 107f77_print_array_1 (int nss, int ndimensions, struct type *type,
490f124f
PA
108 const gdb_byte *valaddr,
109 int embedded_offset, CORE_ADDR address,
79a45b7d 110 struct ui_file *stream, int recurse,
0e03807e 111 const struct value *val,
79a45b7d 112 const struct value_print_options *options,
b3cacbee 113 int *elts)
c906108c 114{
3e2e34f8
KB
115 struct type *range_type = TYPE_INDEX_TYPE (check_typedef (type));
116 CORE_ADDR addr = address + embedded_offset;
117 LONGEST lowerbound, upperbound;
c906108c 118 int i;
c5aa993b 119
3e2e34f8
KB
120 get_discrete_bounds (range_type, &lowerbound, &upperbound);
121
c906108c
SS
122 if (nss != ndimensions)
123 {
3e2e34f8
KB
124 size_t dim_size = TYPE_LENGTH (TYPE_TARGET_TYPE (type));
125 size_t offs = 0;
126
127 for (i = lowerbound;
128 (i < upperbound + 1 && (*elts) < options->print_max);
3e43a32a 129 i++)
c906108c 130 {
3e2e34f8
KB
131 struct value *subarray = value_from_contents_and_address
132 (TYPE_TARGET_TYPE (type), value_contents_for_printing_const (val)
133 + offs, addr + offs);
134
c906108c 135 fprintf_filtered (stream, "( ");
3e2e34f8
KB
136 f77_print_array_1 (nss + 1, ndimensions, value_type (subarray),
137 value_contents_for_printing (subarray),
138 value_embedded_offset (subarray),
139 value_address (subarray),
140 stream, recurse, subarray, options, elts);
141 offs += dim_size;
c906108c
SS
142 fprintf_filtered (stream, ") ");
143 }
3e2e34f8 144 if (*elts >= options->print_max && i < upperbound)
b3cacbee 145 fprintf_filtered (stream, "...");
c906108c
SS
146 }
147 else
148 {
3e2e34f8 149 for (i = lowerbound; i < upperbound + 1 && (*elts) < options->print_max;
7b0090c3 150 i++, (*elts)++)
c906108c 151 {
3e2e34f8
KB
152 struct value *elt = value_subscript ((struct value *)val, i);
153
154 val_print (value_type (elt),
155 value_contents_for_printing (elt),
156 value_embedded_offset (elt),
157 value_address (elt), stream, recurse,
158 elt, options, current_language);
c906108c 159
3e2e34f8 160 if (i != upperbound)
c5aa993b
JM
161 fprintf_filtered (stream, ", ");
162
79a45b7d 163 if ((*elts == options->print_max - 1)
3e2e34f8 164 && (i != upperbound))
c906108c
SS
165 fprintf_filtered (stream, "...");
166 }
167 }
168}
169
170/* This function gets called to print an F77 array, we set up some
0963b4bd 171 stuff and then immediately call f77_print_array_1(). */
c906108c 172
c5aa993b 173static void
fc1a4b47 174f77_print_array (struct type *type, const gdb_byte *valaddr,
490f124f 175 int embedded_offset,
a2bd3dcd 176 CORE_ADDR address, struct ui_file *stream,
0e03807e
TT
177 int recurse,
178 const struct value *val,
179 const struct value_print_options *options)
c906108c 180{
c5aa993b 181 int ndimensions;
b3cacbee 182 int elts = 0;
c5aa993b
JM
183
184 ndimensions = calc_f77_array_dims (type);
185
c906108c 186 if (ndimensions > MAX_FORTRAN_DIMS || ndimensions < 0)
3e43a32a
MS
187 error (_("\
188Type node corrupt! F77 arrays cannot have %d subscripts (%d Max)"),
c906108c 189 ndimensions, MAX_FORTRAN_DIMS);
c5aa993b 190
490f124f
PA
191 f77_print_array_1 (1, ndimensions, type, valaddr, embedded_offset,
192 address, stream, recurse, val, options, &elts);
c5aa993b 193}
c906108c 194\f
c5aa993b 195
e88acd96
TT
196/* Decorations for Fortran. */
197
198static const struct generic_val_print_decorations f_decorations =
199{
200 "(",
201 ",",
202 ")",
203 ".TRUE.",
204 ".FALSE.",
205 "VOID",
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
fc1a4b47 212f_val_print (struct type *type, const gdb_byte *valaddr, int embedded_offset,
79a45b7d 213 CORE_ADDR address, struct ui_file *stream, int recurse,
0e03807e 214 const 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);
0963b4bd 219 unsigned int i = 0; /* Number of characters printed. */
c906108c 220 struct type *elttype;
c906108c 221 CORE_ADDR addr;
2a5e440c 222 int index;
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 {
ab2188aa
PA
257 val_print_scalar_formatted (type, valaddr, embedded_offset,
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);
293 i = val_print_string (TYPE_TARGET_TYPE (type), NULL, addr, -1,
294 stream, options);
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);
ab2188aa 307 val_print_scalar_formatted (type, valaddr, embedded_offset,
eb0b0463 308 original_value, &opts, 0, stream);
79a45b7d 309 }
c906108c
SS
310 else
311 {
490f124f 312 val_print_type_code_int (type, valaddr + embedded_offset, stream);
c906108c
SS
313 /* C and C++ has no single byte int type, char is used instead.
314 Since we don't know whether the value is really intended to
315 be used as an integer or a character, print the character
0963b4bd 316 equivalent as well. */
e88acd96 317 if (TYPE_LENGTH (type) == 1)
c906108c 318 {
490f124f
PA
319 LONGEST c;
320
c906108c 321 fputs_filtered (" ", stream);
490f124f
PA
322 c = unpack_long (type, valaddr + embedded_offset);
323 LA_PRINT_CHAR ((unsigned char) c, type, stream);
c906108c
SS
324 }
325 }
326 break;
c5aa993b 327
2a5e440c 328 case TYPE_CODE_STRUCT:
9eec4d1e 329 case TYPE_CODE_UNION:
2a5e440c
WZ
330 /* Starting from the Fortran 90 standard, Fortran supports derived
331 types. */
9eec4d1e 332 fprintf_filtered (stream, "( ");
2a5e440c
WZ
333 for (index = 0; index < TYPE_NFIELDS (type); index++)
334 {
3e2e34f8
KB
335 struct value *field = value_field
336 ((struct value *)original_value, index);
337
338 val_print (value_type (field),
339 value_contents_for_printing (field),
340 value_embedded_offset (field),
341 value_address (field), stream, recurse + 1,
342 field, options, current_language);
bb9bcb69 343
2a5e440c
WZ
344 if (index != TYPE_NFIELDS (type) - 1)
345 fputs_filtered (", ", stream);
346 }
9eec4d1e 347 fprintf_filtered (stream, " )");
2a5e440c
WZ
348 break;
349
e88acd96
TT
350 case TYPE_CODE_REF:
351 case TYPE_CODE_FUNC:
352 case TYPE_CODE_FLAGS:
353 case TYPE_CODE_FLT:
354 case TYPE_CODE_VOID:
355 case TYPE_CODE_ERROR:
356 case TYPE_CODE_RANGE:
357 case TYPE_CODE_UNDEF:
358 case TYPE_CODE_COMPLEX:
359 case TYPE_CODE_BOOL:
360 case TYPE_CODE_CHAR:
c906108c 361 default:
e88acd96
TT
362 generic_val_print (type, valaddr, embedded_offset, address,
363 stream, recurse, original_value, options,
364 &f_decorations);
365 break;
c906108c
SS
366 }
367 gdb_flush (stream);
c906108c
SS
368}
369
370static void
3977b71f 371info_common_command_for_block (const struct block *block, const char *comname,
4357ac6c 372 int *any_printed)
c906108c 373{
4357ac6c
TT
374 struct block_iterator iter;
375 struct symbol *sym;
376 const char *name;
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 {
418 printf_filtered ("<error reading variable: %s>", except.message);
419 }
420 END_CATCH
421
4357ac6c
TT
422 putchar_filtered ('\n');
423 }
424 }
c906108c
SS
425}
426
427/* This function is used to print out the values in a given COMMON
0963b4bd
MS
428 block. It will always use the most local common block of the
429 given name. */
c906108c 430
c5aa993b 431static void
fba45db2 432info_common_command (char *comname, int from_tty)
c906108c 433{
c906108c 434 struct frame_info *fi;
3977b71f 435 const struct block *block;
4357ac6c 436 int values_printed = 0;
c5aa993b 437
c906108c
SS
438 /* We have been told to display the contents of F77 COMMON
439 block supposedly visible in this function. Let us
440 first make sure that it is visible and if so, let
0963b4bd 441 us display its contents. */
c5aa993b 442
206415a3 443 fi = get_selected_frame (_("No frame selected"));
c5aa993b 444
c906108c 445 /* The following is generally ripped off from stack.c's routine
0963b4bd 446 print_frame_info(). */
c5aa993b 447
4357ac6c
TT
448 block = get_frame_block (fi, 0);
449 if (block == NULL)
c906108c 450 {
4357ac6c
TT
451 printf_filtered (_("No symbol table info available.\n"));
452 return;
c906108c 453 }
c5aa993b 454
4357ac6c 455 while (block)
c906108c 456 {
4357ac6c
TT
457 info_common_command_for_block (block, comname, &values_printed);
458 /* After handling the function's top-level block, stop. Don't
459 continue to its superblock, the block of per-file symbols. */
460 if (BLOCK_FUNCTION (block))
461 break;
462 block = BLOCK_SUPERBLOCK (block);
c906108c 463 }
c5aa993b 464
4357ac6c 465 if (!values_printed)
c906108c 466 {
4357ac6c
TT
467 if (comname)
468 printf_filtered (_("No common block '%s'.\n"), comname);
c5aa993b 469 else
4357ac6c 470 printf_filtered (_("No common blocks.\n"));
c906108c 471 }
c906108c
SS
472}
473
c906108c 474void
fba45db2 475_initialize_f_valprint (void)
c906108c
SS
476{
477 add_info ("common", info_common_command,
1bedd215 478 _("Print out the values contained in a Fortran COMMON block."));
c906108c 479}
This page took 1.170905 seconds and 4 git commands to generate.