diff options
author | Kevin Enderby <enderby@apple.com> | 2009-09-10 20:51:44 +0000 |
---|---|---|
committer | Kevin Enderby <enderby@apple.com> | 2009-09-10 20:51:44 +0000 |
commit | 9c656450d65034c4cd3597fff61ef17376cff090 (patch) | |
tree | 020f8daa6c6b45a3d7339e93c495c69a18aecf80 /lib | |
parent | 399e45b459c2904b9bd1927306670585ecec3378 (diff) | |
download | llvm-9c656450d65034c4cd3597fff61ef17376cff090.tar.gz llvm-9c656450d65034c4cd3597fff61ef17376cff090.tar.bz2 llvm-9c656450d65034c4cd3597fff61ef17376cff090.tar.xz |
Added the ParseInstruction() hook for target specific assembler directives so
that things like .word can be parsed as target specific. Moved parsing .word
out of AsmParser.cpp into X86AsmParser.cpp as it is 2 bytes on X86 and 4 bytes
for other targets that support the .word directive.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@81461 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r-- | lib/Target/X86/AsmParser/X86AsmParser.cpp | 39 |
1 files changed, 38 insertions, 1 deletions
diff --git a/lib/Target/X86/AsmParser/X86AsmParser.cpp b/lib/Target/X86/AsmParser/X86AsmParser.cpp index e5f23e018b..aa04ba60d3 100644 --- a/lib/Target/X86/AsmParser/X86AsmParser.cpp +++ b/lib/Target/X86/AsmParser/X86AsmParser.cpp @@ -12,6 +12,7 @@ #include "llvm/ADT/Twine.h" #include "llvm/MC/MCAsmLexer.h" #include "llvm/MC/MCAsmParser.h" +#include "llvm/MC/MCStreamer.h" #include "llvm/MC/MCExpr.h" #include "llvm/MC/MCInst.h" #include "llvm/Support/SourceMgr.h" @@ -39,7 +40,9 @@ private: bool ParseOperand(X86Operand &Op); bool ParseMemOperand(X86Operand &Op); - + + bool ParseDirectiveWord(unsigned Size, SMLoc L); + /// @name Auto-generated Match Functions /// { @@ -57,6 +60,8 @@ public: : TargetAsmParser(T), Parser(_Parser) {} virtual bool ParseInstruction(const StringRef &Name, MCInst &Inst); + + virtual bool ParseDirective(AsmToken DirectiveID); }; } // end anonymous namespace @@ -432,6 +437,38 @@ bool X86ATTAsmParser::ParseInstruction(const StringRef &Name, MCInst &Inst) { return true; } +bool X86ATTAsmParser::ParseDirective(AsmToken DirectiveID) { + StringRef IDVal = DirectiveID.getIdentifier(); + if (IDVal == ".word") + return ParseDirectiveWord(2, DirectiveID.getLoc()); + return true; +} + +/// ParseDirectiveWord +/// ::= .word [ expression (, expression)* ] +bool X86ATTAsmParser::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"); + getLexer().Lex(); + } + } + + getLexer().Lex(); + return false; +} + // Force static initialization. extern "C" void LLVMInitializeX86AsmParser() { RegisterAsmParser<X86ATTAsmParser> X(TheX86_32Target); |