1 //===-- DIContext.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 // This file defines DIContext, an abstract data structure that holds 11 // debug information data. 12 // 13 //===----------------------------------------------------------------------===// 14 15 #ifndef LLVM_DEBUGINFO_DICONTEXT_H 16 #define LLVM_DEBUGINFO_DICONTEXT_H 17 18 #include "llvm/ADT/DenseMap.h" 19 #include "llvm/ADT/SmallVector.h" 20 #include "llvm/Object/ObjectFile.h" 21 #include "llvm/Object/RelocVisitor.h" 22 #include "llvm/Support/Casting.h" 23 #include "llvm/Support/DataTypes.h" 24 #include <string> 25 26 namespace llvm { 27 28 class raw_ostream; 29 30 /// DILineInfo - a format-neutral container for source line information. 31 struct DILineInfo { 32 std::string FileName; 33 std::string FunctionName; 34 uint32_t Line; 35 uint32_t Column; 36 DILineInfoDILineInfo37 DILineInfo() 38 : FileName("<invalid>"), FunctionName("<invalid>"), Line(0), Column(0) {} 39 40 bool operator==(const DILineInfo &RHS) const { 41 return Line == RHS.Line && Column == RHS.Column && 42 FileName == RHS.FileName && FunctionName == RHS.FunctionName; 43 } 44 bool operator!=(const DILineInfo &RHS) const { 45 return !(*this == RHS); 46 } 47 }; 48 49 typedef SmallVector<std::pair<uint64_t, DILineInfo>, 16> DILineInfoTable; 50 51 /// DIInliningInfo - a format-neutral container for inlined code description. 52 class DIInliningInfo { 53 SmallVector<DILineInfo, 4> Frames; 54 public: DIInliningInfo()55 DIInliningInfo() {} getFrame(unsigned Index)56 DILineInfo getFrame(unsigned Index) const { 57 assert(Index < Frames.size()); 58 return Frames[Index]; 59 } getNumberOfFrames()60 uint32_t getNumberOfFrames() const { 61 return Frames.size(); 62 } addFrame(const DILineInfo & Frame)63 void addFrame(const DILineInfo &Frame) { 64 Frames.push_back(Frame); 65 } 66 }; 67 68 /// A DINameKind is passed to name search methods to specify a 69 /// preference regarding the type of name resolution the caller wants. 70 enum class DINameKind { None, ShortName, LinkageName }; 71 72 /// DILineInfoSpecifier - controls which fields of DILineInfo container 73 /// should be filled with data. 74 struct DILineInfoSpecifier { 75 enum class FileLineInfoKind { None, Default, AbsoluteFilePath }; 76 typedef DINameKind FunctionNameKind; 77 78 FileLineInfoKind FLIKind; 79 FunctionNameKind FNKind; 80 81 DILineInfoSpecifier(FileLineInfoKind FLIKind = FileLineInfoKind::Default, 82 FunctionNameKind FNKind = FunctionNameKind::None) FLIKindDILineInfoSpecifier83 : FLIKind(FLIKind), FNKind(FNKind) {} 84 }; 85 86 /// Selects which debug sections get dumped. 87 enum DIDumpType { 88 DIDT_Null, 89 DIDT_All, 90 DIDT_Abbrev, 91 DIDT_AbbrevDwo, 92 DIDT_Aranges, 93 DIDT_Frames, 94 DIDT_Info, 95 DIDT_InfoDwo, 96 DIDT_Types, 97 DIDT_TypesDwo, 98 DIDT_Line, 99 DIDT_LineDwo, 100 DIDT_Loc, 101 DIDT_LocDwo, 102 DIDT_Ranges, 103 DIDT_Pubnames, 104 DIDT_Pubtypes, 105 DIDT_GnuPubnames, 106 DIDT_GnuPubtypes, 107 DIDT_Str, 108 DIDT_StrDwo, 109 DIDT_StrOffsetsDwo, 110 DIDT_AppleNames, 111 DIDT_AppleTypes, 112 DIDT_AppleNamespaces, 113 DIDT_AppleObjC 114 }; 115 116 // In place of applying the relocations to the data we've read from disk we use 117 // a separate mapping table to the side and checking that at locations in the 118 // dwarf where we expect relocated values. This adds a bit of complexity to the 119 // dwarf parsing/extraction at the benefit of not allocating memory for the 120 // entire size of the debug info sections. 121 typedef DenseMap<uint64_t, std::pair<uint8_t, int64_t> > RelocAddrMap; 122 123 class DIContext { 124 public: 125 enum DIContextKind { 126 CK_DWARF 127 }; getKind()128 DIContextKind getKind() const { return Kind; } 129 DIContext(DIContextKind K)130 DIContext(DIContextKind K) : Kind(K) {} 131 virtual ~DIContext(); 132 133 /// getDWARFContext - get a context for binary DWARF data. 134 static DIContext *getDWARFContext(const object::ObjectFile &Obj); 135 136 virtual void dump(raw_ostream &OS, DIDumpType DumpType = DIDT_All) = 0; 137 138 virtual DILineInfo getLineInfoForAddress(uint64_t Address, 139 DILineInfoSpecifier Specifier = DILineInfoSpecifier()) = 0; 140 virtual DILineInfoTable getLineInfoForAddressRange(uint64_t Address, 141 uint64_t Size, DILineInfoSpecifier Specifier = DILineInfoSpecifier()) = 0; 142 virtual DIInliningInfo getInliningInfoForAddress(uint64_t Address, 143 DILineInfoSpecifier Specifier = DILineInfoSpecifier()) = 0; 144 private: 145 const DIContextKind Kind; 146 }; 147 148 } 149 150 #endif 151