1 //===-- ARMAsmLexer.cpp - Tokenize ARM assembly to AsmTokens --------------===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
11 #include "ARMTargetMachine.h"
13 #include "llvm/ADT/OwningPtr.h"
14 #include "llvm/ADT/SmallVector.h"
15 #include "llvm/ADT/StringExtras.h"
17 #include "llvm/MC/MCAsmInfo.h"
18 #include "llvm/MC/MCParser/MCAsmLexer.h"
19 #include "llvm/MC/MCParser/MCParsedAsmOperand.h"
21 #include "llvm/Target/TargetAsmLexer.h"
22 #include "llvm/Target/TargetMachine.h"
23 #include "llvm/Target/TargetRegistry.h"
32 class ARMBaseAsmLexer
: public TargetAsmLexer
{
33 const MCAsmInfo
&AsmInfo
;
35 const AsmToken
&lexDefinite() {
36 return getLexer()->Lex();
39 AsmToken
LexTokenUAL();
41 typedef std::map
<std::string
, unsigned> rmap_ty
;
45 void InitRegisterMap(const TargetRegisterInfo
*info
) {
46 unsigned numRegs
= info
->getNumRegs();
48 for (unsigned i
= 0; i
< numRegs
; ++i
) {
49 const char *regName
= info
->getName(i
);
51 RegisterMap
[regName
] = i
;
55 unsigned MatchRegisterName(StringRef Name
) {
56 rmap_ty::iterator iter
= RegisterMap
.find(Name
.str());
57 if (iter
!= RegisterMap
.end())
65 SetError(SMLoc(), "No MCAsmLexer installed");
66 return AsmToken(AsmToken::Error
, "", 0);
69 switch (AsmInfo
.getAssemblerDialect()) {
71 SetError(SMLoc(), "Unhandled dialect");
72 return AsmToken(AsmToken::Error
, "", 0);
78 ARMBaseAsmLexer(const Target
&T
, const MCAsmInfo
&MAI
)
79 : TargetAsmLexer(T
), AsmInfo(MAI
) {
83 class ARMAsmLexer
: public ARMBaseAsmLexer
{
85 ARMAsmLexer(const Target
&T
, const MCAsmInfo
&MAI
)
86 : ARMBaseAsmLexer(T
, MAI
) {
87 std::string
tripleString("arm-unknown-unknown");
88 std::string featureString
;
89 OwningPtr
<const TargetMachine
>
90 targetMachine(T
.createTargetMachine(tripleString
, featureString
));
91 InitRegisterMap(targetMachine
->getRegisterInfo());
95 class ThumbAsmLexer
: public ARMBaseAsmLexer
{
97 ThumbAsmLexer(const Target
&T
, const MCAsmInfo
&MAI
)
98 : ARMBaseAsmLexer(T
, MAI
) {
99 std::string
tripleString("thumb-unknown-unknown");
100 std::string featureString
;
101 OwningPtr
<const TargetMachine
>
102 targetMachine(T
.createTargetMachine(tripleString
, featureString
));
103 InitRegisterMap(targetMachine
->getRegisterInfo());
108 AsmToken
ARMBaseAsmLexer::LexTokenUAL() {
109 const AsmToken
&lexedToken
= lexDefinite();
111 switch (lexedToken
.getKind()) {
113 return AsmToken(lexedToken
);
114 case AsmToken::Error
:
115 SetError(Lexer
->getErrLoc(), Lexer
->getErr());
116 return AsmToken(lexedToken
);
117 case AsmToken::Identifier
:
119 std::string upperCase
= lexedToken
.getString().str();
120 std::string lowerCase
= LowercaseString(upperCase
);
121 StringRef
lowerRef(lowerCase
);
123 unsigned regID
= MatchRegisterName(lowerRef
);
126 return AsmToken(AsmToken::Register
,
127 lexedToken
.getString(),
128 static_cast<int64_t>(regID
));
130 return AsmToken(lexedToken
);
136 extern "C" void LLVMInitializeARMAsmLexer() {
137 RegisterAsmLexer
<ARMAsmLexer
> X(TheARMTarget
);
138 RegisterAsmLexer
<ThumbAsmLexer
> Y(TheThumbTarget
);