-
Notifications
You must be signed in to change notification settings - Fork 15.9k
[lldb][DWARF] Delay struct/class/union definition DIE searching when parsing declaration DIEs. #90663
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[lldb][DWARF] Delay struct/class/union definition DIE searching when parsing declaration DIEs. #90663
Changes from 3 commits
4e80000
751a58d
c0a539e
515c85d
40b87f0
6086993
0481675
4f2fbfb
c7edf15
3414ce2
a8d45fb
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Large diffs are not rendered by default.
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -108,6 +108,9 @@ class DWARFASTParserClang : public lldb_private::plugin::dwarf::DWARFASTParser { | |
| lldb_private::ConstString GetDIEClassTemplateParams( | ||
| const lldb_private::plugin::dwarf::DWARFDIE &die) override; | ||
|
||
|
|
||
| bool FindDefinitionDIE(const lldb_private::plugin::dwarf::DWARFDIE &die, | ||
| bool &is_forward_declaration) override; | ||
|
|
||
| protected: | ||
| /// Protected typedefs and members. | ||
| /// @{ | ||
|
|
@@ -246,6 +249,13 @@ class DWARFASTParserClang : public lldb_private::plugin::dwarf::DWARFASTParser { | |
| lldb::ModuleSP | ||
| GetModuleForType(const lldb_private::plugin::dwarf::DWARFDIE &die); | ||
|
|
||
| void PrepareContextToReceiveMembers( | ||
| lldb_private::TypeSystemClang &ast, | ||
| clang::DeclContext *decl_ctx, | ||
| const lldb_private::plugin::dwarf::DWARFDIE &decl_ctx_die, | ||
| const lldb_private::plugin::dwarf::DWARFDIE &die, | ||
| const char *type_name_cstr); | ||
|
|
||
| static bool classof(const DWARFASTParser *Parser) { | ||
| return Parser->GetKind() == Kind::DWARFASTParserClang; | ||
| } | ||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -16,60 +16,65 @@ using namespace lldb_private::plugin::dwarf; | |
| bool UniqueDWARFASTTypeList::Find(const DWARFDIE &die, | ||
| const lldb_private::Declaration &decl, | ||
| const int32_t byte_size, | ||
| bool is_forward_declaration, | ||
| UniqueDWARFASTType &entry) const { | ||
| for (const UniqueDWARFASTType &udt : m_collection) { | ||
| // Make sure the tags match | ||
| if (udt.m_die.Tag() == die.Tag()) { | ||
| // Validate byte sizes of both types only if both are valid. | ||
| if (udt.m_byte_size < 0 || byte_size < 0 || | ||
| udt.m_byte_size == byte_size) { | ||
| // Make sure the file and line match | ||
| if (udt.m_declaration == decl) { | ||
| // The type has the same name, and was defined on the same file and | ||
| // line. Now verify all of the parent DIEs match. | ||
| DWARFDIE parent_arg_die = die.GetParent(); | ||
| DWARFDIE parent_pos_die = udt.m_die.GetParent(); | ||
| bool match = true; | ||
| bool done = false; | ||
| while (!done && match && parent_arg_die && parent_pos_die) { | ||
| const dw_tag_t parent_arg_tag = parent_arg_die.Tag(); | ||
| const dw_tag_t parent_pos_tag = parent_pos_die.Tag(); | ||
| if (parent_arg_tag == parent_pos_tag) { | ||
| switch (parent_arg_tag) { | ||
| case DW_TAG_class_type: | ||
| case DW_TAG_structure_type: | ||
| case DW_TAG_union_type: | ||
| case DW_TAG_namespace: { | ||
| const char *parent_arg_die_name = parent_arg_die.GetName(); | ||
| if (parent_arg_die_name == | ||
| nullptr) // Anonymous (i.e. no-name) struct | ||
| { | ||
| // If they are not both definition DIEs or both declaration DIEs, then | ||
| // don't check for byte size and declaration location, because declaration | ||
| // DIEs usually don't have those info. | ||
| bool matching_size_declaration = | ||
| udt.m_is_forward_declaration != is_forward_declaration | ||
| ? true | ||
| : (udt.m_byte_size < 0 || byte_size < 0 || | ||
| udt.m_byte_size == byte_size) && | ||
| udt.m_declaration == decl; | ||
| if (matching_size_declaration) { | ||
|
||
| // The type has the same name, and was defined on the same file and | ||
| // line. Now verify all of the parent DIEs match. | ||
| DWARFDIE parent_arg_die = die.GetParent(); | ||
| DWARFDIE parent_pos_die = udt.m_die.GetParent(); | ||
| bool match = true; | ||
| bool done = false; | ||
| while (!done && match && parent_arg_die && parent_pos_die) { | ||
| const dw_tag_t parent_arg_tag = parent_arg_die.Tag(); | ||
| const dw_tag_t parent_pos_tag = parent_pos_die.Tag(); | ||
| if (parent_arg_tag == parent_pos_tag) { | ||
| switch (parent_arg_tag) { | ||
| case DW_TAG_class_type: | ||
| case DW_TAG_structure_type: | ||
| case DW_TAG_union_type: | ||
| case DW_TAG_namespace: { | ||
| const char *parent_arg_die_name = parent_arg_die.GetName(); | ||
| if (parent_arg_die_name == | ||
| nullptr) // Anonymous (i.e. no-name) struct | ||
| { | ||
| match = false; | ||
| } else { | ||
| const char *parent_pos_die_name = parent_pos_die.GetName(); | ||
| if (parent_pos_die_name == nullptr || | ||
| ((parent_arg_die_name != parent_pos_die_name) && | ||
| strcmp(parent_arg_die_name, parent_pos_die_name))) | ||
| match = false; | ||
| } else { | ||
| const char *parent_pos_die_name = parent_pos_die.GetName(); | ||
| if (parent_pos_die_name == nullptr || | ||
| ((parent_arg_die_name != parent_pos_die_name) && | ||
| strcmp(parent_arg_die_name, parent_pos_die_name))) | ||
| match = false; | ||
| } | ||
| } break; | ||
|
|
||
| case DW_TAG_compile_unit: | ||
| case DW_TAG_partial_unit: | ||
| done = true; | ||
| break; | ||
| default: | ||
| break; | ||
| } | ||
| } break; | ||
|
|
||
| case DW_TAG_compile_unit: | ||
| case DW_TAG_partial_unit: | ||
| done = true; | ||
| break; | ||
| default: | ||
| break; | ||
| } | ||
| parent_arg_die = parent_arg_die.GetParent(); | ||
| parent_pos_die = parent_pos_die.GetParent(); | ||
| } | ||
| parent_arg_die = parent_arg_die.GetParent(); | ||
| parent_pos_die = parent_pos_die.GetParent(); | ||
| } | ||
|
|
||
| if (match) { | ||
| entry = udt; | ||
| return true; | ||
| } | ||
| if (match) { | ||
| entry = udt; | ||
| return true; | ||
| } | ||
| } | ||
| } | ||
|
|
||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Delete lldb_private::plugin::dwarf::
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done.