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"
30 /// DILineInfo - a format-neutral container for source line information.
33 std::string FunctionName;
38 : FileName("<invalid>"), FunctionName("<invalid>"), Line(0), Column(0) {}
40 bool operator==(const DILineInfo &RHS) const {
41 return Line == RHS.Line && Column == RHS.Column &&
42 FileName == RHS.FileName && FunctionName == RHS.FunctionName;
44 bool operator!=(const DILineInfo &RHS) const {
45 return !(*this == RHS);
49 typedef SmallVector<std::pair<uint64_t, DILineInfo>, 16> DILineInfoTable;
51 /// DIInliningInfo - a format-neutral container for inlined code description.
52 class DIInliningInfo {
53 SmallVector<DILineInfo, 4> Frames;
56 DILineInfo getFrame(unsigned Index) const {
57 assert(Index < Frames.size());
60 uint32_t getNumberOfFrames() const {
63 void addFrame(const DILineInfo &Frame) {
64 Frames.push_back(Frame);
68 /// DIGlobal - container for description of a global variable.
74 DIGlobal() : Name("<invalid>"), Start(0), Size(0) {}
77 /// A DINameKind is passed to name search methods to specify a
78 /// preference regarding the type of name resolution the caller wants.
79 enum class DINameKind { None, ShortName, LinkageName };
81 /// DILineInfoSpecifier - controls which fields of DILineInfo container
82 /// should be filled with data.
83 struct DILineInfoSpecifier {
84 enum class FileLineInfoKind { None, Default, AbsoluteFilePath };
85 typedef DINameKind FunctionNameKind;
87 FileLineInfoKind FLIKind;
88 FunctionNameKind FNKind;
90 DILineInfoSpecifier(FileLineInfoKind FLIKind = FileLineInfoKind::Default,
91 FunctionNameKind FNKind = FunctionNameKind::None)
92 : FLIKind(FLIKind), FNKind(FNKind) {}
95 /// Selects which debug sections get dumped.
121 DIDT_AppleNamespaces,
131 DIContextKind getKind() const { return Kind; }
133 DIContext(DIContextKind K) : Kind(K) {}
134 virtual ~DIContext() {}
136 virtual void dump(raw_ostream &OS, DIDumpType DumpType = DIDT_All) = 0;
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;
145 const DIContextKind Kind;
148 /// An inferface for inquiring the load address of a loaded object file
149 /// to be used by the DIContext implementations when applying relocations
151 class LoadedObjectInfo {
153 LoadedObjectInfo(const LoadedObjectInfo &) = default;
154 LoadedObjectInfo() = default;
157 virtual ~LoadedObjectInfo() = default;
159 /// Obtain the Load Address of a section by SectionRef.
161 /// Calculate the address of the given section.
162 /// The section need not be present in the local address space. The addresses
163 /// need to be consistent with the addresses used to query the DIContext and
164 /// the output of this function should be deterministic, i.e. repeated calls with
165 /// the same Sec should give the same address.
166 virtual uint64_t getSectionLoadAddress(const object::SectionRef &Sec) const = 0;
168 /// If conveniently available, return the content of the given Section.
170 /// When the section is available in the local address space, in relocated (loaded)
171 /// form, e.g. because it was relocated by a JIT for execution, this function
172 /// should provide the contents of said section in `Data`. If the loaded section
173 /// is not available, or the cost of retrieving it would be prohibitive, this
174 /// function should return false. In that case, relocations will be read from the
175 /// local (unrelocated) object file and applied on the fly. Note that this method
176 /// is used purely for optimzation purposes in the common case of JITting in the
177 /// local address space, so returning false should always be correct.
178 virtual bool getLoadedSectionContents(const object::SectionRef &Sec,
179 StringRef &Data) const {
183 /// Obtain a copy of this LoadedObjectInfo.
185 /// The caller is responsible for deallocation once the copy is no longer required.
186 virtual std::unique_ptr<LoadedObjectInfo> clone() const = 0;