diff options
Diffstat (limited to 'lldb/source/Plugins/SymbolFile')
9 files changed, 289 insertions, 6 deletions
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/HashedNameToDIE.h b/lldb/source/Plugins/SymbolFile/DWARF/HashedNameToDIE.h index 4b8a1fd8a30..c31cbaf3ca2 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/HashedNameToDIE.h +++ b/lldb/source/Plugins/SymbolFile/DWARF/HashedNameToDIE.h @@ -607,9 +607,30 @@ struct DWARFMappedHash return m_string_table.PeekCStr (key); } + virtual bool + ReadHashData (uint32_t hash_data_offset, + HashData &hash_data) const + { + lldb::offset_t offset = hash_data_offset; + offset += 4; // Skip string table offset that contains offset of hash name in .debug_str + const uint32_t count = m_data.GetU32 (&offset); + if (count > 0) + { + hash_data.resize(count); + for (uint32_t i=0; i<count; ++i) + { + if (!m_header.Read(m_data, &offset, hash_data[i])) + return false; + } + } + else + hash_data.clear(); + return true; + } + virtual Result GetHashDataForName (const char *name, - lldb::offset_t* hash_data_offset_ptr, + lldb::offset_t* hash_data_offset_ptr, Pair &pair) const { pair.key = m_data.GetU32 (hash_data_offset_ptr); diff --git a/lldb/source/Plugins/SymbolFile/DWARF/NameToDIE.cpp b/lldb/source/Plugins/SymbolFile/DWARF/NameToDIE.cpp index 069009e62f3..5514469d075 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/NameToDIE.cpp +++ b/lldb/source/Plugins/SymbolFile/DWARF/NameToDIE.cpp @@ -73,3 +73,15 @@ NameToDIE::Dump (Stream *s) s->Printf("%p: {0x%8.8x} \"%s\"\n", cstr, m_map.GetValueAtIndexUnchecked(i), cstr); } } + +void +NameToDIE::ForEach (std::function <bool(const char *name, uint32_t die_offset)> const &callback) const +{ + const uint32_t size = m_map.GetSize(); + for (uint32_t i=0; i<size; ++i) + { + if (!callback(m_map.GetCStringAtIndexUnchecked(i), + m_map.GetValueAtIndexUnchecked (i))) + break; + } +} diff --git a/lldb/source/Plugins/SymbolFile/DWARF/NameToDIE.h b/lldb/source/Plugins/SymbolFile/DWARF/NameToDIE.h index 43fb8a54ce9..f9a12736bf9 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/NameToDIE.h +++ b/lldb/source/Plugins/SymbolFile/DWARF/NameToDIE.h @@ -11,6 +11,9 @@ #define SymbolFileDWARF_NameToDIE_h_ #include "lldb/Core/UniqueCStringMap.h" + +#include <functional> + #include "lldb/lldb-defines.h" class SymbolFileDWARF; @@ -51,6 +54,9 @@ public: uint32_t cu_end_offset, DIEArray &info_array) const; + void + ForEach (std::function <bool(const char *name, uint32_t die_offset)> const &callback) const; + protected: lldb_private::UniqueCStringMap<uint32_t> m_map; diff --git a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp index 392d2c93c3d..624d45d6262 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp +++ b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp @@ -235,6 +235,187 @@ SymbolFileDWARF::GetTypeList () return m_obj_file->GetModule()->GetTypeList(); } +void +SymbolFileDWARF::GetTypes (DWARFCompileUnit* cu, + const DWARFDebugInfoEntry *die, + dw_offset_t min_die_offset, + dw_offset_t max_die_offset, + uint32_t type_mask, + TypeSet &type_set) +{ + if (cu) + { + if (die) + { + const dw_offset_t die_offset = die->GetOffset(); + + if (die_offset >= max_die_offset) + return; + + if (die_offset >= min_die_offset) + { + const dw_tag_t tag = die->Tag(); + + bool add_type = false; + + switch (tag) + { + case DW_TAG_array_type: add_type = (type_mask & eTypeClassArray ) != 0; break; + case DW_TAG_unspecified_type: + case DW_TAG_base_type: add_type = (type_mask & eTypeClassBuiltin ) != 0; break; + case DW_TAG_class_type: add_type = (type_mask & eTypeClassClass ) != 0; break; + case DW_TAG_structure_type: add_type = (type_mask & eTypeClassStruct ) != 0; break; + case DW_TAG_union_type: add_type = (type_mask & eTypeClassUnion ) != 0; break; + case DW_TAG_enumeration_type: add_type = (type_mask & eTypeClassEnumeration ) != 0; break; + case DW_TAG_subroutine_type: + case DW_TAG_subprogram: + case DW_TAG_inlined_subroutine: add_type = (type_mask & eTypeClassFunction ) != 0; break; + case DW_TAG_pointer_type: add_type = (type_mask & eTypeClassPointer ) != 0; break; + case DW_TAG_rvalue_reference_type: + case DW_TAG_reference_type: add_type = (type_mask & eTypeClassReference ) != 0; break; + case DW_TAG_typedef: add_type = (type_mask & eTypeClassTypedef ) != 0; break; + case DW_TAG_ptr_to_member_type: add_type = (type_mask & eTypeClassMemberPointer ) != 0; break; + } + + if (add_type) + { + const bool assert_not_being_parsed = true; + Type *type = ResolveTypeUID (cu, die, assert_not_being_parsed); + if (type) + { + if (type_set.find(type) == type_set.end()) + type_set.insert(type); + } + } + } + + for (const DWARFDebugInfoEntry *child_die = die->GetFirstChild(); + child_die != NULL; + child_die = child_die->GetSibling()) + { + GetTypes (cu, child_die, min_die_offset, max_die_offset, type_mask, type_set); + } + } + } +} + +size_t +SymbolFileDWARF::GetTypes (SymbolContextScope *sc_scope, + uint32_t type_mask, + TypeList &type_list) + +{ + TypeSet type_set; + + CompileUnit *comp_unit = NULL; + DWARFCompileUnit* dwarf_cu = NULL; + if (sc_scope) + comp_unit = sc_scope->CalculateSymbolContextCompileUnit(); + + if (comp_unit) + { + dwarf_cu = GetDWARFCompileUnit(comp_unit); + if (dwarf_cu == 0) + return 0; + GetTypes (dwarf_cu, + dwarf_cu->DIE(), + dwarf_cu->GetOffset(), + dwarf_cu->GetNextCompileUnitOffset(), + type_mask, + type_set); + } + else + { + DWARFDebugInfo* info = DebugInfo(); + if (info) + { + const size_t num_cus = info->GetNumCompileUnits(); + for (size_t cu_idx=0; cu_idx<num_cus; ++cu_idx) + { + dwarf_cu = info->GetCompileUnitAtIndex(cu_idx); + if (dwarf_cu) + { + GetTypes (dwarf_cu, + dwarf_cu->DIE(), + 0, + UINT32_MAX, + type_mask, + type_set); + } + } + } + } +// if (m_using_apple_tables) +// { +// DWARFMappedHash::MemoryTable *apple_types = m_apple_types_ap.get(); +// if (apple_types) +// { +// apple_types->ForEach([this, &type_set, apple_types, type_mask](const DWARFMappedHash::DIEInfoArray &die_info_array) -> bool { +// +// for (auto die_info: die_info_array) +// { +// bool add_type = TagMatchesTypeMask (type_mask, 0); +// if (!add_type) +// { +// dw_tag_t tag = die_info.tag; +// if (tag == 0) +// { +// const DWARFDebugInfoEntry *die = DebugInfo()->GetDIEPtr(die_info.offset, NULL); +// tag = die->Tag(); +// } +// add_type = TagMatchesTypeMask (type_mask, tag); +// } +// if (add_type) +// { +// Type *type = ResolveTypeUID(die_info.offset); +// +// if (type_set.find(type) == type_set.end()) +// type_set.insert(type); +// } +// } +// return true; // Keep iterating +// }); +// } +// } +// else +// { +// if (!m_indexed) +// Index (); +// +// m_type_index.ForEach([this, &type_set, type_mask](const char *name, uint32_t die_offset) -> bool { +// +// bool add_type = TagMatchesTypeMask (type_mask, 0); +// +// if (!add_type) +// { +// const DWARFDebugInfoEntry *die = DebugInfo()->GetDIEPtr(die_offset, NULL); +// if (die) +// { +// const dw_tag_t tag = die->Tag(); +// add_type = TagMatchesTypeMask (type_mask, tag); +// } +// } +// +// if (add_type) +// { +// Type *type = ResolveTypeUID(die_offset); +// +// if (type_set.find(type) == type_set.end()) +// type_set.insert(type); +// } +// return true; // Keep iterating +// }); +// } + + size_t num_types_added = 0; + for (Type *type : type_set) + { + type_list.Insert (type->shared_from_this()); + ++num_types_added; + } + return num_types_added; +} + //---------------------------------------------------------------------- // Gets the first parent that is a lexical block, function or inlined diff --git a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h index 87f86b80bbb..0370bc3f595 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h +++ b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h @@ -14,6 +14,7 @@ // C++ Includes #include <list> #include <map> +#include <set> #include <vector> // Other libraries and framework includes @@ -121,6 +122,10 @@ public: virtual uint32_t FindTypes (const lldb_private::SymbolContext& sc, const lldb_private::ConstString &name, const lldb_private::ClangNamespaceDecl *namespace_decl, bool append, uint32_t max_matches, lldb_private::TypeList& types); virtual lldb_private::TypeList * GetTypeList (); + virtual size_t GetTypes (lldb_private::SymbolContextScope *sc_scope, + uint32_t type_mask, + lldb_private::TypeList &type_list); + virtual lldb_private::ClangASTContext & GetClangASTContext (); @@ -545,6 +550,16 @@ protected: bool FixupAddress (lldb_private::Address &addr); + typedef std::set<lldb_private::Type *> TypeSet; + + void + GetTypes (DWARFCompileUnit* dwarf_cu, + const DWARFDebugInfoEntry *die, + dw_offset_t min_die_offset, + dw_offset_t max_die_offset, + uint32_t type_mask, + TypeSet &type_set); + lldb::ModuleWP m_debug_map_module_wp; SymbolFileDWARFDebugMap * m_debug_map_symfile; clang::TranslationUnitDecl * m_clang_tu_decl; diff --git a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp index 61f95f355cf..8816b3ea925 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp +++ b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp @@ -1120,6 +1120,43 @@ SymbolFileDWARFDebugMap::FindFunctions (const RegularExpression& regex, bool inc return sc_list.GetSize() - initial_size; } +size_t +SymbolFileDWARFDebugMap::GetTypes (SymbolContextScope *sc_scope, + uint32_t type_mask, + TypeList &type_list) +{ + Timer scoped_timer (__PRETTY_FUNCTION__, + "SymbolFileDWARFDebugMap::GetTypes (type_mask = 0x%8.8x)", + type_mask); + + + uint32_t initial_size = type_list.GetSize(); + SymbolFileDWARF *oso_dwarf = NULL; + if (sc_scope) + { + SymbolContext sc; + sc_scope->CalculateSymbolContext(&sc); + + CompileUnitInfo *cu_info = GetCompUnitInfo (sc); + if (cu_info) + { + oso_dwarf = GetSymbolFileByCompUnitInfo (cu_info); + if (oso_dwarf) + oso_dwarf->GetTypes (sc_scope, type_mask, type_list); + } + } + else + { + uint32_t oso_idx = 0; + while ((oso_dwarf = GetSymbolFileByOSOIndex (oso_idx++)) != NULL) + { + oso_dwarf->GetTypes (sc_scope, type_mask, type_list); + } + } + return type_list.GetSize() - initial_size; +} + + TypeSP SymbolFileDWARFDebugMap::FindDefinitionTypeForDWARFDeclContext (const DWARFDeclContext &die_decl_ctx) { diff --git a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h index 07f8e415c78..9db2a93f63a 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h +++ b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h @@ -85,9 +85,12 @@ public: virtual uint32_t FindFunctions (const lldb_private::RegularExpression& regex, bool include_inlines, bool append, lldb_private::SymbolContextList& sc_list); virtual uint32_t FindTypes (const lldb_private::SymbolContext& sc, const lldb_private::ConstString &name, const lldb_private::ClangNamespaceDecl *namespace_decl, bool append, uint32_t max_matches, lldb_private::TypeList& types); virtual lldb_private::ClangNamespaceDecl - FindNamespace (const lldb_private::SymbolContext& sc, - const lldb_private::ConstString &name, - const lldb_private::ClangNamespaceDecl *parent_namespace_decl); + FindNamespace (const lldb_private::SymbolContext& sc, + const lldb_private::ConstString &name, + const lldb_private::ClangNamespaceDecl *parent_namespace_decl); + virtual size_t GetTypes (lldb_private::SymbolContextScope *sc_scope, + uint32_t type_mask, + lldb_private::TypeList &type_list); //------------------------------------------------------------------ diff --git a/lldb/source/Plugins/SymbolFile/Symtab/SymbolFileSymtab.cpp b/lldb/source/Plugins/SymbolFile/Symtab/SymbolFileSymtab.cpp index 46460fe79d5..28078693b35 100644 --- a/lldb/source/Plugins/SymbolFile/Symtab/SymbolFileSymtab.cpp +++ b/lldb/source/Plugins/SymbolFile/Symtab/SymbolFileSymtab.cpp @@ -60,6 +60,12 @@ SymbolFileSymtab::CreateInstance (ObjectFile* obj_file) return new SymbolFileSymtab(obj_file); } +size_t +SymbolFileSymtab::GetTypes (SymbolContextScope *sc_scope, uint32_t type_mask, lldb_private::TypeList &type_list) +{ + return 0; +} + SymbolFileSymtab::SymbolFileSymtab(ObjectFile* obj_file) : SymbolFile(obj_file), m_source_indexes(), diff --git a/lldb/source/Plugins/SymbolFile/Symtab/SymbolFileSymtab.h b/lldb/source/Plugins/SymbolFile/Symtab/SymbolFileSymtab.h index ede3447ee99..99f0eb16c60 100644 --- a/lldb/source/Plugins/SymbolFile/Symtab/SymbolFileSymtab.h +++ b/lldb/source/Plugins/SymbolFile/Symtab/SymbolFileSymtab.h @@ -102,8 +102,10 @@ public: virtual uint32_t FindTypes (const lldb_private::SymbolContext& sc,const lldb_private::ConstString &name, const lldb_private::ClangNamespaceDecl *namespace_decl, bool append, uint32_t max_matches, lldb_private::TypeList& types); -// virtual uint32_t -// FindTypes(const lldb_private::SymbolContext& sc, const lldb_private::RegularExpression& regex, bool append, uint32_t max_matches, lldb_private::TypeList& types); + virtual size_t + GetTypes (lldb_private::SymbolContextScope *sc_scope, + uint32_t type_mask, + lldb_private::TypeList &type_list); virtual lldb_private::ClangNamespaceDecl FindNamespace (const lldb_private::SymbolContext& sc, |

