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