OLD | NEW |
1 /* Support for printing C++ values for GDB, the GNU debugger. | 1 /* Support for printing C++ values for GDB, the GNU debugger. |
2 | 2 |
3 Copyright (C) 1986, 1988-1989, 1991-1997, 2000-2003, 2005-2012 Free | 3 Copyright (C) 1986-2013 Free Software Foundation, Inc. |
4 Software Foundation, Inc. | |
5 | 4 |
6 This file is part of GDB. | 5 This file is part of GDB. |
7 | 6 |
8 This program is free software; you can redistribute it and/or modify | 7 This program is free software; you can redistribute it and/or modify |
9 it under the terms of the GNU General Public License as published by | 8 it under the terms of the GNU General Public License as published by |
10 the Free Software Foundation; either version 3 of the License, or | 9 the Free Software Foundation; either version 3 of the License, or |
11 (at your option) any later version. | 10 (at your option) any later version. |
12 | 11 |
13 This program is distributed in the hope that it will be useful, | 12 This program is distributed in the hope that it will be useful, |
14 but WITHOUT ANY WARRANTY; without even the implied warranty of | 13 but WITHOUT ANY WARRANTY; without even the implied warranty of |
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
16 GNU General Public License for more details. | 15 GNU General Public License for more details. |
17 | 16 |
18 You should have received a copy of the GNU General Public License | 17 You should have received a copy of the GNU General Public License |
19 along with this program. If not, see <http://www.gnu.org/licenses/>. */ | 18 along with this program. If not, see <http://www.gnu.org/licenses/>. */ |
20 | 19 |
21 #include "defs.h" | 20 #include "defs.h" |
22 #include "gdb_obstack.h" | 21 #include "gdb_obstack.h" |
23 #include "symtab.h" | 22 #include "symtab.h" |
24 #include "gdbtypes.h" | 23 #include "gdbtypes.h" |
25 #include "expression.h" | 24 #include "expression.h" |
26 #include "value.h" | 25 #include "value.h" |
27 #include "command.h" | 26 #include "command.h" |
28 #include "gdbcmd.h" | 27 #include "gdbcmd.h" |
29 #include "demangle.h" | 28 #include "demangle.h" |
30 #include "annotate.h" | 29 #include "annotate.h" |
31 #include "gdb_string.h" | 30 #include <string.h> |
32 #include "c-lang.h" | 31 #include "c-lang.h" |
33 #include "target.h" | 32 #include "target.h" |
34 #include "cp-abi.h" | 33 #include "cp-abi.h" |
35 #include "valprint.h" | 34 #include "valprint.h" |
36 #include "cp-support.h" | 35 #include "cp-support.h" |
37 #include "language.h" | 36 #include "language.h" |
38 #include "python/python.h" | 37 #include "python/python.h" |
39 #include "exceptions.h" | 38 #include "exceptions.h" |
| 39 #include "typeprint.h" |
40 | 40 |
41 /* Controls printing of vtbl's. */ | 41 /* Controls printing of vtbl's. */ |
42 static void | 42 static void |
43 show_vtblprint (struct ui_file *file, int from_tty, | 43 show_vtblprint (struct ui_file *file, int from_tty, |
44 struct cmd_list_element *c, const char *value) | 44 struct cmd_list_element *c, const char *value) |
45 { | 45 { |
46 fprintf_filtered (file, _("\ | 46 fprintf_filtered (file, _("\ |
47 Printing of C++ virtual function tables is %s.\n"), | 47 Printing of C++ virtual function tables is %s.\n"), |
48 value); | 48 value); |
49 } | 49 } |
(...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
203 | 203 |
204 /* Second, print out data fields */ | 204 /* Second, print out data fields */ |
205 | 205 |
206 /* If there are no data fields, skip this part */ | 206 /* If there are no data fields, skip this part */ |
207 if (len == n_baseclasses || !len) | 207 if (len == n_baseclasses || !len) |
208 fprintf_filtered (stream, "<No data fields>"); | 208 fprintf_filtered (stream, "<No data fields>"); |
209 else | 209 else |
210 { | 210 { |
211 int statmem_obstack_initial_size = 0; | 211 int statmem_obstack_initial_size = 0; |
212 int stat_array_obstack_initial_size = 0; | 212 int stat_array_obstack_initial_size = 0; |
213 | 213 struct type *vptr_basetype = NULL; |
| 214 int vptr_fieldno; |
| 215 |
214 if (dont_print_statmem == 0) | 216 if (dont_print_statmem == 0) |
215 { | 217 { |
216 statmem_obstack_initial_size = | 218 statmem_obstack_initial_size = |
217 obstack_object_size (&dont_print_statmem_obstack); | 219 obstack_object_size (&dont_print_statmem_obstack); |
218 | 220 |
219 if (last_set_recurse != recurse) | 221 if (last_set_recurse != recurse) |
220 { | 222 { |
221 stat_array_obstack_initial_size = | 223 stat_array_obstack_initial_size = |
222 obstack_object_size (&dont_print_stat_array_obstack); | 224 obstack_object_size (&dont_print_stat_array_obstack); |
223 | 225 |
224 last_set_recurse = recurse; | 226 last_set_recurse = recurse; |
225 } | 227 } |
226 } | 228 } |
227 | 229 |
| 230 vptr_fieldno = get_vptr_fieldno (type, &vptr_basetype); |
228 for (i = n_baseclasses; i < len; i++) | 231 for (i = n_baseclasses; i < len; i++) |
229 { | 232 { |
230 /* If requested, skip printing of static fields. */ | 233 /* If requested, skip printing of static fields. */ |
231 if (!options->static_field_print | 234 if (!options->static_field_print |
232 && field_is_static (&TYPE_FIELD (type, i))) | 235 && field_is_static (&TYPE_FIELD (type, i))) |
233 continue; | 236 continue; |
234 | 237 |
235 if (fields_seen) | 238 if (fields_seen) |
236 fprintf_filtered (stream, ", "); | 239 fprintf_filtered (stream, ", "); |
237 else if (n_baseclasses > 0) | 240 else if (n_baseclasses > 0) |
238 { | 241 { |
239 » if (options->pretty) | 242 » if (options->prettyformat) |
240 { | 243 { |
241 fprintf_filtered (stream, "\n"); | 244 fprintf_filtered (stream, "\n"); |
242 print_spaces_filtered (2 + 2 * recurse, stream); | 245 print_spaces_filtered (2 + 2 * recurse, stream); |
243 fputs_filtered ("members of ", stream); | 246 fputs_filtered ("members of ", stream); |
244 fputs_filtered (type_name_no_tag (type), stream); | 247 fputs_filtered (type_name_no_tag (type), stream); |
245 fputs_filtered (": ", stream); | 248 fputs_filtered (": ", stream); |
246 } | 249 } |
247 } | 250 } |
248 fields_seen = 1; | 251 fields_seen = 1; |
249 | 252 |
250 » if (options->pretty) | 253 » if (options->prettyformat) |
251 { | 254 { |
252 fprintf_filtered (stream, "\n"); | 255 fprintf_filtered (stream, "\n"); |
253 print_spaces_filtered (2 + 2 * recurse, stream); | 256 print_spaces_filtered (2 + 2 * recurse, stream); |
254 } | 257 } |
255 else | 258 else |
256 { | 259 { |
257 wrap_here (n_spaces (2 + 2 * recurse)); | 260 wrap_here (n_spaces (2 + 2 * recurse)); |
258 } | 261 } |
259 if (options->inspect_it) | |
260 { | |
261 if (TYPE_CODE (TYPE_FIELD_TYPE (type, i)) == TYPE_CODE_PTR) | |
262 fputs_filtered ("\"( ptr \"", stream); | |
263 else | |
264 fputs_filtered ("\"( nodef \"", stream); | |
265 if (field_is_static (&TYPE_FIELD (type, i))) | |
266 fputs_filtered ("static ", stream); | |
267 fprintf_symbol_filtered (stream, | |
268 TYPE_FIELD_NAME (type, i), | |
269 current_language->la_language, | |
270 DMGL_PARAMS | DMGL_ANSI); | |
271 fputs_filtered ("\" \"", stream); | |
272 fprintf_symbol_filtered (stream, | |
273 TYPE_FIELD_NAME (type, i), | |
274 current_language->la_language, | |
275 DMGL_PARAMS | DMGL_ANSI); | |
276 fputs_filtered ("\") \"", stream); | |
277 } | |
278 else | |
279 { | |
280 annotate_field_begin (TYPE_FIELD_TYPE (type, i)); | |
281 | 262 |
282 » if (field_is_static (&TYPE_FIELD (type, i))) | 263 » annotate_field_begin (TYPE_FIELD_TYPE (type, i)); |
283 » » fputs_filtered ("static ", stream); | 264 |
284 » fprintf_symbol_filtered (stream, | 265 » if (field_is_static (&TYPE_FIELD (type, i))) |
285 » » » » TYPE_FIELD_NAME (type, i), | 266 » fputs_filtered ("static ", stream); |
286 » » » » current_language->la_language, | 267 » fprintf_symbol_filtered (stream, |
287 » » » » DMGL_PARAMS | DMGL_ANSI); | 268 » » » » TYPE_FIELD_NAME (type, i), |
288 » annotate_field_name_end (); | 269 » » » » current_language->la_language, |
289 » /* Do not print leading '=' in case of anonymous | 270 » » » » DMGL_PARAMS | DMGL_ANSI); |
290 » » unions. */ | 271 » annotate_field_name_end (); |
291 » if (strcmp (TYPE_FIELD_NAME (type, i), "")) | 272 » /* Do not print leading '=' in case of anonymous |
292 » » fputs_filtered (" = ", stream); | 273 » unions. */ |
293 » annotate_field_value (); | 274 » if (strcmp (TYPE_FIELD_NAME (type, i), "")) |
294 » } | 275 » fputs_filtered (" = ", stream); |
| 276 » annotate_field_value (); |
295 | 277 |
296 if (!field_is_static (&TYPE_FIELD (type, i)) | 278 if (!field_is_static (&TYPE_FIELD (type, i)) |
297 && TYPE_FIELD_PACKED (type, i)) | 279 && TYPE_FIELD_PACKED (type, i)) |
298 { | 280 { |
299 struct value *v; | 281 struct value *v; |
300 | 282 |
301 /* Bitfields require special handling, especially due to | 283 /* Bitfields require special handling, especially due to |
302 byte order problems. */ | 284 byte order problems. */ |
303 if (TYPE_FIELD_IGNORE (type, i)) | 285 if (TYPE_FIELD_IGNORE (type, i)) |
304 { | 286 { |
305 fputs_filtered ("<optimized out or zero length>", stream); | 287 fputs_filtered ("<optimized out or zero length>", stream); |
306 } | 288 } |
307 else if (value_bits_synthetic_pointer (val, | 289 else if (value_bits_synthetic_pointer (val, |
308 TYPE_FIELD_BITPOS (type, | 290 TYPE_FIELD_BITPOS (type, |
309 i), | 291 i), |
310 TYPE_FIELD_BITSIZE (type, | 292 TYPE_FIELD_BITSIZE (type, |
311 i))) | 293 i))) |
312 { | 294 { |
313 fputs_filtered (_("<synthetic pointer>"), stream); | 295 fputs_filtered (_("<synthetic pointer>"), stream); |
314 } | 296 } |
315 else if (!value_bits_valid (val, | 297 else if (!value_bits_valid (val, |
316 TYPE_FIELD_BITPOS (type, i), | 298 TYPE_FIELD_BITPOS (type, i), |
317 TYPE_FIELD_BITSIZE (type, i))) | 299 TYPE_FIELD_BITSIZE (type, i))) |
318 { | 300 { |
319 » » val_print_optimized_out (stream); | 301 » » val_print_optimized_out (val, stream); |
320 } | 302 } |
321 else | 303 else |
322 { | 304 { |
323 struct value_print_options opts = *options; | 305 struct value_print_options opts = *options; |
324 | 306 |
325 opts.deref_ref = 0; | 307 opts.deref_ref = 0; |
326 | 308 |
327 v = value_field_bitfield (type, i, valaddr, offset, val); | 309 v = value_field_bitfield (type, i, valaddr, offset, val); |
328 | 310 |
329 common_val_print (v, stream, recurse + 1, &opts, | 311 common_val_print (v, stream, recurse + 1, &opts, |
(...skipping 14 matching lines...) Expand all Loading... |
344 | 326 |
345 TRY_CATCH (ex, RETURN_MASK_ERROR) | 327 TRY_CATCH (ex, RETURN_MASK_ERROR) |
346 { | 328 { |
347 v = value_static_field (type, i); | 329 v = value_static_field (type, i); |
348 } | 330 } |
349 | 331 |
350 if (ex.reason < 0) | 332 if (ex.reason < 0) |
351 fprintf_filtered (stream, | 333 fprintf_filtered (stream, |
352 _("<error reading variable: %s>"), | 334 _("<error reading variable: %s>"), |
353 ex.message); | 335 ex.message); |
354 » » else if (v == NULL) | 336 » » cp_print_static_field (TYPE_FIELD_TYPE (type, i), |
355 » » val_print_optimized_out (stream); | 337 » » » » » v, stream, recurse + 1, |
356 » » else | 338 » » » » » options); |
357 » » cp_print_static_field (TYPE_FIELD_TYPE (type, i), | |
358 » » » » » v, stream, recurse + 1, | |
359 » » » » » options); | |
360 } | 339 } |
361 » else if (i == TYPE_VPTR_FIELDNO (type)) | 340 » else if (i == vptr_fieldno && type == vptr_basetype) |
362 { | 341 { |
363 int i_offset = offset + TYPE_FIELD_BITPOS (type, i) / 8; | 342 int i_offset = offset + TYPE_FIELD_BITPOS (type, i) / 8; |
364 struct type *i_type = TYPE_FIELD_TYPE (type, i); | 343 struct type *i_type = TYPE_FIELD_TYPE (type, i); |
365 | 344 |
366 if (valprint_check_validity (stream, i_type, i_offset, val)) | 345 if (valprint_check_validity (stream, i_type, i_offset, val)) |
367 { | 346 { |
368 CORE_ADDR addr; | 347 CORE_ADDR addr; |
369 | 348 |
370 addr = extract_typed_address (valaddr + i_offset, i_type); | 349 addr = extract_typed_address (valaddr + i_offset, i_type); |
371 print_function_pointer_address (options, | 350 print_function_pointer_address (options, |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
418 - (obstack_final_size | 397 - (obstack_final_size |
419 - stat_array_obstack_initial_size); | 398 - stat_array_obstack_initial_size); |
420 | 399 |
421 obstack_free (&dont_print_stat_array_obstack, | 400 obstack_free (&dont_print_stat_array_obstack, |
422 free_to_ptr); | 401 free_to_ptr); |
423 } | 402 } |
424 last_set_recurse = -1; | 403 last_set_recurse = -1; |
425 } | 404 } |
426 } | 405 } |
427 | 406 |
428 if (options->pretty) | 407 if (options->prettyformat) |
429 { | 408 { |
430 fprintf_filtered (stream, "\n"); | 409 fprintf_filtered (stream, "\n"); |
431 print_spaces_filtered (2 * recurse, stream); | 410 print_spaces_filtered (2 * recurse, stream); |
432 } | 411 } |
433 } /* if there are data fields */ | 412 } /* if there are data fields */ |
434 | 413 |
435 fprintf_filtered (stream, "}"); | 414 fprintf_filtered (stream, "}"); |
436 } | 415 } |
437 | 416 |
438 /* Like cp_print_value_fields, but find the runtime type of the object | 417 /* Like cp_print_value_fields, but find the runtime type of the object |
(...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
579 } | 558 } |
580 } | 559 } |
581 else | 560 else |
582 { | 561 { |
583 base_valaddr = valaddr; | 562 base_valaddr = valaddr; |
584 base_val = val; | 563 base_val = val; |
585 } | 564 } |
586 } | 565 } |
587 | 566 |
588 /* Now do the printing. */ | 567 /* Now do the printing. */ |
589 if (options->pretty) | 568 if (options->prettyformat) |
590 { | 569 { |
591 fprintf_filtered (stream, "\n"); | 570 fprintf_filtered (stream, "\n"); |
592 print_spaces_filtered (2 * recurse, stream); | 571 print_spaces_filtered (2 * recurse, stream); |
593 } | 572 } |
594 fputs_filtered ("<", stream); | 573 fputs_filtered ("<", stream); |
595 /* Not sure what the best notation is in the case where there is | 574 /* Not sure what the best notation is in the case where there is |
596 no baseclass name. */ | 575 no baseclass name. */ |
597 fputs_filtered (basename ? basename : "", stream); | 576 fputs_filtered (basename ? basename : "", stream); |
598 fputs_filtered ("> = ", stream); | 577 fputs_filtered ("> = ", stream); |
599 | 578 |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
651 have the same meanings as in c_val_print. */ | 630 have the same meanings as in c_val_print. */ |
652 | 631 |
653 static void | 632 static void |
654 cp_print_static_field (struct type *type, | 633 cp_print_static_field (struct type *type, |
655 struct value *val, | 634 struct value *val, |
656 struct ui_file *stream, | 635 struct ui_file *stream, |
657 int recurse, | 636 int recurse, |
658 const struct value_print_options *options) | 637 const struct value_print_options *options) |
659 { | 638 { |
660 struct value_print_options opts; | 639 struct value_print_options opts; |
661 | 640 |
| 641 if (value_entirely_optimized_out (val)) |
| 642 { |
| 643 val_print_optimized_out (val, stream); |
| 644 return; |
| 645 } |
| 646 |
662 if (TYPE_CODE (type) == TYPE_CODE_STRUCT) | 647 if (TYPE_CODE (type) == TYPE_CODE_STRUCT) |
663 { | 648 { |
664 CORE_ADDR *first_dont_print; | 649 CORE_ADDR *first_dont_print; |
665 CORE_ADDR addr; | 650 CORE_ADDR addr; |
666 int i; | 651 int i; |
667 | 652 |
668 first_dont_print | 653 first_dont_print |
669 = (CORE_ADDR *) obstack_base (&dont_print_statmem_obstack); | 654 = (CORE_ADDR *) obstack_base (&dont_print_statmem_obstack); |
670 i = obstack_object_size (&dont_print_statmem_obstack) | 655 i = obstack_object_size (&dont_print_statmem_obstack) |
671 / sizeof (CORE_ADDR); | 656 / sizeof (CORE_ADDR); |
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
779 cp_print_class_member (const gdb_byte *valaddr, struct type *type, | 764 cp_print_class_member (const gdb_byte *valaddr, struct type *type, |
780 struct ui_file *stream, char *prefix) | 765 struct ui_file *stream, char *prefix) |
781 { | 766 { |
782 enum bfd_endian byte_order = gdbarch_byte_order (get_type_arch (type)); | 767 enum bfd_endian byte_order = gdbarch_byte_order (get_type_arch (type)); |
783 | 768 |
784 /* VAL is a byte offset into the structure type DOMAIN. | 769 /* VAL is a byte offset into the structure type DOMAIN. |
785 Find the name of the field for that offset and | 770 Find the name of the field for that offset and |
786 print it. */ | 771 print it. */ |
787 struct type *domain = TYPE_DOMAIN_TYPE (type); | 772 struct type *domain = TYPE_DOMAIN_TYPE (type); |
788 LONGEST val; | 773 LONGEST val; |
789 unsigned int fieldno; | 774 int fieldno; |
790 | 775 |
791 val = extract_signed_integer (valaddr, | 776 val = extract_signed_integer (valaddr, |
792 TYPE_LENGTH (type), | 777 TYPE_LENGTH (type), |
793 byte_order); | 778 byte_order); |
794 | 779 |
795 /* Pointers to data members are usually byte offsets into an object. | 780 /* Pointers to data members are usually byte offsets into an object. |
796 Because a data member can have offset zero, and a NULL pointer to | 781 Because a data member can have offset zero, and a NULL pointer to |
797 member must be distinct from any valid non-NULL pointer to | 782 member must be distinct from any valid non-NULL pointer to |
798 member, either the value is biased or the NULL value has a | 783 member, either the value is biased or the NULL value has a |
799 special representation; both are permitted by ISO C++. HP aCC | 784 special representation; both are permitted by ISO C++. HP aCC |
(...skipping 12 matching lines...) Expand all Loading... |
812 | 797 |
813 if (domain != NULL) | 798 if (domain != NULL) |
814 { | 799 { |
815 const char *name; | 800 const char *name; |
816 | 801 |
817 fputs_filtered (prefix, stream); | 802 fputs_filtered (prefix, stream); |
818 name = type_name_no_tag (domain); | 803 name = type_name_no_tag (domain); |
819 if (name) | 804 if (name) |
820 fputs_filtered (name, stream); | 805 fputs_filtered (name, stream); |
821 else | 806 else |
822 » c_type_print_base (domain, stream, 0, 0); | 807 » c_type_print_base (domain, stream, 0, 0, &type_print_raw_options); |
823 fprintf_filtered (stream, "::"); | 808 fprintf_filtered (stream, "::"); |
824 fputs_filtered (TYPE_FIELD_NAME (domain, fieldno), stream); | 809 fputs_filtered (TYPE_FIELD_NAME (domain, fieldno), stream); |
825 } | 810 } |
826 else | 811 else |
827 fprintf_filtered (stream, "%ld", (long) val); | 812 fprintf_filtered (stream, "%ld", (long) val); |
828 } | 813 } |
829 | 814 |
830 | 815 |
831 void | 816 void |
832 _initialize_cp_valprint (void) | 817 _initialize_cp_valprint (void) |
(...skipping 22 matching lines...) Expand all Loading... |
855 show_objectprint, | 840 show_objectprint, |
856 &setprintlist, &showprintlist); | 841 &setprintlist, &showprintlist); |
857 | 842 |
858 obstack_begin (&dont_print_stat_array_obstack, | 843 obstack_begin (&dont_print_stat_array_obstack, |
859 32 * sizeof (struct type *)); | 844 32 * sizeof (struct type *)); |
860 obstack_begin (&dont_print_statmem_obstack, | 845 obstack_begin (&dont_print_statmem_obstack, |
861 32 * sizeof (CORE_ADDR)); | 846 32 * sizeof (CORE_ADDR)); |
862 obstack_begin (&dont_print_vb_obstack, | 847 obstack_begin (&dont_print_vb_obstack, |
863 32 * sizeof (struct type *)); | 848 32 * sizeof (struct type *)); |
864 } | 849 } |
OLD | NEW |