DWARFCompileUnit.h revision 263363
155714Skris//===-- DWARFCompileUnit.h --------------------------------------*- C++ -*-===// 255714Skris// 355714Skris// The LLVM Compiler Infrastructure 455714Skris// 555714Skris// This file is distributed under the University of Illinois Open Source 655714Skris// License. See LICENSE.TXT for details. 755714Skris// 855714Skris//===----------------------------------------------------------------------===// 955714Skris 1055714Skris#ifndef SymbolFileDWARF_DWARFCompileUnit_h_ 1155714Skris#define SymbolFileDWARF_DWARFCompileUnit_h_ 1255714Skris 1355714Skris#include "DWARFDebugInfoEntry.h" 1455714Skris#include "SymbolFileDWARF.h" 1555714Skris 1655714Skrisclass NameToDIE; 1755714Skris 1855714Skrisclass DWARFCompileUnit 1955714Skris{ 2055714Skrispublic: 2155714Skris enum Producer 2255714Skris { 2355714Skris eProducerInvalid = 0, 2455714Skris eProducerClang, 2555714Skris eProducerGCC, 2655714Skris eProducerLLVMGCC, 2755714Skris eProcucerOther 2855714Skris }; 2955714Skris 3055714Skris DWARFCompileUnit(SymbolFileDWARF* dwarf2Data); 3155714Skris 3255714Skris bool Extract(const lldb_private::DWARFDataExtractor &debug_info, lldb::offset_t *offset_ptr); 3355714Skris size_t ExtractDIEsIfNeeded (bool cu_die_only); 3455714Skris bool LookupAddress( 3555714Skris const dw_addr_t address, 3655714Skris DWARFDebugInfoEntry** function_die, 3755714Skris DWARFDebugInfoEntry** block_die); 3855714Skris 3955714Skris size_t AppendDIEsWithTag (const dw_tag_t tag, DWARFDIECollection& matching_dies, uint32_t depth = UINT32_MAX) const; 4055714Skris void Clear(); 4155714Skris bool Verify(lldb_private::Stream *s) const; 4255714Skris void Dump(lldb_private::Stream *s) const; 4355714Skris dw_offset_t GetOffset() const { return m_offset; } 4455714Skris uint32_t Size() const { return 11; /* Size in bytes of the compile unit header */ } 4555714Skris bool ContainsDIEOffset(dw_offset_t die_offset) const { return die_offset >= GetFirstDIEOffset() && die_offset < GetNextCompileUnitOffset(); } 4655714Skris dw_offset_t GetFirstDIEOffset() const { return m_offset + Size(); } 4755714Skris dw_offset_t GetNextCompileUnitOffset() const { return m_offset + m_length + 4; } 4855714Skris size_t GetDebugInfoSize() const { return m_length + 4 - Size(); /* Size in bytes of the .debug_info data associated with this compile unit. */ } 4955714Skris uint32_t GetLength() const { return m_length; } 5055714Skris uint16_t GetVersion() const { return m_version; } 5155714Skris const DWARFAbbreviationDeclarationSet* GetAbbreviations() const { return m_abbrevs; } 5255714Skris dw_offset_t GetAbbrevOffset() const; 5355714Skris uint8_t GetAddressByteSize() const { return m_addr_size; } 5455714Skris dw_addr_t GetBaseAddress() const { return m_base_addr; } 5555714Skris void ClearDIEs(bool keep_compile_unit_die); 5655714Skris void BuildAddressRangeTable (SymbolFileDWARF* dwarf2Data, 5755714Skris DWARFDebugAranges* debug_aranges, 5855714Skris bool clear_dies_if_already_not_parsed); 5955714Skris 6055714Skris void 6155714Skris SetBaseAddress(dw_addr_t base_addr) 6255714Skris { 6355714Skris m_base_addr = base_addr; 6455714Skris } 6555714Skris 6655714Skris const DWARFDebugInfoEntry* 6755714Skris GetCompileUnitDIEOnly() 6855714Skris { 6955714Skris ExtractDIEsIfNeeded (true); 7055714Skris if (m_die_array.empty()) 7155714Skris return NULL; 7255714Skris return &m_die_array[0]; 7355714Skris } 7455714Skris 7555714Skris const DWARFDebugInfoEntry* 7655714Skris DIE() 7755714Skris { 7855714Skris ExtractDIEsIfNeeded (false); 7955714Skris if (m_die_array.empty()) 8055714Skris return NULL; 8155714Skris return &m_die_array[0]; 8255714Skris } 8355714Skris 8455714Skris void 8555714Skris AddDIE (DWARFDebugInfoEntry& die) 8655714Skris { 8755714Skris // The average bytes per DIE entry has been seen to be 8855714Skris // around 14-20 so lets pre-reserve half of that since 8955714Skris // we are now stripping the NULL tags. 9055714Skris 9155714Skris // Only reserve the memory if we are adding children of 9255714Skris // the main compile unit DIE. The compile unit DIE is always 9355714Skris // the first entry, so if our size is 1, then we are adding 9455714Skris // the first compile unit child DIE and should reserve 9555714Skris // the memory. 9655714Skris if (m_die_array.empty()) 9755714Skris m_die_array.reserve(GetDebugInfoSize() / 24); 9855714Skris m_die_array.push_back(die); 9955714Skris } 10055714Skris 10155714Skris bool 10255714Skris HasDIEsParsed () const 10355714Skris { 10455714Skris return m_die_array.size() > 1; 10555714Skris } 10655714Skris 10755714Skris DWARFDebugInfoEntry* 10855714Skris GetDIEAtIndexUnchecked (uint32_t idx) 10955714Skris { 11055714Skris return &m_die_array[idx]; 11155714Skris } 11255714Skris 11355714Skris DWARFDebugInfoEntry* 11455714Skris GetDIEPtr (dw_offset_t die_offset); 11555714Skris 11655714Skris const DWARFDebugInfoEntry* 11755714Skris GetDIEPtrContainingOffset (dw_offset_t die_offset); 11855714Skris 11955714Skris static uint8_t 12055714Skris GetAddressByteSize(const DWARFCompileUnit* cu); 12155714Skris 12255714Skris static uint8_t 12355714Skris GetDefaultAddressSize(); 12455714Skris 125 static void 126 SetDefaultAddressSize(uint8_t addr_size); 127 128 void * 129 GetUserData() const 130 { 131 return m_user_data; 132 } 133 134 void 135 SetUserData(void *d) 136 { 137 m_user_data = d; 138 } 139 140 bool 141 Supports_DW_AT_APPLE_objc_complete_type (); 142 143 bool 144 DW_AT_decl_file_attributes_are_invalid(); 145 146 bool 147 Supports_unnamed_objc_bitfields (); 148 149// void 150// AddGlobalDIEByIndex (uint32_t die_idx); 151// 152// void 153// AddGlobal (const DWARFDebugInfoEntry* die); 154// 155 void 156 Index (const uint32_t cu_idx, 157 NameToDIE& func_basenames, 158 NameToDIE& func_fullnames, 159 NameToDIE& func_methods, 160 NameToDIE& func_selectors, 161 NameToDIE& objc_class_selectors, 162 NameToDIE& globals, 163 NameToDIE& types, 164 NameToDIE& namespaces); 165 166 const DWARFDebugAranges & 167 GetFunctionAranges (); 168 169 SymbolFileDWARF* 170 GetSymbolFileDWARF () const 171 { 172 return m_dwarf2Data; 173 } 174 175 Producer 176 GetProducer (); 177 178 uint32_t 179 GetProducerVersionMajor(); 180 181 uint32_t 182 GetProducerVersionMinor(); 183 184 uint32_t 185 GetProducerVersionUpdate(); 186 187protected: 188 SymbolFileDWARF* m_dwarf2Data; 189 const DWARFAbbreviationDeclarationSet *m_abbrevs; 190 void * m_user_data; 191 DWARFDebugInfoEntry::collection m_die_array; // The compile unit debug information entry item 192 std::unique_ptr<DWARFDebugAranges> m_func_aranges_ap; // A table similar to the .debug_aranges table, but this one points to the exact DW_TAG_subprogram DIEs 193 dw_addr_t m_base_addr; 194 dw_offset_t m_offset; 195 uint32_t m_length; 196 uint16_t m_version; 197 uint8_t m_addr_size; 198 Producer m_producer; 199 uint32_t m_producer_version_major; 200 uint32_t m_producer_version_minor; 201 uint32_t m_producer_version_update; 202 203 void 204 ParseProducerInfo (); 205private: 206 DISALLOW_COPY_AND_ASSIGN (DWARFCompileUnit); 207}; 208 209#endif // SymbolFileDWARF_DWARFCompileUnit_h_ 210