1//===-- DWARFCompileUnit.h --------------------------------------*- C++ -*-===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#ifndef SymbolFileDWARF_DWARFCompileUnit_h_
11#define SymbolFileDWARF_DWARFCompileUnit_h_
12
13#include "DWARFDebugInfoEntry.h"
14#include "SymbolFileDWARF.h"
15
16class NameToDIE;
17
18class DWARFCompileUnit
19{
20public:
21    enum Producer
22    {
23        eProducerInvalid = 0,
24        eProducerClang,
25        eProducerGCC,
26        eProducerLLVMGCC,
27        eProcucerOther
28    };
29
30    DWARFCompileUnit(SymbolFileDWARF* dwarf2Data);
31
32    bool        Extract(const lldb_private::DataExtractor &debug_info, lldb::offset_t *offset_ptr);
33    dw_offset_t Extract(lldb::offset_t offset, const lldb_private::DataExtractor& debug_info_data, const DWARFAbbreviationDeclarationSet* abbrevs);
34    size_t      ExtractDIEsIfNeeded (bool cu_die_only);
35    bool        LookupAddress(
36                    const dw_addr_t address,
37                    DWARFDebugInfoEntry** function_die,
38                    DWARFDebugInfoEntry** block_die);
39
40    size_t      AppendDIEsWithTag (const dw_tag_t tag, DWARFDIECollection& matching_dies, uint32_t depth = UINT32_MAX) const;
41    void        Clear();
42    bool        Verify(lldb_private::Stream *s) const;
43    void        Dump(lldb_private::Stream *s) const;
44    dw_offset_t GetOffset() const { return m_offset; }
45    uint32_t    Size() const { return 11; /* Size in bytes of the compile unit header */ }
46    bool        ContainsDIEOffset(dw_offset_t die_offset) const { return die_offset >= GetFirstDIEOffset() && die_offset < GetNextCompileUnitOffset(); }
47    dw_offset_t GetFirstDIEOffset() const { return m_offset + Size(); }
48    dw_offset_t GetNextCompileUnitOffset() const { return m_offset + m_length + 4; }
49    size_t      GetDebugInfoSize() const { return m_length + 4 - Size(); /* Size in bytes of the .debug_info data associated with this compile unit. */ }
50    uint32_t    GetLength() const { return m_length; }
51    uint16_t    GetVersion() const { return m_version; }
52    const DWARFAbbreviationDeclarationSet*  GetAbbreviations() const { return m_abbrevs; }
53    dw_offset_t GetAbbrevOffset() const;
54    uint8_t     GetAddressByteSize() const { return m_addr_size; }
55    dw_addr_t   GetBaseAddress() const { return m_base_addr; }
56    void        ClearDIEs(bool keep_compile_unit_die);
57    void        BuildAddressRangeTable (SymbolFileDWARF* dwarf2Data,
58                                        DWARFDebugAranges* debug_aranges,
59                                        bool clear_dies_if_already_not_parsed);
60
61    void
62    SetBaseAddress(dw_addr_t base_addr)
63    {
64        m_base_addr = base_addr;
65    }
66
67    const DWARFDebugInfoEntry*
68    GetCompileUnitDIEOnly()
69    {
70        ExtractDIEsIfNeeded (true);
71        if (m_die_array.empty())
72            return NULL;
73        return &m_die_array[0];
74    }
75
76    const DWARFDebugInfoEntry*
77    DIE()
78    {
79        ExtractDIEsIfNeeded (false);
80        if (m_die_array.empty())
81            return NULL;
82        return &m_die_array[0];
83    }
84
85    void
86    AddDIE (DWARFDebugInfoEntry& die)
87    {
88        // The average bytes per DIE entry has been seen to be
89        // around 14-20 so lets pre-reserve half of that since
90        // we are now stripping the NULL tags.
91
92        // Only reserve the memory if we are adding children of
93        // the main compile unit DIE. The compile unit DIE is always
94        // the first entry, so if our size is 1, then we are adding
95        // the first compile unit child DIE and should reserve
96        // the memory.
97        if (m_die_array.empty())
98            m_die_array.reserve(GetDebugInfoSize() / 24);
99        m_die_array.push_back(die);
100    }
101
102    bool
103    HasDIEsParsed () const
104    {
105        return m_die_array.size() > 1;
106    }
107
108    DWARFDebugInfoEntry*
109    GetDIEAtIndexUnchecked (uint32_t idx)
110    {
111        return &m_die_array[idx];
112    }
113
114    DWARFDebugInfoEntry*
115    GetDIEPtr (dw_offset_t die_offset);
116
117    const DWARFDebugInfoEntry*
118    GetDIEPtrContainingOffset (dw_offset_t die_offset);
119
120    static uint8_t
121    GetAddressByteSize(const DWARFCompileUnit* cu);
122
123    static uint8_t
124    GetDefaultAddressSize();
125
126    static void
127    SetDefaultAddressSize(uint8_t addr_size);
128
129    void *
130    GetUserData() const
131    {
132        return m_user_data;
133    }
134
135    void
136    SetUserData(void *d)
137    {
138        m_user_data = d;
139    }
140
141    bool
142    Supports_DW_AT_APPLE_objc_complete_type ();
143
144    bool
145    DW_AT_decl_file_attributes_are_invalid();
146
147    bool
148    Supports_unnamed_objc_bitfields ();
149
150//    void
151//    AddGlobalDIEByIndex (uint32_t die_idx);
152//
153//    void
154//    AddGlobal (const DWARFDebugInfoEntry* die);
155//
156    void
157    Index (const uint32_t cu_idx,
158           NameToDIE& func_basenames,
159           NameToDIE& func_fullnames,
160           NameToDIE& func_methods,
161           NameToDIE& func_selectors,
162           NameToDIE& objc_class_selectors,
163           NameToDIE& globals,
164           NameToDIE& types,
165           NameToDIE& namespaces);
166
167    const DWARFDebugAranges &
168    GetFunctionAranges ();
169
170    SymbolFileDWARF*
171    GetSymbolFileDWARF () const
172    {
173        return m_dwarf2Data;
174    }
175
176    Producer
177    GetProducer ();
178
179    uint32_t
180    GetProducerVersionMajor();
181
182    uint32_t
183    GetProducerVersionMinor();
184
185    uint32_t
186    GetProducerVersionUpdate();
187
188protected:
189    SymbolFileDWARF*    m_dwarf2Data;
190    const DWARFAbbreviationDeclarationSet *m_abbrevs;
191    void *              m_user_data;
192    DWARFDebugInfoEntry::collection m_die_array;    // The compile unit debug information entry item
193    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
194    dw_addr_t           m_base_addr;
195    dw_offset_t         m_offset;
196    uint32_t            m_length;
197    uint16_t            m_version;
198    uint8_t             m_addr_size;
199    Producer            m_producer;
200    uint32_t            m_producer_version_major;
201    uint32_t            m_producer_version_minor;
202    uint32_t            m_producer_version_update;
203
204    void
205    ParseProducerInfo ();
206private:
207    DISALLOW_COPY_AND_ASSIGN (DWARFCompileUnit);
208};
209
210#endif  // SymbolFileDWARF_DWARFCompileUnit_h_
211