[Sparc] Add support for parsing directives in SparcAsmParser.
authorVenkatraman Govindaraju <venkatra@cs.wisc.edu>
Sat, 1 Mar 2014 02:18:04 +0000 (02:18 +0000)
committerVenkatraman Govindaraju <venkatra@cs.wisc.edu>
Sat, 1 Mar 2014 02:18:04 +0000 (02:18 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@202564 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/Sparc/AsmParser/SparcAsmParser.cpp
test/CodeGen/SPARC/mature-mc-support.ll
test/MC/Sparc/sparc-directive-xword.s [new file with mode: 0644]
test/MC/Sparc/sparc-directives.s [new file with mode: 0644]

index 7c3ddb0e382b4e1f0d6d95bcc1ea8b7199be5982..924e3c32c648f81307b0d4326ceee12384135545 100644 (file)
@@ -73,7 +73,9 @@ class SparcAsmParser : public MCTargetAsmParser {
                          unsigned &RegKind);
 
   bool matchSparcAsmModifiers(const MCExpr *&EVal, SMLoc &EndLoc);
+  bool parseDirectiveWord(unsigned Size, SMLoc L);
 
+  bool is64Bit() const { return STI.getTargetTriple().startswith("sparcv9"); }
 public:
   SparcAsmParser(MCSubtargetInfo &sti, MCAsmParser &parser,
                 const MCInstrInfo &MII)
@@ -482,8 +484,52 @@ ParseInstruction(ParseInstructionInfo &Info, StringRef Name,
 bool SparcAsmParser::
 ParseDirective(AsmToken DirectiveID)
 {
-  // Ignore all directives for now.
-  Parser.eatToEndOfStatement();
+  StringRef IDVal = DirectiveID.getString();
+
+  if (IDVal == ".byte")
+    return parseDirectiveWord(1, DirectiveID.getLoc());
+
+  if (IDVal == ".half")
+    return parseDirectiveWord(2, DirectiveID.getLoc());
+
+  if (IDVal == ".word")
+    return parseDirectiveWord(4, DirectiveID.getLoc());
+
+  if (IDVal == ".nword")
+    return parseDirectiveWord(is64Bit() ? 8 : 4, DirectiveID.getLoc());
+
+  if (is64Bit() && IDVal == ".xword")
+    return parseDirectiveWord(8, DirectiveID.getLoc());
+
+  if (IDVal == ".register") {
+    // For now, ignore .register directive.
+    Parser.eatToEndOfStatement();
+    return false;
+  }
+
+  // Let the MC layer to handle other directives.
+  return true;
+}
+
+bool SparcAsmParser:: 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;
 }
 
index c4f8f8dd0227e56969ed0f8e68fa3edb94b0d4d5..4ed33098051de069ada2479cf1285689ec585046 100644 (file)
@@ -2,8 +2,6 @@
 ; (even when the output is assembly).
 ; FIXME: SPARC doesn't use the integrated assembler by default in all cases
 ; so we only test that -filetype=obj tries to parse the assembly.
-; FIXME: SPARC seems to accept directives that don't exist
-; XFAIL: *
 
 ; SKIP: not llc -march=sparc < %s > /dev/null 2> %t1
 ; SKIP: FileCheck %s < %t1
diff --git a/test/MC/Sparc/sparc-directive-xword.s b/test/MC/Sparc/sparc-directive-xword.s
new file mode 100644 (file)
index 0000000..0c9e249
--- /dev/null
@@ -0,0 +1,10 @@
+! RUN: not llvm-mc %s -arch=sparc   -show-encoding 2>&1 | FileCheck %s --check-prefix=SPARC32
+! RUN: llvm-mc %s -arch=sparcv9 -show-encoding | FileCheck %s --check-prefix=SPARC64
+
+        ! SPARC32:       error: unknown directive
+        ! SPARC32-NEXT:  .xword 65536
+        ! SPARC32-NEXT:  ^
+
+        ! SPARC64:  .xword 65536
+        .xword 65536
+
diff --git a/test/MC/Sparc/sparc-directives.s b/test/MC/Sparc/sparc-directives.s
new file mode 100644 (file)
index 0000000..9185e4b
--- /dev/null
@@ -0,0 +1,19 @@
+! RUN: llvm-mc %s -arch=sparc   -show-encoding | FileCheck %s --check-prefix=SPARC32
+! RUN: llvm-mc %s -arch=sparcv9 -show-encoding | FileCheck %s --check-prefix=SPARC64
+
+        ! SPARC32: .byte 24
+        ! SPARC64: .byte 24
+        .byte 24
+
+        ! SPARC32: .half 1024
+        ! SPARC64: .half 1024
+        .half 1024
+
+        ! SPARC32: .word 65536
+        ! SPARC64: .word 65536
+        .word 65536
+
+        ! SPARC32: .word 65536
+        ! SPARC64: .xword 65536
+        .nword 65536
+