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