1226584Sdim//===-- DIContext.h ---------------------------------------------*- C++ -*-===//
2226584Sdim//
3226584Sdim//                     The LLVM Compiler Infrastructure
4226584Sdim//
5226584Sdim// This file is distributed under the University of Illinois Open Source
6226584Sdim// License. See LICENSE.TXT for details.
7226584Sdim//
8226584Sdim//===----------------------------------------------------------------------===//
9226584Sdim//
10226584Sdim// This file defines DIContext, an abstract data structure that holds
11226584Sdim// debug information data.
12226584Sdim//
13226584Sdim//===----------------------------------------------------------------------===//
14226584Sdim
15226584Sdim#ifndef LLVM_DEBUGINFO_DICONTEXT_H
16226584Sdim#define LLVM_DEBUGINFO_DICONTEXT_H
17226584Sdim
18243830Sdim#include "llvm/ADT/DenseMap.h"
19249423Sdim#include "llvm/ADT/SmallString.h"
20243830Sdim#include "llvm/ADT/SmallVector.h"
21226584Sdim#include "llvm/ADT/StringRef.h"
22249423Sdim#include "llvm/Object/ObjectFile.h"
23249423Sdim#include "llvm/Object/RelocVisitor.h"
24263508Sdim#include "llvm/Support/Casting.h"
25226584Sdim#include "llvm/Support/DataTypes.h"
26226584Sdim
27226584Sdimnamespace llvm {
28226584Sdim
29226584Sdimclass raw_ostream;
30226584Sdim
31226584Sdim/// DILineInfo - a format-neutral container for source line information.
32226584Sdimclass DILineInfo {
33239462Sdim  SmallString<16> FileName;
34239462Sdim  SmallString<16> FunctionName;
35226584Sdim  uint32_t Line;
36226584Sdim  uint32_t Column;
37226584Sdimpublic:
38239462Sdim  DILineInfo()
39239462Sdim    : FileName("<invalid>"), FunctionName("<invalid>"),
40239462Sdim      Line(0), Column(0) {}
41263508Sdim  DILineInfo(StringRef fileName, StringRef functionName, uint32_t line,
42263508Sdim             uint32_t column)
43263508Sdim      : FileName(fileName), FunctionName(functionName), Line(line),
44263508Sdim        Column(column) {}
45226584Sdim
46239462Sdim  const char *getFileName() { return FileName.c_str(); }
47239462Sdim  const char *getFunctionName() { return FunctionName.c_str(); }
48226584Sdim  uint32_t getLine() const { return Line; }
49226584Sdim  uint32_t getColumn() const { return Column; }
50226584Sdim
51226584Sdim  bool operator==(const DILineInfo &RHS) const {
52226584Sdim    return Line == RHS.Line && Column == RHS.Column &&
53239462Sdim           FileName.equals(RHS.FileName) &&
54239462Sdim           FunctionName.equals(RHS.FunctionName);
55226584Sdim  }
56226584Sdim  bool operator!=(const DILineInfo &RHS) const {
57226584Sdim    return !(*this == RHS);
58226584Sdim  }
59226584Sdim};
60226584Sdim
61249423Sdimtypedef SmallVector<std::pair<uint64_t, DILineInfo>, 16> DILineInfoTable;
62249423Sdim
63243830Sdim/// DIInliningInfo - a format-neutral container for inlined code description.
64243830Sdimclass DIInliningInfo {
65243830Sdim  SmallVector<DILineInfo, 4> Frames;
66243830Sdim public:
67243830Sdim  DIInliningInfo() {}
68243830Sdim  DILineInfo getFrame(unsigned Index) const {
69243830Sdim    assert(Index < Frames.size());
70243830Sdim    return Frames[Index];
71243830Sdim  }
72243830Sdim  uint32_t getNumberOfFrames() const {
73243830Sdim    return Frames.size();
74243830Sdim  }
75243830Sdim  void addFrame(const DILineInfo &Frame) {
76243830Sdim    Frames.push_back(Frame);
77243830Sdim  }
78243830Sdim};
79243830Sdim
80239462Sdim/// DILineInfoSpecifier - controls which fields of DILineInfo container
81239462Sdim/// should be filled with data.
82239462Sdimclass DILineInfoSpecifier {
83239462Sdim  const uint32_t Flags;  // Or'ed flags that set the info we want to fetch.
84239462Sdimpublic:
85239462Sdim  enum Specification {
86239462Sdim    FileLineInfo = 1 << 0,
87239462Sdim    AbsoluteFilePath = 1 << 1,
88239462Sdim    FunctionName = 1 << 2
89239462Sdim  };
90239462Sdim  // Use file/line info by default.
91239462Sdim  DILineInfoSpecifier(uint32_t flags = FileLineInfo) : Flags(flags) {}
92239462Sdim  bool needs(Specification spec) const {
93239462Sdim    return (Flags & spec) > 0;
94239462Sdim  }
95239462Sdim};
96239462Sdim
97249423Sdim/// Selects which debug sections get dumped.
98249423Sdimenum DIDumpType {
99249423Sdim  DIDT_Null,
100249423Sdim  DIDT_All,
101249423Sdim  DIDT_Abbrev,
102249423Sdim  DIDT_AbbrevDwo,
103249423Sdim  DIDT_Aranges,
104249423Sdim  DIDT_Frames,
105249423Sdim  DIDT_Info,
106249423Sdim  DIDT_InfoDwo,
107263508Sdim  DIDT_Types,
108249423Sdim  DIDT_Line,
109263508Sdim  DIDT_Loc,
110249423Sdim  DIDT_Ranges,
111249423Sdim  DIDT_Pubnames,
112263508Sdim  DIDT_Pubtypes,
113263508Sdim  DIDT_GnuPubnames,
114263508Sdim  DIDT_GnuPubtypes,
115249423Sdim  DIDT_Str,
116249423Sdim  DIDT_StrDwo,
117249423Sdim  DIDT_StrOffsetsDwo
118249423Sdim};
119249423Sdim
120243830Sdim// In place of applying the relocations to the data we've read from disk we use
121243830Sdim// a separate mapping table to the side and checking that at locations in the
122243830Sdim// dwarf where we expect relocated values. This adds a bit of complexity to the
123243830Sdim// dwarf parsing/extraction at the benefit of not allocating memory for the
124243830Sdim// entire size of the debug info sections.
125243830Sdimtypedef DenseMap<uint64_t, std::pair<uint8_t, int64_t> > RelocAddrMap;
126243830Sdim
127226584Sdimclass DIContext {
128226584Sdimpublic:
129263508Sdim  enum DIContextKind {
130263508Sdim    CK_DWARF
131263508Sdim  };
132263508Sdim  DIContextKind getKind() const { return Kind; }
133263508Sdim
134263508Sdim  DIContext(DIContextKind K) : Kind(K) {}
135226584Sdim  virtual ~DIContext();
136226584Sdim
137226584Sdim  /// getDWARFContext - get a context for binary DWARF data.
138249423Sdim  static DIContext *getDWARFContext(object::ObjectFile *);
139226584Sdim
140249423Sdim  virtual void dump(raw_ostream &OS, DIDumpType DumpType = DIDT_All) = 0;
141226584Sdim
142243830Sdim  virtual DILineInfo getLineInfoForAddress(uint64_t Address,
143243830Sdim      DILineInfoSpecifier Specifier = DILineInfoSpecifier()) = 0;
144249423Sdim  virtual DILineInfoTable getLineInfoForAddressRange(uint64_t Address,
145249423Sdim      uint64_t Size, DILineInfoSpecifier Specifier = DILineInfoSpecifier()) = 0;
146243830Sdim  virtual DIInliningInfo getInliningInfoForAddress(uint64_t Address,
147243830Sdim      DILineInfoSpecifier Specifier = DILineInfoSpecifier()) = 0;
148263508Sdimprivate:
149263508Sdim  const DIContextKind Kind;
150226584Sdim};
151226584Sdim
152226584Sdim}
153226584Sdim
154226584Sdim#endif
155