From 801c5838830d190a6b0d8e462bd43805f66ba50f Mon Sep 17 00:00:00 2001 From: Jack Carter Date: Fri, 25 Jan 2013 01:31:34 +0000 Subject: [PATCH] This patch implements parsing the .word directive for the Mips assembler. Contributer: Vladimir Medic git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@173407 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/Mips/AsmParser/MipsAsmParser.cpp | 49 ++++++++++++++++++--- test/MC/Mips/mips_directives.s | 5 ++- 2 files changed, 46 insertions(+), 8 deletions(-) diff --git a/lib/Target/Mips/AsmParser/MipsAsmParser.cpp b/lib/Target/Mips/AsmParser/MipsAsmParser.cpp index 39a53aeba72..1f143d10b50 100644 --- a/lib/Target/Mips/AsmParser/MipsAsmParser.cpp +++ b/lib/Target/Mips/AsmParser/MipsAsmParser.cpp @@ -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; } diff --git a/test/MC/Mips/mips_directives.s b/test/MC/Mips/mips_directives.s index e2f75a827d0..5026b385e82 100644 --- a/test/MC/Mips/mips_directives.s +++ b/test/MC/Mips/mips_directives.s @@ -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