OSDN Git Service

[AsmParser] Support GAS's .print directive
authorCoby Tayree <coby.tayree@intel.com>
Mon, 2 Oct 2017 14:36:31 +0000 (14:36 +0000)
committerCoby Tayree <coby.tayree@intel.com>
Mon, 2 Oct 2017 14:36:31 +0000 (14:36 +0000)
Differential Revision: https://reviews.llvm.org/D38448

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

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

index 16c6d56..9568394 100644 (file)
@@ -538,6 +538,7 @@ private:
     DK_ERR,
     DK_ERROR,
     DK_WARNING,
+    DK_PRINT,
     DK_END
   };
 
@@ -682,6 +683,9 @@ private:
   // ".warning"
   bool parseDirectiveWarning(SMLoc DirectiveLoc);
 
+  // .print <double-quotes-string>
+  bool parseDirectivePrint(SMLoc DirectiveLoc);
+
   void initializeDirectiveKindMap();
 };
 
@@ -2130,6 +2134,8 @@ bool AsmParser::parseStatement(ParseStatementInfo &Info,
     case DK_DS_P:
     case DK_DS_X:
       return parseDirectiveDS(IDVal, 12);
+    case DK_PRINT:
+      return parseDirectivePrint(IDLoc);
     }
 
     return Error(IDLoc, "unknown directive");
@@ -5228,6 +5234,7 @@ void AsmParser::initializeDirectiveKindMap() {
   DirectiveKindMap[".ds.s"] = DK_DS_S;
   DirectiveKindMap[".ds.w"] = DK_DS_W;
   DirectiveKindMap[".ds.x"] = DK_DS_X;
+  DirectiveKindMap[".print"] = DK_PRINT;
 }
 
 MCAsmMacro *AsmParser::parseMacroLikeBody(SMLoc DirectiveLoc) {
@@ -5456,6 +5463,17 @@ bool AsmParser::parseDirectiveMSAlign(SMLoc IDLoc, ParseStatementInfo &Info) {
   return false;
 }
 
+bool AsmParser::parseDirectivePrint(SMLoc DirectiveLoc) {
+  const AsmToken StrTok = getTok();
+  Lex();
+  if (StrTok.isNot(AsmToken::String) || StrTok.getString().front() != '"')
+    return Error(DirectiveLoc, "expected double quoted string after .print");
+  if (parseToken(AsmToken::EndOfStatement, "expected end of statement"))
+    return true;
+  llvm::outs() << StrTok.getStringContents() << '\n';
+  return false;
+}
+
 // We are comparing pointers, but the pointers are relative to a single string.
 // Thus, this should always be deterministic.
 static int rewritesSort(const AsmRewrite *AsmRewriteA,
diff --git a/test/MC/AsmParser/directive_print.s b/test/MC/AsmParser/directive_print.s
new file mode 100644 (file)
index 0000000..9d22844
--- /dev/null
@@ -0,0 +1,18 @@
+# RUN: not llvm-mc -triple i386-linux-gnu %s 2> %t.err | FileCheck %s
+# RUN: FileCheck < %t.err %s --check-prefix=CHECK-ERR
+
+T1:
+# CHECK: e
+# CHECK: 2.718281828459045235
+.print "e"
+.print "2.718281828459045235"
+
+T2:
+# CHECK-ERR: expected double quoted string after .print
+.altmacro
+.print <pi>
+.noaltmacro
+
+T3:
+# CHECK-ERR: expected end of statement
+.print "a" "misplaced-string"