*** empty log message ***
[deliverable/binutils-gdb.git] / gdb / f-valprint.c
... / ...
CommitLineData
1/* Support for printing Fortran values for GDB, the GNU debugger.
2
3 Copyright (C) 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2003, 2005, 2006,
4 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
5
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
9 This file is part of GDB.
10
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
13 the Free Software Foundation; either version 3 of the License, or
14 (at your option) any later version.
15
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.
20
21 You should have received a copy of the GNU General Public License
22 along with this program. If not, see <http://www.gnu.org/licenses/>. */
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"
30#include "valprint.h"
31#include "language.h"
32#include "f-lang.h"
33#include "frame.h"
34#include "gdbcore.h"
35#include "command.h"
36#include "block.h"
37
38#if 0
39static int there_is_a_visible_common_named (char *);
40#endif
41
42extern void _initialize_f_valprint (void);
43static void info_common_command (char *, int);
44static void list_all_visible_commons (char *);
45static void f77_create_arrayprint_offset_tbl (struct type *,
46 struct ui_file *);
47static void f77_get_dynamic_length_of_aggregate (struct type *);
48
49int f77_array_offset_tbl[MAX_FORTRAN_DIMS + 1][2];
50
51/* Array which holds offsets to be applied to get a row's elements
52 for a given array. Array also holds the size of each subarray. */
53
54/* The following macro gives us the size of the nth dimension, Where
55 n is 1 based. */
56
57#define F77_DIM_SIZE(n) (f77_array_offset_tbl[n][1])
58
59/* The following gives us the offset for row n where n is 1-based. */
60
61#define F77_DIM_OFFSET(n) (f77_array_offset_tbl[n][0])
62
63int
64f77_get_lowerbound (struct type *type)
65{
66 if (TYPE_ARRAY_LOWER_BOUND_IS_UNDEFINED (type))
67 error (_("Lower bound may not be '*' in F77"));
68
69 return TYPE_ARRAY_LOWER_BOUND_VALUE (type);
70}
71
72int
73f77_get_upperbound (struct type *type)
74{
75 if (TYPE_ARRAY_UPPER_BOUND_IS_UNDEFINED (type))
76 {
77 /* We have an assumed size array on our hands. Assume that
78 upper_bound == lower_bound so that we show at least 1 element.
79 If the user wants to see more elements, let him manually ask for 'em
80 and we'll subscript the array and show him. */
81
82 return f77_get_lowerbound (type);
83 }
84
85 return TYPE_ARRAY_UPPER_BOUND_VALUE (type);
86}
87
88/* Obtain F77 adjustable array dimensions */
89
90static void
91f77_get_dynamic_length_of_aggregate (struct type *type)
92{
93 int upper_bound = -1;
94 int lower_bound = 1;
95
96 /* Recursively go all the way down into a possibly multi-dimensional
97 F77 array and get the bounds. For simple arrays, this is pretty
98 easy but when the bounds are dynamic, we must be very careful
99 to add up all the lengths correctly. Not doing this right
100 will lead to horrendous-looking arrays in parameter lists.
101
102 This function also works for strings which behave very
103 similarly to arrays. */
104
105 if (TYPE_CODE (TYPE_TARGET_TYPE (type)) == TYPE_CODE_ARRAY
106 || TYPE_CODE (TYPE_TARGET_TYPE (type)) == TYPE_CODE_STRING)
107 f77_get_dynamic_length_of_aggregate (TYPE_TARGET_TYPE (type));
108
109 /* Recursion ends here, start setting up lengths. */
110 lower_bound = f77_get_lowerbound (type);
111 upper_bound = f77_get_upperbound (type);
112
113 /* Patch in a valid length value. */
114
115 TYPE_LENGTH (type) =
116 (upper_bound - lower_bound + 1) * TYPE_LENGTH (check_typedef (TYPE_TARGET_TYPE (type)));
117}
118
119/* Function that sets up the array offset,size table for the array
120 type "type". */
121
122static void
123f77_create_arrayprint_offset_tbl (struct type *type, struct ui_file *stream)
124{
125 struct type *tmp_type;
126 int eltlen;
127 int ndimen = 1;
128 int upper, lower;
129
130 tmp_type = type;
131
132 while ((TYPE_CODE (tmp_type) == TYPE_CODE_ARRAY))
133 {
134 upper = f77_get_upperbound (tmp_type);
135 lower = f77_get_lowerbound (tmp_type);
136
137 F77_DIM_SIZE (ndimen) = upper - lower + 1;
138
139 tmp_type = TYPE_TARGET_TYPE (tmp_type);
140 ndimen++;
141 }
142
143 /* Now we multiply eltlen by all the offsets, so that later we
144 can print out array elements correctly. Up till now we
145 know an offset to apply to get the item but we also
146 have to know how much to add to get to the next item */
147
148 ndimen--;
149 eltlen = TYPE_LENGTH (tmp_type);
150 F77_DIM_OFFSET (ndimen) = eltlen;
151 while (--ndimen > 0)
152 {
153 eltlen *= F77_DIM_SIZE (ndimen + 1);
154 F77_DIM_OFFSET (ndimen) = eltlen;
155 }
156}
157
158
159
160/* Actual function which prints out F77 arrays, Valaddr == address in
161 the superior. Address == the address in the inferior. */
162
163static void
164f77_print_array_1 (int nss, int ndimensions, struct type *type,
165 const gdb_byte *valaddr, CORE_ADDR address,
166 struct ui_file *stream, int recurse,
167 const struct value_print_options *options,
168 int *elts)
169{
170 int i;
171
172 if (nss != ndimensions)
173 {
174 for (i = 0; (i < F77_DIM_SIZE (nss) && (*elts) < options->print_max); i++)
175 {
176 fprintf_filtered (stream, "( ");
177 f77_print_array_1 (nss + 1, ndimensions, TYPE_TARGET_TYPE (type),
178 valaddr + i * F77_DIM_OFFSET (nss),
179 address + i * F77_DIM_OFFSET (nss),
180 stream, recurse, options, elts);
181 fprintf_filtered (stream, ") ");
182 }
183 if (*elts >= options->print_max && i < F77_DIM_SIZE (nss))
184 fprintf_filtered (stream, "...");
185 }
186 else
187 {
188 for (i = 0; i < F77_DIM_SIZE (nss) && (*elts) < options->print_max;
189 i++, (*elts)++)
190 {
191 val_print (TYPE_TARGET_TYPE (type),
192 valaddr + i * F77_DIM_OFFSET (ndimensions),
193 0,
194 address + i * F77_DIM_OFFSET (ndimensions),
195 stream, recurse, options, current_language);
196
197 if (i != (F77_DIM_SIZE (nss) - 1))
198 fprintf_filtered (stream, ", ");
199
200 if ((*elts == options->print_max - 1)
201 && (i != (F77_DIM_SIZE (nss) - 1)))
202 fprintf_filtered (stream, "...");
203 }
204 }
205}
206
207/* This function gets called to print an F77 array, we set up some
208 stuff and then immediately call f77_print_array_1() */
209
210static void
211f77_print_array (struct type *type, const gdb_byte *valaddr,
212 CORE_ADDR address, struct ui_file *stream,
213 int recurse, const struct value_print_options *options)
214{
215 int ndimensions;
216 int elts = 0;
217
218 ndimensions = calc_f77_array_dims (type);
219
220 if (ndimensions > MAX_FORTRAN_DIMS || ndimensions < 0)
221 error (_("Type node corrupt! F77 arrays cannot have %d subscripts (%d Max)"),
222 ndimensions, MAX_FORTRAN_DIMS);
223
224 /* Since F77 arrays are stored column-major, we set up an
225 offset table to get at the various row's elements. The
226 offset table contains entries for both offset and subarray size. */
227
228 f77_create_arrayprint_offset_tbl (type, stream);
229
230 f77_print_array_1 (1, ndimensions, type, valaddr, address, stream,
231 recurse, options, &elts);
232}
233\f
234
235/* Print data of type TYPE located at VALADDR (within GDB), which came from
236 the inferior at address ADDRESS, onto stdio stream STREAM according to
237 OPTIONS. The data at VALADDR is in target byte order.
238
239 If the data are a string pointer, returns the number of string characters
240 printed. */
241
242int
243f_val_print (struct type *type, const gdb_byte *valaddr, int embedded_offset,
244 CORE_ADDR address, struct ui_file *stream, int recurse,
245 const struct value_print_options *options)
246{
247 struct gdbarch *gdbarch = get_type_arch (type);
248 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
249 unsigned int i = 0; /* Number of characters printed */
250 struct type *elttype;
251 LONGEST val;
252 CORE_ADDR addr;
253 int index;
254
255 CHECK_TYPEDEF (type);
256 switch (TYPE_CODE (type))
257 {
258 case TYPE_CODE_STRING:
259 f77_get_dynamic_length_of_aggregate (type);
260 LA_PRINT_STRING (stream, builtin_type (gdbarch)->builtin_char,
261 valaddr, TYPE_LENGTH (type), NULL, 0, options);
262 break;
263
264 case TYPE_CODE_ARRAY:
265 fprintf_filtered (stream, "(");
266 f77_print_array (type, valaddr, address, stream, recurse, options);
267 fprintf_filtered (stream, ")");
268 break;
269
270 case TYPE_CODE_PTR:
271 if (options->format && options->format != 's')
272 {
273 print_scalar_formatted (valaddr, type, options, 0, stream);
274 break;
275 }
276 else
277 {
278 addr = unpack_pointer (type, valaddr);
279 elttype = check_typedef (TYPE_TARGET_TYPE (type));
280
281 if (TYPE_CODE (elttype) == TYPE_CODE_FUNC)
282 {
283 /* Try to print what function it points to. */
284 print_address_demangle (gdbarch, addr, stream, demangle);
285 /* Return value is irrelevant except for string pointers. */
286 return 0;
287 }
288
289 if (options->addressprint && options->format != 's')
290 fputs_filtered (paddress (gdbarch, addr), stream);
291
292 /* For a pointer to char or unsigned char, also print the string
293 pointed to, unless pointer is null. */
294 if (TYPE_LENGTH (elttype) == 1
295 && TYPE_CODE (elttype) == TYPE_CODE_INT
296 && (options->format == 0 || options->format == 's')
297 && addr != 0)
298 i = val_print_string (TYPE_TARGET_TYPE (type), addr, -1, stream,
299 options);
300
301 /* Return number of characters printed, including the terminating
302 '\0' if we reached the end. val_print_string takes care including
303 the terminating '\0' if necessary. */
304 return i;
305 }
306 break;
307
308 case TYPE_CODE_REF:
309 elttype = check_typedef (TYPE_TARGET_TYPE (type));
310 if (options->addressprint)
311 {
312 CORE_ADDR addr
313 = extract_typed_address (valaddr + embedded_offset, type);
314
315 fprintf_filtered (stream, "@");
316 fputs_filtered (paddress (gdbarch, addr), stream);
317 if (options->deref_ref)
318 fputs_filtered (": ", stream);
319 }
320 /* De-reference the reference. */
321 if (options->deref_ref)
322 {
323 if (TYPE_CODE (elttype) != TYPE_CODE_UNDEF)
324 {
325 struct value *deref_val =
326 value_at
327 (TYPE_TARGET_TYPE (type),
328 unpack_pointer (type, valaddr + embedded_offset));
329
330 common_val_print (deref_val, stream, recurse,
331 options, current_language);
332 }
333 else
334 fputs_filtered ("???", stream);
335 }
336 break;
337
338 case TYPE_CODE_FUNC:
339 if (options->format)
340 {
341 print_scalar_formatted (valaddr, type, options, 0, stream);
342 break;
343 }
344 /* FIXME, we should consider, at least for ANSI C language, eliminating
345 the distinction made between FUNCs and POINTERs to FUNCs. */
346 fprintf_filtered (stream, "{");
347 type_print (type, "", stream, -1);
348 fprintf_filtered (stream, "} ");
349 /* Try to print what function it points to, and its address. */
350 print_address_demangle (gdbarch, address, stream, demangle);
351 break;
352
353 case TYPE_CODE_INT:
354 if (options->format || options->output_format)
355 {
356 struct value_print_options opts = *options;
357
358 opts.format = (options->format ? options->format
359 : options->output_format);
360 print_scalar_formatted (valaddr, type, &opts, 0, stream);
361 }
362 else
363 {
364 val_print_type_code_int (type, valaddr, stream);
365 /* C and C++ has no single byte int type, char is used instead.
366 Since we don't know whether the value is really intended to
367 be used as an integer or a character, print the character
368 equivalent as well. */
369 if (TYPE_LENGTH (type) == 1)
370 {
371 fputs_filtered (" ", stream);
372 LA_PRINT_CHAR ((unsigned char) unpack_long (type, valaddr),
373 type, stream);
374 }
375 }
376 break;
377
378 case TYPE_CODE_FLAGS:
379 if (options->format)
380 print_scalar_formatted (valaddr, type, options, 0, stream);
381 else
382 val_print_type_code_flags (type, valaddr, stream);
383 break;
384
385 case TYPE_CODE_FLT:
386 if (options->format)
387 print_scalar_formatted (valaddr, type, options, 0, stream);
388 else
389 print_floating (valaddr, type, stream);
390 break;
391
392 case TYPE_CODE_VOID:
393 fprintf_filtered (stream, "VOID");
394 break;
395
396 case TYPE_CODE_ERROR:
397 fprintf_filtered (stream, "<error type>");
398 break;
399
400 case TYPE_CODE_RANGE:
401 /* FIXME, we should not ever have to print one of these yet. */
402 fprintf_filtered (stream, "<range type>");
403 break;
404
405 case TYPE_CODE_BOOL:
406 if (options->format || options->output_format)
407 {
408 struct value_print_options opts = *options;
409
410 opts.format = (options->format ? options->format
411 : options->output_format);
412 print_scalar_formatted (valaddr, type, &opts, 0, stream);
413 }
414 else
415 {
416 val = extract_unsigned_integer (valaddr,
417 TYPE_LENGTH (type), byte_order);
418 if (val == 0)
419 fprintf_filtered (stream, ".FALSE.");
420 else if (val == 1)
421 fprintf_filtered (stream, ".TRUE.");
422 else
423 /* Not a legitimate logical type, print as an integer. */
424 {
425 /* Bash the type code temporarily. */
426 TYPE_CODE (type) = TYPE_CODE_INT;
427 f_val_print (type, valaddr, 0, address, stream, recurse, options);
428 /* Restore the type code so later uses work as intended. */
429 TYPE_CODE (type) = TYPE_CODE_BOOL;
430 }
431 }
432 break;
433
434 case TYPE_CODE_COMPLEX:
435 type = TYPE_TARGET_TYPE (type);
436 fputs_filtered ("(", stream);
437 print_floating (valaddr, type, stream);
438 fputs_filtered (",", stream);
439 print_floating (valaddr + TYPE_LENGTH (type), type, stream);
440 fputs_filtered (")", stream);
441 break;
442
443 case TYPE_CODE_UNDEF:
444 /* This happens (without TYPE_FLAG_STUB set) on systems which don't use
445 dbx xrefs (NO_DBX_XREFS in gcc) if a file has a "struct foo *bar"
446 and no complete type for struct foo in that file. */
447 fprintf_filtered (stream, "<incomplete type>");
448 break;
449
450 case TYPE_CODE_STRUCT:
451 case TYPE_CODE_UNION:
452 /* Starting from the Fortran 90 standard, Fortran supports derived
453 types. */
454 fprintf_filtered (stream, "( ");
455 for (index = 0; index < TYPE_NFIELDS (type); index++)
456 {
457 int offset = TYPE_FIELD_BITPOS (type, index) / 8;
458
459 f_val_print (TYPE_FIELD_TYPE (type, index), valaddr + offset,
460 embedded_offset, address, stream, recurse, options);
461 if (index != TYPE_NFIELDS (type) - 1)
462 fputs_filtered (", ", stream);
463 }
464 fprintf_filtered (stream, " )");
465 break;
466
467 default:
468 error (_("Invalid F77 type code %d in symbol table."), TYPE_CODE (type));
469 }
470 gdb_flush (stream);
471 return 0;
472}
473
474static void
475list_all_visible_commons (char *funname)
476{
477 SAVED_F77_COMMON_PTR tmp;
478
479 tmp = head_common_list;
480
481 printf_filtered (_("All COMMON blocks visible at this level:\n\n"));
482
483 while (tmp != NULL)
484 {
485 if (strcmp (tmp->owning_function, funname) == 0)
486 printf_filtered ("%s\n", tmp->name);
487
488 tmp = tmp->next;
489 }
490}
491
492/* This function is used to print out the values in a given COMMON
493 block. It will always use the most local common block of the
494 given name */
495
496static void
497info_common_command (char *comname, int from_tty)
498{
499 SAVED_F77_COMMON_PTR the_common;
500 COMMON_ENTRY_PTR entry;
501 struct frame_info *fi;
502 char *funname = 0;
503 struct symbol *func;
504
505 /* We have been told to display the contents of F77 COMMON
506 block supposedly visible in this function. Let us
507 first make sure that it is visible and if so, let
508 us display its contents */
509
510 fi = get_selected_frame (_("No frame selected"));
511
512 /* The following is generally ripped off from stack.c's routine
513 print_frame_info() */
514
515 func = find_pc_function (get_frame_pc (fi));
516 if (func)
517 {
518 /* In certain pathological cases, the symtabs give the wrong
519 function (when we are in the first function in a file which
520 is compiled without debugging symbols, the previous function
521 is compiled with debugging symbols, and the "foo.o" symbol
522 that is supposed to tell us where the file with debugging symbols
523 ends has been truncated by ar because it is longer than 15
524 characters).
525
526 So look in the minimal symbol tables as well, and if it comes
527 up with a larger address for the function use that instead.
528 I don't think this can ever cause any problems; there shouldn't
529 be any minimal symbols in the middle of a function.
530 FIXME: (Not necessarily true. What about text labels) */
531
532 struct minimal_symbol *msymbol =
533 lookup_minimal_symbol_by_pc (get_frame_pc (fi));
534
535 if (msymbol != NULL
536 && (SYMBOL_VALUE_ADDRESS (msymbol)
537 > BLOCK_START (SYMBOL_BLOCK_VALUE (func))))
538 funname = SYMBOL_LINKAGE_NAME (msymbol);
539 else
540 funname = SYMBOL_LINKAGE_NAME (func);
541 }
542 else
543 {
544 struct minimal_symbol *msymbol =
545 lookup_minimal_symbol_by_pc (get_frame_pc (fi));
546
547 if (msymbol != NULL)
548 funname = SYMBOL_LINKAGE_NAME (msymbol);
549 else /* Got no 'funname', code below will fail. */
550 error (_("No function found for frame."));
551 }
552
553 /* If comname is NULL, we assume the user wishes to see the
554 which COMMON blocks are visible here and then return */
555
556 if (comname == 0)
557 {
558 list_all_visible_commons (funname);
559 return;
560 }
561
562 the_common = find_common_for_function (comname, funname);
563
564 if (the_common)
565 {
566 if (strcmp (comname, BLANK_COMMON_NAME_LOCAL) == 0)
567 printf_filtered (_("Contents of blank COMMON block:\n"));
568 else
569 printf_filtered (_("Contents of F77 COMMON block '%s':\n"), comname);
570
571 printf_filtered ("\n");
572 entry = the_common->entries;
573
574 while (entry != NULL)
575 {
576 print_variable_and_value (NULL, entry->symbol, fi, gdb_stdout, 0);
577 entry = entry->next;
578 }
579 }
580 else
581 printf_filtered (_("Cannot locate the common block %s in function '%s'\n"),
582 comname, funname);
583}
584
585/* This function is used to determine whether there is a
586 F77 common block visible at the current scope called 'comname'. */
587
588#if 0
589static int
590there_is_a_visible_common_named (char *comname)
591{
592 SAVED_F77_COMMON_PTR the_common;
593 struct frame_info *fi;
594 char *funname = 0;
595 struct symbol *func;
596
597 if (comname == NULL)
598 error (_("Cannot deal with NULL common name!"));
599
600 fi = get_selected_frame (_("No frame selected"));
601
602 /* The following is generally ripped off from stack.c's routine
603 print_frame_info() */
604
605 func = find_pc_function (fi->pc);
606 if (func)
607 {
608 /* In certain pathological cases, the symtabs give the wrong
609 function (when we are in the first function in a file which
610 is compiled without debugging symbols, the previous function
611 is compiled with debugging symbols, and the "foo.o" symbol
612 that is supposed to tell us where the file with debugging symbols
613 ends has been truncated by ar because it is longer than 15
614 characters).
615
616 So look in the minimal symbol tables as well, and if it comes
617 up with a larger address for the function use that instead.
618 I don't think this can ever cause any problems; there shouldn't
619 be any minimal symbols in the middle of a function.
620 FIXME: (Not necessarily true. What about text labels) */
621
622 struct minimal_symbol *msymbol = lookup_minimal_symbol_by_pc (fi->pc);
623
624 if (msymbol != NULL
625 && (SYMBOL_VALUE_ADDRESS (msymbol)
626 > BLOCK_START (SYMBOL_BLOCK_VALUE (func))))
627 funname = SYMBOL_LINKAGE_NAME (msymbol);
628 else
629 funname = SYMBOL_LINKAGE_NAME (func);
630 }
631 else
632 {
633 struct minimal_symbol *msymbol =
634 lookup_minimal_symbol_by_pc (fi->pc);
635
636 if (msymbol != NULL)
637 funname = SYMBOL_LINKAGE_NAME (msymbol);
638 }
639
640 the_common = find_common_for_function (comname, funname);
641
642 return (the_common ? 1 : 0);
643}
644#endif
645
646void
647_initialize_f_valprint (void)
648{
649 add_info ("common", info_common_command,
650 _("Print out the values contained in a Fortran COMMON block."));
651 if (xdb_commands)
652 add_com ("lc", class_info, info_common_command,
653 _("Print out the values contained in a Fortran COMMON block."));
654}
This page took 0.031774 seconds and 4 git commands to generate.