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