|  | //===-- 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); | 
|  | } | 
|  |  |