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