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