diff options
| -rw-r--r-- | lldb/source/Plugins/SymbolFile/DWARF/DWARFDIE.cpp | 1 | ||||
| -rw-r--r-- | lldb/source/Plugins/SymbolFile/DWARF/DWARFDeclContext.h | 16 | ||||
| -rw-r--r-- | lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp | 13 |
3 files changed, 27 insertions, 3 deletions
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDIE.cpp b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDIE.cpp index 4963f8599da..0f02c74fd2e 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDIE.cpp +++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDIE.cpp @@ -298,6 +298,7 @@ DWARFDIE::GetDWARFDeclContext (DWARFDeclContext &dwarf_decl_ctx) const { if (IsValid()) { + dwarf_decl_ctx.SetLanguage(GetLanguage()); m_die->GetDWARFDeclContext (GetDWARF(), GetCU(), dwarf_decl_ctx); } else diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDeclContext.h b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDeclContext.h index 4c29447b47b..2452274a293 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDeclContext.h +++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDeclContext.h @@ -64,7 +64,8 @@ public: }; DWARFDeclContext () : - m_entries() + m_entries(), + m_language(lldb::eLanguageTypeUnknown) { } @@ -115,10 +116,23 @@ public: m_qualified_name.clear(); } + lldb::LanguageType + GetLanguage() const + { + return m_language; + } + + void + SetLanguage(lldb::LanguageType language) + { + m_language = language; + } + protected: typedef std::vector<Entry> collection; collection m_entries; mutable std::string m_qualified_name; + lldb::LanguageType m_language; }; #endif // SymbolFileDWARF_DWARFDeclContext_h_ diff --git a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp index 36f4d2b8ca4..8b9726fbf2d 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp +++ b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp @@ -3698,8 +3698,12 @@ SymbolFileDWARF::FindDefinitionTypeForDWARFDeclContext (const DWARFDeclContext & } const size_t num_matches = die_offsets.size(); - - + + // Get the type system that we are looking to find a type for. We will use this + // to ensure any matches we find are in a language that this type system supports + const LanguageType language = dwarf_decl_ctx.GetLanguage(); + TypeSystem *type_system = (language == eLanguageTypeUnknown) ? nullptr : GetTypeSystemForLanguage(language); + if (num_matches) { for (size_t i=0; i<num_matches; ++i) @@ -3709,6 +3713,11 @@ SymbolFileDWARF::FindDefinitionTypeForDWARFDeclContext (const DWARFDeclContext & if (type_die) { + // Make sure type_die's langauge matches the type system we are looking for. + // We don't want to find a "Foo" type from Java if we are looking for a "Foo" + // type for C, C++, ObjC, or ObjC++. + if (type_system && !type_system->SupportsLanguage(type_die.GetLanguage())) + continue; bool try_resolving_type = false; // Don't try and resolve the DIE we are looking for with the DIE itself! |

