diff options
| author | Venkatraman Govindaraju <venkatra@cs.wisc.edu> | 2014-03-01 02:18:04 +0000 |
|---|---|---|
| committer | Venkatraman Govindaraju <venkatra@cs.wisc.edu> | 2014-03-01 02:18:04 +0000 |
| commit | 6f2e08c8e1827268c59f572c1bbe2ab8ecc9d339 (patch) | |
| tree | b84099581a5050e0f1920ce644f804645840a280 /llvm | |
| parent | f7eecf80c4133dff74c242b8ee0d8d6273998bec (diff) | |
| download | bcm5719-llvm-6f2e08c8e1827268c59f572c1bbe2ab8ecc9d339.tar.gz bcm5719-llvm-6f2e08c8e1827268c59f572c1bbe2ab8ecc9d339.zip | |
[Sparc] Add support for parsing directives in SparcAsmParser.
llvm-svn: 202564
Diffstat (limited to 'llvm')
| -rw-r--r-- | llvm/lib/Target/Sparc/AsmParser/SparcAsmParser.cpp | 50 | ||||
| -rw-r--r-- | llvm/test/CodeGen/SPARC/mature-mc-support.ll | 2 | ||||
| -rw-r--r-- | llvm/test/MC/Sparc/sparc-directive-xword.s | 10 | ||||
| -rw-r--r-- | llvm/test/MC/Sparc/sparc-directives.s | 19 |
4 files changed, 77 insertions, 4 deletions
diff --git a/llvm/lib/Target/Sparc/AsmParser/SparcAsmParser.cpp b/llvm/lib/Target/Sparc/AsmParser/SparcAsmParser.cpp index 7c3ddb0e382..924e3c32c64 100644 --- a/llvm/lib/Target/Sparc/AsmParser/SparcAsmParser.cpp +++ b/llvm/lib/Target/Sparc/AsmParser/SparcAsmParser.cpp @@ -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; } diff --git a/llvm/test/CodeGen/SPARC/mature-mc-support.ll b/llvm/test/CodeGen/SPARC/mature-mc-support.ll index c4f8f8dd022..4ed33098051 100644 --- a/llvm/test/CodeGen/SPARC/mature-mc-support.ll +++ b/llvm/test/CodeGen/SPARC/mature-mc-support.ll @@ -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/llvm/test/MC/Sparc/sparc-directive-xword.s b/llvm/test/MC/Sparc/sparc-directive-xword.s new file mode 100644 index 00000000000..0c9e249a6ad --- /dev/null +++ b/llvm/test/MC/Sparc/sparc-directive-xword.s @@ -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/llvm/test/MC/Sparc/sparc-directives.s b/llvm/test/MC/Sparc/sparc-directives.s new file mode 100644 index 00000000000..9185e4bc9b2 --- /dev/null +++ b/llvm/test/MC/Sparc/sparc-directives.s @@ -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 + |

