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