LLVM API Documentation

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
DWARFDebugLine.h
Go to the documentation of this file.
1 //===-- DWARFDebugLine.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_DWARFDEBUGLINE_H
11 #define LLVM_DEBUGINFO_DWARFDEBUGLINE_H
12 
13 #include "DWARFRelocMap.h"
15 #include <map>
16 #include <string>
17 #include <vector>
18 
19 namespace llvm {
20 
21 class raw_ostream;
22 
24 public:
25  DWARFDebugLine(const RelocAddrMap* LineInfoRelocMap) : RelocMap(LineInfoRelocMap) {}
26  struct FileNameEntry {
27  FileNameEntry() : Name(0), DirIdx(0), ModTime(0), Length(0) {}
28 
29  const char *Name;
30  uint64_t DirIdx;
31  uint64_t ModTime;
32  uint64_t Length;
33  };
34 
35  struct Prologue {
38  DefaultIsStmt(0), LineBase(0), LineRange(0), OpcodeBase(0) {}
39 
40  // The size in bytes of the statement information for this compilation unit
41  // (not including the total_length field itself).
42  uint32_t TotalLength;
43  // Version identifier for the statement information format.
44  uint16_t Version;
45  // The number of bytes following the prologue_length field to the beginning
46  // of the first byte of the statement program itself.
47  uint32_t PrologueLength;
48  // The size in bytes of the smallest target machine instruction. Statement
49  // program opcodes that alter the address register first multiply their
50  // operands by this value.
51  uint8_t MinInstLength;
52  // The initial value of theis_stmtregister.
53  uint8_t DefaultIsStmt;
54  // This parameter affects the meaning of the special opcodes. See below.
55  int8_t LineBase;
56  // This parameter affects the meaning of the special opcodes. See below.
57  uint8_t LineRange;
58  // The number assigned to the first special opcode.
59  uint8_t OpcodeBase;
60  std::vector<uint8_t> StandardOpcodeLengths;
61  std::vector<const char*> IncludeDirectories;
62  std::vector<FileNameEntry> FileNames;
63 
64  // Length of the prologue in bytes.
65  uint32_t getLength() const {
66  return PrologueLength + sizeof(TotalLength) + sizeof(Version) +
67  sizeof(PrologueLength);
68  }
69  // Length of the line table data in bytes (not including the prologue).
70  uint32_t getStatementTableLength() const {
71  return TotalLength + sizeof(TotalLength) - getLength();
72  }
74  return LineBase + (int8_t)LineRange - 1;
75  }
76  void dump(raw_ostream &OS) const;
77  void clear() {
80  StandardOpcodeLengths.clear();
81  IncludeDirectories.clear();
82  FileNames.clear();
83  }
84  };
85 
86  // Standard .debug_line state machine structure.
87  struct Row {
88  Row(bool default_is_stmt = false) { reset(default_is_stmt); }
89  /// Called after a row is appended to the matrix.
90  void postAppend();
91  void reset(bool default_is_stmt);
92  void dump(raw_ostream &OS) const;
93 
94  static bool orderByAddress(const Row& LHS, const Row& RHS) {
95  return LHS.Address < RHS.Address;
96  }
97 
98  // The program-counter value corresponding to a machine instruction
99  // generated by the compiler.
100  uint64_t Address;
101  // An unsigned integer indicating a source line number. Lines are numbered
102  // beginning at 1. The compiler may emit the value 0 in cases where an
103  // instruction cannot be attributed to any source line.
104  uint32_t Line;
105  // An unsigned integer indicating a column number within a source line.
106  // Columns are numbered beginning at 1. The value 0 is reserved to indicate
107  // that a statement begins at the 'left edge' of the line.
108  uint16_t Column;
109  // An unsigned integer indicating the identity of the source file
110  // corresponding to a machine instruction.
111  uint16_t File;
112  // An unsigned integer whose value encodes the applicable instruction set
113  // architecture for the current instruction.
114  uint8_t Isa;
115  // A boolean indicating that the current instruction is the beginning of a
116  // statement.
117  uint8_t IsStmt:1,
118  // A boolean indicating that the current instruction is the
119  // beginning of a basic block.
120  BasicBlock:1,
121  // A boolean indicating that the current address is that of the
122  // first byte after the end of a sequence of target machine
123  // instructions.
124  EndSequence:1,
125  // A boolean indicating that the current address is one (of possibly
126  // many) where execution should be suspended for an entry breakpoint
127  // of a function.
128  PrologueEnd:1,
129  // A boolean indicating that the current address is one (of possibly
130  // many) where execution should be suspended for an exit breakpoint
131  // of a function.
132  EpilogueBegin:1;
133  };
134 
135  // Represents a series of contiguous machine instructions. Line table for each
136  // compilation unit may consist of multiple sequences, which are not
137  // guaranteed to be in the order of ascending instruction address.
138  struct Sequence {
139  // Sequence describes instructions at address range [LowPC, HighPC)
140  // and is described by line table rows [FirstRowIndex, LastRowIndex).
141  uint64_t LowPC;
142  uint64_t HighPC;
143  unsigned FirstRowIndex;
144  unsigned LastRowIndex;
145  bool Empty;
146 
147  Sequence() { reset(); }
148  void reset() {
149  LowPC = 0;
150  HighPC = 0;
151  FirstRowIndex = 0;
152  LastRowIndex = 0;
153  Empty = true;
154  }
155  static bool orderByLowPC(const Sequence& LHS, const Sequence& RHS) {
156  return LHS.LowPC < RHS.LowPC;
157  }
158  bool isValid() const {
159  return !Empty && (LowPC < HighPC) && (FirstRowIndex < LastRowIndex);
160  }
161  bool containsPC(uint64_t pc) const {
162  return (LowPC <= pc && pc < HighPC);
163  }
164  };
165 
166  struct LineTable {
167  void appendRow(const DWARFDebugLine::Row &state) { Rows.push_back(state); }
168  void appendSequence(const DWARFDebugLine::Sequence &sequence) {
169  Sequences.push_back(sequence);
170  }
171  void clear() {
172  Prologue.clear();
173  Rows.clear();
174  Sequences.clear();
175  }
176 
177  // Returns the index of the row with file/line info for a given address,
178  // or -1 if there is no such row.
179  uint32_t lookupAddress(uint64_t address) const;
180 
181  bool lookupAddressRange(uint64_t address,
182  uint64_t size,
183  std::vector<uint32_t>& result) const;
184 
185  // Extracts filename by its index in filename table in prologue.
186  // Returns true on success.
187  bool getFileNameByIndex(uint64_t FileIndex,
188  bool NeedsAbsoluteFilePath,
189  std::string &Result) const;
190 
191  void dump(raw_ostream &OS) const;
192 
194  typedef std::vector<Row> RowVector;
195  typedef RowVector::const_iterator RowIter;
196  typedef std::vector<Sequence> SequenceVector;
197  typedef SequenceVector::const_iterator SequenceIter;
200  };
201 
202  struct State : public Row, public Sequence, public LineTable {
203  // Special row codes.
204  enum {
207  };
208 
210  virtual ~State();
211 
212  virtual void appendRowToMatrix(uint32_t offset);
213  virtual void finalize();
214  virtual void reset() {
216  Sequence::reset();
217  }
218 
219  // The row number that starts at zero for the prologue, and increases for
220  // each row added to the matrix.
221  unsigned row;
222  };
223 
224  struct DumpingState : public State {
225  DumpingState(raw_ostream &OS) : OS(OS) {}
226  virtual ~DumpingState();
227  virtual void finalize();
228  private:
229  raw_ostream &OS;
230  };
231 
232  static bool parsePrologue(DataExtractor debug_line_data, uint32_t *offset_ptr,
233  Prologue *prologue);
234  /// Parse a single line table (prologue and all rows).
235  static bool parseStatementTable(DataExtractor debug_line_data,
236  const RelocAddrMap *RMap,
237  uint32_t *offset_ptr, State &state);
238 
239  const LineTable *getLineTable(uint32_t offset) const;
240  const LineTable *getOrParseLineTable(DataExtractor debug_line_data,
241  uint32_t offset);
242 
243 private:
244  typedef std::map<uint32_t, LineTable> LineTableMapTy;
245  typedef LineTableMapTy::iterator LineTableIter;
246  typedef LineTableMapTy::const_iterator LineTableConstIter;
247 
248  const RelocAddrMap *RelocMap;
249  LineTableMapTy LineTableMap;
250 };
251 
252 }
253 
254 #endif
DWARFDebugLine(const RelocAddrMap *LineInfoRelocMap)
RowVector::const_iterator RowIter
std::vector< Sequence > SequenceVector
Row(bool default_is_stmt=false)
static bool orderByAddress(const Row &LHS, const Row &RHS)
SequenceVector::const_iterator SequenceIter
const LineTable * getLineTable(uint32_t offset) const
uint32_t getStatementTableLength() const
void postAppend()
Called after a row is appended to the matrix.
bool getFileNameByIndex(uint64_t FileIndex, bool NeedsAbsoluteFilePath, std::string &Result) const
void appendSequence(const DWARFDebugLine::Sequence &sequence)
void appendRow(const DWARFDebugLine::Row &state)
LLVM Basic Block Representation.
Definition: BasicBlock.h:72
void dump(raw_ostream &OS) const
void dump(raw_ostream &OS) const
int32_t getMaxLineIncrementForSpecialOpcode() const
void dump(raw_ostream &OS) const
const LineTable * getOrParseLineTable(DataExtractor debug_line_data, uint32_t offset)
bool lookupAddressRange(uint64_t address, uint64_t size, std::vector< uint32_t > &result) const
uint32_t lookupAddress(uint64_t address) const
std::vector< const char * > IncludeDirectories
virtual void appendRowToMatrix(uint32_t offset)
std::vector< uint8_t > StandardOpcodeLengths
void reset(bool default_is_stmt)
bool containsPC(uint64_t pc) const
std::vector< FileNameEntry > FileNames
static bool orderByLowPC(const Sequence &LHS, const Sequence &RHS)
static bool parsePrologue(DataExtractor debug_line_data, uint32_t *offset_ptr, Prologue *prologue)
static bool parseStatementTable(DataExtractor debug_line_data, const RelocAddrMap *RMap, uint32_t *offset_ptr, State &state)
Parse a single line table (prologue and all rows).