1 //===-- DIContext.h ---------------------------------------------*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This file defines DIContext, an abstract data structure that holds
11 // debug information data.
13 //===----------------------------------------------------------------------===//
15 #ifndef LLVM_DEBUGINFO_DICONTEXT_H
16 #define LLVM_DEBUGINFO_DICONTEXT_H
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"
31 /// DILineInfo - a format-neutral container for source line information.
34 std::string FunctionName;
39 : FileName("<invalid>"), FunctionName("<invalid>"), Line(0), Column(0) {}
41 bool operator==(const DILineInfo &RHS) const {
42 return Line == RHS.Line && Column == RHS.Column &&
43 FileName == RHS.FileName && FunctionName == RHS.FunctionName;
45 bool operator!=(const DILineInfo &RHS) const {
46 return !(*this == RHS);
50 typedef SmallVector<std::pair<uint64_t, DILineInfo>, 16> DILineInfoTable;
52 /// DIInliningInfo - a format-neutral container for inlined code description.
53 class DIInliningInfo {
54 SmallVector<DILineInfo, 4> Frames;
57 DILineInfo getFrame(unsigned Index) const {
58 assert(Index < Frames.size());
61 uint32_t getNumberOfFrames() const {
64 void addFrame(const DILineInfo &Frame) {
65 Frames.push_back(Frame);
69 /// A DINameKind is passed to name search methods to specify a
70 /// preference regarding the type of name resolution the caller wants.
71 enum class DINameKind { None, ShortName, LinkageName };
73 /// DILineInfoSpecifier - controls which fields of DILineInfo container
74 /// should be filled with data.
75 struct DILineInfoSpecifier {
76 enum class FileLineInfoKind { None, Default, AbsoluteFilePath };
77 typedef DINameKind FunctionNameKind;
79 FileLineInfoKind FLIKind;
80 FunctionNameKind FNKind;
82 DILineInfoSpecifier(FileLineInfoKind FLIKind = FileLineInfoKind::Default,
83 FunctionNameKind FNKind = FunctionNameKind::None)
84 : FLIKind(FLIKind), FNKind(FNKind) {}
87 /// Selects which debug sections get dumped.
113 DIDT_AppleNamespaces,
123 DIContextKind getKind() const { return Kind; }
125 DIContext(DIContextKind K) : Kind(K) {}
126 virtual ~DIContext() {}
128 virtual void dump(raw_ostream &OS, DIDumpType DumpType = DIDT_All) = 0;
130 virtual DILineInfo getLineInfoForAddress(uint64_t Address,
131 DILineInfoSpecifier Specifier = DILineInfoSpecifier()) = 0;
132 virtual DILineInfoTable getLineInfoForAddressRange(uint64_t Address,
133 uint64_t Size, DILineInfoSpecifier Specifier = DILineInfoSpecifier()) = 0;
134 virtual DIInliningInfo getInliningInfoForAddress(uint64_t Address,
135 DILineInfoSpecifier Specifier = DILineInfoSpecifier()) = 0;
137 const DIContextKind Kind;
140 /// An inferface for inquiring the load address of a loaded object file
141 /// to be used by the DIContext implementations when applying relocations
143 class LoadedObjectInfo {
145 virtual ~LoadedObjectInfo() = default;
147 /// Obtain the Load Address of a section by Name.
149 /// Calculate the address of the section identified by the passed in Name.
150 /// The section need not be present in the local address space. The addresses
151 /// need to be consistent with the addresses used to query the DIContext and
152 /// the output of this function should be deterministic, i.e. repeated calls with
153 /// the same Name should give the same address.
154 virtual uint64_t getSectionLoadAddress(StringRef Name) const = 0;
156 /// If conveniently available, return the content of the given Section.
158 /// When the section is available in the local address space, in relocated (loaded)
159 /// form, e.g. because it was relocated by a JIT for execution, this function
160 /// should provide the contents of said section in `Data`. If the loaded section
161 /// is not available, or the cost of retrieving it would be prohibitive, this
162 /// function should return false. In that case, relocations will be read from the
163 /// local (unrelocated) object file and applied on the fly. Note that this method
164 /// is used purely for optimzation purposes in the common case of JITting in the
165 /// local address space, so returning false should always be correct.
166 virtual bool getLoadedSectionContents(StringRef Name, StringRef &Data) const {
169 virtual std::unique_ptr<LoadedObjectInfo> clone() const = 0;