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