[llvm] r213873 - Let the integrated assembler understand .warning, PR20428.

Nico Weber nicolasweber at gmx.de
Thu Jul 24 09:26:06 PDT 2014


Author: nico
Date: Thu Jul 24 11:26:06 2014
New Revision: 213873

URL: http://llvm.org/viewvc/llvm-project?rev=213873&view=rev
Log:
Let the integrated assembler understand .warning, PR20428.

Added:
    llvm/trunk/test/MC/AsmParser/directive-warning.s
Modified:
    llvm/trunk/lib/MC/MCParser/AsmParser.cpp

Modified: llvm/trunk/lib/MC/MCParser/AsmParser.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCParser/AsmParser.cpp?rev=213873&r1=213872&r2=213873&view=diff
==============================================================================
--- llvm/trunk/lib/MC/MCParser/AsmParser.cpp (original)
+++ llvm/trunk/lib/MC/MCParser/AsmParser.cpp Thu Jul 24 11:26:06 2014
@@ -357,7 +357,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_ERROR,
+    DK_ERR, DK_ERROR, DK_WARNING,
     DK_END
   };
 
@@ -474,6 +474,9 @@ private:
   // ".err" or ".error"
   bool parseDirectiveError(SMLoc DirectiveLoc, bool WithMessage);
 
+  // ".warning"
+  bool parseDirectiveWarning(SMLoc DirectiveLoc);
+
   void initializeDirectiveKindMap();
 };
 }
@@ -1553,6 +1556,8 @@ bool AsmParser::parseStatement(ParseStat
       return parseDirectiveError(IDLoc, false);
     case DK_ERROR:
       return parseDirectiveError(IDLoc, true);
+    case DK_WARNING:
+      return parseDirectiveWarning(IDLoc);
     }
 
     return Error(IDLoc, "unknown directive");
@@ -4073,6 +4078,32 @@ bool AsmParser::parseDirectiveError(SMLo
   return true;
 }
 
+/// parseDirectiveWarning
+///   ::= .warning [string]
+bool AsmParser::parseDirectiveWarning(SMLoc L) {
+  if (!TheCondStack.empty()) {
+    if (TheCondStack.back().Ignore) {
+      eatToEndOfStatement();
+      return false;
+    }
+  }
+
+  StringRef Message = ".warning directive invoked in source file";
+  if (Lexer.isNot(AsmToken::EndOfStatement)) {
+    if (Lexer.isNot(AsmToken::String)) {
+      TokError(".warning argument must be a string");
+      eatToEndOfStatement();
+      return true;
+    }
+
+    Message = getTok().getStringContents();
+    Lex();
+  }
+
+  Warning(L, Message);
+  return false;
+}
+
 /// parseDirectiveEndIf
 /// ::= .endif
 bool AsmParser::parseDirectiveEndIf(SMLoc DirectiveLoc) {
@@ -4205,6 +4236,7 @@ void AsmParser::initializeDirectiveKindM
   DirectiveKindMap[".purgem"] = DK_PURGEM;
   DirectiveKindMap[".err"] = DK_ERR;
   DirectiveKindMap[".error"] = DK_ERROR;
+  DirectiveKindMap[".warning"] = DK_WARNING;
 }
 
 MCAsmMacro *AsmParser::parseMacroLikeBody(SMLoc DirectiveLoc) {

Added: llvm/trunk/test/MC/AsmParser/directive-warning.s
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/AsmParser/directive-warning.s?rev=213873&view=auto
==============================================================================
--- llvm/trunk/test/MC/AsmParser/directive-warning.s (added)
+++ llvm/trunk/test/MC/AsmParser/directive-warning.s Thu Jul 24 11:26:06 2014
@@ -0,0 +1,26 @@
+// RUN: llvm-mc -triple i386 %s 2>&1 | FileCheck %s
+
+	.warning
+// CHECK: warning: .warning directive invoked in source file
+// CHECK-NEXT: 	.warning
+// CHECK-NEXT:  ^
+
+	.ifc a,a
+		.warning
+	.endif
+// CHECK: warning: .warning directive invoked in source file
+// CHECK-NEXT:		.warning
+// CHECK-NEXT:          ^
+
+	.ifnc a,a
+		.warning
+	.endif
+// CHECK-NOT: warning: .warning directive invoked in source file
+
+	.warning "here be dragons"
+// CHECK: warning: here be dragons
+
+	.ifc one, two
+		.warning "dragons, i say"
+	.endif
+// CHECK-NOT: warning: dragons, i say





More information about the llvm-commits mailing list