1 //===-- DWARFContext.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_DWARFCONTEXT_H 11 #define LLVM_DEBUGINFO_DWARFCONTEXT_H 12 13 #include "DWARFCompileUnit.h" 14 #include "DWARFDebugAranges.h" 15 #include "DWARFDebugFrame.h" 16 #include "DWARFDebugLine.h" 17 #include "DWARFDebugRangeList.h" 18 #include "llvm/ADT/OwningPtr.h" 19 #include "llvm/ADT/SmallVector.h" 20 #include "llvm/DebugInfo/DIContext.h" 21 22 namespace llvm { 23 24 /// DWARFContext 25 /// This data structure is the top level entity that deals with dwarf debug 26 /// information parsing. The actual data is supplied through pure virtual 27 /// methods that a concrete implementation provides. 28 class DWARFContext : public DIContext { 29 SmallVector<DWARFCompileUnit, 1> CUs; 30 OwningPtr<DWARFDebugAbbrev> Abbrev; 31 OwningPtr<DWARFDebugAranges> Aranges; 32 OwningPtr<DWARFDebugLine> Line; 33 OwningPtr<DWARFDebugFrame> DebugFrame; 34 35 SmallVector<DWARFCompileUnit, 1> DWOCUs; 36 OwningPtr<DWARFDebugAbbrev> AbbrevDWO; 37 38 DWARFContext(DWARFContext &) LLVM_DELETED_FUNCTION; 39 DWARFContext &operator=(DWARFContext &) LLVM_DELETED_FUNCTION; 40 41 /// Read compile units from the debug_info section and store them in CUs. 42 void parseCompileUnits(); 43 44 /// Read compile units from the debug_info.dwo section and store them in 45 /// DWOCUs. 46 void parseDWOCompileUnits(); 47 48 public: DWARFContext()49 DWARFContext() {} 50 virtual void dump(raw_ostream &OS, DIDumpType DumpType = DIDT_All); 51 52 /// Get the number of compile units in this context. getNumCompileUnits()53 unsigned getNumCompileUnits() { 54 if (CUs.empty()) 55 parseCompileUnits(); 56 return CUs.size(); 57 } 58 59 /// Get the number of compile units in the DWO context. getNumDWOCompileUnits()60 unsigned getNumDWOCompileUnits() { 61 if (DWOCUs.empty()) 62 parseDWOCompileUnits(); 63 return DWOCUs.size(); 64 } 65 66 /// Get the compile unit at the specified index for this compile unit. getCompileUnitAtIndex(unsigned index)67 DWARFCompileUnit *getCompileUnitAtIndex(unsigned index) { 68 if (CUs.empty()) 69 parseCompileUnits(); 70 return &CUs[index]; 71 } 72 73 /// Get the compile unit at the specified index for the DWO compile units. getDWOCompileUnitAtIndex(unsigned index)74 DWARFCompileUnit *getDWOCompileUnitAtIndex(unsigned index) { 75 if (DWOCUs.empty()) 76 parseDWOCompileUnits(); 77 return &DWOCUs[index]; 78 } 79 80 /// Get a pointer to the parsed DebugAbbrev object. 81 const DWARFDebugAbbrev *getDebugAbbrev(); 82 83 /// Get a pointer to the parsed dwo abbreviations object. 84 const DWARFDebugAbbrev *getDebugAbbrevDWO(); 85 86 /// Get a pointer to the parsed DebugAranges object. 87 const DWARFDebugAranges *getDebugAranges(); 88 89 /// Get a pointer to the parsed frame information object. 90 const DWARFDebugFrame *getDebugFrame(); 91 92 /// Get a pointer to a parsed line table corresponding to a compile unit. 93 const DWARFDebugLine::LineTable * 94 getLineTableForCompileUnit(DWARFCompileUnit *cu); 95 96 virtual DILineInfo getLineInfoForAddress(uint64_t Address, 97 DILineInfoSpecifier Specifier = DILineInfoSpecifier()); 98 virtual DILineInfoTable getLineInfoForAddressRange(uint64_t Address, 99 uint64_t Size, DILineInfoSpecifier Specifier = DILineInfoSpecifier()); 100 virtual DIInliningInfo getInliningInfoForAddress(uint64_t Address, 101 DILineInfoSpecifier Specifier = DILineInfoSpecifier()); 102 103 virtual bool isLittleEndian() const = 0; 104 virtual uint8_t getAddressSize() const = 0; 105 virtual const RelocAddrMap &infoRelocMap() const = 0; 106 virtual const RelocAddrMap &lineRelocMap() const = 0; 107 virtual StringRef getInfoSection() = 0; 108 virtual StringRef getAbbrevSection() = 0; 109 virtual StringRef getARangeSection() = 0; 110 virtual StringRef getDebugFrameSection() = 0; 111 virtual StringRef getLineSection() = 0; 112 virtual StringRef getStringSection() = 0; 113 virtual StringRef getRangeSection() = 0; 114 virtual StringRef getPubNamesSection() = 0; 115 116 // Sections for DWARF5 split dwarf proposal. 117 virtual StringRef getInfoDWOSection() = 0; 118 virtual StringRef getAbbrevDWOSection() = 0; 119 virtual StringRef getStringDWOSection() = 0; 120 virtual StringRef getStringOffsetDWOSection() = 0; 121 virtual StringRef getRangeDWOSection() = 0; 122 virtual StringRef getAddrSection() = 0; 123 virtual const RelocAddrMap &infoDWORelocMap() const = 0; 124 isSupportedVersion(unsigned version)125 static bool isSupportedVersion(unsigned version) { 126 return version == 2 || version == 3; 127 } 128 private: 129 /// Return the compile unit that includes an offset (relative to .debug_info). 130 DWARFCompileUnit *getCompileUnitForOffset(uint32_t Offset); 131 132 /// Return the compile unit which contains instruction with provided 133 /// address. 134 DWARFCompileUnit *getCompileUnitForAddress(uint64_t Address); 135 }; 136 137 /// DWARFContextInMemory is the simplest possible implementation of a 138 /// DWARFContext. It assumes all content is available in memory and stores 139 /// pointers to it. 140 class DWARFContextInMemory : public DWARFContext { 141 virtual void anchor(); 142 bool IsLittleEndian; 143 uint8_t AddressSize; 144 RelocAddrMap InfoRelocMap; 145 RelocAddrMap LineRelocMap; 146 StringRef InfoSection; 147 StringRef AbbrevSection; 148 StringRef ARangeSection; 149 StringRef DebugFrameSection; 150 StringRef LineSection; 151 StringRef StringSection; 152 StringRef RangeSection; 153 StringRef PubNamesSection; 154 155 // Sections for DWARF5 split dwarf proposal. 156 RelocAddrMap InfoDWORelocMap; 157 StringRef InfoDWOSection; 158 StringRef AbbrevDWOSection; 159 StringRef StringDWOSection; 160 StringRef StringOffsetDWOSection; 161 StringRef RangeDWOSection; 162 StringRef AddrSection; 163 164 public: 165 DWARFContextInMemory(object::ObjectFile *); isLittleEndian()166 virtual bool isLittleEndian() const { return IsLittleEndian; } getAddressSize()167 virtual uint8_t getAddressSize() const { return AddressSize; } infoRelocMap()168 virtual const RelocAddrMap &infoRelocMap() const { return InfoRelocMap; } lineRelocMap()169 virtual const RelocAddrMap &lineRelocMap() const { return LineRelocMap; } getInfoSection()170 virtual StringRef getInfoSection() { return InfoSection; } getAbbrevSection()171 virtual StringRef getAbbrevSection() { return AbbrevSection; } getARangeSection()172 virtual StringRef getARangeSection() { return ARangeSection; } getDebugFrameSection()173 virtual StringRef getDebugFrameSection() { return DebugFrameSection; } getLineSection()174 virtual StringRef getLineSection() { return LineSection; } getStringSection()175 virtual StringRef getStringSection() { return StringSection; } getRangeSection()176 virtual StringRef getRangeSection() { return RangeSection; } getPubNamesSection()177 virtual StringRef getPubNamesSection() { return PubNamesSection; } 178 179 // Sections for DWARF5 split dwarf proposal. getInfoDWOSection()180 virtual StringRef getInfoDWOSection() { return InfoDWOSection; } getAbbrevDWOSection()181 virtual StringRef getAbbrevDWOSection() { return AbbrevDWOSection; } getStringDWOSection()182 virtual StringRef getStringDWOSection() { return StringDWOSection; } getStringOffsetDWOSection()183 virtual StringRef getStringOffsetDWOSection() { 184 return StringOffsetDWOSection; 185 } getRangeDWOSection()186 virtual StringRef getRangeDWOSection() { return RangeDWOSection; } getAddrSection()187 virtual StringRef getAddrSection() { 188 return AddrSection; 189 } infoDWORelocMap()190 virtual const RelocAddrMap &infoDWORelocMap() const { 191 return InfoDWORelocMap; 192 } 193 }; 194 195 } 196 197 #endif 198