| //===-- MBlazeAsmLexer.cpp - Tokenize MBlaze assembly to AsmTokens --------===// | |
| // | |
| // The LLVM Compiler Infrastructure | |
| // | |
| // This file is distributed under the University of Illinois Open Source | |
| // License. See LICENSE.TXT for details. | |
| // | |
| //===----------------------------------------------------------------------===// | |
| #include "MCTargetDesc/MBlazeBaseInfo.h" | |
| #include "llvm/ADT/OwningPtr.h" | |
| #include "llvm/ADT/SmallVector.h" | |
| #include "llvm/ADT/StringExtras.h" | |
| #include "llvm/MC/MCAsmInfo.h" | |
| #include "llvm/MC/MCParser/MCAsmLexer.h" | |
| #include "llvm/MC/MCParser/MCParsedAsmOperand.h" | |
| #include "llvm/MC/MCRegisterInfo.h" | |
| #include "llvm/MC/MCTargetAsmLexer.h" | |
| #include "llvm/Support/TargetRegistry.h" | |
| #include <string> | |
| #include <map> | |
| using namespace llvm; | |
| namespace { | |
| class MBlazeBaseAsmLexer : public MCTargetAsmLexer { | |
| const MCAsmInfo &AsmInfo; | |
| const AsmToken &lexDefinite() { | |
| return getLexer()->Lex(); | |
| } | |
| AsmToken LexTokenUAL(); | |
| protected: | |
| typedef std::map <std::string, unsigned> rmap_ty; | |
| rmap_ty RegisterMap; | |
| void InitRegisterMap(const MCRegisterInfo *info) { | |
| unsigned numRegs = info->getNumRegs(); | |
| for (unsigned i = 0; i < numRegs; ++i) { | |
| const char *regName = info->getName(i); | |
| if (regName) | |
| RegisterMap[regName] = i; | |
| } | |
| } | |
| unsigned MatchRegisterName(StringRef Name) { | |
| rmap_ty::iterator iter = RegisterMap.find(Name.str()); | |
| if (iter != RegisterMap.end()) | |
| return iter->second; | |
| else | |
| return 0; | |
| } | |
| AsmToken LexToken() { | |
| if (!Lexer) { | |
| SetError(SMLoc(), "No MCAsmLexer installed"); | |
| return AsmToken(AsmToken::Error, "", 0); | |
| } | |
| switch (AsmInfo.getAssemblerDialect()) { | |
| default: | |
| SetError(SMLoc(), "Unhandled dialect"); | |
| return AsmToken(AsmToken::Error, "", 0); | |
| case 0: | |
| return LexTokenUAL(); | |
| } | |
| } | |
| public: | |
| MBlazeBaseAsmLexer(const Target &T, const MCAsmInfo &MAI) | |
| : MCTargetAsmLexer(T), AsmInfo(MAI) { | |
| } | |
| }; | |
| class MBlazeAsmLexer : public MBlazeBaseAsmLexer { | |
| public: | |
| MBlazeAsmLexer(const Target &T, const MCRegisterInfo &MRI, | |
| const MCAsmInfo &MAI) | |
| : MBlazeBaseAsmLexer(T, MAI) { | |
| InitRegisterMap(&MRI); | |
| } | |
| }; | |
| } | |
| AsmToken MBlazeBaseAsmLexer::LexTokenUAL() { | |
| const AsmToken &lexedToken = lexDefinite(); | |
| switch (lexedToken.getKind()) { | |
| default: | |
| return AsmToken(lexedToken); | |
| case AsmToken::Error: | |
| SetError(Lexer->getErrLoc(), Lexer->getErr()); | |
| return AsmToken(lexedToken); | |
| case AsmToken::Identifier: | |
| { | |
| std::string upperCase = lexedToken.getString().str(); | |
| std::string lowerCase = LowercaseString(upperCase); | |
| StringRef lowerRef(lowerCase); | |
| unsigned regID = MatchRegisterName(lowerRef); | |
| if (regID) { | |
| return AsmToken(AsmToken::Register, | |
| lexedToken.getString(), | |
| static_cast<int64_t>(regID)); | |
| } else { | |
| return AsmToken(lexedToken); | |
| } | |
| } | |
| } | |
| } | |
| extern "C" void LLVMInitializeMBlazeAsmLexer() { | |
| RegisterMCAsmLexer<MBlazeAsmLexer> X(TheMBlazeTarget); | |
| } | |