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