1b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer//===-- DWARFDebugLine.h ----------------------------------------*- C++ -*-===//
2b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer//
3b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer//                     The LLVM Compiler Infrastructure
4b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer//
5b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer// This file is distributed under the University of Illinois Open Source
6b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer// License. See LICENSE.TXT for details.
7b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer//
8b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer//===----------------------------------------------------------------------===//
9b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer
10b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer#ifndef LLVM_DEBUGINFO_DWARFDEBUGLINE_H
11b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer#define LLVM_DEBUGINFO_DWARFDEBUGLINE_H
12b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer
13b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer#include "llvm/Support/DataExtractor.h"
14b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer#include <map>
15b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer#include <string>
16b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer#include <vector>
17b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer
18b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramernamespace llvm {
19b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer
20b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramerclass raw_ostream;
21b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer
22b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramerclass DWARFDebugLine {
23b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramerpublic:
24b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer  struct FileNameEntry {
25b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer    FileNameEntry() : DirIdx(0), ModTime(0), Length(0) {}
26b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer
27b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer    std::string Name;
28b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer    uint64_t DirIdx;
29b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer    uint64_t ModTime;
30b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer    uint64_t Length;
31b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer  };
32b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer
33b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer  struct Prologue {
34b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer    Prologue()
35b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer      : TotalLength(0), Version(0), PrologueLength(0), MinInstLength(0),
36b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer        DefaultIsStmt(0), LineBase(0), LineRange(0), OpcodeBase(0) {}
37b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer
38b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer    // The size in bytes of the statement information for this compilation unit
39b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer    // (not including the total_length field itself).
40b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer    uint32_t TotalLength;
41b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer    // Version identifier for the statement information format.
42b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer    uint16_t Version;
43b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer    // The number of bytes following the prologue_length field to the beginning
44b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer    // of the first byte of the statement program itself.
45b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer    uint32_t PrologueLength;
46b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer    // The size in bytes of the smallest target machine instruction. Statement
47b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer    // program opcodes that alter the address register first multiply their
48b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer    // operands by this value.
49b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer    uint8_t MinInstLength;
50b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer    // The initial value of theis_stmtregister.
51b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer    uint8_t DefaultIsStmt;
52b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer    // This parameter affects the meaning of the special opcodes. See below.
53b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer    int8_t LineBase;
54b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer    // This parameter affects the meaning of the special opcodes. See below.
55b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer    uint8_t LineRange;
56b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer    // The number assigned to the first special opcode.
57b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer    uint8_t OpcodeBase;
58b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer    std::vector<uint8_t> StandardOpcodeLengths;
59b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer    std::vector<std::string> IncludeDirectories;
60b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer    std::vector<FileNameEntry> FileNames;
61b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer
62b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer    // Length of the prologue in bytes.
63b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer    uint32_t getLength() const {
64b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer      return PrologueLength + sizeof(TotalLength) + sizeof(Version) +
65b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer             sizeof(PrologueLength);
66b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer    }
67b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer    // Length of the line table data in bytes (not including the prologue).
68b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer    uint32_t getStatementTableLength() const {
69b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer      return TotalLength + sizeof(TotalLength) - getLength();
70b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer    }
71b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer    int32_t getMaxLineIncrementForSpecialOpcode() const {
72b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer      return LineBase + (int8_t)LineRange - 1;
73b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer    }
74b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer    void dump(raw_ostream &OS) const;
75b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer    void clear() {
76b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer      TotalLength = Version = PrologueLength = 0;
77b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer      MinInstLength = LineBase = LineRange = OpcodeBase = 0;
78b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer      StandardOpcodeLengths.clear();
79b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer      IncludeDirectories.clear();
80b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer      FileNames.clear();
81b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer    }
82b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer  };
83b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer
84b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer  // Standard .debug_line state machine structure.
85b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer  struct Row {
86b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer    Row(bool default_is_stmt = false) { reset(default_is_stmt); }
87b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer    /// Called after a row is appended to the matrix.
88b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer    void postAppend();
89b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer    void reset(bool default_is_stmt);
90b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer    void dump(raw_ostream &OS) const;
91b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer
92b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer    // The program-counter value corresponding to a machine instruction
93b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer    // generated by the compiler.
94b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer    uint64_t Address;
95b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer    // An unsigned integer indicating a source line number. Lines are numbered
96b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer    // beginning at 1. The compiler may emit the value 0 in cases where an
97b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer    // instruction cannot be attributed to any source line.
98b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer    uint32_t Line;
99b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer    // An unsigned integer indicating a column number within a source line.
100b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer    // Columns are numbered beginning at 1. The value 0 is reserved to indicate
101b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer    // that a statement begins at the 'left edge' of the line.
102b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer    uint16_t Column;
103b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer    // An unsigned integer indicating the identity of the source file
104b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer    // corresponding to a machine instruction.
105b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer    uint16_t File;
106b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer    // An unsigned integer whose value encodes the applicable instruction set
107b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer    // architecture for the current instruction.
108b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer    uint8_t Isa;
109b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer    // A boolean indicating that the current instruction is the beginning of a
110b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer    // statement.
111b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer    uint8_t IsStmt:1,
112b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer            // A boolean indicating that the current instruction is the
113b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer            // beginning of a basic block.
114b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer            BasicBlock:1,
115b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer            // A boolean indicating that the current address is that of the
116b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer            // first byte after the end of a sequence of target machine
117b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer            // instructions.
118b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer            EndSequence:1,
119b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer            // A boolean indicating that the current address is one (of possibly
120b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer            // many) where execution should be suspended for an entry breakpoint
121b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer            // of a function.
122b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer            PrologueEnd:1,
123b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer            // A boolean indicating that the current address is one (of possibly
124b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer            // many) where execution should be suspended for an exit breakpoint
125b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer            // of a function.
126b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer            EpilogueBegin:1;
127b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer  };
128b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer
129b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer  struct LineTable {
130b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer    void appendRow(const DWARFDebugLine::Row &state) { Rows.push_back(state); }
131b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer    void clear() {
132b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer      Prologue.clear();
133b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer      Rows.clear();
134b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer    }
135b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer
136b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer    uint32_t lookupAddress(uint64_t address, uint64_t cu_high_pc) const;
137b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer    void dump(raw_ostream &OS) const;
138b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer
139b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer    struct Prologue Prologue;
140b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer    std::vector<Row> Rows;
141b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer  };
142b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer
143b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer  struct State : public Row, public LineTable {
144b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer    // Special row codes.
145b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer    enum {
146b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer      StartParsingLineTable = 0,
147b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer      DoneParsingLineTable = -1
148b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer    };
149b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer
150c26ed9b47ff77ca6244feda9e3837b49624605dbBenjamin Kramer    State() : row(StartParsingLineTable) {}
1516bc4e712dc35db68a621f54c176f6e0b14f40f97Nick Lewycky    virtual ~State();
152b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer
153b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer    virtual void appendRowToMatrix(uint32_t offset);
154b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer    virtual void finalize(uint32_t offset) { row = DoneParsingLineTable; }
155b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer    virtual void reset() { Row::reset(Prologue.DefaultIsStmt); }
156b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer
157b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer    // The row number that starts at zero for the prologue, and increases for
158b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer    // each row added to the matrix.
159b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer    unsigned row;
160b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer  };
161b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer
162b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer  struct DumpingState : public State {
163b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer    DumpingState(raw_ostream &OS) : OS(OS) {}
1646bc4e712dc35db68a621f54c176f6e0b14f40f97Nick Lewycky    virtual ~DumpingState();
165b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer    virtual void finalize(uint32_t offset);
166b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer  private:
167b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer    raw_ostream &OS;
168b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer  };
169b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer
170b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer  static bool parsePrologue(DataExtractor debug_line_data, uint32_t *offset_ptr,
171b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer                            Prologue *prologue);
172b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer  /// Parse a single line table (prologue and all rows).
173b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer  static bool parseStatementTable(DataExtractor debug_line_data,
174b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer                                  uint32_t *offset_ptr, State &state);
175b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer
176b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer  const LineTable *getLineTable(uint32_t offset) const;
177c26ed9b47ff77ca6244feda9e3837b49624605dbBenjamin Kramer  const LineTable *getOrParseLineTable(DataExtractor debug_line_data,
178c26ed9b47ff77ca6244feda9e3837b49624605dbBenjamin Kramer                                       uint32_t offset);
179b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer
18089aedba562243c7b60b24b5ffba55394d9c55a12Benjamin Kramerprivate:
181b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer  typedef std::map<uint32_t, LineTable> LineTableMapTy;
182b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer  typedef LineTableMapTy::iterator LineTableIter;
183b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer  typedef LineTableMapTy::const_iterator LineTableConstIter;
184b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer
185b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer  LineTableMapTy LineTableMap;
186b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer};
187b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer
188b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer}
189b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer
190b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer#endif
191