1/*
2 * Copyright (C) 2014 Apple Inc. All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
6 * are met:
7 * 1. Redistributions of source code must retain the above copyright
8 *    notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 *    notice, this list of conditions and the following disclaimer in the
11 *    documentation and/or other materials provided with the distribution.
12 *
13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
14 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23 * THE POSSIBILITY OF SUCH DAMAGE.
24 */
25
26#ifndef FTLDWARFDebugLineInfo_h
27#define FTLDWARFDebugLineInfo_h
28
29#if ENABLE(FTL_JIT)
30
31#include <wtf/Vector.h>
32#include <wtf/text/WTFString.h>
33
34namespace JSC { namespace FTL {
35
36class DebugLineInterpreter {
37public:
38    DebugLineInterpreter(const char* program);
39
40    void run();
41
42private:
43    struct FileEntry {
44        String name;
45        uint32_t directoryIndex;
46        uint32_t lastModified;
47        uint32_t size;
48    };
49
50    void resetInterpreterState();
51    void interpretStatementProgram();
52    bool interpretOpcode(const char*&);
53    void parsePrologue();
54    void parseIncludeDirectories(const char*&);
55    void parseFileEntries(const char*&);
56    bool parseFileEntry(const char*&, DebugLineInterpreter::FileEntry&);
57    uint32_t parseULEB128(const char*&);
58    int32_t parseSLEB128(const char*&);
59
60    const char* m_program;
61    bool m_logResults;
62
63    struct LineInfo {
64        size_t address;
65        uint32_t file;
66        uint32_t line;
67        uint32_t column;
68        uint32_t isa;
69        bool isStatement;
70        bool isBasicBlock;
71        bool endSequence;
72        bool prologueEnd;
73        bool epilogueBegin;
74    };
75
76    void printLineInfo(LineInfo&);
77    void printLineInfo();
78
79    LineInfo m_currentState;
80    Vector<LineInfo> m_lineInfoMatrix;
81
82    enum DwarfFormat {
83        SixtyFourBit,
84        ThirtyTwoBit
85    };
86
87    struct Prologue {
88        Prologue()
89            : totalLength(0)
90            , format(ThirtyTwoBit)
91            , version(0)
92            , prologueLength(0)
93            , minimumInstructionLength(0)
94            , defaultIsStatement(0)
95            , lineBase(0)
96            , lineRange(0)
97            , opcodeBase(0)
98        {
99        }
100
101        uint64_t totalLength;
102        DwarfFormat format;
103        uint16_t version;
104        uint64_t prologueLength;
105        uint8_t minimumInstructionLength;
106        uint8_t defaultIsStatement;
107        int8_t lineBase;
108        uint8_t lineRange;
109        uint8_t opcodeBase;
110        Vector<uint8_t> standardOpcodeLengths;
111        Vector<String> includeDirectories;
112        Vector<FileEntry> fileEntries;
113    } m_prologue;
114
115    enum ExtendedOpcode {
116        DW_LNE_end_sequence = 0x1,
117        DW_LNE_set_address  = 0x2,
118        DW_LNE_define_file  = 0x3
119    };
120
121    enum StandardOpcode {
122        ExtendedOpcodes             = 0x0,
123        DW_LNS_copy                 = 0x1,
124        DW_LNS_advance_pc           = 0x2,
125        DW_LNS_advance_line         = 0x3,
126        DW_LNS_set_file             = 0x4,
127        DW_LNS_set_column           = 0x5,
128        DW_LNS_negate_stmt          = 0x6,
129        DW_LNS_set_basic_block      = 0x7,
130        DW_LNS_const_add_pc         = 0x8,
131        DW_LNS_fixed_advance_pc     = 0x9,
132        DW_LNS_set_prologue_end     = 0xa,
133        DW_LNS_set_epilogue_begin   = 0xb,
134        DW_LNS_set_isa              = 0xc
135    };
136};
137
138} } // namespace JSC::FTL
139
140#endif // ENABLE(FTL_JIT)
141
142#endif // FTLDWARFDebugLineInfo_h
143