This patch implements parsing the .word
authorJack Carter <jcarter@mips.com>
Fri, 25 Jan 2013 01:31:34 +0000 (01:31 +0000)
committerJack Carter <jcarter@mips.com>
Fri, 25 Jan 2013 01:31:34 +0000 (01:31 +0000)
directive for the Mips assembler.

Contributer: Vladimir Medic

llvm-svn: 173407

llvm/lib/Target/Mips/AsmParser/MipsAsmParser.cpp
llvm/test/MC/Mips/mips_directives.s

index 39a53ae..1f143d1 100644 (file)
@@ -133,6 +133,8 @@ class MipsAsmParser : public MCTargetAsmParser {
   bool parseSetReorderDirective();
   bool parseSetNoReorderDirective();
 
+  bool parseDirectiveWord(unsigned Size, SMLoc L);
+
   MCSymbolRefExpr::VariantKind getVariantKind(StringRef Symbol);
 
   bool isMips64() const {
@@ -1451,51 +1453,84 @@ bool MipsAsmParser::parseDirectiveSet() {
     Parser.EatToEndOfStatement();
     return false;
   }
+
   return true;
 }
 
+/// parseDirectiveWord
+///  ::= .word [ expression (, expression)* ]
+bool MipsAsmParser::parseDirectiveWord(unsigned Size, SMLoc L) {
+  if (getLexer().isNot(AsmToken::EndOfStatement)) {
+    for (;;) {
+      const MCExpr *Value;
+      if (getParser().ParseExpression(Value))
+        return true;
+
+      getParser().getStreamer().EmitValue(Value, Size);
+
+      if (getLexer().is(AsmToken::EndOfStatement))
+        break;
+
+      // FIXME: Improve diagnostic.
+      if (getLexer().isNot(AsmToken::Comma))
+        return Error(L, "unexpected token in directive");
+      Parser.Lex();
+    }
+  }
+
+  Parser.Lex();
+  return false;
+}
+
 bool MipsAsmParser::ParseDirective(AsmToken DirectiveID) {
 
-  if (DirectiveID.getString() == ".ent") {
+  StringRef IDVal = DirectiveID.getString();
+
+  if ( IDVal == ".ent") {
     // ignore this directive for now
     Parser.Lex();
     return false;
   }
 
-  if (DirectiveID.getString() == ".end") {
+  if (IDVal == ".end") {
     // ignore this directive for now
     Parser.Lex();
     return false;
   }
 
-  if (DirectiveID.getString() == ".frame") {
+  if (IDVal == ".frame") {
     // ignore this directive for now
     Parser.EatToEndOfStatement();
     return false;
   }
 
-  if (DirectiveID.getString() == ".set") {
+  if (IDVal == ".set") {
     return parseDirectiveSet();
   }
 
-  if (DirectiveID.getString() == ".fmask") {
+  if (IDVal == ".fmask") {
     // ignore this directive for now
     Parser.EatToEndOfStatement();
     return false;
   }
 
-  if (DirectiveID.getString() == ".mask") {
+  if (IDVal == ".mask") {
     // ignore this directive for now
     Parser.EatToEndOfStatement();
     return false;
   }
 
-  if (DirectiveID.getString() == ".gpword") {
+  if (IDVal == ".gpword") {
     // ignore this directive for now
     Parser.EatToEndOfStatement();
     return false;
   }
 
+  if (IDVal == ".word") {
+    parseDirectiveWord(4, DirectiveID.getLoc());
+    return false;
+  }
+
   return true;
 }
 
index e2f75a8..5026b38 100644 (file)
@@ -1,4 +1,4 @@
-# RUN: llvm-mc -triple mips-unknown-unknown %s
+# RUN: llvm-mc -triple mips-unknown-unknown %s | FileCheck %s
 #this test produces no output so there isS no FileCheck call
 $BB0_2:
   .ent directives_test
@@ -10,6 +10,9 @@ $BB0_2:
        .set    noat
 $JTI0_0:
        .gpword ($BB0_2)
+       .word 0x77fffffc
+# CHECK: $JTI0_0:
+# CHECK-NEXT:  .4byte  2013265916
        .set  at=$12
        .set macro
        .set reorder