FTLDWARFDebugLineInfo.h [plain text]
#ifndef FTLDWARFDebugLineInfo_h
#define FTLDWARFDebugLineInfo_h
#if ENABLE(FTL_JIT)
#include <wtf/Vector.h>
#include <wtf/text/WTFString.h>
namespace JSC { namespace FTL {
class DebugLineInterpreter {
public:
DebugLineInterpreter(const char* program);
void run();
private:
struct FileEntry {
String name;
uint32_t directoryIndex;
uint32_t lastModified;
uint32_t size;
};
void resetInterpreterState();
void interpretStatementProgram();
bool interpretOpcode(const char*&);
void parsePrologue();
void parseIncludeDirectories(const char*&);
void parseFileEntries(const char*&);
bool parseFileEntry(const char*&, DebugLineInterpreter::FileEntry&);
uint32_t parseULEB128(const char*&);
int32_t parseSLEB128(const char*&);
const char* m_program;
bool m_logResults;
struct LineInfo {
size_t address;
uint32_t file;
uint32_t line;
uint32_t column;
uint32_t isa;
bool isStatement;
bool isBasicBlock;
bool endSequence;
bool prologueEnd;
bool epilogueBegin;
};
void printLineInfo(LineInfo&);
void printLineInfo();
LineInfo m_currentState;
Vector<LineInfo> m_lineInfoMatrix;
enum DwarfFormat {
SixtyFourBit,
ThirtyTwoBit
};
struct Prologue {
Prologue()
: totalLength(0)
, format(ThirtyTwoBit)
, version(0)
, prologueLength(0)
, minimumInstructionLength(0)
, defaultIsStatement(0)
, lineBase(0)
, lineRange(0)
, opcodeBase(0)
{
}
uint64_t totalLength;
DwarfFormat format;
uint16_t version;
uint64_t prologueLength;
uint8_t minimumInstructionLength;
uint8_t defaultIsStatement;
int8_t lineBase;
uint8_t lineRange;
uint8_t opcodeBase;
Vector<uint8_t> standardOpcodeLengths;
Vector<String> includeDirectories;
Vector<FileEntry> fileEntries;
} m_prologue;
enum ExtendedOpcode {
DW_LNE_end_sequence = 0x1,
DW_LNE_set_address = 0x2,
DW_LNE_define_file = 0x3
};
enum StandardOpcode {
ExtendedOpcodes = 0x0,
DW_LNS_copy = 0x1,
DW_LNS_advance_pc = 0x2,
DW_LNS_advance_line = 0x3,
DW_LNS_set_file = 0x4,
DW_LNS_set_column = 0x5,
DW_LNS_negate_stmt = 0x6,
DW_LNS_set_basic_block = 0x7,
DW_LNS_const_add_pc = 0x8,
DW_LNS_fixed_advance_pc = 0x9,
DW_LNS_set_prologue_end = 0xa,
DW_LNS_set_epilogue_begin = 0xb,
DW_LNS_set_isa = 0xc
};
};
} }
#endif // ENABLE(FTL_JIT)
#endif // FTLDWARFDebugLineInfo_h