MCAsmParser: add support for .err directive
authorSaleem Abdulrasool <compnerd@compnerd.org>
Sun, 23 Feb 2014 15:53:30 +0000 (15:53 +0000)
committerSaleem Abdulrasool <compnerd@compnerd.org>
Sun, 23 Feb 2014 15:53:30 +0000 (15:53 +0000)
The .err directive produces an error whenever it is assembled.  This can be
useful for preventing assembly when an unexpected condition occurs.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@201984 91177308-0d34-0410-b5e6-96231b3b80d8

lib/MC/MCParser/AsmParser.cpp
test/MC/AsmParser/directive-err.s [new file with mode: 0644]

index c2998ab8ccc1e6282ee985bd8c60ce46213a11b2..d77a0fd1b6985a0c0233e7ee6385b77311feb55d 100644 (file)
@@ -361,6 +361,7 @@ private:
     DK_CFI_REGISTER, DK_CFI_WINDOW_SAVE,
     DK_MACROS_ON, DK_MACROS_OFF, DK_MACRO, DK_ENDM, DK_ENDMACRO, DK_PURGEM,
     DK_SLEB128, DK_ULEB128,
+    DK_ERR,
     DK_END
   };
 
@@ -471,6 +472,9 @@ private:
   // "end"
   bool parseDirectiveEnd(SMLoc DirectiveLoc);
 
+  // "err"
+  bool parseDirectiveErr(SMLoc DirectiveLoc);
+
   void initializeDirectiveKindMap();
 };
 }
@@ -1526,6 +1530,8 @@ bool AsmParser::parseStatement(ParseStatementInfo &Info) {
       return parseDirectivePurgeMacro(IDLoc);
     case DK_END:
       return parseDirectiveEnd(IDLoc);
+    case DK_ERR:
+      return parseDirectiveErr(IDLoc);
     }
 
     return Error(IDLoc, "unknown directive");
@@ -3931,6 +3937,15 @@ bool AsmParser::parseDirectiveEnd(SMLoc DirectiveLoc) {
   return false;
 }
 
+/// parseDirectiveErr
+/// ::= .err
+bool AsmParser::parseDirectiveErr(SMLoc Loc) {
+  if (!TheCondStack.empty())
+    if (TheCondStack.back().Ignore)
+      return false;
+  return Error(Loc, ".err encountered");
+}
+
 /// parseDirectiveEndIf
 /// ::= .endif
 bool AsmParser::parseDirectiveEndIf(SMLoc DirectiveLoc) {
@@ -4054,6 +4069,7 @@ void AsmParser::initializeDirectiveKindMap() {
   DirectiveKindMap[".endm"] = DK_ENDM;
   DirectiveKindMap[".endmacro"] = DK_ENDMACRO;
   DirectiveKindMap[".purgem"] = DK_PURGEM;
+  DirectiveKindMap[".err"] = DK_ERR;
 }
 
 MCAsmMacro *AsmParser::parseMacroLikeBody(SMLoc DirectiveLoc) {
diff --git a/test/MC/AsmParser/directive-err.s b/test/MC/AsmParser/directive-err.s
new file mode 100644 (file)
index 0000000..59c552a
--- /dev/null
@@ -0,0 +1,19 @@
+// RUN: not llvm-mc -triple i386 %s 2>&1 | FileCheck %s
+
+       .err
+// CHECK: error: .err encountered
+// CHECK-NEXT:         .err
+// CHECK-NEXT:  ^
+
+       .ifc a,a
+               .err
+       .endif
+// CHECK: error: .err encountered
+// CHECK-NEXT:         .err
+// CHECK-NEXT:          ^
+
+       .ifnc a,a
+               .err
+       .endif
+// CHECK-NOT: error: .err encountered
+