From: Venkatraman Govindaraju Date: Sat, 1 Mar 2014 02:18:04 +0000 (+0000) Subject: [Sparc] Add support for parsing directives in SparcAsmParser. X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=17e95370047926ea4eb1f263667959456731e042;p=oota-llvm.git [Sparc] Add support for parsing directives in SparcAsmParser. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@202564 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Target/Sparc/AsmParser/SparcAsmParser.cpp b/lib/Target/Sparc/AsmParser/SparcAsmParser.cpp index 7c3ddb0e382..924e3c32c64 100644 --- a/lib/Target/Sparc/AsmParser/SparcAsmParser.cpp +++ b/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/test/CodeGen/SPARC/mature-mc-support.ll b/test/CodeGen/SPARC/mature-mc-support.ll index c4f8f8dd022..4ed33098051 100644 --- a/test/CodeGen/SPARC/mature-mc-support.ll +++ b/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/test/MC/Sparc/sparc-directive-xword.s b/test/MC/Sparc/sparc-directive-xword.s new file mode 100644 index 00000000000..0c9e249a6ad --- /dev/null +++ b/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/test/MC/Sparc/sparc-directives.s b/test/MC/Sparc/sparc-directives.s new file mode 100644 index 00000000000..9185e4bc9b2 --- /dev/null +++ b/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 +