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