mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2025-01-12 12:16:04 +08:00
883fd55ab1
GDB currently does not track types defined in classes. Consider: class A { public: class B { public: class C { }; }; }; (gdb) ptype A type = class A { <no data fields> } This patch changes this behavior so that GDB records these nested types and displays them to the user when he has set the (new) "print type" option "nested-type-limit." Example: (gdb) set print type nested-type-limit 1 (gdb) ptype A type = class A { <no data fields> class A::B { <no data fields> }; } (gdb) set print type nested-type-limit 2 type = class A { <no data fields> class A::B { <no data fields> class A::B::C { <no data fields> }; }; } By default, the code maintains the status quo, that is, it will not print any nested type definitions at all. Testing is carried out via cp_ptype_class which required quite a bit of modification to permit recursive calling (for the nested types). This was most easily facilitated by turning the ptype command output into a queue. Upshot: the test suite now has stack and queue data structures that may be used by test writers. gdb/ChangeLog * NEWS (New commands): Mention set/show print type nested-type-limit. * c-typeprint.c (c_type_print_base): Print out nested types. * dwarf2read.c (struct typedef_field_list): Rename to ... (struct decl_field_list): ... this. Change all uses. (struct field_info) <nested_types_list, nested_types_list_count>: New fields. (add_partial_symbol): Look for nested type definitions in C++, too. (dwarf2_add_typedef): Rename to ... (dwarf2_add_type_defn): ... this. (type_can_define_types): New function. Update assertion to use type_can_define_types. Permit NULL for a field's name. (process_structure_scope): Handle child DIEs of types that can define types. Copy the list of nested types into the type struct. * gdbtypes.h (struct typedef_field): Rename to ... (struct decl_field): ... this. Change all uses. [is_protected, is_private]: New fields. (struct cplus_struct_type) <nested_types, nested_types_count>: New fields. (TYPE_NESTED_TYPES_ARRAY, TYPE_NESTED_TYPES_FIELD) (TYPE_NESTED_TYPES_FIELD_NAME, TYPE_NESTED_TYPES_FIELD_TYPE) (TYPE_NESTED_TYPES_COUNT, TYPE_NESTED_TYPES_FIELD_PROTECTED) (TYPE_NESTED_TYPES_FIELD_PRIVATE): New macros. * typeprint.c (type_print_raw_options, default_ptype_flags): Add default value for print_nested_type_limit. (print_nested_type_limit): New static variable. (set_print_type_nested_types, show_print_type_nested_types): New functions. (_initialize_typeprint): Register new commands for set/show `print-nested-type-limit'. * typeprint.h (struct type_print_options) [print_nested_type_limit]: New field. gdb/testsuite/ChangeLog * gdb.cp/nested-types.cc: New file. * gdb.cp/nested-types.exp: New file. * lib/cp-support.exp: Load data-structures.exp library. (debug_cp_test_ptype_class): New global. (cp_ptype_class_verbose, next_line): New procedures. (cp_test_ptype_class): Add and document new parameter `recursive_qid'. Add and document new return value. Switch the list of lines to a queue. Add support for new `type' key for nested type definitions. Add debugging/troubleshooting messages. * lib/data-structures.exp: New file. gdb/doc/ChangeLog * gdb.texinfo (Symbols): Document "set print type nested-type-limit" and "show print type nested-type-limit".
94 lines
3.1 KiB
C
94 lines
3.1 KiB
C
/* Language independent support for printing types for GDB, the GNU debugger.
|
|
Copyright (C) 1986-2017 Free Software Foundation, Inc.
|
|
|
|
This file is part of GDB.
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation; either version 3 of the License, or
|
|
(at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
|
|
|
#ifndef TYPEPRINT_H
|
|
#define TYPEPRINT_H
|
|
|
|
enum language;
|
|
struct ui_file;
|
|
struct typedef_hash_table;
|
|
struct ext_lang_type_printers;
|
|
|
|
struct type_print_options
|
|
{
|
|
/* True means that no special printing flags should apply. */
|
|
unsigned int raw : 1;
|
|
|
|
/* True means print methods in a class. */
|
|
unsigned int print_methods : 1;
|
|
|
|
/* True means print typedefs in a class. */
|
|
unsigned int print_typedefs : 1;
|
|
|
|
/* The number of nested type definitions to print. -1 == all. */
|
|
int print_nested_type_limit;
|
|
|
|
/* If not NULL, a local typedef hash table used when printing a
|
|
type. */
|
|
struct typedef_hash_table *local_typedefs;
|
|
|
|
/* If not NULL, a global typedef hash table used when printing a
|
|
type. */
|
|
struct typedef_hash_table *global_typedefs;
|
|
|
|
/* The list of type printers associated with the global typedef
|
|
table. This is intentionally opaque. */
|
|
struct ext_lang_type_printers *global_printers;
|
|
};
|
|
|
|
extern const struct type_print_options type_print_raw_options;
|
|
|
|
void recursively_update_typedef_hash (struct typedef_hash_table *,
|
|
struct type *);
|
|
|
|
void add_template_parameters (struct typedef_hash_table *, struct type *);
|
|
|
|
struct typedef_hash_table *create_typedef_hash (void);
|
|
|
|
void free_typedef_hash (struct typedef_hash_table *);
|
|
|
|
struct cleanup *make_cleanup_free_typedef_hash (struct typedef_hash_table *);
|
|
|
|
struct typedef_hash_table *copy_typedef_hash (struct typedef_hash_table *);
|
|
|
|
const char *find_typedef_in_hash (const struct type_print_options *,
|
|
struct type *);
|
|
|
|
void print_type_scalar (struct type * type, LONGEST, struct ui_file *);
|
|
|
|
void c_type_print_varspec_suffix (struct type *, struct ui_file *, int,
|
|
int, int, const struct type_print_options *);
|
|
|
|
void c_type_print_args (struct type *, struct ui_file *, int, enum language,
|
|
const struct type_print_options *);
|
|
|
|
/* Print <unknown return type> to stream STREAM. */
|
|
|
|
void type_print_unknown_return_type (struct ui_file *stream);
|
|
|
|
/* Throw an error indicating that the user tried to use a symbol that
|
|
has unknown type. SYM_PRINT_NAME is the name of the symbol, to be
|
|
included in the error message. */
|
|
extern void error_unknown_type (const char *sym_print_name);
|
|
|
|
extern void val_print_not_allocated (struct ui_file *stream);
|
|
|
|
extern void val_print_not_associated (struct ui_file *stream);
|
|
|
|
#endif
|