15796c8dcSSimon Schubert /* Support for printing C values for GDB, the GNU debugger. 25796c8dcSSimon Schubert 3*ef5ccd6cSJohn Marino Copyright (C) 1986-2013 Free Software Foundation, Inc. 45796c8dcSSimon Schubert 55796c8dcSSimon Schubert This file is part of GDB. 65796c8dcSSimon Schubert 75796c8dcSSimon Schubert This program is free software; you can redistribute it and/or modify 85796c8dcSSimon Schubert it under the terms of the GNU General Public License as published by 95796c8dcSSimon Schubert the Free Software Foundation; either version 3 of the License, or 105796c8dcSSimon Schubert (at your option) any later version. 115796c8dcSSimon Schubert 125796c8dcSSimon Schubert This program is distributed in the hope that it will be useful, 135796c8dcSSimon Schubert but WITHOUT ANY WARRANTY; without even the implied warranty of 145796c8dcSSimon Schubert MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 155796c8dcSSimon Schubert GNU General Public License for more details. 165796c8dcSSimon Schubert 175796c8dcSSimon Schubert You should have received a copy of the GNU General Public License 185796c8dcSSimon Schubert along with this program. If not, see <http://www.gnu.org/licenses/>. */ 195796c8dcSSimon Schubert 205796c8dcSSimon Schubert #include "defs.h" 215796c8dcSSimon Schubert #include "gdb_string.h" 225796c8dcSSimon Schubert #include "symtab.h" 235796c8dcSSimon Schubert #include "gdbtypes.h" 245796c8dcSSimon Schubert #include "expression.h" 255796c8dcSSimon Schubert #include "value.h" 265796c8dcSSimon Schubert #include "valprint.h" 275796c8dcSSimon Schubert #include "language.h" 285796c8dcSSimon Schubert #include "c-lang.h" 295796c8dcSSimon Schubert #include "cp-abi.h" 305796c8dcSSimon Schubert #include "target.h" 315796c8dcSSimon Schubert 325796c8dcSSimon Schubert 33cf7f2e2dSJohn Marino /* A helper for c_textual_element_type. This checks the name of the 345796c8dcSSimon Schubert typedef. This is bogus but it isn't apparent that the compiler 355796c8dcSSimon Schubert provides us the help we may need. */ 365796c8dcSSimon Schubert 375796c8dcSSimon Schubert static int 385796c8dcSSimon Schubert textual_name (const char *name) 395796c8dcSSimon Schubert { 405796c8dcSSimon Schubert return (!strcmp (name, "wchar_t") 415796c8dcSSimon Schubert || !strcmp (name, "char16_t") 425796c8dcSSimon Schubert || !strcmp (name, "char32_t")); 435796c8dcSSimon Schubert } 445796c8dcSSimon Schubert 455796c8dcSSimon Schubert /* Apply a heuristic to decide whether an array of TYPE or a pointer 465796c8dcSSimon Schubert to TYPE should be printed as a textual string. Return non-zero if 475796c8dcSSimon Schubert it should, or zero if it should be treated as an array of integers 48c50c785cSJohn Marino or pointer to integers. FORMAT is the current format letter, or 0 49c50c785cSJohn Marino if none. 505796c8dcSSimon Schubert 515796c8dcSSimon Schubert We guess that "char" is a character. Explicitly signed and 525796c8dcSSimon Schubert unsigned character types are also characters. Integer data from 535796c8dcSSimon Schubert vector types is not. The user can override this by using the /s 545796c8dcSSimon Schubert format letter. */ 555796c8dcSSimon Schubert 56cf7f2e2dSJohn Marino int 57cf7f2e2dSJohn Marino c_textual_element_type (struct type *type, char format) 585796c8dcSSimon Schubert { 595796c8dcSSimon Schubert struct type *true_type, *iter_type; 605796c8dcSSimon Schubert 615796c8dcSSimon Schubert if (format != 0 && format != 's') 625796c8dcSSimon Schubert return 0; 635796c8dcSSimon Schubert 645796c8dcSSimon Schubert /* We also rely on this for its side effect of setting up all the 655796c8dcSSimon Schubert typedef pointers. */ 665796c8dcSSimon Schubert true_type = check_typedef (type); 675796c8dcSSimon Schubert 685796c8dcSSimon Schubert /* TYPE_CODE_CHAR is always textual. */ 695796c8dcSSimon Schubert if (TYPE_CODE (true_type) == TYPE_CODE_CHAR) 705796c8dcSSimon Schubert return 1; 715796c8dcSSimon Schubert 725796c8dcSSimon Schubert /* Any other character-like types must be integral. */ 735796c8dcSSimon Schubert if (TYPE_CODE (true_type) != TYPE_CODE_INT) 745796c8dcSSimon Schubert return 0; 755796c8dcSSimon Schubert 765796c8dcSSimon Schubert /* We peel typedefs one by one, looking for a match. */ 775796c8dcSSimon Schubert iter_type = type; 785796c8dcSSimon Schubert while (iter_type) 795796c8dcSSimon Schubert { 805796c8dcSSimon Schubert /* Check the name of the type. */ 815796c8dcSSimon Schubert if (TYPE_NAME (iter_type) && textual_name (TYPE_NAME (iter_type))) 825796c8dcSSimon Schubert return 1; 835796c8dcSSimon Schubert 845796c8dcSSimon Schubert if (TYPE_CODE (iter_type) != TYPE_CODE_TYPEDEF) 855796c8dcSSimon Schubert break; 865796c8dcSSimon Schubert 875796c8dcSSimon Schubert /* Peel a single typedef. If the typedef doesn't have a target 885796c8dcSSimon Schubert type, we use check_typedef and hope the result is ok -- it 895796c8dcSSimon Schubert might be for C++, where wchar_t is a built-in type. */ 905796c8dcSSimon Schubert if (TYPE_TARGET_TYPE (iter_type)) 915796c8dcSSimon Schubert iter_type = TYPE_TARGET_TYPE (iter_type); 925796c8dcSSimon Schubert else 935796c8dcSSimon Schubert iter_type = check_typedef (iter_type); 945796c8dcSSimon Schubert } 955796c8dcSSimon Schubert 965796c8dcSSimon Schubert if (format == 's') 975796c8dcSSimon Schubert { 98c50c785cSJohn Marino /* Print this as a string if we can manage it. For now, no wide 99c50c785cSJohn Marino character support. */ 1005796c8dcSSimon Schubert if (TYPE_CODE (true_type) == TYPE_CODE_INT 1015796c8dcSSimon Schubert && TYPE_LENGTH (true_type) == 1) 1025796c8dcSSimon Schubert return 1; 1035796c8dcSSimon Schubert } 1045796c8dcSSimon Schubert else 1055796c8dcSSimon Schubert { 1065796c8dcSSimon Schubert /* If a one-byte TYPE_CODE_INT is missing the not-a-character 1075796c8dcSSimon Schubert flag, then we treat it as text; otherwise, we assume it's 1085796c8dcSSimon Schubert being used as data. */ 1095796c8dcSSimon Schubert if (TYPE_CODE (true_type) == TYPE_CODE_INT 1105796c8dcSSimon Schubert && TYPE_LENGTH (true_type) == 1 1115796c8dcSSimon Schubert && !TYPE_NOTTEXT (true_type)) 1125796c8dcSSimon Schubert return 1; 1135796c8dcSSimon Schubert } 1145796c8dcSSimon Schubert 1155796c8dcSSimon Schubert return 0; 1165796c8dcSSimon Schubert } 1175796c8dcSSimon Schubert 118*ef5ccd6cSJohn Marino /* Decorations for C. */ 1195796c8dcSSimon Schubert 120*ef5ccd6cSJohn Marino static const struct generic_val_print_decorations c_decorations = 121*ef5ccd6cSJohn Marino { 122*ef5ccd6cSJohn Marino "", 123*ef5ccd6cSJohn Marino " + ", 124*ef5ccd6cSJohn Marino " * I", 125*ef5ccd6cSJohn Marino "true", 126*ef5ccd6cSJohn Marino "false", 127*ef5ccd6cSJohn Marino "void" 128*ef5ccd6cSJohn Marino }; 129*ef5ccd6cSJohn Marino 130*ef5ccd6cSJohn Marino /* See val_print for a description of the various parameters of this 131*ef5ccd6cSJohn Marino function; they are identical. */ 132*ef5ccd6cSJohn Marino 133*ef5ccd6cSJohn Marino void 134c50c785cSJohn Marino c_val_print (struct type *type, const gdb_byte *valaddr, 135c50c785cSJohn Marino int embedded_offset, CORE_ADDR address, 136c50c785cSJohn Marino struct ui_file *stream, int recurse, 137cf7f2e2dSJohn Marino const struct value *original_value, 1385796c8dcSSimon Schubert const struct value_print_options *options) 1395796c8dcSSimon Schubert { 1405796c8dcSSimon Schubert struct gdbarch *gdbarch = get_type_arch (type); 1415796c8dcSSimon Schubert enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); 142c50c785cSJohn Marino unsigned int i = 0; /* Number of characters printed. */ 1435796c8dcSSimon Schubert unsigned len; 1445796c8dcSSimon Schubert struct type *elttype, *unresolved_elttype; 1455796c8dcSSimon Schubert struct type *unresolved_type = type; 1465796c8dcSSimon Schubert unsigned eltlen; 1475796c8dcSSimon Schubert CORE_ADDR addr; 1485796c8dcSSimon Schubert 1495796c8dcSSimon Schubert CHECK_TYPEDEF (type); 1505796c8dcSSimon Schubert switch (TYPE_CODE (type)) 1515796c8dcSSimon Schubert { 1525796c8dcSSimon Schubert case TYPE_CODE_ARRAY: 1535796c8dcSSimon Schubert unresolved_elttype = TYPE_TARGET_TYPE (type); 1545796c8dcSSimon Schubert elttype = check_typedef (unresolved_elttype); 1555796c8dcSSimon Schubert if (TYPE_LENGTH (type) > 0 && TYPE_LENGTH (unresolved_elttype) > 0) 1565796c8dcSSimon Schubert { 157c50c785cSJohn Marino LONGEST low_bound, high_bound; 158c50c785cSJohn Marino 159c50c785cSJohn Marino if (!get_array_bounds (type, &low_bound, &high_bound)) 160c50c785cSJohn Marino error (_("Could not determine the array high bound")); 161c50c785cSJohn Marino 1625796c8dcSSimon Schubert eltlen = TYPE_LENGTH (elttype); 163c50c785cSJohn Marino len = high_bound - low_bound + 1; 1645796c8dcSSimon Schubert if (options->prettyprint_arrays) 1655796c8dcSSimon Schubert { 1665796c8dcSSimon Schubert print_spaces_filtered (2 + 2 * recurse, stream); 1675796c8dcSSimon Schubert } 1685796c8dcSSimon Schubert 169cf7f2e2dSJohn Marino /* Print arrays of textual chars with a string syntax, as 170cf7f2e2dSJohn Marino long as the entire array is valid. */ 171c50c785cSJohn Marino if (c_textual_element_type (unresolved_elttype, 172c50c785cSJohn Marino options->format) 173c50c785cSJohn Marino && value_bytes_available (original_value, embedded_offset, 174c50c785cSJohn Marino TYPE_LENGTH (type)) 175cf7f2e2dSJohn Marino && value_bits_valid (original_value, 176cf7f2e2dSJohn Marino TARGET_CHAR_BIT * embedded_offset, 177cf7f2e2dSJohn Marino TARGET_CHAR_BIT * TYPE_LENGTH (type))) 1785796c8dcSSimon Schubert { 179*ef5ccd6cSJohn Marino int force_ellipses = 0; 180*ef5ccd6cSJohn Marino 181c50c785cSJohn Marino /* If requested, look for the first null char and only 182c50c785cSJohn Marino print elements up to it. */ 1835796c8dcSSimon Schubert if (options->stop_print_at_null) 1845796c8dcSSimon Schubert { 1855796c8dcSSimon Schubert unsigned int temp_len; 1865796c8dcSSimon Schubert 1875796c8dcSSimon Schubert for (temp_len = 0; 1885796c8dcSSimon Schubert (temp_len < len 1895796c8dcSSimon Schubert && temp_len < options->print_max 1905796c8dcSSimon Schubert && extract_unsigned_integer (valaddr + embedded_offset 1915796c8dcSSimon Schubert + temp_len * eltlen, 192cf7f2e2dSJohn Marino eltlen, byte_order) != 0); 1935796c8dcSSimon Schubert ++temp_len) 1945796c8dcSSimon Schubert ; 195*ef5ccd6cSJohn Marino 196*ef5ccd6cSJohn Marino /* Force LA_PRINT_STRING to print ellipses if 197*ef5ccd6cSJohn Marino we've printed the maximum characters and 198*ef5ccd6cSJohn Marino the next character is not \000. */ 199*ef5ccd6cSJohn Marino if (temp_len == options->print_max && temp_len < len) 200*ef5ccd6cSJohn Marino { 201*ef5ccd6cSJohn Marino ULONGEST val 202*ef5ccd6cSJohn Marino = extract_unsigned_integer (valaddr + embedded_offset 203*ef5ccd6cSJohn Marino + temp_len * eltlen, 204*ef5ccd6cSJohn Marino eltlen, byte_order); 205*ef5ccd6cSJohn Marino if (val != 0) 206*ef5ccd6cSJohn Marino force_ellipses = 1; 207*ef5ccd6cSJohn Marino } 208*ef5ccd6cSJohn Marino 2095796c8dcSSimon Schubert len = temp_len; 2105796c8dcSSimon Schubert } 2115796c8dcSSimon Schubert 2125796c8dcSSimon Schubert LA_PRINT_STRING (stream, unresolved_elttype, 213cf7f2e2dSJohn Marino valaddr + embedded_offset, len, 214*ef5ccd6cSJohn Marino NULL, force_ellipses, options); 2155796c8dcSSimon Schubert i = len; 2165796c8dcSSimon Schubert } 2175796c8dcSSimon Schubert else 2185796c8dcSSimon Schubert { 2195796c8dcSSimon Schubert fprintf_filtered (stream, "{"); 2205796c8dcSSimon Schubert /* If this is a virtual function table, print the 0th 221c50c785cSJohn Marino entry specially, and the rest of the members 222c50c785cSJohn Marino normally. */ 2235796c8dcSSimon Schubert if (cp_is_vtbl_ptr_type (elttype)) 2245796c8dcSSimon Schubert { 2255796c8dcSSimon Schubert i = 1; 226c50c785cSJohn Marino fprintf_filtered (stream, _("%d vtable entries"), 227c50c785cSJohn Marino len - 1); 2285796c8dcSSimon Schubert } 2295796c8dcSSimon Schubert else 2305796c8dcSSimon Schubert { 2315796c8dcSSimon Schubert i = 0; 2325796c8dcSSimon Schubert } 233c50c785cSJohn Marino val_print_array_elements (type, valaddr, embedded_offset, 234c50c785cSJohn Marino address, stream, 235cf7f2e2dSJohn Marino recurse, original_value, options, i); 2365796c8dcSSimon Schubert fprintf_filtered (stream, "}"); 2375796c8dcSSimon Schubert } 2385796c8dcSSimon Schubert break; 2395796c8dcSSimon Schubert } 240c50c785cSJohn Marino /* Array of unspecified length: treat like pointer to first 241c50c785cSJohn Marino elt. */ 242c50c785cSJohn Marino addr = address + embedded_offset; 2435796c8dcSSimon Schubert goto print_unpacked_pointer; 2445796c8dcSSimon Schubert 2455796c8dcSSimon Schubert case TYPE_CODE_METHODPTR: 2465796c8dcSSimon Schubert cplus_print_method_ptr (valaddr + embedded_offset, type, stream); 2475796c8dcSSimon Schubert break; 2485796c8dcSSimon Schubert 2495796c8dcSSimon Schubert case TYPE_CODE_PTR: 2505796c8dcSSimon Schubert if (options->format && options->format != 's') 2515796c8dcSSimon Schubert { 252c50c785cSJohn Marino val_print_scalar_formatted (type, valaddr, embedded_offset, 253c50c785cSJohn Marino original_value, options, 0, stream); 2545796c8dcSSimon Schubert break; 2555796c8dcSSimon Schubert } 2565796c8dcSSimon Schubert if (options->vtblprint && cp_is_vtbl_ptr_type (type)) 2575796c8dcSSimon Schubert { 2585796c8dcSSimon Schubert /* Print the unmangled name if desired. */ 2595796c8dcSSimon Schubert /* Print vtable entry - we only get here if we ARE using 260c50c785cSJohn Marino -fvtable_thunks. (Otherwise, look under 261c50c785cSJohn Marino TYPE_CODE_STRUCT.) */ 2625796c8dcSSimon Schubert CORE_ADDR addr 2635796c8dcSSimon Schubert = extract_typed_address (valaddr + embedded_offset, type); 264cf7f2e2dSJohn Marino 265*ef5ccd6cSJohn Marino print_function_pointer_address (options, gdbarch, addr, stream); 2665796c8dcSSimon Schubert break; 2675796c8dcSSimon Schubert } 2685796c8dcSSimon Schubert unresolved_elttype = TYPE_TARGET_TYPE (type); 2695796c8dcSSimon Schubert elttype = check_typedef (unresolved_elttype); 2705796c8dcSSimon Schubert { 271*ef5ccd6cSJohn Marino int want_space; 272*ef5ccd6cSJohn Marino 2735796c8dcSSimon Schubert addr = unpack_pointer (type, valaddr + embedded_offset); 2745796c8dcSSimon Schubert print_unpacked_pointer: 2755796c8dcSSimon Schubert 276*ef5ccd6cSJohn Marino want_space = 0; 277*ef5ccd6cSJohn Marino 2785796c8dcSSimon Schubert if (TYPE_CODE (elttype) == TYPE_CODE_FUNC) 2795796c8dcSSimon Schubert { 2805796c8dcSSimon Schubert /* Try to print what function it points to. */ 281*ef5ccd6cSJohn Marino print_function_pointer_address (options, gdbarch, addr, stream); 282*ef5ccd6cSJohn Marino return; 2835796c8dcSSimon Schubert } 2845796c8dcSSimon Schubert 285*ef5ccd6cSJohn Marino if (options->symbol_print) 286*ef5ccd6cSJohn Marino want_space = print_address_demangle (options, gdbarch, addr, 287*ef5ccd6cSJohn Marino stream, demangle); 288*ef5ccd6cSJohn Marino else if (options->addressprint) 289*ef5ccd6cSJohn Marino { 2905796c8dcSSimon Schubert fputs_filtered (paddress (gdbarch, addr), stream); 291*ef5ccd6cSJohn Marino want_space = 1; 292*ef5ccd6cSJohn Marino } 2935796c8dcSSimon Schubert 2945796c8dcSSimon Schubert /* For a pointer to a textual type, also print the string 2955796c8dcSSimon Schubert pointed to, unless pointer is null. */ 2965796c8dcSSimon Schubert 297c50c785cSJohn Marino if (c_textual_element_type (unresolved_elttype, 298c50c785cSJohn Marino options->format) 2995796c8dcSSimon Schubert && addr != 0) 3005796c8dcSSimon Schubert { 301*ef5ccd6cSJohn Marino if (want_space) 302*ef5ccd6cSJohn Marino fputs_filtered (" ", stream); 303c50c785cSJohn Marino i = val_print_string (unresolved_elttype, NULL, 304c50c785cSJohn Marino addr, -1, 305c50c785cSJohn Marino stream, options); 3065796c8dcSSimon Schubert } 3075796c8dcSSimon Schubert else if (cp_is_vtbl_member (type)) 3085796c8dcSSimon Schubert { 309c50c785cSJohn Marino /* Print vtbl's nicely. */ 310c50c785cSJohn Marino CORE_ADDR vt_address = unpack_pointer (type, 311c50c785cSJohn Marino valaddr 312c50c785cSJohn Marino + embedded_offset); 3135796c8dcSSimon Schubert struct minimal_symbol *msymbol = 3145796c8dcSSimon Schubert lookup_minimal_symbol_by_pc (vt_address); 315*ef5ccd6cSJohn Marino 316*ef5ccd6cSJohn Marino /* If 'symbol_print' is set, we did the work above. */ 317*ef5ccd6cSJohn Marino if (!options->symbol_print 318*ef5ccd6cSJohn Marino && (msymbol != NULL) 319cf7f2e2dSJohn Marino && (vt_address == SYMBOL_VALUE_ADDRESS (msymbol))) 3205796c8dcSSimon Schubert { 321*ef5ccd6cSJohn Marino if (want_space) 322*ef5ccd6cSJohn Marino fputs_filtered (" ", stream); 3235796c8dcSSimon Schubert fputs_filtered (" <", stream); 3245796c8dcSSimon Schubert fputs_filtered (SYMBOL_PRINT_NAME (msymbol), stream); 3255796c8dcSSimon Schubert fputs_filtered (">", stream); 326*ef5ccd6cSJohn Marino want_space = 1; 3275796c8dcSSimon Schubert } 328*ef5ccd6cSJohn Marino 3295796c8dcSSimon Schubert if (vt_address && options->vtblprint) 3305796c8dcSSimon Schubert { 3315796c8dcSSimon Schubert struct value *vt_val; 3325796c8dcSSimon Schubert struct symbol *wsym = (struct symbol *) NULL; 3335796c8dcSSimon Schubert struct type *wtype; 3345796c8dcSSimon Schubert struct block *block = (struct block *) NULL; 335*ef5ccd6cSJohn Marino struct field_of_this_result is_this_fld; 336*ef5ccd6cSJohn Marino 337*ef5ccd6cSJohn Marino if (want_space) 338*ef5ccd6cSJohn Marino fputs_filtered (" ", stream); 3395796c8dcSSimon Schubert 3405796c8dcSSimon Schubert if (msymbol != NULL) 341c50c785cSJohn Marino wsym = lookup_symbol (SYMBOL_LINKAGE_NAME (msymbol), 342c50c785cSJohn Marino block, VAR_DOMAIN, 343c50c785cSJohn Marino &is_this_fld); 3445796c8dcSSimon Schubert 3455796c8dcSSimon Schubert if (wsym) 3465796c8dcSSimon Schubert { 3475796c8dcSSimon Schubert wtype = SYMBOL_TYPE (wsym); 3485796c8dcSSimon Schubert } 3495796c8dcSSimon Schubert else 3505796c8dcSSimon Schubert { 3515796c8dcSSimon Schubert wtype = unresolved_elttype; 3525796c8dcSSimon Schubert } 3535796c8dcSSimon Schubert vt_val = value_at (wtype, vt_address); 354c50c785cSJohn Marino common_val_print (vt_val, stream, recurse + 1, 355c50c785cSJohn Marino options, current_language); 3565796c8dcSSimon Schubert if (options->pretty) 3575796c8dcSSimon Schubert { 3585796c8dcSSimon Schubert fprintf_filtered (stream, "\n"); 3595796c8dcSSimon Schubert print_spaces_filtered (2 + 2 * recurse, stream); 3605796c8dcSSimon Schubert } 3615796c8dcSSimon Schubert } 3625796c8dcSSimon Schubert } 363*ef5ccd6cSJohn Marino return; 3645796c8dcSSimon Schubert } 3655796c8dcSSimon Schubert break; 3665796c8dcSSimon Schubert 3675796c8dcSSimon Schubert case TYPE_CODE_UNION: 3685796c8dcSSimon Schubert if (recurse && !options->unionprint) 3695796c8dcSSimon Schubert { 3705796c8dcSSimon Schubert fprintf_filtered (stream, "{...}"); 3715796c8dcSSimon Schubert break; 3725796c8dcSSimon Schubert } 3735796c8dcSSimon Schubert /* Fall through. */ 3745796c8dcSSimon Schubert case TYPE_CODE_STRUCT: 375c50c785cSJohn Marino /*FIXME: Abstract this away. */ 3765796c8dcSSimon Schubert if (options->vtblprint && cp_is_vtbl_ptr_type (type)) 3775796c8dcSSimon Schubert { 3785796c8dcSSimon Schubert /* Print the unmangled name if desired. */ 3795796c8dcSSimon Schubert /* Print vtable entry - we only get here if NOT using 380c50c785cSJohn Marino -fvtable_thunks. (Otherwise, look under 381c50c785cSJohn Marino TYPE_CODE_PTR.) */ 382c50c785cSJohn Marino int offset = (embedded_offset 383c50c785cSJohn Marino + TYPE_FIELD_BITPOS (type, 384c50c785cSJohn Marino VTBL_FNADDR_OFFSET) / 8); 385c50c785cSJohn Marino struct type *field_type = TYPE_FIELD_TYPE (type, 386c50c785cSJohn Marino VTBL_FNADDR_OFFSET); 3875796c8dcSSimon Schubert CORE_ADDR addr 3885796c8dcSSimon Schubert = extract_typed_address (valaddr + offset, field_type); 3895796c8dcSSimon Schubert 390*ef5ccd6cSJohn Marino print_function_pointer_address (options, gdbarch, addr, stream); 3915796c8dcSSimon Schubert } 3925796c8dcSSimon Schubert else 393cf7f2e2dSJohn Marino cp_print_value_fields_rtti (type, valaddr, 394c50c785cSJohn Marino embedded_offset, address, 395c50c785cSJohn Marino stream, recurse, 396c50c785cSJohn Marino original_value, options, 397c50c785cSJohn Marino NULL, 0); 3985796c8dcSSimon Schubert break; 3995796c8dcSSimon Schubert 4005796c8dcSSimon Schubert case TYPE_CODE_INT: 4015796c8dcSSimon Schubert if (options->format || options->output_format) 4025796c8dcSSimon Schubert { 4035796c8dcSSimon Schubert struct value_print_options opts = *options; 404cf7f2e2dSJohn Marino 4055796c8dcSSimon Schubert opts.format = (options->format ? options->format 4065796c8dcSSimon Schubert : options->output_format); 407c50c785cSJohn Marino val_print_scalar_formatted (type, valaddr, embedded_offset, 408c50c785cSJohn Marino original_value, &opts, 0, stream); 4095796c8dcSSimon Schubert } 4105796c8dcSSimon Schubert else 4115796c8dcSSimon Schubert { 412c50c785cSJohn Marino val_print_type_code_int (type, valaddr + embedded_offset, 413c50c785cSJohn Marino stream); 414c50c785cSJohn Marino /* C and C++ has no single byte int type, char is used 415c50c785cSJohn Marino instead. Since we don't know whether the value is really 416c50c785cSJohn Marino intended to be used as an integer or a character, print 417c50c785cSJohn Marino the character equivalent as well. */ 418cf7f2e2dSJohn Marino if (c_textual_element_type (unresolved_type, options->format)) 4195796c8dcSSimon Schubert { 4205796c8dcSSimon Schubert fputs_filtered (" ", stream); 421c50c785cSJohn Marino LA_PRINT_CHAR (unpack_long (type, valaddr + embedded_offset), 4225796c8dcSSimon Schubert unresolved_type, stream); 4235796c8dcSSimon Schubert } 4245796c8dcSSimon Schubert } 4255796c8dcSSimon Schubert break; 4265796c8dcSSimon Schubert 427*ef5ccd6cSJohn Marino case TYPE_CODE_MEMBERPTR: 428*ef5ccd6cSJohn Marino if (!options->format) 4295796c8dcSSimon Schubert { 430*ef5ccd6cSJohn Marino cp_print_class_member (valaddr + embedded_offset, type, stream, "&"); 4315796c8dcSSimon Schubert break; 432*ef5ccd6cSJohn Marino } 433*ef5ccd6cSJohn Marino /* FALLTHROUGH */ 4345796c8dcSSimon Schubert 435*ef5ccd6cSJohn Marino case TYPE_CODE_REF: 436*ef5ccd6cSJohn Marino case TYPE_CODE_ENUM: 437*ef5ccd6cSJohn Marino case TYPE_CODE_FLAGS: 438*ef5ccd6cSJohn Marino case TYPE_CODE_FUNC: 439*ef5ccd6cSJohn Marino case TYPE_CODE_METHOD: 440*ef5ccd6cSJohn Marino case TYPE_CODE_BOOL: 441*ef5ccd6cSJohn Marino case TYPE_CODE_RANGE: 4425796c8dcSSimon Schubert case TYPE_CODE_FLT: 4435796c8dcSSimon Schubert case TYPE_CODE_DECFLOAT: 4445796c8dcSSimon Schubert case TYPE_CODE_VOID: 4455796c8dcSSimon Schubert case TYPE_CODE_ERROR: 4465796c8dcSSimon Schubert case TYPE_CODE_UNDEF: 4475796c8dcSSimon Schubert case TYPE_CODE_COMPLEX: 448*ef5ccd6cSJohn Marino case TYPE_CODE_CHAR: 4495796c8dcSSimon Schubert default: 450*ef5ccd6cSJohn Marino generic_val_print (type, valaddr, embedded_offset, address, 451*ef5ccd6cSJohn Marino stream, recurse, original_value, options, 452*ef5ccd6cSJohn Marino &c_decorations); 453*ef5ccd6cSJohn Marino break; 4545796c8dcSSimon Schubert } 4555796c8dcSSimon Schubert gdb_flush (stream); 4565796c8dcSSimon Schubert } 4575796c8dcSSimon Schubert 458*ef5ccd6cSJohn Marino void 4595796c8dcSSimon Schubert c_value_print (struct value *val, struct ui_file *stream, 4605796c8dcSSimon Schubert const struct value_print_options *options) 4615796c8dcSSimon Schubert { 4625796c8dcSSimon Schubert struct type *type, *real_type, *val_type; 4635796c8dcSSimon Schubert int full, top, using_enc; 4645796c8dcSSimon Schubert struct value_print_options opts = *options; 4655796c8dcSSimon Schubert 4665796c8dcSSimon Schubert opts.deref_ref = 1; 4675796c8dcSSimon Schubert 4685796c8dcSSimon Schubert /* If it is a pointer, indicate what it points to. 4695796c8dcSSimon Schubert 4705796c8dcSSimon Schubert Print type also if it is a reference. 4715796c8dcSSimon Schubert 4725796c8dcSSimon Schubert C++: if it is a member pointer, we will take care 4735796c8dcSSimon Schubert of that when we print it. */ 4745796c8dcSSimon Schubert 4755796c8dcSSimon Schubert /* Preserve the original type before stripping typedefs. We prefer 4765796c8dcSSimon Schubert to pass down the original type when possible, but for local 4775796c8dcSSimon Schubert checks it is better to look past the typedefs. */ 4785796c8dcSSimon Schubert val_type = value_type (val); 4795796c8dcSSimon Schubert type = check_typedef (val_type); 4805796c8dcSSimon Schubert 4815796c8dcSSimon Schubert if (TYPE_CODE (type) == TYPE_CODE_PTR 4825796c8dcSSimon Schubert || TYPE_CODE (type) == TYPE_CODE_REF) 4835796c8dcSSimon Schubert { 4845796c8dcSSimon Schubert /* Hack: remove (char *) for char strings. Their 4855796c8dcSSimon Schubert type is indicated by the quoted string anyway. 486cf7f2e2dSJohn Marino (Don't use c_textual_element_type here; quoted strings 4875796c8dcSSimon Schubert are always exactly (char *), (wchar_t *), or the like. */ 4885796c8dcSSimon Schubert if (TYPE_CODE (val_type) == TYPE_CODE_PTR 4895796c8dcSSimon Schubert && TYPE_NAME (val_type) == NULL 4905796c8dcSSimon Schubert && TYPE_NAME (TYPE_TARGET_TYPE (val_type)) != NULL 491c50c785cSJohn Marino && (strcmp (TYPE_NAME (TYPE_TARGET_TYPE (val_type)), 492c50c785cSJohn Marino "char") == 0 4935796c8dcSSimon Schubert || textual_name (TYPE_NAME (TYPE_TARGET_TYPE (val_type))))) 4945796c8dcSSimon Schubert { 495c50c785cSJohn Marino /* Print nothing. */ 4965796c8dcSSimon Schubert } 4975796c8dcSSimon Schubert else if (options->objectprint 4985796c8dcSSimon Schubert && (TYPE_CODE (TYPE_TARGET_TYPE (type)) == TYPE_CODE_CLASS)) 4995796c8dcSSimon Schubert { 5005796c8dcSSimon Schubert 5015796c8dcSSimon Schubert if (TYPE_CODE(type) == TYPE_CODE_REF) 5025796c8dcSSimon Schubert { 5035796c8dcSSimon Schubert /* Copy value, change to pointer, so we don't get an 504c50c785cSJohn Marino error about a non-pointer type in 505c50c785cSJohn Marino value_rtti_target_type. */ 5065796c8dcSSimon Schubert struct value *temparg; 5075796c8dcSSimon Schubert temparg=value_copy(val); 508c50c785cSJohn Marino deprecated_set_value_type 509c50c785cSJohn Marino (temparg, lookup_pointer_type (TYPE_TARGET_TYPE (type))); 5105796c8dcSSimon Schubert val = temparg; 5115796c8dcSSimon Schubert } 512c50c785cSJohn Marino /* Pointer to class, check real type of object. */ 5135796c8dcSSimon Schubert fprintf_filtered (stream, "("); 514c50c785cSJohn Marino 515c50c785cSJohn Marino if (value_entirely_available (val)) 516c50c785cSJohn Marino { 517*ef5ccd6cSJohn Marino real_type = value_rtti_indirect_type (val, &full, &top, 518*ef5ccd6cSJohn Marino &using_enc); 5195796c8dcSSimon Schubert if (real_type) 5205796c8dcSSimon Schubert { 521c50c785cSJohn Marino /* RTTI entry found. */ 522*ef5ccd6cSJohn Marino type = real_type; 523*ef5ccd6cSJohn Marino 524c50c785cSJohn Marino /* Need to adjust pointer value. */ 525c50c785cSJohn Marino val = value_from_pointer (type, value_as_address (val) - top); 5265796c8dcSSimon Schubert 527c50c785cSJohn Marino /* Note: When we look up RTTI entries, we don't get 528c50c785cSJohn Marino any information on const or volatile 529c50c785cSJohn Marino attributes. */ 530c50c785cSJohn Marino } 5315796c8dcSSimon Schubert } 5325796c8dcSSimon Schubert type_print (type, "", stream, -1); 5335796c8dcSSimon Schubert fprintf_filtered (stream, ") "); 5345796c8dcSSimon Schubert val_type = type; 5355796c8dcSSimon Schubert } 5365796c8dcSSimon Schubert else 5375796c8dcSSimon Schubert { 5385796c8dcSSimon Schubert /* normal case */ 5395796c8dcSSimon Schubert fprintf_filtered (stream, "("); 5405796c8dcSSimon Schubert type_print (value_type (val), "", stream, -1); 5415796c8dcSSimon Schubert fprintf_filtered (stream, ") "); 5425796c8dcSSimon Schubert } 5435796c8dcSSimon Schubert } 5445796c8dcSSimon Schubert 5455796c8dcSSimon Schubert if (!value_initialized (val)) 5465796c8dcSSimon Schubert fprintf_filtered (stream, " [uninitialized] "); 5475796c8dcSSimon Schubert 5485796c8dcSSimon Schubert if (options->objectprint && (TYPE_CODE (type) == TYPE_CODE_CLASS)) 5495796c8dcSSimon Schubert { 550c50c785cSJohn Marino /* Attempt to determine real type of object. */ 5515796c8dcSSimon Schubert real_type = value_rtti_type (val, &full, &top, &using_enc); 5525796c8dcSSimon Schubert if (real_type) 5535796c8dcSSimon Schubert { 554c50c785cSJohn Marino /* We have RTTI information, so use it. */ 555c50c785cSJohn Marino val = value_full_object (val, real_type, 556c50c785cSJohn Marino full, top, using_enc); 5575796c8dcSSimon Schubert fprintf_filtered (stream, "(%s%s) ", 5585796c8dcSSimon Schubert TYPE_NAME (real_type), 5595796c8dcSSimon Schubert full ? "" : _(" [incomplete object]")); 560c50c785cSJohn Marino /* Print out object: enclosing type is same as real_type if 561c50c785cSJohn Marino full. */ 562*ef5ccd6cSJohn Marino val_print (value_enclosing_type (val), 563cf7f2e2dSJohn Marino value_contents_for_printing (val), 0, 5645796c8dcSSimon Schubert value_address (val), stream, 0, 565cf7f2e2dSJohn Marino val, &opts, current_language); 566*ef5ccd6cSJohn Marino return; 567c50c785cSJohn Marino /* Note: When we look up RTTI entries, we don't get any 568c50c785cSJohn Marino information on const or volatile attributes. */ 5695796c8dcSSimon Schubert } 5705796c8dcSSimon Schubert else if (type != check_typedef (value_enclosing_type (val))) 5715796c8dcSSimon Schubert { 572c50c785cSJohn Marino /* No RTTI information, so let's do our best. */ 5735796c8dcSSimon Schubert fprintf_filtered (stream, "(%s ?) ", 5745796c8dcSSimon Schubert TYPE_NAME (value_enclosing_type (val))); 575*ef5ccd6cSJohn Marino val_print (value_enclosing_type (val), 576cf7f2e2dSJohn Marino value_contents_for_printing (val), 0, 5775796c8dcSSimon Schubert value_address (val), stream, 0, 578cf7f2e2dSJohn Marino val, &opts, current_language); 579*ef5ccd6cSJohn Marino return; 5805796c8dcSSimon Schubert } 581c50c785cSJohn Marino /* Otherwise, we end up at the return outside this "if". */ 5825796c8dcSSimon Schubert } 5835796c8dcSSimon Schubert 584*ef5ccd6cSJohn Marino val_print (val_type, value_contents_for_printing (val), 5855796c8dcSSimon Schubert value_embedded_offset (val), 5865796c8dcSSimon Schubert value_address (val), 587cf7f2e2dSJohn Marino stream, 0, 588cf7f2e2dSJohn Marino val, &opts, current_language); 5895796c8dcSSimon Schubert } 590