diff options
author | Sean Callanan <scallanan@apple.com> | 2010-01-26 00:08:25 +0000 |
---|---|---|
committer | Sean Callanan <scallanan@apple.com> | 2010-01-26 00:08:25 +0000 |
commit | cf2e3d108d6f8f692c01bd48767c7f8dd9e20dcf (patch) | |
tree | 134070d848ed862ef0b266edeca71837e165cb76 /lib | |
parent | 6ec25f570f8e6d216769c76411267618b5f4c61a (diff) | |
download | llvm-cf2e3d108d6f8f692c01bd48767c7f8dd9e20dcf.tar.gz llvm-cf2e3d108d6f8f692c01bd48767c7f8dd9e20dcf.tar.bz2 llvm-cf2e3d108d6f8f692c01bd48767c7f8dd9e20dcf.tar.xz |
Added the TargetAsmLexer implementation for AT&T syntax.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@94479 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r-- | lib/Target/X86/AsmParser/X86AsmLexer.cpp | 75 |
1 files changed, 70 insertions, 5 deletions
diff --git a/lib/Target/X86/AsmParser/X86AsmLexer.cpp b/lib/Target/X86/AsmParser/X86AsmLexer.cpp index 123735cace..f35cb10db3 100644 --- a/lib/Target/X86/AsmParser/X86AsmLexer.cpp +++ b/lib/Target/X86/AsmParser/X86AsmLexer.cpp @@ -7,6 +7,7 @@ // //===----------------------------------------------------------------------===// +#include "llvm/ADT/SmallVector.h" #include "llvm/Target/TargetAsmLexer.h" #include "llvm/Target/TargetRegistry.h" #include "llvm/MC/MCAsmInfo.h" @@ -20,11 +21,36 @@ namespace { class X86AsmLexer : public TargetAsmLexer { const MCAsmInfo &AsmInfo; + MCAsmLexer *Lexer; + + bool tentativeIsValid; + AsmToken tentativeToken; + + const AsmToken &lexTentative() { + tentativeToken = Lexer->Lex(); + tentativeIsValid = true; + return tentativeToken; + } + + const AsmToken &lexDefinite() { + if(tentativeIsValid) { + tentativeIsValid = false; + return tentativeToken; + } + else { + return Lexer->Lex(); + } + } AsmToken LexTokenATT(); AsmToken LexTokenIntel(); protected: AsmToken LexToken() { + if (!Lexer) { + SetError(SMLoc(), "No MCAsmLexer installed"); + return AsmToken(AsmToken::Error, "", 0); + } + switch (AsmInfo.getAssemblerDialect()) { default: SetError(SMLoc(), "Unhandled dialect"); @@ -37,14 +63,53 @@ protected: } public: X86AsmLexer(const Target &T, const MCAsmInfo &MAI) - : TargetAsmLexer(T), AsmInfo(MAI) { + : TargetAsmLexer(T), AsmInfo(MAI), Lexer(NULL), tentativeIsValid(false) { + } + + void InstallLexer(MCAsmLexer &L) { + Lexer = &L; } }; } +static unsigned MatchRegisterName(const StringRef &Name); + AsmToken X86AsmLexer::LexTokenATT() { - return AsmToken(AsmToken::Error, "", 0); + const AsmToken &lexedToken = lexDefinite(); + + switch (lexedToken.getKind()) { + default: + return AsmToken(lexedToken); + case AsmToken::Error: + SetError(Lexer->getErrLoc(), Lexer->getErr()); + return AsmToken(lexedToken); + case AsmToken::Percent: + { + const AsmToken &nextToken = lexTentative(); + if (nextToken.getKind() == AsmToken::Identifier) { + unsigned regID = MatchRegisterName(nextToken.getString()); + + if (regID) { + lexDefinite(); + + StringRef regStr(lexedToken.getString().data(), + lexedToken.getString().size() + + nextToken.getString().size()); + + return AsmToken(AsmToken::Register, + regStr, + static_cast<int64_t>(regID)); + } + else { + return AsmToken(lexedToken); + } + } + else { + return AsmToken(lexedToken); + } + } + } } AsmToken X86AsmLexer::LexTokenIntel() { @@ -56,6 +121,6 @@ extern "C" void LLVMInitializeX86AsmLexer() { RegisterAsmLexer<X86AsmLexer> Y(TheX86_64Target); } -//#define REGISTERS_ONLY -//#include "../X86GenAsmMatcher.inc" -//#undef REGISTERS_ONLY +#define REGISTERS_ONLY +#include "../X86GenAsmMatcher.inc" +#undef REGISTERS_ONLY |