124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- DWARFDebugLine.h ----------------------------------------*- C++ -*-===//
224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                     The LLVM Compiler Infrastructure
424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// This file is distributed under the University of Illinois Open Source
624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// License. See LICENSE.TXT for details.
724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===----------------------------------------------------------------------===//
924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
10d996d0c32b483c2190e1eb288cd3bbbd259c2960Greg Clayton#ifndef SymbolFileDWARF_DWARFDebugLine_h_
11d996d0c32b483c2190e1eb288cd3bbbd259c2960Greg Clayton#define SymbolFileDWARF_DWARFDebugLine_h_
1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <map>
1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <vector>
1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <string>
1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/lldb-private.h"
1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "DWARFDefines.h"
2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass SymbolFileDWARF;
2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass DWARFDebugInfoEntry;
2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// DWARFDebugLine
2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass DWARFDebugLine
2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic:
3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // FileNameEntry
3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    struct FileNameEntry
3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        FileNameEntry() :
3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            name(),
3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            dir_idx(0),
3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            mod_time(0),
3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            length(0)
4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        std::string     name;
4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        dw_sleb128_t    dir_idx;
4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        dw_sleb128_t    mod_time;
4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        dw_sleb128_t    length;
4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    };
4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Prologue
5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    struct Prologue
5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Prologue() :
5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            total_length(0),
5824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            version(0),
5924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            prologue_length(0),
6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            min_inst_length(0),
6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            default_is_stmt(0),
6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            line_base(0),
6324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            line_range(0),
6424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            opcode_base(0),
6524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            standard_opcode_lengths(),
6624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            include_directories(),
6724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            file_names()
6824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
6924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
7024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
71102b2c2681c9a830afe25bfea35557421905e42cGreg Clayton        typedef std::shared_ptr<Prologue> shared_ptr;
7224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        uint32_t    total_length;   // The size in bytes of the statement information for this compilation unit (not including the total_length field itself).
7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        uint16_t    version;        // Version identifier for the statement information format.
7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        uint32_t    prologue_length;// The number of bytes following the prologue_length field to the beginning of the first byte of the statement program itself.
7624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        uint8_t     min_inst_length;// The size in bytes of the smallest target machine instruction. Statement program opcodes that alter the address register first multiply their operands by this value.
7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        uint8_t     default_is_stmt;// The initial value of theis_stmtregister.
7824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        int8_t      line_base;      // This parameter affects the meaning of the special opcodes. See below.
7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        uint8_t     line_range;     // This parameter affects the meaning of the special opcodes. See below.
8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        uint8_t     opcode_base;    // The number assigned to the first special opcode.
8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        std::vector<uint8_t>            standard_opcode_lengths;
8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        std::vector<std::string>        include_directories;
8324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        std::vector<FileNameEntry>      file_names;
8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // Length of the prologue in bytes
8624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        uint32_t Length() const { return prologue_length + sizeof(total_length) + sizeof(version) + sizeof(prologue_length); }
8724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // Length of the line table data in bytes (not including the prologue)
8824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        uint32_t StatementTableLength() const { return total_length + sizeof(total_length) - Length(); }
899a23becdf4f275a7a4da9e5a0319c1b4501673aeFilipe Cabecinhas        int32_t MaxLineIncrementForSpecialOpcode() const { return line_base + (int8_t)line_range - 1; }
9024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        bool IsValid() const;
9124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      void Append(BinaryStreamBuf& buff) const;
9224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        void Dump (lldb_private::Log *log);
9324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        void Clear()
9424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
9524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            total_length = version = prologue_length = min_inst_length = line_base = line_range = opcode_base = 0;
9624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            line_base = 0;
9724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            standard_opcode_lengths.clear();
9824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            include_directories.clear();
9924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            file_names.clear();
10024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
10124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        bool GetFile(uint32_t file_idx, std::string& file, std::string& dir) const;
10224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
10324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    };
10424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
10524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Standard .debug_line state machine structure
10624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    struct Row
10724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
10824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        typedef std::vector<Row>            collection;
10924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        typedef collection::iterator        iterator;
11024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        typedef collection::const_iterator  const_iterator;
11124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
11224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Row(bool default_is_stmt = false);
1138aaa52329ade20107fe28af7085b0a1f395816a8Todd Fiala        Row(const Row& rhs) :
1148aaa52329ade20107fe28af7085b0a1f395816a8Todd Fiala            address(rhs.address),
1158aaa52329ade20107fe28af7085b0a1f395816a8Todd Fiala            line(rhs.line),
1168aaa52329ade20107fe28af7085b0a1f395816a8Todd Fiala            column(rhs.column),
1178aaa52329ade20107fe28af7085b0a1f395816a8Todd Fiala            file(rhs.file),
1188aaa52329ade20107fe28af7085b0a1f395816a8Todd Fiala            is_stmt(rhs.is_stmt),
1198aaa52329ade20107fe28af7085b0a1f395816a8Todd Fiala            basic_block(rhs.basic_block),
1208aaa52329ade20107fe28af7085b0a1f395816a8Todd Fiala            end_sequence(rhs.end_sequence),
1218aaa52329ade20107fe28af7085b0a1f395816a8Todd Fiala            prologue_end(rhs.prologue_end),
1228aaa52329ade20107fe28af7085b0a1f395816a8Todd Fiala            epilogue_begin(rhs.epilogue_begin),
1238aaa52329ade20107fe28af7085b0a1f395816a8Todd Fiala            isa(rhs.isa)
1248aaa52329ade20107fe28af7085b0a1f395816a8Todd Fiala        {}
1258aaa52329ade20107fe28af7085b0a1f395816a8Todd Fiala        Row& operator =(const Row& rhs)
1268aaa52329ade20107fe28af7085b0a1f395816a8Todd Fiala        {
1278aaa52329ade20107fe28af7085b0a1f395816a8Todd Fiala            if (&rhs == this)
1288aaa52329ade20107fe28af7085b0a1f395816a8Todd Fiala                return *this;
1298aaa52329ade20107fe28af7085b0a1f395816a8Todd Fiala
1308aaa52329ade20107fe28af7085b0a1f395816a8Todd Fiala            address = rhs.address;
1318aaa52329ade20107fe28af7085b0a1f395816a8Todd Fiala            line = rhs.line;
1328aaa52329ade20107fe28af7085b0a1f395816a8Todd Fiala            column = rhs.column;
1338aaa52329ade20107fe28af7085b0a1f395816a8Todd Fiala            file = rhs.file;
1348aaa52329ade20107fe28af7085b0a1f395816a8Todd Fiala            is_stmt = rhs.is_stmt;
1358aaa52329ade20107fe28af7085b0a1f395816a8Todd Fiala            basic_block = rhs.basic_block;
1368aaa52329ade20107fe28af7085b0a1f395816a8Todd Fiala            end_sequence = rhs.end_sequence;
1378aaa52329ade20107fe28af7085b0a1f395816a8Todd Fiala            prologue_end = rhs.prologue_end;
1388aaa52329ade20107fe28af7085b0a1f395816a8Todd Fiala            epilogue_begin = rhs.epilogue_begin;
1398aaa52329ade20107fe28af7085b0a1f395816a8Todd Fiala            isa = rhs.isa;
1408aaa52329ade20107fe28af7085b0a1f395816a8Todd Fiala            return *this;
1418aaa52329ade20107fe28af7085b0a1f395816a8Todd Fiala        }
14224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        virtual ~Row() {}
14324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        void PostAppend ();
14424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        void Reset(bool default_is_stmt);
14524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        void Dump(lldb_private::Log *log) const;
14624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        static void Insert(Row::collection& state_coll, const Row& state);
14724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        static void Dump(lldb_private::Log *log, const Row::collection& state_coll);
14824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
14924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        dw_addr_t   address;        // The program-counter value corresponding to a machine instruction generated by the compiler.
15024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        uint32_t    line;           // An unsigned integer indicating a source line number. Lines are numbered beginning at 1. The compiler may emit the value 0 in cases where an instruction cannot be attributed to any source line.
151d996d0c32b483c2190e1eb288cd3bbbd259c2960Greg Clayton        uint16_t    column;         // An unsigned integer indicating a column number within a source line. Columns are numbered beginning at 1. The value 0 is reserved to indicate that a statement begins at the 'left edge' of the line.
15224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        uint16_t    file;           // An unsigned integer indicating the identity of the source file corresponding to a machine instruction.
15324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        uint8_t     is_stmt:1,      // A boolean indicating that the current instruction is the beginning of a statement.
15424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    basic_block:1,  // A boolean indicating that the current instruction is the beginning of a basic block.
15524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    end_sequence:1, // A boolean indicating that the current address is that of the first byte after the end of a sequence of target machine instructions.
15624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    prologue_end:1, // A boolean indicating that the current address is one (of possibly many) where execution should be suspended for an entry breakpoint of a function.
15724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    epilogue_begin:1;// A boolean indicating that the current address is one (of possibly many) where execution should be suspended for an exit breakpoint of a function.
15824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        uint32_t    isa;            // An unsigned integer whose value encodes the applicable instruction set architecture for the current instruction.
15924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    };
16024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
16124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
16224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
16324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // LineTable
16424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
16524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    struct LineTable
16624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
167102b2c2681c9a830afe25bfea35557421905e42cGreg Clayton        typedef std::shared_ptr<LineTable> shared_ptr;
16824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
16924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        LineTable() :
17024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            prologue(),
17124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            rows()
17224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
17324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
17424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
17524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        void AppendRow(const DWARFDebugLine::Row& state);
17624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        void Clear()
17724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
17824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            prologue.reset();
17924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            rows.clear();
18024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
18124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
18224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        uint32_t LookupAddress(dw_addr_t address, dw_addr_t cu_high_pc) const;
18324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        void Dump(lldb_private::Log *log) const;
18424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
18524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Prologue::shared_ptr prologue;
18624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Row::collection rows;
18724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    };
18824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
18924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
19024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // State
19124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
19224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    struct State : public Row
19324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
19424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        typedef void (*Callback)(dw_offset_t offset, const State& state, void* userData);
19524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
19624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // Special row codes used when calling the callback
19724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        enum
19824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
19924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            StartParsingLineTable = 0,
20024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            DoneParsingLineTable = -1
20124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        };
20224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
20324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        State (Prologue::shared_ptr& prologue_sp,
20424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner               lldb_private::Log *log,
20524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner               Callback callback,
20624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner               void* userData);
20724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
20824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        void
20924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        AppendRowToMatrix (dw_offset_t offset);
21024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
21124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        void
21224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Finalize (dw_offset_t offset);
21324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
21424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        void
21524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Reset ();
21624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
21724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Prologue::shared_ptr prologue;
21824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        lldb_private::Log *log;
2195d187e5495ee17f6763337a6ae28c2a7b07e4945Greg Clayton        Callback callback; // Callback function that gets called each time an entry is to be added to the matrix
22024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        void* callbackUserData;
22124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        int row; // The row number that starts at zero for the prologue, and increases for each row added to the matrix
22224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    private:
22324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        DISALLOW_COPY_AND_ASSIGN (State);
22424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    };
22524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
22624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    static bool DumpOpcodes(lldb_private::Log *log, SymbolFileDWARF* dwarf2Data, dw_offset_t line_offset = DW_INVALID_OFFSET, uint32_t dump_flags = 0);   // If line_offset is invalid, dump everything
22724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    static bool DumpLineTableRows(lldb_private::Log *log, SymbolFileDWARF* dwarf2Data, dw_offset_t line_offset = DW_INVALID_OFFSET);  // If line_offset is invalid, dump everything
228964deba8853eb794e59263322b59b09b43669618Greg Clayton    static bool ParseSupportFiles(const lldb::ModuleSP &module_sp, const lldb_private::DataExtractor& debug_line_data, const char *cu_comp_dir, dw_offset_t stmt_list, lldb_private::FileSpecList &support_files);
22936da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton    static bool ParsePrologue(const lldb_private::DataExtractor& debug_line_data, lldb::offset_t* offset_ptr, Prologue* prologue);
23036da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton    static bool ParseStatementTable(const lldb_private::DataExtractor& debug_line_data, lldb::offset_t* offset_ptr, State::Callback callback, void* userData);
23124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    static dw_offset_t DumpStatementTable(lldb_private::Log *log, const lldb_private::DataExtractor& debug_line_data, const dw_offset_t line_offset);
23224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    static dw_offset_t DumpStatementOpcodes(lldb_private::Log *log, const lldb_private::DataExtractor& debug_line_data, const dw_offset_t line_offset, uint32_t flags);
23336da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton    static bool ParseStatementTable(const lldb_private::DataExtractor& debug_line_data, lldb::offset_t *offset_ptr, LineTable* line_table);
23424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    static void Parse(const lldb_private::DataExtractor& debug_line_data, DWARFDebugLine::State::Callback callback, void* userData);
23524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  static void AppendLineTableData(const DWARFDebugLine::Prologue* prologue, const DWARFDebugLine::Row::collection& state_coll, const uint32_t addr_size, BinaryStreamBuf &debug_line_data);
23624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
23724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    DWARFDebugLine() :
23824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_lineTableMap()
23924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
24024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
24124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
24224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void Parse(const lldb_private::DataExtractor& debug_line_data);
24324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void ParseIfNeeded(const lldb_private::DataExtractor& debug_line_data);
24424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    LineTable::shared_ptr GetLineTable(const dw_offset_t offset) const;
24524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
24624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerprotected:
24724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    typedef std::map<dw_offset_t, LineTable::shared_ptr> LineTableMap;
24824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    typedef LineTableMap::iterator LineTableIter;
24924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    typedef LineTableMap::const_iterator LineTableConstIter;
25024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
25124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    LineTableMap m_lineTableMap;
25224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner};
25324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
254d996d0c32b483c2190e1eb288cd3bbbd259c2960Greg Clayton#endif  // SymbolFileDWARF_DWARFDebugLine_h_
255