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