1 //===-- DWARFUnit.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 LLVM_DEBUGINFO_DWARFUNIT_H 11 #define LLVM_DEBUGINFO_DWARFUNIT_H 12 13 #include "DWARFDebugAbbrev.h" 14 #include "DWARFDebugInfoEntry.h" 15 #include "DWARFDebugRangeList.h" 16 #include "DWARFRelocMap.h" 17 #include <vector> 18 19 namespace llvm { 20 21 namespace object { 22 class ObjectFile; 23 } 24 25 class DWARFDebugAbbrev; 26 class StringRef; 27 class raw_ostream; 28 29 class DWARFUnit { 30 const DWARFDebugAbbrev *Abbrev; 31 StringRef InfoSection; 32 StringRef RangeSection; 33 uint32_t RangeSectionBase; 34 StringRef StringSection; 35 StringRef StringOffsetSection; 36 StringRef AddrOffsetSection; 37 uint32_t AddrOffsetSectionBase; 38 const RelocAddrMap *RelocMap; 39 bool isLittleEndian; 40 41 uint32_t Offset; 42 uint32_t Length; 43 uint16_t Version; 44 const DWARFAbbreviationDeclarationSet *Abbrevs; 45 uint8_t AddrSize; 46 uint64_t BaseAddr; 47 // The compile unit debug information entry items. 48 std::vector<DWARFDebugInfoEntryMinimal> DieArray; 49 50 class DWOHolder { 51 std::unique_ptr<object::ObjectFile> DWOFile; 52 std::unique_ptr<DWARFContext> DWOContext; 53 DWARFUnit *DWOU; 54 public: 55 DWOHolder(object::ObjectFile *DWOFile); 56 DWARFUnit *getUnit() const { return DWOU; } 57 }; 58 std::unique_ptr<DWOHolder> DWO; 59 60 protected: 61 virtual bool extractImpl(DataExtractor debug_info, uint32_t *offset_ptr); 62 /// Size in bytes of the unit header. 63 virtual uint32_t getHeaderSize() const { return 11; } 64 65 public: 66 DWARFUnit(const DWARFDebugAbbrev *DA, StringRef IS, StringRef RS, 67 StringRef SS, StringRef SOS, StringRef AOS, const RelocAddrMap *M, 68 bool LE); 69 70 virtual ~DWARFUnit(); 71 72 StringRef getStringSection() const { return StringSection; } 73 StringRef getStringOffsetSection() const { return StringOffsetSection; } 74 void setAddrOffsetSection(StringRef AOS, uint32_t Base) { 75 AddrOffsetSection = AOS; 76 AddrOffsetSectionBase = Base; 77 } 78 void setRangesSection(StringRef RS, uint32_t Base) { 79 RangeSection = RS; 80 RangeSectionBase = Base; 81 } 82 83 bool getAddrOffsetSectionItem(uint32_t Index, uint64_t &Result) const; 84 // FIXME: Result should be uint64_t in DWARF64. 85 bool getStringOffsetSectionItem(uint32_t Index, uint32_t &Result) const; 86 87 DataExtractor getDebugInfoExtractor() const { 88 return DataExtractor(InfoSection, isLittleEndian, AddrSize); 89 } 90 DataExtractor getStringExtractor() const { 91 return DataExtractor(StringSection, false, 0); 92 } 93 94 const RelocAddrMap *getRelocMap() const { return RelocMap; } 95 96 bool extract(DataExtractor debug_info, uint32_t* offset_ptr); 97 98 /// extractRangeList - extracts the range list referenced by this compile 99 /// unit from .debug_ranges section. Returns true on success. 100 /// Requires that compile unit is already extracted. 101 bool extractRangeList(uint32_t RangeListOffset, 102 DWARFDebugRangeList &RangeList) const; 103 void clear(); 104 uint32_t getOffset() const { return Offset; } 105 uint32_t getNextUnitOffset() const { return Offset + Length + 4; } 106 uint32_t getLength() const { return Length; } 107 uint16_t getVersion() const { return Version; } 108 const DWARFAbbreviationDeclarationSet *getAbbreviations() const { 109 return Abbrevs; 110 } 111 uint8_t getAddressByteSize() const { return AddrSize; } 112 uint64_t getBaseAddress() const { return BaseAddr; } 113 114 void setBaseAddress(uint64_t base_addr) { 115 BaseAddr = base_addr; 116 } 117 118 const DWARFDebugInfoEntryMinimal * 119 getCompileUnitDIE(bool extract_cu_die_only = true) { 120 extractDIEsIfNeeded(extract_cu_die_only); 121 return DieArray.empty() ? nullptr : &DieArray[0]; 122 } 123 124 const char *getCompilationDir(); 125 uint64_t getDWOId(); 126 127 void collectAddressRanges(DWARFAddressRangesVector &CURanges); 128 129 /// getInlinedChainForAddress - fetches inlined chain for a given address. 130 /// Returns empty chain if there is no subprogram containing address. The 131 /// chain is valid as long as parsed compile unit DIEs are not cleared. 132 DWARFDebugInfoEntryInlinedChain getInlinedChainForAddress(uint64_t Address); 133 134 private: 135 /// Size in bytes of the .debug_info data associated with this compile unit. 136 size_t getDebugInfoSize() const { return Length + 4 - getHeaderSize(); } 137 138 /// extractDIEsIfNeeded - Parses a compile unit and indexes its DIEs if it 139 /// hasn't already been done. Returns the number of DIEs parsed at this call. 140 size_t extractDIEsIfNeeded(bool CUDieOnly); 141 /// extractDIEsToVector - Appends all parsed DIEs to a vector. 142 void extractDIEsToVector(bool AppendCUDie, bool AppendNonCUDIEs, 143 std::vector<DWARFDebugInfoEntryMinimal> &DIEs) const; 144 /// setDIERelations - We read in all of the DIE entries into our flat list 145 /// of DIE entries and now we need to go back through all of them and set the 146 /// parent, sibling and child pointers for quick DIE navigation. 147 void setDIERelations(); 148 /// clearDIEs - Clear parsed DIEs to keep memory usage low. 149 void clearDIEs(bool KeepCUDie); 150 151 /// parseDWO - Parses .dwo file for current compile unit. Returns true if 152 /// it was actually constructed. 153 bool parseDWO(); 154 155 /// getSubprogramForAddress - Returns subprogram DIE with address range 156 /// encompassing the provided address. The pointer is alive as long as parsed 157 /// compile unit DIEs are not cleared. 158 const DWARFDebugInfoEntryMinimal *getSubprogramForAddress(uint64_t Address); 159 }; 160 161 } 162 163 #endif 164