From 68e3ed88028cf2f1b74017aff43c73d2defbf2c9 Mon Sep 17 00:00:00 2001 From: Nguyen Anh Quynh <aquynh@gmail.com> Date: Sat, 7 May 2016 17:53:29 +0800 Subject: [PATCH] x86: support for NASM directive in db/dw/dd/dq --- kstool/kstool.c | 41 ++ llvm/include/llvm/MC/MCParser/MCAsmParser.h | 2 + llvm/keystone/ks.cpp | 4 + llvm/lib/MC/MCParser/AsmParser.cpp | 400 +++++++++++++------- 4 files changed, 319 insertions(+), 128 deletions(-) diff --git a/kstool/kstool.c b/kstool/kstool.c index f93875a..95a9d8e 100644 --- a/kstool/kstool.c +++ b/kstool/kstool.c @@ -20,6 +20,9 @@ static void usage(char *prog) printf(" x16att: X86 16bit, AT&T syntax\n"); printf(" x32att: X86 32bit, AT&T syntax\n"); printf(" x64att: X86 64bit, AT&T syntax\n"); + printf(" x16nasm: X86 16bit, NASM syntax\n"); + printf(" x32nasm: X86 32bit, NASM syntax\n"); + printf(" x64nasm: X86 64bit, NASM syntax\n"); } if (ks_arch_supported(KS_ARCH_ARM)) { @@ -88,6 +91,7 @@ int main(int argc, char **argv) if (!strcmp(mode, "x64")) { err = ks_open(KS_ARCH_X86, KS_MODE_64, &ks); } + if (!strcmp(mode, "x16att")) { err = ks_open(KS_ARCH_X86, KS_MODE_16, &ks); if (!err) { @@ -106,57 +110,94 @@ int main(int argc, char **argv) ks_option(ks, KS_OPT_SYNTAX, KS_OPT_SYNTAX_ATT); } } + + if (!strcmp(mode, "x16nasm")) { + err = ks_open(KS_ARCH_X86, KS_MODE_16, &ks); + if (!err) { + ks_option(ks, KS_OPT_SYNTAX, KS_OPT_SYNTAX_NASM); + } + } + if (!strcmp(mode, "x32nasm")) { + err = ks_open(KS_ARCH_X86, KS_MODE_32, &ks); + if (!err) { + ks_option(ks, KS_OPT_SYNTAX, KS_OPT_SYNTAX_NASM); + } + } + if (!strcmp(mode, "x64nasm")) { + err = ks_open(KS_ARCH_X86, KS_MODE_64, &ks); + if (!err) { + ks_option(ks, KS_OPT_SYNTAX, KS_OPT_SYNTAX_NASM); + } + } + if (!strcmp(mode, "arm")) { err = ks_open(KS_ARCH_ARM, KS_MODE_ARM+KS_MODE_LITTLE_ENDIAN, &ks); } + if (!strcmp(mode, "armbe")) { err = ks_open(KS_ARCH_ARM, KS_MODE_ARM+KS_MODE_BIG_ENDIAN, &ks); } + if (!strcmp(mode, "thumb")) { err = ks_open(KS_ARCH_ARM, KS_MODE_THUMB+KS_MODE_LITTLE_ENDIAN, &ks); } + if (!strcmp(mode, "thumbbe")) { err = ks_open(KS_ARCH_ARM, KS_MODE_THUMB+KS_MODE_BIG_ENDIAN, &ks); } + if (!strcmp(mode, "arm64be") || !strcmp(mode, "arm64")) { err = ks_open(KS_ARCH_ARM64, KS_MODE_BIG_ENDIAN, &ks); } + if (!strcmp(mode, "hex") || !strcmp(mode, "hexagon")) { err = ks_open(KS_ARCH_HEXAGON, KS_MODE_BIG_ENDIAN, &ks); } + if (!strcmp(mode, "mips")) { err = ks_open(KS_ARCH_MIPS, KS_MODE_MIPS32+KS_MODE_LITTLE_ENDIAN, &ks); } + if (!strcmp(mode, "mipsbe")) { err = ks_open(KS_ARCH_MIPS, KS_MODE_MIPS32+KS_MODE_BIG_ENDIAN, &ks); } + if (!strcmp(mode, "mips64")) { err = ks_open(KS_ARCH_MIPS, KS_MODE_MIPS64+KS_MODE_LITTLE_ENDIAN, &ks); } + if (!strcmp(mode, "mips64be")) { err = ks_open(KS_ARCH_MIPS, KS_MODE_MIPS64+KS_MODE_BIG_ENDIAN, &ks); } + if (!strcmp(mode, "ppc32be")) { err = ks_open(KS_ARCH_PPC, KS_MODE_PPC32+KS_MODE_BIG_ENDIAN, &ks); } + if (!strcmp(mode, "ppc64")) { err = ks_open(KS_ARCH_PPC, KS_MODE_PPC64+KS_MODE_LITTLE_ENDIAN, &ks); } + if (!strcmp(mode, "ppc64be")) { err = ks_open(KS_ARCH_PPC, KS_MODE_PPC64+KS_MODE_BIG_ENDIAN, &ks); } + if (!strcmp(mode, "sparc")) { err = ks_open(KS_ARCH_SPARC, KS_MODE_SPARC32+KS_MODE_LITTLE_ENDIAN, &ks); } + if (!strcmp(mode, "sparcbe")) { err = ks_open(KS_ARCH_SPARC, KS_MODE_SPARC32+KS_MODE_BIG_ENDIAN, &ks); } + if (!strcmp(mode, "sparc64")) { err = ks_open(KS_ARCH_SPARC, KS_MODE_SPARC64+KS_MODE_LITTLE_ENDIAN, &ks); } + if (!strcmp(mode, "sparc64be")) { err = ks_open(KS_ARCH_SPARC, KS_MODE_SPARC64+KS_MODE_BIG_ENDIAN, &ks); } + if (!strcmp(mode, "systemz") || !strcmp(mode, "sysz") || !strcmp(mode, "s390x")) { err = ks_open(KS_ARCH_SYSTEMZ, KS_MODE_BIG_ENDIAN, &ks); } diff --git a/llvm/include/llvm/MC/MCParser/MCAsmParser.h b/llvm/include/llvm/MC/MCParser/MCAsmParser.h index 460c502..79a2e46 100644 --- a/llvm/include/llvm/MC/MCParser/MCAsmParser.h +++ b/llvm/include/llvm/MC/MCParser/MCAsmParser.h @@ -206,6 +206,8 @@ public: /// \return - False on success. virtual bool parseParenExprOfDepth(unsigned ParenDepth, const MCExpr *&Res, SMLoc &EndLoc) = 0; + + virtual void initializeDirectiveKindMap(int syntax) = 0; }; /// \brief Create an MCAsmParser instance. diff --git a/llvm/keystone/ks.cpp b/llvm/keystone/ks.cpp index 3d63aea..13b08c1 100644 --- a/llvm/keystone/ks.cpp +++ b/llvm/keystone/ks.cpp @@ -480,6 +480,10 @@ int ks_asm(ks_engine *ks, Parser->setTargetParser(*TAP); + // TODO: optimize this to avoid setting up NASM every time we call ks_asm() + if (ks->arch == KS_ARCH_X86 && ks->syntax == KS_OPT_SYNTAX_NASM) + Parser->initializeDirectiveKindMap(KS_OPT_SYNTAX_NASM); + *stat_count = Parser->Run(false, address); // PPC counts empty statement diff --git a/llvm/lib/MC/MCParser/AsmParser.cpp b/llvm/lib/MC/MCParser/AsmParser.cpp index cc332f6..5bf787e 100644 --- a/llvm/lib/MC/MCParser/AsmParser.cpp +++ b/llvm/lib/MC/MCParser/AsmParser.cpp @@ -182,6 +182,9 @@ private: /// \brief Are we parsing ms-style inline assembly? bool ParsingInlineAsm; + // Keystone syntax support + int KsSyntax; + public: AsmParser(SourceMgr &SM, MCContext &Ctx, MCStreamer &Out, const MCAsmInfo &MAI); @@ -250,6 +253,8 @@ public: void eatToEndOfStatement() override; void checkForValidSection() override; + + void initializeDirectiveKindMap(int syntax) override; // Keystone NASM support /// } private: @@ -503,7 +508,7 @@ private: // ".warning" bool parseDirectiveWarning(SMLoc DirectiveLoc); - void initializeDirectiveKindMap(); + bool isDirective(StringRef str); // is this str a directive? }; } @@ -549,7 +554,7 @@ AsmParser::AsmParser(SourceMgr &SM, MCContext &Ctx, MCStreamer &Out, #endif PlatformParser->Initialize(*this); - initializeDirectiveKindMap(); + initializeDirectiveKindMap(0); NumOfMacroInstantiations = 0; } @@ -1339,6 +1344,14 @@ bool AsmParser::parseBinOpRHS(unsigned Precedence, const MCExpr *&Res, } } +bool AsmParser::isDirective(StringRef IDVal) +{ + if (KsSyntax == KS_OPT_SYNTAX_NASM) { + return (DirectiveKindMap.find(IDVal) != DirectiveKindMap.end()); + } else // Directives start with "." + return (IDVal[0] == '.' && IDVal != "."); +} + /// ParseStatement: /// ::= EndOfStatement /// ::= Label* Directive ...Operands... EndOfStatement @@ -1360,7 +1373,7 @@ bool AsmParser::parseStatement(ParseStatementInfo &Info, int64_t LocalLabelVal = -1; // A full line comment is a '#' as the first token. if (Lexer.is(AsmToken::Hash)) - return parseCppHashLineFilenameComment(IDLoc); + return parseCppHashLineFilenameComment(IDLoc); // qq // Allow an integer followed by a ':' as a directional local label. if (Lexer.is(AsmToken::Integer)) { @@ -1396,6 +1409,9 @@ bool AsmParser::parseStatement(ParseStatementInfo &Info, // Treat '}' as a valid identifier in this context. Lex(); IDVal = "}"; + } else if (ID.getString().str() == "db") { + Lex(); + IDVal = ID.getString(); } else if (parseIdentifier(IDVal)) { if (!TheCondState.Ignore) { // return TokError("unexpected token at start of statement"); @@ -1534,8 +1550,7 @@ bool AsmParser::parseStatement(ParseStatementInfo &Info, // Otherwise, we have a normal instruction or directive. - // Directives start with "." - if (IDVal[0] == '.' && IDVal != ".") { + if (isDirective(IDVal)) { // There are several entities interested in parsing directives: // // 1. The target-specific assembly parser. Some directives are target @@ -1764,6 +1779,8 @@ bool AsmParser::parseStatement(ParseStatementInfo &Info, } return Error(IDLoc, "unknown directive"); + // KsError = KS_ERR_ASM_DIRECTIVE_UNKNOWN; + // return true; } // __asm _emit or __asm __emit @@ -4644,129 +4661,256 @@ bool AsmParser::parseDirectiveEndIf(SMLoc DirectiveLoc) { return false; } -void AsmParser::initializeDirectiveKindMap() { - DirectiveKindMap[".set"] = DK_SET; - DirectiveKindMap[".equ"] = DK_EQU; - DirectiveKindMap[".equiv"] = DK_EQUIV; - DirectiveKindMap[".ascii"] = DK_ASCII; - DirectiveKindMap[".asciz"] = DK_ASCIZ; - DirectiveKindMap[".string"] = DK_STRING; - DirectiveKindMap[".byte"] = DK_BYTE; - DirectiveKindMap[".short"] = DK_SHORT; - DirectiveKindMap[".value"] = DK_VALUE; - DirectiveKindMap[".2byte"] = DK_2BYTE; - DirectiveKindMap[".long"] = DK_LONG; - DirectiveKindMap[".int"] = DK_INT; - DirectiveKindMap[".4byte"] = DK_4BYTE; - DirectiveKindMap[".quad"] = DK_QUAD; - DirectiveKindMap[".8byte"] = DK_8BYTE; - DirectiveKindMap[".octa"] = DK_OCTA; - DirectiveKindMap[".single"] = DK_SINGLE; - DirectiveKindMap[".float"] = DK_FLOAT; - DirectiveKindMap[".double"] = DK_DOUBLE; - DirectiveKindMap[".align"] = DK_ALIGN; - DirectiveKindMap[".align32"] = DK_ALIGN32; - DirectiveKindMap[".balign"] = DK_BALIGN; - DirectiveKindMap[".balignw"] = DK_BALIGNW; - DirectiveKindMap[".balignl"] = DK_BALIGNL; - DirectiveKindMap[".p2align"] = DK_P2ALIGN; - DirectiveKindMap[".p2alignw"] = DK_P2ALIGNW; - DirectiveKindMap[".p2alignl"] = DK_P2ALIGNL; - DirectiveKindMap[".org"] = DK_ORG; - DirectiveKindMap[".fill"] = DK_FILL; - DirectiveKindMap[".zero"] = DK_ZERO; - DirectiveKindMap[".extern"] = DK_EXTERN; - DirectiveKindMap[".globl"] = DK_GLOBL; - DirectiveKindMap[".global"] = DK_GLOBAL; - DirectiveKindMap[".lazy_reference"] = DK_LAZY_REFERENCE; - DirectiveKindMap[".no_dead_strip"] = DK_NO_DEAD_STRIP; - DirectiveKindMap[".symbol_resolver"] = DK_SYMBOL_RESOLVER; - DirectiveKindMap[".private_extern"] = DK_PRIVATE_EXTERN; - DirectiveKindMap[".reference"] = DK_REFERENCE; - DirectiveKindMap[".weak_definition"] = DK_WEAK_DEFINITION; - DirectiveKindMap[".weak_reference"] = DK_WEAK_REFERENCE; - DirectiveKindMap[".weak_def_can_be_hidden"] = DK_WEAK_DEF_CAN_BE_HIDDEN; - DirectiveKindMap[".comm"] = DK_COMM; - DirectiveKindMap[".common"] = DK_COMMON; - DirectiveKindMap[".lcomm"] = DK_LCOMM; - DirectiveKindMap[".abort"] = DK_ABORT; - DirectiveKindMap[".include"] = DK_INCLUDE; - DirectiveKindMap[".incbin"] = DK_INCBIN; - DirectiveKindMap[".code16"] = DK_CODE16; - DirectiveKindMap[".code16gcc"] = DK_CODE16GCC; - DirectiveKindMap[".rept"] = DK_REPT; - DirectiveKindMap[".rep"] = DK_REPT; - DirectiveKindMap[".irp"] = DK_IRP; - DirectiveKindMap[".irpc"] = DK_IRPC; - DirectiveKindMap[".endr"] = DK_ENDR; - DirectiveKindMap[".bundle_align_mode"] = DK_BUNDLE_ALIGN_MODE; - DirectiveKindMap[".bundle_lock"] = DK_BUNDLE_LOCK; - DirectiveKindMap[".bundle_unlock"] = DK_BUNDLE_UNLOCK; - DirectiveKindMap[".if"] = DK_IF; - DirectiveKindMap[".ifeq"] = DK_IFEQ; - DirectiveKindMap[".ifge"] = DK_IFGE; - DirectiveKindMap[".ifgt"] = DK_IFGT; - DirectiveKindMap[".ifle"] = DK_IFLE; - DirectiveKindMap[".iflt"] = DK_IFLT; - DirectiveKindMap[".ifne"] = DK_IFNE; - DirectiveKindMap[".ifb"] = DK_IFB; - DirectiveKindMap[".ifnb"] = DK_IFNB; - DirectiveKindMap[".ifc"] = DK_IFC; - DirectiveKindMap[".ifeqs"] = DK_IFEQS; - DirectiveKindMap[".ifnc"] = DK_IFNC; - DirectiveKindMap[".ifnes"] = DK_IFNES; - DirectiveKindMap[".ifdef"] = DK_IFDEF; - DirectiveKindMap[".ifndef"] = DK_IFNDEF; - DirectiveKindMap[".ifnotdef"] = DK_IFNOTDEF; - DirectiveKindMap[".elseif"] = DK_ELSEIF; - DirectiveKindMap[".else"] = DK_ELSE; - DirectiveKindMap[".end"] = DK_END; - DirectiveKindMap[".endif"] = DK_ENDIF; - DirectiveKindMap[".skip"] = DK_SKIP; - DirectiveKindMap[".space"] = DK_SPACE; - DirectiveKindMap[".file"] = DK_FILE; - DirectiveKindMap[".line"] = DK_LINE; - DirectiveKindMap[".loc"] = DK_LOC; - DirectiveKindMap[".stabs"] = DK_STABS; - DirectiveKindMap[".cv_file"] = DK_CV_FILE; - DirectiveKindMap[".cv_loc"] = DK_CV_LOC; - DirectiveKindMap[".cv_linetable"] = DK_CV_LINETABLE; - DirectiveKindMap[".cv_inline_linetable"] = DK_CV_INLINE_LINETABLE; - DirectiveKindMap[".cv_stringtable"] = DK_CV_STRINGTABLE; - DirectiveKindMap[".cv_filechecksums"] = DK_CV_FILECHECKSUMS; - DirectiveKindMap[".sleb128"] = DK_SLEB128; - DirectiveKindMap[".uleb128"] = DK_ULEB128; - DirectiveKindMap[".cfi_sections"] = DK_CFI_SECTIONS; - DirectiveKindMap[".cfi_startproc"] = DK_CFI_STARTPROC; - DirectiveKindMap[".cfi_endproc"] = DK_CFI_ENDPROC; - DirectiveKindMap[".cfi_def_cfa"] = DK_CFI_DEF_CFA; - DirectiveKindMap[".cfi_def_cfa_offset"] = DK_CFI_DEF_CFA_OFFSET; - DirectiveKindMap[".cfi_adjust_cfa_offset"] = DK_CFI_ADJUST_CFA_OFFSET; - DirectiveKindMap[".cfi_def_cfa_register"] = DK_CFI_DEF_CFA_REGISTER; - DirectiveKindMap[".cfi_offset"] = DK_CFI_OFFSET; - DirectiveKindMap[".cfi_rel_offset"] = DK_CFI_REL_OFFSET; - DirectiveKindMap[".cfi_personality"] = DK_CFI_PERSONALITY; - DirectiveKindMap[".cfi_lsda"] = DK_CFI_LSDA; - DirectiveKindMap[".cfi_remember_state"] = DK_CFI_REMEMBER_STATE; - DirectiveKindMap[".cfi_restore_state"] = DK_CFI_RESTORE_STATE; - DirectiveKindMap[".cfi_same_value"] = DK_CFI_SAME_VALUE; - DirectiveKindMap[".cfi_restore"] = DK_CFI_RESTORE; - DirectiveKindMap[".cfi_escape"] = DK_CFI_ESCAPE; - DirectiveKindMap[".cfi_signal_frame"] = DK_CFI_SIGNAL_FRAME; - DirectiveKindMap[".cfi_undefined"] = DK_CFI_UNDEFINED; - DirectiveKindMap[".cfi_register"] = DK_CFI_REGISTER; - DirectiveKindMap[".cfi_window_save"] = DK_CFI_WINDOW_SAVE; - DirectiveKindMap[".macros_on"] = DK_MACROS_ON; - DirectiveKindMap[".macros_off"] = DK_MACROS_OFF; - DirectiveKindMap[".macro"] = DK_MACRO; - DirectiveKindMap[".exitm"] = DK_EXITM; - DirectiveKindMap[".endm"] = DK_ENDM; - DirectiveKindMap[".endmacro"] = DK_ENDMACRO; - DirectiveKindMap[".purgem"] = DK_PURGEM; - DirectiveKindMap[".err"] = DK_ERR; - DirectiveKindMap[".error"] = DK_ERROR; - DirectiveKindMap[".warning"] = DK_WARNING; - DirectiveKindMap[".reloc"] = DK_RELOC; +void AsmParser::initializeDirectiveKindMap(int syntax) +{ + KsSyntax = syntax; + if (syntax == KS_OPT_SYNTAX_NASM) { + DirectiveKindMap.clear(); + DirectiveKindMap["db"] = DK_BYTE; + DirectiveKindMap["dw"] = DK_SHORT; + DirectiveKindMap["dd"] = DK_INT; + DirectiveKindMap["dq"] = DK_QUAD; + DirectiveKindMap["use16"] = DK_CODE16; +#if 0 + DirectiveKindMap[".set"] = DK_SET; + DirectiveKindMap[".equ"] = DK_EQU; + DirectiveKindMap[".equiv"] = DK_EQUIV; + DirectiveKindMap[".ascii"] = DK_ASCII; + DirectiveKindMap[".asciz"] = DK_ASCIZ; + DirectiveKindMap[".string"] = DK_STRING; + DirectiveKindMap[".octa"] = DK_OCTA; + DirectiveKindMap[".single"] = DK_SINGLE; + DirectiveKindMap[".float"] = DK_FLOAT; + DirectiveKindMap[".double"] = DK_DOUBLE; + DirectiveKindMap[".align"] = DK_ALIGN; + DirectiveKindMap[".align32"] = DK_ALIGN32; + DirectiveKindMap[".balign"] = DK_BALIGN; + DirectiveKindMap[".balignw"] = DK_BALIGNW; + DirectiveKindMap[".balignl"] = DK_BALIGNL; + DirectiveKindMap[".p2align"] = DK_P2ALIGN; + DirectiveKindMap[".p2alignw"] = DK_P2ALIGNW; + DirectiveKindMap[".p2alignl"] = DK_P2ALIGNL; + DirectiveKindMap[".org"] = DK_ORG; + DirectiveKindMap[".fill"] = DK_FILL; + DirectiveKindMap[".zero"] = DK_ZERO; + DirectiveKindMap[".extern"] = DK_EXTERN; + DirectiveKindMap[".globl"] = DK_GLOBL; + DirectiveKindMap[".global"] = DK_GLOBAL; + DirectiveKindMap[".lazy_reference"] = DK_LAZY_REFERENCE; + DirectiveKindMap[".no_dead_strip"] = DK_NO_DEAD_STRIP; + DirectiveKindMap[".symbol_resolver"] = DK_SYMBOL_RESOLVER; + DirectiveKindMap[".private_extern"] = DK_PRIVATE_EXTERN; + DirectiveKindMap[".reference"] = DK_REFERENCE; + DirectiveKindMap[".weak_definition"] = DK_WEAK_DEFINITION; + DirectiveKindMap[".weak_reference"] = DK_WEAK_REFERENCE; + DirectiveKindMap[".weak_def_can_be_hidden"] = DK_WEAK_DEF_CAN_BE_HIDDEN; + DirectiveKindMap[".comm"] = DK_COMM; + DirectiveKindMap[".common"] = DK_COMMON; + DirectiveKindMap[".lcomm"] = DK_LCOMM; + DirectiveKindMap[".abort"] = DK_ABORT; + DirectiveKindMap[".include"] = DK_INCLUDE; + DirectiveKindMap[".incbin"] = DK_INCBIN; + DirectiveKindMap[".code16gcc"] = DK_CODE16GCC; + DirectiveKindMap[".rept"] = DK_REPT; + DirectiveKindMap[".rep"] = DK_REPT; + DirectiveKindMap[".irp"] = DK_IRP; + DirectiveKindMap[".irpc"] = DK_IRPC; + DirectiveKindMap[".endr"] = DK_ENDR; + DirectiveKindMap[".bundle_align_mode"] = DK_BUNDLE_ALIGN_MODE; + DirectiveKindMap[".bundle_lock"] = DK_BUNDLE_LOCK; + DirectiveKindMap[".bundle_unlock"] = DK_BUNDLE_UNLOCK; + DirectiveKindMap[".if"] = DK_IF; + DirectiveKindMap[".ifeq"] = DK_IFEQ; + DirectiveKindMap[".ifge"] = DK_IFGE; + DirectiveKindMap[".ifgt"] = DK_IFGT; + DirectiveKindMap[".ifle"] = DK_IFLE; + DirectiveKindMap[".iflt"] = DK_IFLT; + DirectiveKindMap[".ifne"] = DK_IFNE; + DirectiveKindMap[".ifb"] = DK_IFB; + DirectiveKindMap[".ifnb"] = DK_IFNB; + DirectiveKindMap[".ifc"] = DK_IFC; + DirectiveKindMap[".ifeqs"] = DK_IFEQS; + DirectiveKindMap[".ifnc"] = DK_IFNC; + DirectiveKindMap[".ifnes"] = DK_IFNES; + DirectiveKindMap[".ifdef"] = DK_IFDEF; + DirectiveKindMap[".ifndef"] = DK_IFNDEF; + DirectiveKindMap[".ifnotdef"] = DK_IFNOTDEF; + DirectiveKindMap[".elseif"] = DK_ELSEIF; + DirectiveKindMap[".else"] = DK_ELSE; + DirectiveKindMap[".end"] = DK_END; + DirectiveKindMap[".endif"] = DK_ENDIF; + DirectiveKindMap[".skip"] = DK_SKIP; + DirectiveKindMap[".space"] = DK_SPACE; + DirectiveKindMap[".file"] = DK_FILE; + DirectiveKindMap[".line"] = DK_LINE; + DirectiveKindMap[".loc"] = DK_LOC; + DirectiveKindMap[".stabs"] = DK_STABS; + DirectiveKindMap[".cv_file"] = DK_CV_FILE; + DirectiveKindMap[".cv_loc"] = DK_CV_LOC; + DirectiveKindMap[".cv_linetable"] = DK_CV_LINETABLE; + DirectiveKindMap[".cv_inline_linetable"] = DK_CV_INLINE_LINETABLE; + DirectiveKindMap[".cv_stringtable"] = DK_CV_STRINGTABLE; + DirectiveKindMap[".cv_filechecksums"] = DK_CV_FILECHECKSUMS; + DirectiveKindMap[".sleb128"] = DK_SLEB128; + DirectiveKindMap[".uleb128"] = DK_ULEB128; + DirectiveKindMap[".cfi_sections"] = DK_CFI_SECTIONS; + DirectiveKindMap[".cfi_startproc"] = DK_CFI_STARTPROC; + DirectiveKindMap[".cfi_endproc"] = DK_CFI_ENDPROC; + DirectiveKindMap[".cfi_def_cfa"] = DK_CFI_DEF_CFA; + DirectiveKindMap[".cfi_def_cfa_offset"] = DK_CFI_DEF_CFA_OFFSET; + DirectiveKindMap[".cfi_adjust_cfa_offset"] = DK_CFI_ADJUST_CFA_OFFSET; + DirectiveKindMap[".cfi_def_cfa_register"] = DK_CFI_DEF_CFA_REGISTER; + DirectiveKindMap[".cfi_offset"] = DK_CFI_OFFSET; + DirectiveKindMap[".cfi_rel_offset"] = DK_CFI_REL_OFFSET; + DirectiveKindMap[".cfi_personality"] = DK_CFI_PERSONALITY; + DirectiveKindMap[".cfi_lsda"] = DK_CFI_LSDA; + DirectiveKindMap[".cfi_remember_state"] = DK_CFI_REMEMBER_STATE; + DirectiveKindMap[".cfi_restore_state"] = DK_CFI_RESTORE_STATE; + DirectiveKindMap[".cfi_same_value"] = DK_CFI_SAME_VALUE; + DirectiveKindMap[".cfi_restore"] = DK_CFI_RESTORE; + DirectiveKindMap[".cfi_escape"] = DK_CFI_ESCAPE; + DirectiveKindMap[".cfi_signal_frame"] = DK_CFI_SIGNAL_FRAME; + DirectiveKindMap[".cfi_undefined"] = DK_CFI_UNDEFINED; + DirectiveKindMap[".cfi_register"] = DK_CFI_REGISTER; + DirectiveKindMap[".cfi_window_save"] = DK_CFI_WINDOW_SAVE; + DirectiveKindMap[".macros_on"] = DK_MACROS_ON; + DirectiveKindMap[".macros_off"] = DK_MACROS_OFF; + DirectiveKindMap[".macro"] = DK_MACRO; + DirectiveKindMap[".exitm"] = DK_EXITM; + DirectiveKindMap[".endm"] = DK_ENDM; + DirectiveKindMap[".endmacro"] = DK_ENDMACRO; + DirectiveKindMap[".purgem"] = DK_PURGEM; + DirectiveKindMap[".err"] = DK_ERR; + DirectiveKindMap[".error"] = DK_ERROR; + DirectiveKindMap[".warning"] = DK_WARNING; + DirectiveKindMap[".reloc"] = DK_RELOC; +#endif + } else { + // default LLVM syntax + DirectiveKindMap.clear(); + DirectiveKindMap[".set"] = DK_SET; + DirectiveKindMap[".equ"] = DK_EQU; + DirectiveKindMap[".equiv"] = DK_EQUIV; + DirectiveKindMap[".ascii"] = DK_ASCII; + DirectiveKindMap[".asciz"] = DK_ASCIZ; + DirectiveKindMap[".string"] = DK_STRING; + DirectiveKindMap[".byte"] = DK_BYTE; + DirectiveKindMap[".short"] = DK_SHORT; + DirectiveKindMap[".value"] = DK_VALUE; + DirectiveKindMap[".2byte"] = DK_2BYTE; + DirectiveKindMap[".long"] = DK_LONG; + DirectiveKindMap[".int"] = DK_INT; + DirectiveKindMap[".4byte"] = DK_4BYTE; + DirectiveKindMap[".quad"] = DK_QUAD; + DirectiveKindMap[".8byte"] = DK_8BYTE; + DirectiveKindMap[".octa"] = DK_OCTA; + DirectiveKindMap[".single"] = DK_SINGLE; + DirectiveKindMap[".float"] = DK_FLOAT; + DirectiveKindMap[".double"] = DK_DOUBLE; + DirectiveKindMap[".align"] = DK_ALIGN; + DirectiveKindMap[".align32"] = DK_ALIGN32; + DirectiveKindMap[".balign"] = DK_BALIGN; + DirectiveKindMap[".balignw"] = DK_BALIGNW; + DirectiveKindMap[".balignl"] = DK_BALIGNL; + DirectiveKindMap[".p2align"] = DK_P2ALIGN; + DirectiveKindMap[".p2alignw"] = DK_P2ALIGNW; + DirectiveKindMap[".p2alignl"] = DK_P2ALIGNL; + DirectiveKindMap[".org"] = DK_ORG; + DirectiveKindMap[".fill"] = DK_FILL; + DirectiveKindMap[".zero"] = DK_ZERO; + DirectiveKindMap[".extern"] = DK_EXTERN; + DirectiveKindMap[".globl"] = DK_GLOBL; + DirectiveKindMap[".global"] = DK_GLOBAL; + DirectiveKindMap[".lazy_reference"] = DK_LAZY_REFERENCE; + DirectiveKindMap[".no_dead_strip"] = DK_NO_DEAD_STRIP; + DirectiveKindMap[".symbol_resolver"] = DK_SYMBOL_RESOLVER; + DirectiveKindMap[".private_extern"] = DK_PRIVATE_EXTERN; + DirectiveKindMap[".reference"] = DK_REFERENCE; + DirectiveKindMap[".weak_definition"] = DK_WEAK_DEFINITION; + DirectiveKindMap[".weak_reference"] = DK_WEAK_REFERENCE; + DirectiveKindMap[".weak_def_can_be_hidden"] = DK_WEAK_DEF_CAN_BE_HIDDEN; + DirectiveKindMap[".comm"] = DK_COMM; + DirectiveKindMap[".common"] = DK_COMMON; + DirectiveKindMap[".lcomm"] = DK_LCOMM; + DirectiveKindMap[".abort"] = DK_ABORT; + DirectiveKindMap[".include"] = DK_INCLUDE; + DirectiveKindMap[".incbin"] = DK_INCBIN; + DirectiveKindMap[".code16"] = DK_CODE16; + DirectiveKindMap[".code16gcc"] = DK_CODE16GCC; + DirectiveKindMap[".rept"] = DK_REPT; + DirectiveKindMap[".rep"] = DK_REPT; + DirectiveKindMap[".irp"] = DK_IRP; + DirectiveKindMap[".irpc"] = DK_IRPC; + DirectiveKindMap[".endr"] = DK_ENDR; + DirectiveKindMap[".bundle_align_mode"] = DK_BUNDLE_ALIGN_MODE; + DirectiveKindMap[".bundle_lock"] = DK_BUNDLE_LOCK; + DirectiveKindMap[".bundle_unlock"] = DK_BUNDLE_UNLOCK; + DirectiveKindMap[".if"] = DK_IF; + DirectiveKindMap[".ifeq"] = DK_IFEQ; + DirectiveKindMap[".ifge"] = DK_IFGE; + DirectiveKindMap[".ifgt"] = DK_IFGT; + DirectiveKindMap[".ifle"] = DK_IFLE; + DirectiveKindMap[".iflt"] = DK_IFLT; + DirectiveKindMap[".ifne"] = DK_IFNE; + DirectiveKindMap[".ifb"] = DK_IFB; + DirectiveKindMap[".ifnb"] = DK_IFNB; + DirectiveKindMap[".ifc"] = DK_IFC; + DirectiveKindMap[".ifeqs"] = DK_IFEQS; + DirectiveKindMap[".ifnc"] = DK_IFNC; + DirectiveKindMap[".ifnes"] = DK_IFNES; + DirectiveKindMap[".ifdef"] = DK_IFDEF; + DirectiveKindMap[".ifndef"] = DK_IFNDEF; + DirectiveKindMap[".ifnotdef"] = DK_IFNOTDEF; + DirectiveKindMap[".elseif"] = DK_ELSEIF; + DirectiveKindMap[".else"] = DK_ELSE; + DirectiveKindMap[".end"] = DK_END; + DirectiveKindMap[".endif"] = DK_ENDIF; + DirectiveKindMap[".skip"] = DK_SKIP; + DirectiveKindMap[".space"] = DK_SPACE; + DirectiveKindMap[".file"] = DK_FILE; + DirectiveKindMap[".line"] = DK_LINE; + DirectiveKindMap[".loc"] = DK_LOC; + DirectiveKindMap[".stabs"] = DK_STABS; + DirectiveKindMap[".cv_file"] = DK_CV_FILE; + DirectiveKindMap[".cv_loc"] = DK_CV_LOC; + DirectiveKindMap[".cv_linetable"] = DK_CV_LINETABLE; + DirectiveKindMap[".cv_inline_linetable"] = DK_CV_INLINE_LINETABLE; + DirectiveKindMap[".cv_stringtable"] = DK_CV_STRINGTABLE; + DirectiveKindMap[".cv_filechecksums"] = DK_CV_FILECHECKSUMS; + DirectiveKindMap[".sleb128"] = DK_SLEB128; + DirectiveKindMap[".uleb128"] = DK_ULEB128; + DirectiveKindMap[".cfi_sections"] = DK_CFI_SECTIONS; + DirectiveKindMap[".cfi_startproc"] = DK_CFI_STARTPROC; + DirectiveKindMap[".cfi_endproc"] = DK_CFI_ENDPROC; + DirectiveKindMap[".cfi_def_cfa"] = DK_CFI_DEF_CFA; + DirectiveKindMap[".cfi_def_cfa_offset"] = DK_CFI_DEF_CFA_OFFSET; + DirectiveKindMap[".cfi_adjust_cfa_offset"] = DK_CFI_ADJUST_CFA_OFFSET; + DirectiveKindMap[".cfi_def_cfa_register"] = DK_CFI_DEF_CFA_REGISTER; + DirectiveKindMap[".cfi_offset"] = DK_CFI_OFFSET; + DirectiveKindMap[".cfi_rel_offset"] = DK_CFI_REL_OFFSET; + DirectiveKindMap[".cfi_personality"] = DK_CFI_PERSONALITY; + DirectiveKindMap[".cfi_lsda"] = DK_CFI_LSDA; + DirectiveKindMap[".cfi_remember_state"] = DK_CFI_REMEMBER_STATE; + DirectiveKindMap[".cfi_restore_state"] = DK_CFI_RESTORE_STATE; + DirectiveKindMap[".cfi_same_value"] = DK_CFI_SAME_VALUE; + DirectiveKindMap[".cfi_restore"] = DK_CFI_RESTORE; + DirectiveKindMap[".cfi_escape"] = DK_CFI_ESCAPE; + DirectiveKindMap[".cfi_signal_frame"] = DK_CFI_SIGNAL_FRAME; + DirectiveKindMap[".cfi_undefined"] = DK_CFI_UNDEFINED; + DirectiveKindMap[".cfi_register"] = DK_CFI_REGISTER; + DirectiveKindMap[".cfi_window_save"] = DK_CFI_WINDOW_SAVE; + DirectiveKindMap[".macros_on"] = DK_MACROS_ON; + DirectiveKindMap[".macros_off"] = DK_MACROS_OFF; + DirectiveKindMap[".macro"] = DK_MACRO; + DirectiveKindMap[".exitm"] = DK_EXITM; + DirectiveKindMap[".endm"] = DK_ENDM; + DirectiveKindMap[".endmacro"] = DK_ENDMACRO; + DirectiveKindMap[".purgem"] = DK_PURGEM; + DirectiveKindMap[".err"] = DK_ERR; + DirectiveKindMap[".error"] = DK_ERROR; + DirectiveKindMap[".warning"] = DK_WARNING; + DirectiveKindMap[".reloc"] = DK_RELOC; + } } MCAsmMacro *AsmParser::parseMacroLikeBody(SMLoc DirectiveLoc) { -- GitLab