diff options
author | Keith Seitz <keiths@redhat.com> | 2017-12-07 15:01:30 -0800 |
---|---|---|
committer | Keith Seitz <keiths@redhat.com> | 2017-12-07 15:01:30 -0800 |
commit | 883fd55ab1049333364479a7f5b0c7e61a310bac (patch) | |
tree | 7e62acd5cb4951e9b8faf934771e6c7a65b169c7 /gdb/c-typeprint.c | |
parent | ec72db3ef415ebdcedaf36a1d83bd6624ec063e0 (diff) | |
download | binutils-gdb-883fd55ab1049333364479a7f5b0c7e61a310bac.tar.gz |
Record nested types
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".
Diffstat (limited to 'gdb/c-typeprint.c')
-rw-r--r-- | gdb/c-typeprint.c | 22 |
1 files changed, 21 insertions, 1 deletions
diff --git a/gdb/c-typeprint.c b/gdb/c-typeprint.c index ed5a1a4b8a4..f3c3e7d706f 100644 --- a/gdb/c-typeprint.c +++ b/gdb/c-typeprint.c @@ -1327,11 +1327,31 @@ c_type_print_base (struct type *type, struct ui_file *stream, } } + /* Print out nested types. */ + if (TYPE_NESTED_TYPES_COUNT (type) != 0 + && semi_local_flags.print_nested_type_limit != 0) + { + if (semi_local_flags.print_nested_type_limit > 0) + --semi_local_flags.print_nested_type_limit; + + if (TYPE_NFIELDS (type) != 0 || TYPE_NFN_FIELDS (type) != 0) + fprintf_filtered (stream, "\n"); + + for (i = 0; i < TYPE_NESTED_TYPES_COUNT (type); ++i) + { + print_spaces_filtered (level + 4, stream); + c_print_type (TYPE_NESTED_TYPES_FIELD_TYPE (type, i), + "", stream, show, level + 4, &semi_local_flags); + fprintf_filtered (stream, ";\n"); + } + } + /* Print typedefs defined in this class. */ if (TYPE_TYPEDEF_FIELD_COUNT (type) != 0 && flags->print_typedefs) { - if (TYPE_NFIELDS (type) != 0 || TYPE_NFN_FIELDS (type) != 0) + if (TYPE_NFIELDS (type) != 0 || TYPE_NFN_FIELDS (type) != 0 + || TYPE_NESTED_TYPES_COUNT (type) != 0) fprintf_filtered (stream, "\n"); for (i = 0; i < TYPE_TYPEDEF_FIELD_COUNT (type); i++) |