1 //===-- DWARFCompileUnit.h --------------------------------------*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 #ifndef SymbolFileDWARF_DWARFCompileUnit_h_
11 #define SymbolFileDWARF_DWARFCompileUnit_h_
13 #include "DWARFDebugInfoEntry.h"
14 #include "SymbolFileDWARF.h"
18 class DWARFCompileUnit
30 DWARFCompileUnit(SymbolFileDWARF* dwarf2Data);
32 bool Extract(const lldb_private::DWARFDataExtractor &debug_info, lldb::offset_t *offset_ptr);
33 size_t ExtractDIEsIfNeeded (bool cu_die_only);
35 const dw_addr_t address,
36 DWARFDebugInfoEntry** function_die,
37 DWARFDebugInfoEntry** block_die);
39 size_t AppendDIEsWithTag (const dw_tag_t tag, DWARFDIECollection& matching_dies, uint32_t depth = UINT32_MAX) const;
41 bool Verify(lldb_private::Stream *s) const;
42 void Dump(lldb_private::Stream *s) const;
43 dw_offset_t GetOffset() const { return m_offset; }
44 uint32_t Size() const { return m_is_dwarf64 ? 23 : 11; /* Size in bytes of the compile unit header */ }
45 bool ContainsDIEOffset(dw_offset_t die_offset) const { return die_offset >= GetFirstDIEOffset() && die_offset < GetNextCompileUnitOffset(); }
46 dw_offset_t GetFirstDIEOffset() const { return m_offset + Size(); }
47 dw_offset_t GetNextCompileUnitOffset() const { return m_offset + m_length + (m_is_dwarf64 ? 12 : 4); }
48 size_t GetDebugInfoSize() const { return m_length + (m_is_dwarf64 ? 12 : 4) - Size(); /* Size in bytes of the .debug_info data associated with this compile unit. */ }
49 uint32_t GetLength() const { return m_length; }
50 uint16_t GetVersion() const { return m_version; }
51 const DWARFAbbreviationDeclarationSet* GetAbbreviations() const { return m_abbrevs; }
52 dw_offset_t GetAbbrevOffset() const;
53 uint8_t GetAddressByteSize() const { return m_addr_size; }
54 dw_addr_t GetBaseAddress() const { return m_base_addr; }
55 void ClearDIEs(bool keep_compile_unit_die);
56 void BuildAddressRangeTable (SymbolFileDWARF* dwarf2Data,
57 DWARFDebugAranges* debug_aranges);
60 SetBaseAddress(dw_addr_t base_addr)
62 m_base_addr = base_addr;
65 const DWARFDebugInfoEntry*
66 GetCompileUnitDIEOnly()
68 ExtractDIEsIfNeeded (true);
69 if (m_die_array.empty())
71 return &m_die_array[0];
74 const DWARFDebugInfoEntry*
77 ExtractDIEsIfNeeded (false);
78 if (m_die_array.empty())
80 return &m_die_array[0];
84 AddDIE (DWARFDebugInfoEntry& die)
86 // The average bytes per DIE entry has been seen to be
87 // around 14-20 so lets pre-reserve half of that since
88 // we are now stripping the NULL tags.
90 // Only reserve the memory if we are adding children of
91 // the main compile unit DIE. The compile unit DIE is always
92 // the first entry, so if our size is 1, then we are adding
93 // the first compile unit child DIE and should reserve
95 if (m_die_array.empty())
96 m_die_array.reserve(GetDebugInfoSize() / 24);
97 m_die_array.push_back(die);
101 HasDIEsParsed () const
103 return m_die_array.size() > 1;
107 GetDIEAtIndexUnchecked (uint32_t idx)
109 return &m_die_array[idx];
113 GetDIEPtr (dw_offset_t die_offset);
115 const DWARFDebugInfoEntry*
116 GetDIEPtrContainingOffset (dw_offset_t die_offset);
119 GetAddressByteSize(const DWARFCompileUnit* cu);
122 IsDWARF64(const DWARFCompileUnit* cu);
125 GetDefaultAddressSize();
128 SetDefaultAddressSize(uint8_t addr_size);
143 Supports_DW_AT_APPLE_objc_complete_type ();
146 DW_AT_decl_file_attributes_are_invalid();
149 Supports_unnamed_objc_bitfields ();
152 // AddGlobalDIEByIndex (uint32_t die_idx);
155 // AddGlobal (const DWARFDebugInfoEntry* die);
158 Index (const uint32_t cu_idx,
159 NameToDIE& func_basenames,
160 NameToDIE& func_fullnames,
161 NameToDIE& func_methods,
162 NameToDIE& func_selectors,
163 NameToDIE& objc_class_selectors,
166 NameToDIE& namespaces);
168 const DWARFDebugAranges &
169 GetFunctionAranges ();
172 GetSymbolFileDWARF () const
181 GetProducerVersionMajor();
184 GetProducerVersionMinor();
187 GetProducerVersionUpdate();
193 SymbolFileDWARF* m_dwarf2Data;
194 const DWARFAbbreviationDeclarationSet *m_abbrevs;
196 DWARFDebugInfoEntry::collection m_die_array; // The compile unit debug information entry item
197 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
198 dw_addr_t m_base_addr;
199 dw_offset_t m_offset;
200 dw_offset_t m_length;
204 uint32_t m_producer_version_major;
205 uint32_t m_producer_version_minor;
206 uint32_t m_producer_version_update;
210 ParseProducerInfo ();
212 DISALLOW_COPY_AND_ASSIGN (DWARFCompileUnit);
215 #endif // SymbolFileDWARF_DWARFCompileUnit_h_