124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- DWARFCompileUnit.h --------------------------------------*- C++ -*-===//
224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                     The LLVM Compiler Infrastructure
424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// This file is distributed under the University of Illinois Open Source
624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// License. See LICENSE.TXT for details.
724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===----------------------------------------------------------------------===//
924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
10144188bc458a35997d2f2e52206ab69747439073Greg Clayton#ifndef SymbolFileDWARF_DWARFCompileUnit_h_
1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#define SymbolFileDWARF_DWARFCompileUnit_h_
1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "DWARFDebugInfoEntry.h"
14144188bc458a35997d2f2e52206ab69747439073Greg Clayton#include "SymbolFileDWARF.h"
1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1674124754d6d8ffda5bdaef8ac87e7faaeef3b358Greg Claytonclass NameToDIE;
1774124754d6d8ffda5bdaef8ac87e7faaeef3b358Greg Clayton
1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass DWARFCompileUnit
1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic:
21e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton    enum Producer
22e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton    {
23e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton        eProducerInvalid = 0,
24e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton        eProducerClang,
25e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton        eProducerGCC,
2614fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton        eProducerLLVMGCC,
27e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton        eProcucerOther
28e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton    };
29e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton
3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    DWARFCompileUnit(SymbolFileDWARF* dwarf2Data);
3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3236da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton    bool        Extract(const lldb_private::DataExtractor &debug_info, lldb::offset_t *offset_ptr);
3336da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton    dw_offset_t Extract(lldb::offset_t offset, const lldb_private::DataExtractor& debug_info_data, const DWARFAbbreviationDeclarationSet* abbrevs);
3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    size_t      ExtractDIEsIfNeeded (bool cu_die_only);
3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool        LookupAddress(
3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    const dw_addr_t address,
3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    DWARFDebugInfoEntry** function_die,
3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    DWARFDebugInfoEntry** block_die);
3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
40178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton    size_t      AppendDIEsWithTag (const dw_tag_t tag, DWARFDIECollection& matching_dies, uint32_t depth = UINT32_MAX) const;
4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void        Clear();
4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool        Verify(lldb_private::Stream *s) const;
4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void        Dump(lldb_private::Stream *s) const;
4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    dw_offset_t GetOffset() const { return m_offset; }
4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t    Size() const { return 11; /* Size in bytes of the compile unit header */ }
4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool        ContainsDIEOffset(dw_offset_t die_offset) const { return die_offset >= GetFirstDIEOffset() && die_offset < GetNextCompileUnitOffset(); }
4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    dw_offset_t GetFirstDIEOffset() const { return m_offset + Size(); }
4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    dw_offset_t GetNextCompileUnitOffset() const { return m_offset + m_length + 4; }
4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    size_t      GetDebugInfoSize() const { return m_length + 4 - Size(); /* Size in bytes of the .debug_info data associated with this compile unit. */ }
5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t    GetLength() const { return m_length; }
5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint16_t    GetVersion() const { return m_version; }
5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const DWARFAbbreviationDeclarationSet*  GetAbbreviations() const { return m_abbrevs; }
5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    dw_offset_t GetAbbrevOffset() const;
5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint8_t     GetAddressByteSize() const { return m_addr_size; }
5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    dw_addr_t   GetBaseAddress() const { return m_base_addr; }
5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void        ClearDIEs(bool keep_compile_unit_die);
57144188bc458a35997d2f2e52206ab69747439073Greg Clayton    void        BuildAddressRangeTable (SymbolFileDWARF* dwarf2Data,
58144188bc458a35997d2f2e52206ab69747439073Greg Clayton                                        DWARFDebugAranges* debug_aranges,
59144188bc458a35997d2f2e52206ab69747439073Greg Clayton                                        bool clear_dies_if_already_not_parsed);
6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SetBaseAddress(dw_addr_t base_addr)
6324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
6424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_base_addr = base_addr;
6524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
6624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
6724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const DWARFDebugInfoEntry*
6824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetCompileUnitDIEOnly()
6924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
7024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        ExtractDIEsIfNeeded (true);
7124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (m_die_array.empty())
7224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return NULL;
7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return &m_die_array[0];
7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
7624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const DWARFDebugInfoEntry*
7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    DIE()
7824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        ExtractDIEsIfNeeded (false);
8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (m_die_array.empty())
8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return NULL;
8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return &m_die_array[0];
8324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
86c5b3f5025871a8f359c08f242894af00178d08ddGreg Clayton    AddDIE (DWARFDebugInfoEntry& die)
8724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
8824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // The average bytes per DIE entry has been seen to be
89c5b3f5025871a8f359c08f242894af00178d08ddGreg Clayton        // around 14-20 so lets pre-reserve half of that since
90c5b3f5025871a8f359c08f242894af00178d08ddGreg Clayton        // we are now stripping the NULL tags.
9124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
9224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // Only reserve the memory if we are adding children of
9324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // the main compile unit DIE. The compile unit DIE is always
9424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // the first entry, so if our size is 1, then we are adding
9524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // the first compile unit child DIE and should reserve
9624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // the memory.
9724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (m_die_array.empty())
98c5b3f5025871a8f359c08f242894af00178d08ddGreg Clayton            m_die_array.reserve(GetDebugInfoSize() / 24);
9924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_die_array.push_back(die);
10024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
10124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
102b5c023af6df0f4f9eddd14284ca986f578c6bee2Greg Clayton    bool
103b5c023af6df0f4f9eddd14284ca986f578c6bee2Greg Clayton    HasDIEsParsed () const
104b5c023af6df0f4f9eddd14284ca986f578c6bee2Greg Clayton    {
105b5c023af6df0f4f9eddd14284ca986f578c6bee2Greg Clayton        return m_die_array.size() > 1;
106b5c023af6df0f4f9eddd14284ca986f578c6bee2Greg Clayton    }
107b5c023af6df0f4f9eddd14284ca986f578c6bee2Greg Clayton
10824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    DWARFDebugInfoEntry*
10974124754d6d8ffda5bdaef8ac87e7faaeef3b358Greg Clayton    GetDIEAtIndexUnchecked (uint32_t idx)
11074124754d6d8ffda5bdaef8ac87e7faaeef3b358Greg Clayton    {
11174124754d6d8ffda5bdaef8ac87e7faaeef3b358Greg Clayton        return &m_die_array[idx];
11274124754d6d8ffda5bdaef8ac87e7faaeef3b358Greg Clayton    }
11374124754d6d8ffda5bdaef8ac87e7faaeef3b358Greg Clayton
11474124754d6d8ffda5bdaef8ac87e7faaeef3b358Greg Clayton    DWARFDebugInfoEntry*
11524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetDIEPtr (dw_offset_t die_offset);
11624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
11724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const DWARFDebugInfoEntry*
11824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetDIEPtrContainingOffset (dw_offset_t die_offset);
11924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
12024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    static uint8_t
12124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetAddressByteSize(const DWARFCompileUnit* cu);
12224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
12324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    static uint8_t
12424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetDefaultAddressSize();
12574124754d6d8ffda5bdaef8ac87e7faaeef3b358Greg Clayton
12624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    static void
12724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SetDefaultAddressSize(uint8_t addr_size);
12824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
12924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void *
13024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetUserData() const
13124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
13224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return m_user_data;
13324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
13424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
13524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
13624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SetUserData(void *d)
13724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
13824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_user_data = d;
13924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
14024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
141e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton    bool
142e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton    Supports_DW_AT_APPLE_objc_complete_type ();
143e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton
144e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton    bool
145e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton    DW_AT_decl_file_attributes_are_invalid();
14624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
14714fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton    bool
14814fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton    Supports_unnamed_objc_bitfields ();
14914fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton
15074124754d6d8ffda5bdaef8ac87e7faaeef3b358Greg Clayton//    void
15174124754d6d8ffda5bdaef8ac87e7faaeef3b358Greg Clayton//    AddGlobalDIEByIndex (uint32_t die_idx);
15274124754d6d8ffda5bdaef8ac87e7faaeef3b358Greg Clayton//
15374124754d6d8ffda5bdaef8ac87e7faaeef3b358Greg Clayton//    void
15474124754d6d8ffda5bdaef8ac87e7faaeef3b358Greg Clayton//    AddGlobal (const DWARFDebugInfoEntry* die);
15574124754d6d8ffda5bdaef8ac87e7faaeef3b358Greg Clayton//
15624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
15774124754d6d8ffda5bdaef8ac87e7faaeef3b358Greg Clayton    Index (const uint32_t cu_idx,
1580e0e81dada17e960cc7e35b9e91aaad56b99582eGreg Clayton           NameToDIE& func_basenames,
1590e0e81dada17e960cc7e35b9e91aaad56b99582eGreg Clayton           NameToDIE& func_fullnames,
1600e0e81dada17e960cc7e35b9e91aaad56b99582eGreg Clayton           NameToDIE& func_methods,
1610e0e81dada17e960cc7e35b9e91aaad56b99582eGreg Clayton           NameToDIE& func_selectors,
1620e0e81dada17e960cc7e35b9e91aaad56b99582eGreg Clayton           NameToDIE& objc_class_selectors,
1630e0e81dada17e960cc7e35b9e91aaad56b99582eGreg Clayton           NameToDIE& globals,
1640e0e81dada17e960cc7e35b9e91aaad56b99582eGreg Clayton           NameToDIE& types,
165144188bc458a35997d2f2e52206ab69747439073Greg Clayton           NameToDIE& namespaces);
16612bec71b323dc520f0e985a86e09c4712559e115Greg Clayton
167144188bc458a35997d2f2e52206ab69747439073Greg Clayton    const DWARFDebugAranges &
168144188bc458a35997d2f2e52206ab69747439073Greg Clayton    GetFunctionAranges ();
16924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
17059857327d22aa88e30349d14535cdf515166529eGreg Clayton    SymbolFileDWARF*
17159857327d22aa88e30349d14535cdf515166529eGreg Clayton    GetSymbolFileDWARF () const
17259857327d22aa88e30349d14535cdf515166529eGreg Clayton    {
17359857327d22aa88e30349d14535cdf515166529eGreg Clayton        return m_dwarf2Data;
17459857327d22aa88e30349d14535cdf515166529eGreg Clayton    }
175e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton
176e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton    Producer
177e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton    GetProducer ();
178e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton
17914fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton    uint32_t
18014fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton    GetProducerVersionMajor();
18114fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton
18214fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton    uint32_t
18314fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton    GetProducerVersionMinor();
18414fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton
18514fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton    uint32_t
18614fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton    GetProducerVersionUpdate();
18759857327d22aa88e30349d14535cdf515166529eGreg Clayton
18824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerprotected:
18924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SymbolFileDWARF*    m_dwarf2Data;
190144188bc458a35997d2f2e52206ab69747439073Greg Clayton    const DWARFAbbreviationDeclarationSet *m_abbrevs;
191144188bc458a35997d2f2e52206ab69747439073Greg Clayton    void *              m_user_data;
192144188bc458a35997d2f2e52206ab69747439073Greg Clayton    DWARFDebugInfoEntry::collection m_die_array;    // The compile unit debug information entry item
193102b2c2681c9a830afe25bfea35557421905e42cGreg Clayton    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
194144188bc458a35997d2f2e52206ab69747439073Greg Clayton    dw_addr_t           m_base_addr;
19524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    dw_offset_t         m_offset;
19624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t            m_length;
19724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint16_t            m_version;
19824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint8_t             m_addr_size;
199e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton    Producer            m_producer;
20014fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton    uint32_t            m_producer_version_major;
20114fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton    uint32_t            m_producer_version_minor;
20214fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton    uint32_t            m_producer_version_update;
20314fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton
20414fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton    void
20514fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton    ParseProducerInfo ();
20624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerprivate:
20724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    DISALLOW_COPY_AND_ASSIGN (DWARFCompileUnit);
20824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner};
20924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
21024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#endif  // SymbolFileDWARF_DWARFCompileUnit_h_
211