diff options
Diffstat (limited to 'source/Plugins/SymbolFile/DWARF/DWARFCompileUnit.h')
-rw-r--r-- | source/Plugins/SymbolFile/DWARF/DWARFCompileUnit.h | 124 |
1 files changed, 83 insertions, 41 deletions
diff --git a/source/Plugins/SymbolFile/DWARF/DWARFCompileUnit.h b/source/Plugins/SymbolFile/DWARF/DWARFCompileUnit.h index 93c8df822dcc4..0fcaaca09ed8c 100644 --- a/source/Plugins/SymbolFile/DWARF/DWARFCompileUnit.h +++ b/source/Plugins/SymbolFile/DWARF/DWARFCompileUnit.h @@ -12,9 +12,11 @@ #include "lldb/lldb-enumerations.h" #include "DWARFDebugInfoEntry.h" -#include "SymbolFileDWARF.h" +#include "DWARFDIE.h" class NameToDIE; +class SymbolFileDWARF; +class SymbolFileDWARFDwo; class DWARFCompileUnit { @@ -29,19 +31,17 @@ public: }; DWARFCompileUnit(SymbolFileDWARF* dwarf2Data); + ~DWARFCompileUnit(); bool Extract(const lldb_private::DWARFDataExtractor &debug_info, lldb::offset_t *offset_ptr); size_t ExtractDIEsIfNeeded (bool cu_die_only); - bool LookupAddress( - const dw_addr_t address, - DWARFDebugInfoEntry** function_die, - DWARFDebugInfoEntry** block_die); - + DWARFDIE LookupAddress(const dw_addr_t address); size_t AppendDIEsWithTag (const dw_tag_t tag, DWARFDIECollection& matching_dies, uint32_t depth = UINT32_MAX) const; void Clear(); bool Verify(lldb_private::Stream *s) const; void Dump(lldb_private::Stream *s) const; dw_offset_t GetOffset() const { return m_offset; } + lldb::user_id_t GetID () const; uint32_t Size() const { return m_is_dwarf64 ? 23 : 11; /* Size in bytes of the compile unit header */ } bool ContainsDIEOffset(dw_offset_t die_offset) const { return die_offset >= GetFirstDIEOffset() && die_offset < GetNextCompileUnitOffset(); } dw_offset_t GetFirstDIEOffset() const { return m_offset + Size(); } @@ -53,32 +53,35 @@ public: dw_offset_t GetAbbrevOffset() const; uint8_t GetAddressByteSize() const { return m_addr_size; } dw_addr_t GetBaseAddress() const { return m_base_addr; } + dw_addr_t GetAddrBase() const { return m_addr_base; } + void SetAddrBase(dw_addr_t addr_base, dw_offset_t base_obj_offset); void ClearDIEs(bool keep_compile_unit_die); void BuildAddressRangeTable (SymbolFileDWARF* dwarf2Data, DWARFDebugAranges* debug_aranges); + + lldb_private::TypeSystem * + GetTypeSystem(); + + DWARFFormValue::FixedFormSizes + GetFixedFormSizes (); + void SetBaseAddress(dw_addr_t base_addr) { m_base_addr = base_addr; } - const DWARFDebugInfoEntry* + DWARFDIE GetCompileUnitDIEOnly() { - ExtractDIEsIfNeeded (true); - if (m_die_array.empty()) - return NULL; - return &m_die_array[0]; + return DWARFDIE(this, GetCompileUnitDIEPtrOnly()); } - const DWARFDebugInfoEntry* - DIE() + DWARFDIE + DIE () { - ExtractDIEsIfNeeded (false); - if (m_die_array.empty()) - return NULL; - return &m_die_array[0]; + return DWARFDIE(this, DIEPtr()); } void @@ -97,6 +100,9 @@ public: m_die_array.reserve(GetDebugInfoSize() / 24); m_die_array.push_back(die); } + + void + AddCompileUnitDIE (DWARFDebugInfoEntry& die); bool HasDIEsParsed () const @@ -104,17 +110,8 @@ public: return m_die_array.size() > 1; } - DWARFDebugInfoEntry* - GetDIEAtIndexUnchecked (uint32_t idx) - { - return &m_die_array[idx]; - } - - DWARFDebugInfoEntry* - GetDIEPtr (dw_offset_t die_offset); - - const DWARFDebugInfoEntry* - GetDIEPtrContainingOffset (dw_offset_t die_offset); + DWARFDIE + GetDIE (dw_offset_t die_offset); static uint8_t GetAddressByteSize(const DWARFCompileUnit* cu); @@ -135,10 +132,7 @@ public: } void - SetUserData(void *d) - { - m_user_data = d; - } + SetUserData(void *d); bool Supports_DW_AT_APPLE_objc_complete_type (); @@ -149,15 +143,8 @@ public: bool Supports_unnamed_objc_bitfields (); -// void -// AddGlobalDIEByIndex (uint32_t die_idx); -// -// void -// AddGlobal (const DWARFDebugInfoEntry* die); -// void - Index (const uint32_t cu_idx, - NameToDIE& func_basenames, + Index (NameToDIE& func_basenames, NameToDIE& func_fullnames, NameToDIE& func_methods, NameToDIE& func_selectors, @@ -196,8 +183,24 @@ public: bool IsDWARF64() const; + bool + GetIsOptimized (); + + SymbolFileDWARFDwo* + GetDwoSymbolFile() const + { + return m_dwo_symbol_file.get(); + } + + dw_offset_t + GetBaseObjOffset() const + { + return m_base_obj_offset; + } + protected: SymbolFileDWARF* m_dwarf2Data; + std::unique_ptr<SymbolFileDWARFDwo> m_dwo_symbol_file; const DWARFAbbreviationDeclarationSet *m_abbrevs; void * m_user_data; DWARFDebugInfoEntry::collection m_die_array; // The compile unit debug information entry item @@ -213,10 +216,49 @@ protected: uint32_t m_producer_version_update; lldb::LanguageType m_language_type; bool m_is_dwarf64; - + lldb_private::LazyBool m_is_optimized; + dw_addr_t m_addr_base; // Value of DW_AT_addr_base + dw_offset_t m_base_obj_offset; // If this is a dwo compile unit this is the offset of + // the base compile unit in the main object file + void ParseProducerInfo (); + + static void + IndexPrivate (DWARFCompileUnit* dwarf_cu, + const lldb::LanguageType cu_language, + const DWARFFormValue::FixedFormSizes& fixed_form_sizes, + const dw_offset_t cu_offset, + NameToDIE& func_basenames, + NameToDIE& func_fullnames, + NameToDIE& func_methods, + NameToDIE& func_selectors, + NameToDIE& objc_class_selectors, + NameToDIE& globals, + NameToDIE& types, + NameToDIE& namespaces); + private: + + const DWARFDebugInfoEntry* + GetCompileUnitDIEPtrOnly() + { + ExtractDIEsIfNeeded (true); + if (m_die_array.empty()) + return NULL; + return &m_die_array[0]; + } + + const DWARFDebugInfoEntry* + DIEPtr() + { + ExtractDIEsIfNeeded (false); + if (m_die_array.empty()) + return NULL; + return &m_die_array[0]; + } + + DISALLOW_COPY_AND_ASSIGN (DWARFCompileUnit); }; |