xref: /aosp_15_r20/external/llvm/lib/AsmParser/LLLexer.cpp (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker //===- LLLexer.cpp - Lexer for .ll Files ----------------------------------===//
2*9880d681SAndroid Build Coastguard Worker //
3*9880d681SAndroid Build Coastguard Worker //                     The LLVM Compiler Infrastructure
4*9880d681SAndroid Build Coastguard Worker //
5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source
6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details.
7*9880d681SAndroid Build Coastguard Worker //
8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
9*9880d681SAndroid Build Coastguard Worker //
10*9880d681SAndroid Build Coastguard Worker // Implement the Lexer for .ll files.
11*9880d681SAndroid Build Coastguard Worker //
12*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
13*9880d681SAndroid Build Coastguard Worker 
14*9880d681SAndroid Build Coastguard Worker #include "LLLexer.h"
15*9880d681SAndroid Build Coastguard Worker #include "llvm/ADT/StringExtras.h"
16*9880d681SAndroid Build Coastguard Worker #include "llvm/ADT/Twine.h"
17*9880d681SAndroid Build Coastguard Worker #include "llvm/AsmParser/Parser.h"
18*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/DerivedTypes.h"
19*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/Instruction.h"
20*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/LLVMContext.h"
21*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/ErrorHandling.h"
22*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/MathExtras.h"
23*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/MemoryBuffer.h"
24*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/SourceMgr.h"
25*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/raw_ostream.h"
26*9880d681SAndroid Build Coastguard Worker #include <cctype>
27*9880d681SAndroid Build Coastguard Worker #include <cstdio>
28*9880d681SAndroid Build Coastguard Worker #include <cstdlib>
29*9880d681SAndroid Build Coastguard Worker #include <cstring>
30*9880d681SAndroid Build Coastguard Worker using namespace llvm;
31*9880d681SAndroid Build Coastguard Worker 
Error(LocTy ErrorLoc,const Twine & Msg) const32*9880d681SAndroid Build Coastguard Worker bool LLLexer::Error(LocTy ErrorLoc, const Twine &Msg) const {
33*9880d681SAndroid Build Coastguard Worker   ErrorInfo = SM.GetMessage(ErrorLoc, SourceMgr::DK_Error, Msg);
34*9880d681SAndroid Build Coastguard Worker   return true;
35*9880d681SAndroid Build Coastguard Worker }
36*9880d681SAndroid Build Coastguard Worker 
Warning(LocTy WarningLoc,const Twine & Msg) const37*9880d681SAndroid Build Coastguard Worker void LLLexer::Warning(LocTy WarningLoc, const Twine &Msg) const {
38*9880d681SAndroid Build Coastguard Worker   SM.PrintMessage(WarningLoc, SourceMgr::DK_Warning, Msg);
39*9880d681SAndroid Build Coastguard Worker }
40*9880d681SAndroid Build Coastguard Worker 
41*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
42*9880d681SAndroid Build Coastguard Worker // Helper functions.
43*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
44*9880d681SAndroid Build Coastguard Worker 
45*9880d681SAndroid Build Coastguard Worker // atoull - Convert an ascii string of decimal digits into the unsigned long
46*9880d681SAndroid Build Coastguard Worker // long representation... this does not have to do input error checking,
47*9880d681SAndroid Build Coastguard Worker // because we know that the input will be matched by a suitable regex...
48*9880d681SAndroid Build Coastguard Worker //
atoull(const char * Buffer,const char * End)49*9880d681SAndroid Build Coastguard Worker uint64_t LLLexer::atoull(const char *Buffer, const char *End) {
50*9880d681SAndroid Build Coastguard Worker   uint64_t Result = 0;
51*9880d681SAndroid Build Coastguard Worker   for (; Buffer != End; Buffer++) {
52*9880d681SAndroid Build Coastguard Worker     uint64_t OldRes = Result;
53*9880d681SAndroid Build Coastguard Worker     Result *= 10;
54*9880d681SAndroid Build Coastguard Worker     Result += *Buffer-'0';
55*9880d681SAndroid Build Coastguard Worker     if (Result < OldRes) {  // Uh, oh, overflow detected!!!
56*9880d681SAndroid Build Coastguard Worker       Error("constant bigger than 64 bits detected!");
57*9880d681SAndroid Build Coastguard Worker       return 0;
58*9880d681SAndroid Build Coastguard Worker     }
59*9880d681SAndroid Build Coastguard Worker   }
60*9880d681SAndroid Build Coastguard Worker   return Result;
61*9880d681SAndroid Build Coastguard Worker }
62*9880d681SAndroid Build Coastguard Worker 
HexIntToVal(const char * Buffer,const char * End)63*9880d681SAndroid Build Coastguard Worker uint64_t LLLexer::HexIntToVal(const char *Buffer, const char *End) {
64*9880d681SAndroid Build Coastguard Worker   uint64_t Result = 0;
65*9880d681SAndroid Build Coastguard Worker   for (; Buffer != End; ++Buffer) {
66*9880d681SAndroid Build Coastguard Worker     uint64_t OldRes = Result;
67*9880d681SAndroid Build Coastguard Worker     Result *= 16;
68*9880d681SAndroid Build Coastguard Worker     Result += hexDigitValue(*Buffer);
69*9880d681SAndroid Build Coastguard Worker 
70*9880d681SAndroid Build Coastguard Worker     if (Result < OldRes) {   // Uh, oh, overflow detected!!!
71*9880d681SAndroid Build Coastguard Worker       Error("constant bigger than 64 bits detected!");
72*9880d681SAndroid Build Coastguard Worker       return 0;
73*9880d681SAndroid Build Coastguard Worker     }
74*9880d681SAndroid Build Coastguard Worker   }
75*9880d681SAndroid Build Coastguard Worker   return Result;
76*9880d681SAndroid Build Coastguard Worker }
77*9880d681SAndroid Build Coastguard Worker 
HexToIntPair(const char * Buffer,const char * End,uint64_t Pair[2])78*9880d681SAndroid Build Coastguard Worker void LLLexer::HexToIntPair(const char *Buffer, const char *End,
79*9880d681SAndroid Build Coastguard Worker                            uint64_t Pair[2]) {
80*9880d681SAndroid Build Coastguard Worker   Pair[0] = 0;
81*9880d681SAndroid Build Coastguard Worker   if (End - Buffer >= 16) {
82*9880d681SAndroid Build Coastguard Worker     for (int i = 0; i < 16; i++, Buffer++) {
83*9880d681SAndroid Build Coastguard Worker       assert(Buffer != End);
84*9880d681SAndroid Build Coastguard Worker       Pair[0] *= 16;
85*9880d681SAndroid Build Coastguard Worker       Pair[0] += hexDigitValue(*Buffer);
86*9880d681SAndroid Build Coastguard Worker     }
87*9880d681SAndroid Build Coastguard Worker   }
88*9880d681SAndroid Build Coastguard Worker   Pair[1] = 0;
89*9880d681SAndroid Build Coastguard Worker   for (int i = 0; i < 16 && Buffer != End; i++, Buffer++) {
90*9880d681SAndroid Build Coastguard Worker     Pair[1] *= 16;
91*9880d681SAndroid Build Coastguard Worker     Pair[1] += hexDigitValue(*Buffer);
92*9880d681SAndroid Build Coastguard Worker   }
93*9880d681SAndroid Build Coastguard Worker   if (Buffer != End)
94*9880d681SAndroid Build Coastguard Worker     Error("constant bigger than 128 bits detected!");
95*9880d681SAndroid Build Coastguard Worker }
96*9880d681SAndroid Build Coastguard Worker 
97*9880d681SAndroid Build Coastguard Worker /// FP80HexToIntPair - translate an 80 bit FP80 number (20 hexits) into
98*9880d681SAndroid Build Coastguard Worker /// { low64, high16 } as usual for an APInt.
FP80HexToIntPair(const char * Buffer,const char * End,uint64_t Pair[2])99*9880d681SAndroid Build Coastguard Worker void LLLexer::FP80HexToIntPair(const char *Buffer, const char *End,
100*9880d681SAndroid Build Coastguard Worker                            uint64_t Pair[2]) {
101*9880d681SAndroid Build Coastguard Worker   Pair[1] = 0;
102*9880d681SAndroid Build Coastguard Worker   for (int i=0; i<4 && Buffer != End; i++, Buffer++) {
103*9880d681SAndroid Build Coastguard Worker     assert(Buffer != End);
104*9880d681SAndroid Build Coastguard Worker     Pair[1] *= 16;
105*9880d681SAndroid Build Coastguard Worker     Pair[1] += hexDigitValue(*Buffer);
106*9880d681SAndroid Build Coastguard Worker   }
107*9880d681SAndroid Build Coastguard Worker   Pair[0] = 0;
108*9880d681SAndroid Build Coastguard Worker   for (int i = 0; i < 16 && Buffer != End; i++, Buffer++) {
109*9880d681SAndroid Build Coastguard Worker     Pair[0] *= 16;
110*9880d681SAndroid Build Coastguard Worker     Pair[0] += hexDigitValue(*Buffer);
111*9880d681SAndroid Build Coastguard Worker   }
112*9880d681SAndroid Build Coastguard Worker   if (Buffer != End)
113*9880d681SAndroid Build Coastguard Worker     Error("constant bigger than 128 bits detected!");
114*9880d681SAndroid Build Coastguard Worker }
115*9880d681SAndroid Build Coastguard Worker 
116*9880d681SAndroid Build Coastguard Worker // UnEscapeLexed - Run through the specified buffer and change \xx codes to the
117*9880d681SAndroid Build Coastguard Worker // appropriate character.
UnEscapeLexed(std::string & Str)118*9880d681SAndroid Build Coastguard Worker static void UnEscapeLexed(std::string &Str) {
119*9880d681SAndroid Build Coastguard Worker   if (Str.empty()) return;
120*9880d681SAndroid Build Coastguard Worker 
121*9880d681SAndroid Build Coastguard Worker   char *Buffer = &Str[0], *EndBuffer = Buffer+Str.size();
122*9880d681SAndroid Build Coastguard Worker   char *BOut = Buffer;
123*9880d681SAndroid Build Coastguard Worker   for (char *BIn = Buffer; BIn != EndBuffer; ) {
124*9880d681SAndroid Build Coastguard Worker     if (BIn[0] == '\\') {
125*9880d681SAndroid Build Coastguard Worker       if (BIn < EndBuffer-1 && BIn[1] == '\\') {
126*9880d681SAndroid Build Coastguard Worker         *BOut++ = '\\'; // Two \ becomes one
127*9880d681SAndroid Build Coastguard Worker         BIn += 2;
128*9880d681SAndroid Build Coastguard Worker       } else if (BIn < EndBuffer-2 &&
129*9880d681SAndroid Build Coastguard Worker                  isxdigit(static_cast<unsigned char>(BIn[1])) &&
130*9880d681SAndroid Build Coastguard Worker                  isxdigit(static_cast<unsigned char>(BIn[2]))) {
131*9880d681SAndroid Build Coastguard Worker         *BOut = hexDigitValue(BIn[1]) * 16 + hexDigitValue(BIn[2]);
132*9880d681SAndroid Build Coastguard Worker         BIn += 3;                           // Skip over handled chars
133*9880d681SAndroid Build Coastguard Worker         ++BOut;
134*9880d681SAndroid Build Coastguard Worker       } else {
135*9880d681SAndroid Build Coastguard Worker         *BOut++ = *BIn++;
136*9880d681SAndroid Build Coastguard Worker       }
137*9880d681SAndroid Build Coastguard Worker     } else {
138*9880d681SAndroid Build Coastguard Worker       *BOut++ = *BIn++;
139*9880d681SAndroid Build Coastguard Worker     }
140*9880d681SAndroid Build Coastguard Worker   }
141*9880d681SAndroid Build Coastguard Worker   Str.resize(BOut-Buffer);
142*9880d681SAndroid Build Coastguard Worker }
143*9880d681SAndroid Build Coastguard Worker 
144*9880d681SAndroid Build Coastguard Worker /// isLabelChar - Return true for [-a-zA-Z$._0-9].
isLabelChar(char C)145*9880d681SAndroid Build Coastguard Worker static bool isLabelChar(char C) {
146*9880d681SAndroid Build Coastguard Worker   return isalnum(static_cast<unsigned char>(C)) || C == '-' || C == '$' ||
147*9880d681SAndroid Build Coastguard Worker          C == '.' || C == '_';
148*9880d681SAndroid Build Coastguard Worker }
149*9880d681SAndroid Build Coastguard Worker 
150*9880d681SAndroid Build Coastguard Worker 
151*9880d681SAndroid Build Coastguard Worker /// isLabelTail - Return true if this pointer points to a valid end of a label.
isLabelTail(const char * CurPtr)152*9880d681SAndroid Build Coastguard Worker static const char *isLabelTail(const char *CurPtr) {
153*9880d681SAndroid Build Coastguard Worker   while (1) {
154*9880d681SAndroid Build Coastguard Worker     if (CurPtr[0] == ':') return CurPtr+1;
155*9880d681SAndroid Build Coastguard Worker     if (!isLabelChar(CurPtr[0])) return nullptr;
156*9880d681SAndroid Build Coastguard Worker     ++CurPtr;
157*9880d681SAndroid Build Coastguard Worker   }
158*9880d681SAndroid Build Coastguard Worker }
159*9880d681SAndroid Build Coastguard Worker 
160*9880d681SAndroid Build Coastguard Worker 
161*9880d681SAndroid Build Coastguard Worker 
162*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
163*9880d681SAndroid Build Coastguard Worker // Lexer definition.
164*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
165*9880d681SAndroid Build Coastguard Worker 
LLLexer(StringRef StartBuf,SourceMgr & sm,SMDiagnostic & Err,LLVMContext & C)166*9880d681SAndroid Build Coastguard Worker LLLexer::LLLexer(StringRef StartBuf, SourceMgr &sm, SMDiagnostic &Err,
167*9880d681SAndroid Build Coastguard Worker                  LLVMContext &C)
168*9880d681SAndroid Build Coastguard Worker   : CurBuf(StartBuf), ErrorInfo(Err), SM(sm), Context(C), APFloatVal(0.0) {
169*9880d681SAndroid Build Coastguard Worker   CurPtr = CurBuf.begin();
170*9880d681SAndroid Build Coastguard Worker }
171*9880d681SAndroid Build Coastguard Worker 
getNextChar()172*9880d681SAndroid Build Coastguard Worker int LLLexer::getNextChar() {
173*9880d681SAndroid Build Coastguard Worker   char CurChar = *CurPtr++;
174*9880d681SAndroid Build Coastguard Worker   switch (CurChar) {
175*9880d681SAndroid Build Coastguard Worker   default: return (unsigned char)CurChar;
176*9880d681SAndroid Build Coastguard Worker   case 0:
177*9880d681SAndroid Build Coastguard Worker     // A nul character in the stream is either the end of the current buffer or
178*9880d681SAndroid Build Coastguard Worker     // a random nul in the file.  Disambiguate that here.
179*9880d681SAndroid Build Coastguard Worker     if (CurPtr-1 != CurBuf.end())
180*9880d681SAndroid Build Coastguard Worker       return 0;  // Just whitespace.
181*9880d681SAndroid Build Coastguard Worker 
182*9880d681SAndroid Build Coastguard Worker     // Otherwise, return end of file.
183*9880d681SAndroid Build Coastguard Worker     --CurPtr;  // Another call to lex will return EOF again.
184*9880d681SAndroid Build Coastguard Worker     return EOF;
185*9880d681SAndroid Build Coastguard Worker   }
186*9880d681SAndroid Build Coastguard Worker }
187*9880d681SAndroid Build Coastguard Worker 
188*9880d681SAndroid Build Coastguard Worker 
LexToken()189*9880d681SAndroid Build Coastguard Worker lltok::Kind LLLexer::LexToken() {
190*9880d681SAndroid Build Coastguard Worker   TokStart = CurPtr;
191*9880d681SAndroid Build Coastguard Worker 
192*9880d681SAndroid Build Coastguard Worker   int CurChar = getNextChar();
193*9880d681SAndroid Build Coastguard Worker   switch (CurChar) {
194*9880d681SAndroid Build Coastguard Worker   default:
195*9880d681SAndroid Build Coastguard Worker     // Handle letters: [a-zA-Z_]
196*9880d681SAndroid Build Coastguard Worker     if (isalpha(static_cast<unsigned char>(CurChar)) || CurChar == '_')
197*9880d681SAndroid Build Coastguard Worker       return LexIdentifier();
198*9880d681SAndroid Build Coastguard Worker 
199*9880d681SAndroid Build Coastguard Worker     return lltok::Error;
200*9880d681SAndroid Build Coastguard Worker   case EOF: return lltok::Eof;
201*9880d681SAndroid Build Coastguard Worker   case 0:
202*9880d681SAndroid Build Coastguard Worker   case ' ':
203*9880d681SAndroid Build Coastguard Worker   case '\t':
204*9880d681SAndroid Build Coastguard Worker   case '\n':
205*9880d681SAndroid Build Coastguard Worker   case '\r':
206*9880d681SAndroid Build Coastguard Worker     // Ignore whitespace.
207*9880d681SAndroid Build Coastguard Worker     return LexToken();
208*9880d681SAndroid Build Coastguard Worker   case '+': return LexPositive();
209*9880d681SAndroid Build Coastguard Worker   case '@': return LexAt();
210*9880d681SAndroid Build Coastguard Worker   case '$': return LexDollar();
211*9880d681SAndroid Build Coastguard Worker   case '%': return LexPercent();
212*9880d681SAndroid Build Coastguard Worker   case '"': return LexQuote();
213*9880d681SAndroid Build Coastguard Worker   case '.':
214*9880d681SAndroid Build Coastguard Worker     if (const char *Ptr = isLabelTail(CurPtr)) {
215*9880d681SAndroid Build Coastguard Worker       CurPtr = Ptr;
216*9880d681SAndroid Build Coastguard Worker       StrVal.assign(TokStart, CurPtr-1);
217*9880d681SAndroid Build Coastguard Worker       return lltok::LabelStr;
218*9880d681SAndroid Build Coastguard Worker     }
219*9880d681SAndroid Build Coastguard Worker     if (CurPtr[0] == '.' && CurPtr[1] == '.') {
220*9880d681SAndroid Build Coastguard Worker       CurPtr += 2;
221*9880d681SAndroid Build Coastguard Worker       return lltok::dotdotdot;
222*9880d681SAndroid Build Coastguard Worker     }
223*9880d681SAndroid Build Coastguard Worker     return lltok::Error;
224*9880d681SAndroid Build Coastguard Worker   case ';':
225*9880d681SAndroid Build Coastguard Worker     SkipLineComment();
226*9880d681SAndroid Build Coastguard Worker     return LexToken();
227*9880d681SAndroid Build Coastguard Worker   case '!': return LexExclaim();
228*9880d681SAndroid Build Coastguard Worker   case '#': return LexHash();
229*9880d681SAndroid Build Coastguard Worker   case '0': case '1': case '2': case '3': case '4':
230*9880d681SAndroid Build Coastguard Worker   case '5': case '6': case '7': case '8': case '9':
231*9880d681SAndroid Build Coastguard Worker   case '-':
232*9880d681SAndroid Build Coastguard Worker     return LexDigitOrNegative();
233*9880d681SAndroid Build Coastguard Worker   case '=': return lltok::equal;
234*9880d681SAndroid Build Coastguard Worker   case '[': return lltok::lsquare;
235*9880d681SAndroid Build Coastguard Worker   case ']': return lltok::rsquare;
236*9880d681SAndroid Build Coastguard Worker   case '{': return lltok::lbrace;
237*9880d681SAndroid Build Coastguard Worker   case '}': return lltok::rbrace;
238*9880d681SAndroid Build Coastguard Worker   case '<': return lltok::less;
239*9880d681SAndroid Build Coastguard Worker   case '>': return lltok::greater;
240*9880d681SAndroid Build Coastguard Worker   case '(': return lltok::lparen;
241*9880d681SAndroid Build Coastguard Worker   case ')': return lltok::rparen;
242*9880d681SAndroid Build Coastguard Worker   case ',': return lltok::comma;
243*9880d681SAndroid Build Coastguard Worker   case '*': return lltok::star;
244*9880d681SAndroid Build Coastguard Worker   case '|': return lltok::bar;
245*9880d681SAndroid Build Coastguard Worker   }
246*9880d681SAndroid Build Coastguard Worker }
247*9880d681SAndroid Build Coastguard Worker 
SkipLineComment()248*9880d681SAndroid Build Coastguard Worker void LLLexer::SkipLineComment() {
249*9880d681SAndroid Build Coastguard Worker   while (1) {
250*9880d681SAndroid Build Coastguard Worker     if (CurPtr[0] == '\n' || CurPtr[0] == '\r' || getNextChar() == EOF)
251*9880d681SAndroid Build Coastguard Worker       return;
252*9880d681SAndroid Build Coastguard Worker   }
253*9880d681SAndroid Build Coastguard Worker }
254*9880d681SAndroid Build Coastguard Worker 
255*9880d681SAndroid Build Coastguard Worker /// Lex all tokens that start with an @ character.
256*9880d681SAndroid Build Coastguard Worker ///   GlobalVar   @\"[^\"]*\"
257*9880d681SAndroid Build Coastguard Worker ///   GlobalVar   @[-a-zA-Z$._][-a-zA-Z$._0-9]*
258*9880d681SAndroid Build Coastguard Worker ///   GlobalVarID @[0-9]+
LexAt()259*9880d681SAndroid Build Coastguard Worker lltok::Kind LLLexer::LexAt() {
260*9880d681SAndroid Build Coastguard Worker   return LexVar(lltok::GlobalVar, lltok::GlobalID);
261*9880d681SAndroid Build Coastguard Worker }
262*9880d681SAndroid Build Coastguard Worker 
LexDollar()263*9880d681SAndroid Build Coastguard Worker lltok::Kind LLLexer::LexDollar() {
264*9880d681SAndroid Build Coastguard Worker   if (const char *Ptr = isLabelTail(TokStart)) {
265*9880d681SAndroid Build Coastguard Worker     CurPtr = Ptr;
266*9880d681SAndroid Build Coastguard Worker     StrVal.assign(TokStart, CurPtr - 1);
267*9880d681SAndroid Build Coastguard Worker     return lltok::LabelStr;
268*9880d681SAndroid Build Coastguard Worker   }
269*9880d681SAndroid Build Coastguard Worker 
270*9880d681SAndroid Build Coastguard Worker   // Handle DollarStringConstant: $\"[^\"]*\"
271*9880d681SAndroid Build Coastguard Worker   if (CurPtr[0] == '"') {
272*9880d681SAndroid Build Coastguard Worker     ++CurPtr;
273*9880d681SAndroid Build Coastguard Worker 
274*9880d681SAndroid Build Coastguard Worker     while (1) {
275*9880d681SAndroid Build Coastguard Worker       int CurChar = getNextChar();
276*9880d681SAndroid Build Coastguard Worker 
277*9880d681SAndroid Build Coastguard Worker       if (CurChar == EOF) {
278*9880d681SAndroid Build Coastguard Worker         Error("end of file in COMDAT variable name");
279*9880d681SAndroid Build Coastguard Worker         return lltok::Error;
280*9880d681SAndroid Build Coastguard Worker       }
281*9880d681SAndroid Build Coastguard Worker       if (CurChar == '"') {
282*9880d681SAndroid Build Coastguard Worker         StrVal.assign(TokStart + 2, CurPtr - 1);
283*9880d681SAndroid Build Coastguard Worker         UnEscapeLexed(StrVal);
284*9880d681SAndroid Build Coastguard Worker         if (StringRef(StrVal).find_first_of(0) != StringRef::npos) {
285*9880d681SAndroid Build Coastguard Worker           Error("Null bytes are not allowed in names");
286*9880d681SAndroid Build Coastguard Worker           return lltok::Error;
287*9880d681SAndroid Build Coastguard Worker         }
288*9880d681SAndroid Build Coastguard Worker         return lltok::ComdatVar;
289*9880d681SAndroid Build Coastguard Worker       }
290*9880d681SAndroid Build Coastguard Worker     }
291*9880d681SAndroid Build Coastguard Worker   }
292*9880d681SAndroid Build Coastguard Worker 
293*9880d681SAndroid Build Coastguard Worker   // Handle ComdatVarName: $[-a-zA-Z$._][-a-zA-Z$._0-9]*
294*9880d681SAndroid Build Coastguard Worker   if (ReadVarName())
295*9880d681SAndroid Build Coastguard Worker     return lltok::ComdatVar;
296*9880d681SAndroid Build Coastguard Worker 
297*9880d681SAndroid Build Coastguard Worker   return lltok::Error;
298*9880d681SAndroid Build Coastguard Worker }
299*9880d681SAndroid Build Coastguard Worker 
300*9880d681SAndroid Build Coastguard Worker /// ReadString - Read a string until the closing quote.
ReadString(lltok::Kind kind)301*9880d681SAndroid Build Coastguard Worker lltok::Kind LLLexer::ReadString(lltok::Kind kind) {
302*9880d681SAndroid Build Coastguard Worker   const char *Start = CurPtr;
303*9880d681SAndroid Build Coastguard Worker   while (1) {
304*9880d681SAndroid Build Coastguard Worker     int CurChar = getNextChar();
305*9880d681SAndroid Build Coastguard Worker 
306*9880d681SAndroid Build Coastguard Worker     if (CurChar == EOF) {
307*9880d681SAndroid Build Coastguard Worker       Error("end of file in string constant");
308*9880d681SAndroid Build Coastguard Worker       return lltok::Error;
309*9880d681SAndroid Build Coastguard Worker     }
310*9880d681SAndroid Build Coastguard Worker     if (CurChar == '"') {
311*9880d681SAndroid Build Coastguard Worker       StrVal.assign(Start, CurPtr-1);
312*9880d681SAndroid Build Coastguard Worker       UnEscapeLexed(StrVal);
313*9880d681SAndroid Build Coastguard Worker       return kind;
314*9880d681SAndroid Build Coastguard Worker     }
315*9880d681SAndroid Build Coastguard Worker   }
316*9880d681SAndroid Build Coastguard Worker }
317*9880d681SAndroid Build Coastguard Worker 
318*9880d681SAndroid Build Coastguard Worker /// ReadVarName - Read the rest of a token containing a variable name.
ReadVarName()319*9880d681SAndroid Build Coastguard Worker bool LLLexer::ReadVarName() {
320*9880d681SAndroid Build Coastguard Worker   const char *NameStart = CurPtr;
321*9880d681SAndroid Build Coastguard Worker   if (isalpha(static_cast<unsigned char>(CurPtr[0])) ||
322*9880d681SAndroid Build Coastguard Worker       CurPtr[0] == '-' || CurPtr[0] == '$' ||
323*9880d681SAndroid Build Coastguard Worker       CurPtr[0] == '.' || CurPtr[0] == '_') {
324*9880d681SAndroid Build Coastguard Worker     ++CurPtr;
325*9880d681SAndroid Build Coastguard Worker     while (isalnum(static_cast<unsigned char>(CurPtr[0])) ||
326*9880d681SAndroid Build Coastguard Worker            CurPtr[0] == '-' || CurPtr[0] == '$' ||
327*9880d681SAndroid Build Coastguard Worker            CurPtr[0] == '.' || CurPtr[0] == '_')
328*9880d681SAndroid Build Coastguard Worker       ++CurPtr;
329*9880d681SAndroid Build Coastguard Worker 
330*9880d681SAndroid Build Coastguard Worker     StrVal.assign(NameStart, CurPtr);
331*9880d681SAndroid Build Coastguard Worker     return true;
332*9880d681SAndroid Build Coastguard Worker   }
333*9880d681SAndroid Build Coastguard Worker   return false;
334*9880d681SAndroid Build Coastguard Worker }
335*9880d681SAndroid Build Coastguard Worker 
LexVar(lltok::Kind Var,lltok::Kind VarID)336*9880d681SAndroid Build Coastguard Worker lltok::Kind LLLexer::LexVar(lltok::Kind Var, lltok::Kind VarID) {
337*9880d681SAndroid Build Coastguard Worker   // Handle StringConstant: \"[^\"]*\"
338*9880d681SAndroid Build Coastguard Worker   if (CurPtr[0] == '"') {
339*9880d681SAndroid Build Coastguard Worker     ++CurPtr;
340*9880d681SAndroid Build Coastguard Worker 
341*9880d681SAndroid Build Coastguard Worker     while (1) {
342*9880d681SAndroid Build Coastguard Worker       int CurChar = getNextChar();
343*9880d681SAndroid Build Coastguard Worker 
344*9880d681SAndroid Build Coastguard Worker       if (CurChar == EOF) {
345*9880d681SAndroid Build Coastguard Worker         Error("end of file in global variable name");
346*9880d681SAndroid Build Coastguard Worker         return lltok::Error;
347*9880d681SAndroid Build Coastguard Worker       }
348*9880d681SAndroid Build Coastguard Worker       if (CurChar == '"') {
349*9880d681SAndroid Build Coastguard Worker         StrVal.assign(TokStart+2, CurPtr-1);
350*9880d681SAndroid Build Coastguard Worker         UnEscapeLexed(StrVal);
351*9880d681SAndroid Build Coastguard Worker         if (StringRef(StrVal).find_first_of(0) != StringRef::npos) {
352*9880d681SAndroid Build Coastguard Worker           Error("Null bytes are not allowed in names");
353*9880d681SAndroid Build Coastguard Worker           return lltok::Error;
354*9880d681SAndroid Build Coastguard Worker         }
355*9880d681SAndroid Build Coastguard Worker         return Var;
356*9880d681SAndroid Build Coastguard Worker       }
357*9880d681SAndroid Build Coastguard Worker     }
358*9880d681SAndroid Build Coastguard Worker   }
359*9880d681SAndroid Build Coastguard Worker 
360*9880d681SAndroid Build Coastguard Worker   // Handle VarName: [-a-zA-Z$._][-a-zA-Z$._0-9]*
361*9880d681SAndroid Build Coastguard Worker   if (ReadVarName())
362*9880d681SAndroid Build Coastguard Worker     return Var;
363*9880d681SAndroid Build Coastguard Worker 
364*9880d681SAndroid Build Coastguard Worker   // Handle VarID: [0-9]+
365*9880d681SAndroid Build Coastguard Worker   if (isdigit(static_cast<unsigned char>(CurPtr[0]))) {
366*9880d681SAndroid Build Coastguard Worker     for (++CurPtr; isdigit(static_cast<unsigned char>(CurPtr[0])); ++CurPtr)
367*9880d681SAndroid Build Coastguard Worker       /*empty*/;
368*9880d681SAndroid Build Coastguard Worker 
369*9880d681SAndroid Build Coastguard Worker     uint64_t Val = atoull(TokStart+1, CurPtr);
370*9880d681SAndroid Build Coastguard Worker     if ((unsigned)Val != Val)
371*9880d681SAndroid Build Coastguard Worker       Error("invalid value number (too large)!");
372*9880d681SAndroid Build Coastguard Worker     UIntVal = unsigned(Val);
373*9880d681SAndroid Build Coastguard Worker     return VarID;
374*9880d681SAndroid Build Coastguard Worker   }
375*9880d681SAndroid Build Coastguard Worker   return lltok::Error;
376*9880d681SAndroid Build Coastguard Worker }
377*9880d681SAndroid Build Coastguard Worker 
378*9880d681SAndroid Build Coastguard Worker /// Lex all tokens that start with a % character.
379*9880d681SAndroid Build Coastguard Worker ///   LocalVar   ::= %\"[^\"]*\"
380*9880d681SAndroid Build Coastguard Worker ///   LocalVar   ::= %[-a-zA-Z$._][-a-zA-Z$._0-9]*
381*9880d681SAndroid Build Coastguard Worker ///   LocalVarID ::= %[0-9]+
LexPercent()382*9880d681SAndroid Build Coastguard Worker lltok::Kind LLLexer::LexPercent() {
383*9880d681SAndroid Build Coastguard Worker   return LexVar(lltok::LocalVar, lltok::LocalVarID);
384*9880d681SAndroid Build Coastguard Worker }
385*9880d681SAndroid Build Coastguard Worker 
386*9880d681SAndroid Build Coastguard Worker /// Lex all tokens that start with a " character.
387*9880d681SAndroid Build Coastguard Worker ///   QuoteLabel        "[^"]+":
388*9880d681SAndroid Build Coastguard Worker ///   StringConstant    "[^"]*"
LexQuote()389*9880d681SAndroid Build Coastguard Worker lltok::Kind LLLexer::LexQuote() {
390*9880d681SAndroid Build Coastguard Worker   lltok::Kind kind = ReadString(lltok::StringConstant);
391*9880d681SAndroid Build Coastguard Worker   if (kind == lltok::Error || kind == lltok::Eof)
392*9880d681SAndroid Build Coastguard Worker     return kind;
393*9880d681SAndroid Build Coastguard Worker 
394*9880d681SAndroid Build Coastguard Worker   if (CurPtr[0] == ':') {
395*9880d681SAndroid Build Coastguard Worker     ++CurPtr;
396*9880d681SAndroid Build Coastguard Worker     if (StringRef(StrVal).find_first_of(0) != StringRef::npos) {
397*9880d681SAndroid Build Coastguard Worker       Error("Null bytes are not allowed in names");
398*9880d681SAndroid Build Coastguard Worker       kind = lltok::Error;
399*9880d681SAndroid Build Coastguard Worker     } else {
400*9880d681SAndroid Build Coastguard Worker       kind = lltok::LabelStr;
401*9880d681SAndroid Build Coastguard Worker     }
402*9880d681SAndroid Build Coastguard Worker   }
403*9880d681SAndroid Build Coastguard Worker 
404*9880d681SAndroid Build Coastguard Worker   return kind;
405*9880d681SAndroid Build Coastguard Worker }
406*9880d681SAndroid Build Coastguard Worker 
407*9880d681SAndroid Build Coastguard Worker /// Lex all tokens that start with a ! character.
408*9880d681SAndroid Build Coastguard Worker ///    !foo
409*9880d681SAndroid Build Coastguard Worker ///    !
LexExclaim()410*9880d681SAndroid Build Coastguard Worker lltok::Kind LLLexer::LexExclaim() {
411*9880d681SAndroid Build Coastguard Worker   // Lex a metadata name as a MetadataVar.
412*9880d681SAndroid Build Coastguard Worker   if (isalpha(static_cast<unsigned char>(CurPtr[0])) ||
413*9880d681SAndroid Build Coastguard Worker       CurPtr[0] == '-' || CurPtr[0] == '$' ||
414*9880d681SAndroid Build Coastguard Worker       CurPtr[0] == '.' || CurPtr[0] == '_' || CurPtr[0] == '\\') {
415*9880d681SAndroid Build Coastguard Worker     ++CurPtr;
416*9880d681SAndroid Build Coastguard Worker     while (isalnum(static_cast<unsigned char>(CurPtr[0])) ||
417*9880d681SAndroid Build Coastguard Worker            CurPtr[0] == '-' || CurPtr[0] == '$' ||
418*9880d681SAndroid Build Coastguard Worker            CurPtr[0] == '.' || CurPtr[0] == '_' || CurPtr[0] == '\\')
419*9880d681SAndroid Build Coastguard Worker       ++CurPtr;
420*9880d681SAndroid Build Coastguard Worker 
421*9880d681SAndroid Build Coastguard Worker     StrVal.assign(TokStart+1, CurPtr);   // Skip !
422*9880d681SAndroid Build Coastguard Worker     UnEscapeLexed(StrVal);
423*9880d681SAndroid Build Coastguard Worker     return lltok::MetadataVar;
424*9880d681SAndroid Build Coastguard Worker   }
425*9880d681SAndroid Build Coastguard Worker   return lltok::exclaim;
426*9880d681SAndroid Build Coastguard Worker }
427*9880d681SAndroid Build Coastguard Worker 
428*9880d681SAndroid Build Coastguard Worker /// Lex all tokens that start with a # character.
429*9880d681SAndroid Build Coastguard Worker ///    AttrGrpID ::= #[0-9]+
LexHash()430*9880d681SAndroid Build Coastguard Worker lltok::Kind LLLexer::LexHash() {
431*9880d681SAndroid Build Coastguard Worker   // Handle AttrGrpID: #[0-9]+
432*9880d681SAndroid Build Coastguard Worker   if (isdigit(static_cast<unsigned char>(CurPtr[0]))) {
433*9880d681SAndroid Build Coastguard Worker     for (++CurPtr; isdigit(static_cast<unsigned char>(CurPtr[0])); ++CurPtr)
434*9880d681SAndroid Build Coastguard Worker       /*empty*/;
435*9880d681SAndroid Build Coastguard Worker 
436*9880d681SAndroid Build Coastguard Worker     uint64_t Val = atoull(TokStart+1, CurPtr);
437*9880d681SAndroid Build Coastguard Worker     if ((unsigned)Val != Val)
438*9880d681SAndroid Build Coastguard Worker       Error("invalid value number (too large)!");
439*9880d681SAndroid Build Coastguard Worker     UIntVal = unsigned(Val);
440*9880d681SAndroid Build Coastguard Worker     return lltok::AttrGrpID;
441*9880d681SAndroid Build Coastguard Worker   }
442*9880d681SAndroid Build Coastguard Worker 
443*9880d681SAndroid Build Coastguard Worker   return lltok::Error;
444*9880d681SAndroid Build Coastguard Worker }
445*9880d681SAndroid Build Coastguard Worker 
446*9880d681SAndroid Build Coastguard Worker /// Lex a label, integer type, keyword, or hexadecimal integer constant.
447*9880d681SAndroid Build Coastguard Worker ///    Label           [-a-zA-Z$._0-9]+:
448*9880d681SAndroid Build Coastguard Worker ///    IntegerType     i[0-9]+
449*9880d681SAndroid Build Coastguard Worker ///    Keyword         sdiv, float, ...
450*9880d681SAndroid Build Coastguard Worker ///    HexIntConstant  [us]0x[0-9A-Fa-f]+
LexIdentifier()451*9880d681SAndroid Build Coastguard Worker lltok::Kind LLLexer::LexIdentifier() {
452*9880d681SAndroid Build Coastguard Worker   const char *StartChar = CurPtr;
453*9880d681SAndroid Build Coastguard Worker   const char *IntEnd = CurPtr[-1] == 'i' ? nullptr : StartChar;
454*9880d681SAndroid Build Coastguard Worker   const char *KeywordEnd = nullptr;
455*9880d681SAndroid Build Coastguard Worker 
456*9880d681SAndroid Build Coastguard Worker   for (; isLabelChar(*CurPtr); ++CurPtr) {
457*9880d681SAndroid Build Coastguard Worker     // If we decide this is an integer, remember the end of the sequence.
458*9880d681SAndroid Build Coastguard Worker     if (!IntEnd && !isdigit(static_cast<unsigned char>(*CurPtr)))
459*9880d681SAndroid Build Coastguard Worker       IntEnd = CurPtr;
460*9880d681SAndroid Build Coastguard Worker     if (!KeywordEnd && !isalnum(static_cast<unsigned char>(*CurPtr)) &&
461*9880d681SAndroid Build Coastguard Worker         *CurPtr != '_')
462*9880d681SAndroid Build Coastguard Worker       KeywordEnd = CurPtr;
463*9880d681SAndroid Build Coastguard Worker   }
464*9880d681SAndroid Build Coastguard Worker 
465*9880d681SAndroid Build Coastguard Worker   // If we stopped due to a colon, this really is a label.
466*9880d681SAndroid Build Coastguard Worker   if (*CurPtr == ':') {
467*9880d681SAndroid Build Coastguard Worker     StrVal.assign(StartChar-1, CurPtr++);
468*9880d681SAndroid Build Coastguard Worker     return lltok::LabelStr;
469*9880d681SAndroid Build Coastguard Worker   }
470*9880d681SAndroid Build Coastguard Worker 
471*9880d681SAndroid Build Coastguard Worker   // Otherwise, this wasn't a label.  If this was valid as an integer type,
472*9880d681SAndroid Build Coastguard Worker   // return it.
473*9880d681SAndroid Build Coastguard Worker   if (!IntEnd) IntEnd = CurPtr;
474*9880d681SAndroid Build Coastguard Worker   if (IntEnd != StartChar) {
475*9880d681SAndroid Build Coastguard Worker     CurPtr = IntEnd;
476*9880d681SAndroid Build Coastguard Worker     uint64_t NumBits = atoull(StartChar, CurPtr);
477*9880d681SAndroid Build Coastguard Worker     if (NumBits < IntegerType::MIN_INT_BITS ||
478*9880d681SAndroid Build Coastguard Worker         NumBits > IntegerType::MAX_INT_BITS) {
479*9880d681SAndroid Build Coastguard Worker       Error("bitwidth for integer type out of range!");
480*9880d681SAndroid Build Coastguard Worker       return lltok::Error;
481*9880d681SAndroid Build Coastguard Worker     }
482*9880d681SAndroid Build Coastguard Worker     TyVal = IntegerType::get(Context, NumBits);
483*9880d681SAndroid Build Coastguard Worker     return lltok::Type;
484*9880d681SAndroid Build Coastguard Worker   }
485*9880d681SAndroid Build Coastguard Worker 
486*9880d681SAndroid Build Coastguard Worker   // Otherwise, this was a letter sequence.  See which keyword this is.
487*9880d681SAndroid Build Coastguard Worker   if (!KeywordEnd) KeywordEnd = CurPtr;
488*9880d681SAndroid Build Coastguard Worker   CurPtr = KeywordEnd;
489*9880d681SAndroid Build Coastguard Worker   --StartChar;
490*9880d681SAndroid Build Coastguard Worker   StringRef Keyword(StartChar, CurPtr - StartChar);
491*9880d681SAndroid Build Coastguard Worker #define KEYWORD(STR)                                                           \
492*9880d681SAndroid Build Coastguard Worker   do {                                                                         \
493*9880d681SAndroid Build Coastguard Worker     if (Keyword == #STR)                                                       \
494*9880d681SAndroid Build Coastguard Worker       return lltok::kw_##STR;                                                  \
495*9880d681SAndroid Build Coastguard Worker   } while (0)
496*9880d681SAndroid Build Coastguard Worker 
497*9880d681SAndroid Build Coastguard Worker   KEYWORD(true);    KEYWORD(false);
498*9880d681SAndroid Build Coastguard Worker   KEYWORD(declare); KEYWORD(define);
499*9880d681SAndroid Build Coastguard Worker   KEYWORD(global);  KEYWORD(constant);
500*9880d681SAndroid Build Coastguard Worker 
501*9880d681SAndroid Build Coastguard Worker   KEYWORD(private);
502*9880d681SAndroid Build Coastguard Worker   KEYWORD(internal);
503*9880d681SAndroid Build Coastguard Worker   KEYWORD(available_externally);
504*9880d681SAndroid Build Coastguard Worker   KEYWORD(linkonce);
505*9880d681SAndroid Build Coastguard Worker   KEYWORD(linkonce_odr);
506*9880d681SAndroid Build Coastguard Worker   KEYWORD(weak); // Use as a linkage, and a modifier for "cmpxchg".
507*9880d681SAndroid Build Coastguard Worker   KEYWORD(weak_odr);
508*9880d681SAndroid Build Coastguard Worker   KEYWORD(appending);
509*9880d681SAndroid Build Coastguard Worker   KEYWORD(dllimport);
510*9880d681SAndroid Build Coastguard Worker   KEYWORD(dllexport);
511*9880d681SAndroid Build Coastguard Worker   KEYWORD(common);
512*9880d681SAndroid Build Coastguard Worker   KEYWORD(default);
513*9880d681SAndroid Build Coastguard Worker   KEYWORD(hidden);
514*9880d681SAndroid Build Coastguard Worker   KEYWORD(protected);
515*9880d681SAndroid Build Coastguard Worker   KEYWORD(unnamed_addr);
516*9880d681SAndroid Build Coastguard Worker   KEYWORD(local_unnamed_addr);
517*9880d681SAndroid Build Coastguard Worker   KEYWORD(externally_initialized);
518*9880d681SAndroid Build Coastguard Worker   KEYWORD(extern_weak);
519*9880d681SAndroid Build Coastguard Worker   KEYWORD(external);
520*9880d681SAndroid Build Coastguard Worker   KEYWORD(thread_local);
521*9880d681SAndroid Build Coastguard Worker   KEYWORD(localdynamic);
522*9880d681SAndroid Build Coastguard Worker   KEYWORD(initialexec);
523*9880d681SAndroid Build Coastguard Worker   KEYWORD(localexec);
524*9880d681SAndroid Build Coastguard Worker   KEYWORD(zeroinitializer);
525*9880d681SAndroid Build Coastguard Worker   KEYWORD(undef);
526*9880d681SAndroid Build Coastguard Worker   KEYWORD(null);
527*9880d681SAndroid Build Coastguard Worker   KEYWORD(none);
528*9880d681SAndroid Build Coastguard Worker   KEYWORD(to);
529*9880d681SAndroid Build Coastguard Worker   KEYWORD(caller);
530*9880d681SAndroid Build Coastguard Worker   KEYWORD(within);
531*9880d681SAndroid Build Coastguard Worker   KEYWORD(from);
532*9880d681SAndroid Build Coastguard Worker   KEYWORD(tail);
533*9880d681SAndroid Build Coastguard Worker   KEYWORD(musttail);
534*9880d681SAndroid Build Coastguard Worker   KEYWORD(notail);
535*9880d681SAndroid Build Coastguard Worker   KEYWORD(target);
536*9880d681SAndroid Build Coastguard Worker   KEYWORD(triple);
537*9880d681SAndroid Build Coastguard Worker   KEYWORD(source_filename);
538*9880d681SAndroid Build Coastguard Worker   KEYWORD(unwind);
539*9880d681SAndroid Build Coastguard Worker   KEYWORD(deplibs);             // FIXME: Remove in 4.0.
540*9880d681SAndroid Build Coastguard Worker   KEYWORD(datalayout);
541*9880d681SAndroid Build Coastguard Worker   KEYWORD(volatile);
542*9880d681SAndroid Build Coastguard Worker   KEYWORD(atomic);
543*9880d681SAndroid Build Coastguard Worker   KEYWORD(unordered);
544*9880d681SAndroid Build Coastguard Worker   KEYWORD(monotonic);
545*9880d681SAndroid Build Coastguard Worker   KEYWORD(acquire);
546*9880d681SAndroid Build Coastguard Worker   KEYWORD(release);
547*9880d681SAndroid Build Coastguard Worker   KEYWORD(acq_rel);
548*9880d681SAndroid Build Coastguard Worker   KEYWORD(seq_cst);
549*9880d681SAndroid Build Coastguard Worker   KEYWORD(singlethread);
550*9880d681SAndroid Build Coastguard Worker 
551*9880d681SAndroid Build Coastguard Worker   KEYWORD(nnan);
552*9880d681SAndroid Build Coastguard Worker   KEYWORD(ninf);
553*9880d681SAndroid Build Coastguard Worker   KEYWORD(nsz);
554*9880d681SAndroid Build Coastguard Worker   KEYWORD(arcp);
555*9880d681SAndroid Build Coastguard Worker   KEYWORD(fast);
556*9880d681SAndroid Build Coastguard Worker   KEYWORD(nuw);
557*9880d681SAndroid Build Coastguard Worker   KEYWORD(nsw);
558*9880d681SAndroid Build Coastguard Worker   KEYWORD(exact);
559*9880d681SAndroid Build Coastguard Worker   KEYWORD(inbounds);
560*9880d681SAndroid Build Coastguard Worker   KEYWORD(align);
561*9880d681SAndroid Build Coastguard Worker   KEYWORD(addrspace);
562*9880d681SAndroid Build Coastguard Worker   KEYWORD(section);
563*9880d681SAndroid Build Coastguard Worker   KEYWORD(alias);
564*9880d681SAndroid Build Coastguard Worker   KEYWORD(ifunc);
565*9880d681SAndroid Build Coastguard Worker   KEYWORD(module);
566*9880d681SAndroid Build Coastguard Worker   KEYWORD(asm);
567*9880d681SAndroid Build Coastguard Worker   KEYWORD(sideeffect);
568*9880d681SAndroid Build Coastguard Worker   KEYWORD(alignstack);
569*9880d681SAndroid Build Coastguard Worker   KEYWORD(inteldialect);
570*9880d681SAndroid Build Coastguard Worker   KEYWORD(gc);
571*9880d681SAndroid Build Coastguard Worker   KEYWORD(prefix);
572*9880d681SAndroid Build Coastguard Worker   KEYWORD(prologue);
573*9880d681SAndroid Build Coastguard Worker 
574*9880d681SAndroid Build Coastguard Worker   KEYWORD(ccc);
575*9880d681SAndroid Build Coastguard Worker   KEYWORD(fastcc);
576*9880d681SAndroid Build Coastguard Worker   KEYWORD(coldcc);
577*9880d681SAndroid Build Coastguard Worker   KEYWORD(x86_stdcallcc);
578*9880d681SAndroid Build Coastguard Worker   KEYWORD(x86_fastcallcc);
579*9880d681SAndroid Build Coastguard Worker   KEYWORD(x86_thiscallcc);
580*9880d681SAndroid Build Coastguard Worker   KEYWORD(x86_vectorcallcc);
581*9880d681SAndroid Build Coastguard Worker   KEYWORD(arm_apcscc);
582*9880d681SAndroid Build Coastguard Worker   KEYWORD(arm_aapcscc);
583*9880d681SAndroid Build Coastguard Worker   KEYWORD(arm_aapcs_vfpcc);
584*9880d681SAndroid Build Coastguard Worker   KEYWORD(msp430_intrcc);
585*9880d681SAndroid Build Coastguard Worker   KEYWORD(avr_intrcc);
586*9880d681SAndroid Build Coastguard Worker   KEYWORD(avr_signalcc);
587*9880d681SAndroid Build Coastguard Worker   KEYWORD(ptx_kernel);
588*9880d681SAndroid Build Coastguard Worker   KEYWORD(ptx_device);
589*9880d681SAndroid Build Coastguard Worker   KEYWORD(spir_kernel);
590*9880d681SAndroid Build Coastguard Worker   KEYWORD(spir_func);
591*9880d681SAndroid Build Coastguard Worker   KEYWORD(intel_ocl_bicc);
592*9880d681SAndroid Build Coastguard Worker   KEYWORD(x86_64_sysvcc);
593*9880d681SAndroid Build Coastguard Worker   KEYWORD(x86_64_win64cc);
594*9880d681SAndroid Build Coastguard Worker   KEYWORD(webkit_jscc);
595*9880d681SAndroid Build Coastguard Worker   KEYWORD(swiftcc);
596*9880d681SAndroid Build Coastguard Worker   KEYWORD(anyregcc);
597*9880d681SAndroid Build Coastguard Worker   KEYWORD(preserve_mostcc);
598*9880d681SAndroid Build Coastguard Worker   KEYWORD(preserve_allcc);
599*9880d681SAndroid Build Coastguard Worker   KEYWORD(ghccc);
600*9880d681SAndroid Build Coastguard Worker   KEYWORD(x86_intrcc);
601*9880d681SAndroid Build Coastguard Worker   KEYWORD(hhvmcc);
602*9880d681SAndroid Build Coastguard Worker   KEYWORD(hhvm_ccc);
603*9880d681SAndroid Build Coastguard Worker   KEYWORD(cxx_fast_tlscc);
604*9880d681SAndroid Build Coastguard Worker   KEYWORD(amdgpu_vs);
605*9880d681SAndroid Build Coastguard Worker   KEYWORD(amdgpu_gs);
606*9880d681SAndroid Build Coastguard Worker   KEYWORD(amdgpu_ps);
607*9880d681SAndroid Build Coastguard Worker   KEYWORD(amdgpu_cs);
608*9880d681SAndroid Build Coastguard Worker   KEYWORD(amdgpu_kernel);
609*9880d681SAndroid Build Coastguard Worker 
610*9880d681SAndroid Build Coastguard Worker   KEYWORD(cc);
611*9880d681SAndroid Build Coastguard Worker   KEYWORD(c);
612*9880d681SAndroid Build Coastguard Worker 
613*9880d681SAndroid Build Coastguard Worker   KEYWORD(attributes);
614*9880d681SAndroid Build Coastguard Worker 
615*9880d681SAndroid Build Coastguard Worker   KEYWORD(alwaysinline);
616*9880d681SAndroid Build Coastguard Worker   KEYWORD(allocsize);
617*9880d681SAndroid Build Coastguard Worker   KEYWORD(argmemonly);
618*9880d681SAndroid Build Coastguard Worker   KEYWORD(builtin);
619*9880d681SAndroid Build Coastguard Worker   KEYWORD(byval);
620*9880d681SAndroid Build Coastguard Worker   KEYWORD(inalloca);
621*9880d681SAndroid Build Coastguard Worker   KEYWORD(cold);
622*9880d681SAndroid Build Coastguard Worker   KEYWORD(convergent);
623*9880d681SAndroid Build Coastguard Worker   KEYWORD(dereferenceable);
624*9880d681SAndroid Build Coastguard Worker   KEYWORD(dereferenceable_or_null);
625*9880d681SAndroid Build Coastguard Worker   KEYWORD(inaccessiblememonly);
626*9880d681SAndroid Build Coastguard Worker   KEYWORD(inaccessiblemem_or_argmemonly);
627*9880d681SAndroid Build Coastguard Worker   KEYWORD(inlinehint);
628*9880d681SAndroid Build Coastguard Worker   KEYWORD(inreg);
629*9880d681SAndroid Build Coastguard Worker   KEYWORD(jumptable);
630*9880d681SAndroid Build Coastguard Worker   KEYWORD(minsize);
631*9880d681SAndroid Build Coastguard Worker   KEYWORD(naked);
632*9880d681SAndroid Build Coastguard Worker   KEYWORD(nest);
633*9880d681SAndroid Build Coastguard Worker   KEYWORD(noalias);
634*9880d681SAndroid Build Coastguard Worker   KEYWORD(nobuiltin);
635*9880d681SAndroid Build Coastguard Worker   KEYWORD(nocapture);
636*9880d681SAndroid Build Coastguard Worker   KEYWORD(noduplicate);
637*9880d681SAndroid Build Coastguard Worker   KEYWORD(noimplicitfloat);
638*9880d681SAndroid Build Coastguard Worker   KEYWORD(noinline);
639*9880d681SAndroid Build Coastguard Worker   KEYWORD(norecurse);
640*9880d681SAndroid Build Coastguard Worker   KEYWORD(nonlazybind);
641*9880d681SAndroid Build Coastguard Worker   KEYWORD(nonnull);
642*9880d681SAndroid Build Coastguard Worker   KEYWORD(noredzone);
643*9880d681SAndroid Build Coastguard Worker   KEYWORD(noreturn);
644*9880d681SAndroid Build Coastguard Worker   KEYWORD(nounwind);
645*9880d681SAndroid Build Coastguard Worker   KEYWORD(optnone);
646*9880d681SAndroid Build Coastguard Worker   KEYWORD(optsize);
647*9880d681SAndroid Build Coastguard Worker   KEYWORD(readnone);
648*9880d681SAndroid Build Coastguard Worker   KEYWORD(readonly);
649*9880d681SAndroid Build Coastguard Worker   KEYWORD(returned);
650*9880d681SAndroid Build Coastguard Worker   KEYWORD(returns_twice);
651*9880d681SAndroid Build Coastguard Worker   KEYWORD(signext);
652*9880d681SAndroid Build Coastguard Worker   KEYWORD(sret);
653*9880d681SAndroid Build Coastguard Worker   KEYWORD(ssp);
654*9880d681SAndroid Build Coastguard Worker   KEYWORD(sspreq);
655*9880d681SAndroid Build Coastguard Worker   KEYWORD(sspstrong);
656*9880d681SAndroid Build Coastguard Worker   KEYWORD(safestack);
657*9880d681SAndroid Build Coastguard Worker   KEYWORD(sanitize_address);
658*9880d681SAndroid Build Coastguard Worker   KEYWORD(sanitize_thread);
659*9880d681SAndroid Build Coastguard Worker   KEYWORD(sanitize_memory);
660*9880d681SAndroid Build Coastguard Worker   KEYWORD(swifterror);
661*9880d681SAndroid Build Coastguard Worker   KEYWORD(swiftself);
662*9880d681SAndroid Build Coastguard Worker   KEYWORD(uwtable);
663*9880d681SAndroid Build Coastguard Worker   KEYWORD(writeonly);
664*9880d681SAndroid Build Coastguard Worker   KEYWORD(zeroext);
665*9880d681SAndroid Build Coastguard Worker 
666*9880d681SAndroid Build Coastguard Worker   KEYWORD(type);
667*9880d681SAndroid Build Coastguard Worker   KEYWORD(opaque);
668*9880d681SAndroid Build Coastguard Worker 
669*9880d681SAndroid Build Coastguard Worker   KEYWORD(comdat);
670*9880d681SAndroid Build Coastguard Worker 
671*9880d681SAndroid Build Coastguard Worker   // Comdat types
672*9880d681SAndroid Build Coastguard Worker   KEYWORD(any);
673*9880d681SAndroid Build Coastguard Worker   KEYWORD(exactmatch);
674*9880d681SAndroid Build Coastguard Worker   KEYWORD(largest);
675*9880d681SAndroid Build Coastguard Worker   KEYWORD(noduplicates);
676*9880d681SAndroid Build Coastguard Worker   KEYWORD(samesize);
677*9880d681SAndroid Build Coastguard Worker 
678*9880d681SAndroid Build Coastguard Worker   KEYWORD(eq); KEYWORD(ne); KEYWORD(slt); KEYWORD(sgt); KEYWORD(sle);
679*9880d681SAndroid Build Coastguard Worker   KEYWORD(sge); KEYWORD(ult); KEYWORD(ugt); KEYWORD(ule); KEYWORD(uge);
680*9880d681SAndroid Build Coastguard Worker   KEYWORD(oeq); KEYWORD(one); KEYWORD(olt); KEYWORD(ogt); KEYWORD(ole);
681*9880d681SAndroid Build Coastguard Worker   KEYWORD(oge); KEYWORD(ord); KEYWORD(uno); KEYWORD(ueq); KEYWORD(une);
682*9880d681SAndroid Build Coastguard Worker 
683*9880d681SAndroid Build Coastguard Worker   KEYWORD(xchg); KEYWORD(nand); KEYWORD(max); KEYWORD(min); KEYWORD(umax);
684*9880d681SAndroid Build Coastguard Worker   KEYWORD(umin);
685*9880d681SAndroid Build Coastguard Worker 
686*9880d681SAndroid Build Coastguard Worker   KEYWORD(x);
687*9880d681SAndroid Build Coastguard Worker   KEYWORD(blockaddress);
688*9880d681SAndroid Build Coastguard Worker 
689*9880d681SAndroid Build Coastguard Worker   // Metadata types.
690*9880d681SAndroid Build Coastguard Worker   KEYWORD(distinct);
691*9880d681SAndroid Build Coastguard Worker 
692*9880d681SAndroid Build Coastguard Worker   // Use-list order directives.
693*9880d681SAndroid Build Coastguard Worker   KEYWORD(uselistorder);
694*9880d681SAndroid Build Coastguard Worker   KEYWORD(uselistorder_bb);
695*9880d681SAndroid Build Coastguard Worker 
696*9880d681SAndroid Build Coastguard Worker   KEYWORD(personality);
697*9880d681SAndroid Build Coastguard Worker   KEYWORD(cleanup);
698*9880d681SAndroid Build Coastguard Worker   KEYWORD(catch);
699*9880d681SAndroid Build Coastguard Worker   KEYWORD(filter);
700*9880d681SAndroid Build Coastguard Worker #undef KEYWORD
701*9880d681SAndroid Build Coastguard Worker 
702*9880d681SAndroid Build Coastguard Worker   // Keywords for types.
703*9880d681SAndroid Build Coastguard Worker #define TYPEKEYWORD(STR, LLVMTY)                                               \
704*9880d681SAndroid Build Coastguard Worker   do {                                                                         \
705*9880d681SAndroid Build Coastguard Worker     if (Keyword == STR) {                                                      \
706*9880d681SAndroid Build Coastguard Worker       TyVal = LLVMTY;                                                          \
707*9880d681SAndroid Build Coastguard Worker       return lltok::Type;                                                      \
708*9880d681SAndroid Build Coastguard Worker     }                                                                          \
709*9880d681SAndroid Build Coastguard Worker   } while (false)
710*9880d681SAndroid Build Coastguard Worker   TYPEKEYWORD("void",      Type::getVoidTy(Context));
711*9880d681SAndroid Build Coastguard Worker   TYPEKEYWORD("half",      Type::getHalfTy(Context));
712*9880d681SAndroid Build Coastguard Worker   TYPEKEYWORD("float",     Type::getFloatTy(Context));
713*9880d681SAndroid Build Coastguard Worker   TYPEKEYWORD("double",    Type::getDoubleTy(Context));
714*9880d681SAndroid Build Coastguard Worker   TYPEKEYWORD("x86_fp80",  Type::getX86_FP80Ty(Context));
715*9880d681SAndroid Build Coastguard Worker   TYPEKEYWORD("fp128",     Type::getFP128Ty(Context));
716*9880d681SAndroid Build Coastguard Worker   TYPEKEYWORD("ppc_fp128", Type::getPPC_FP128Ty(Context));
717*9880d681SAndroid Build Coastguard Worker   TYPEKEYWORD("label",     Type::getLabelTy(Context));
718*9880d681SAndroid Build Coastguard Worker   TYPEKEYWORD("metadata",  Type::getMetadataTy(Context));
719*9880d681SAndroid Build Coastguard Worker   TYPEKEYWORD("x86_mmx",   Type::getX86_MMXTy(Context));
720*9880d681SAndroid Build Coastguard Worker   TYPEKEYWORD("token",     Type::getTokenTy(Context));
721*9880d681SAndroid Build Coastguard Worker #undef TYPEKEYWORD
722*9880d681SAndroid Build Coastguard Worker 
723*9880d681SAndroid Build Coastguard Worker   // Keywords for instructions.
724*9880d681SAndroid Build Coastguard Worker #define INSTKEYWORD(STR, Enum)                                                 \
725*9880d681SAndroid Build Coastguard Worker   do {                                                                         \
726*9880d681SAndroid Build Coastguard Worker     if (Keyword == #STR) {                                                     \
727*9880d681SAndroid Build Coastguard Worker       UIntVal = Instruction::Enum;                                             \
728*9880d681SAndroid Build Coastguard Worker       return lltok::kw_##STR;                                                  \
729*9880d681SAndroid Build Coastguard Worker     }                                                                          \
730*9880d681SAndroid Build Coastguard Worker   } while (false)
731*9880d681SAndroid Build Coastguard Worker 
732*9880d681SAndroid Build Coastguard Worker   INSTKEYWORD(add,   Add);  INSTKEYWORD(fadd,   FAdd);
733*9880d681SAndroid Build Coastguard Worker   INSTKEYWORD(sub,   Sub);  INSTKEYWORD(fsub,   FSub);
734*9880d681SAndroid Build Coastguard Worker   INSTKEYWORD(mul,   Mul);  INSTKEYWORD(fmul,   FMul);
735*9880d681SAndroid Build Coastguard Worker   INSTKEYWORD(udiv,  UDiv); INSTKEYWORD(sdiv,  SDiv); INSTKEYWORD(fdiv,  FDiv);
736*9880d681SAndroid Build Coastguard Worker   INSTKEYWORD(urem,  URem); INSTKEYWORD(srem,  SRem); INSTKEYWORD(frem,  FRem);
737*9880d681SAndroid Build Coastguard Worker   INSTKEYWORD(shl,   Shl);  INSTKEYWORD(lshr,  LShr); INSTKEYWORD(ashr,  AShr);
738*9880d681SAndroid Build Coastguard Worker   INSTKEYWORD(and,   And);  INSTKEYWORD(or,    Or);   INSTKEYWORD(xor,   Xor);
739*9880d681SAndroid Build Coastguard Worker   INSTKEYWORD(icmp,  ICmp); INSTKEYWORD(fcmp,  FCmp);
740*9880d681SAndroid Build Coastguard Worker 
741*9880d681SAndroid Build Coastguard Worker   INSTKEYWORD(phi,         PHI);
742*9880d681SAndroid Build Coastguard Worker   INSTKEYWORD(call,        Call);
743*9880d681SAndroid Build Coastguard Worker   INSTKEYWORD(trunc,       Trunc);
744*9880d681SAndroid Build Coastguard Worker   INSTKEYWORD(zext,        ZExt);
745*9880d681SAndroid Build Coastguard Worker   INSTKEYWORD(sext,        SExt);
746*9880d681SAndroid Build Coastguard Worker   INSTKEYWORD(fptrunc,     FPTrunc);
747*9880d681SAndroid Build Coastguard Worker   INSTKEYWORD(fpext,       FPExt);
748*9880d681SAndroid Build Coastguard Worker   INSTKEYWORD(uitofp,      UIToFP);
749*9880d681SAndroid Build Coastguard Worker   INSTKEYWORD(sitofp,      SIToFP);
750*9880d681SAndroid Build Coastguard Worker   INSTKEYWORD(fptoui,      FPToUI);
751*9880d681SAndroid Build Coastguard Worker   INSTKEYWORD(fptosi,      FPToSI);
752*9880d681SAndroid Build Coastguard Worker   INSTKEYWORD(inttoptr,    IntToPtr);
753*9880d681SAndroid Build Coastguard Worker   INSTKEYWORD(ptrtoint,    PtrToInt);
754*9880d681SAndroid Build Coastguard Worker   INSTKEYWORD(bitcast,     BitCast);
755*9880d681SAndroid Build Coastguard Worker   INSTKEYWORD(addrspacecast, AddrSpaceCast);
756*9880d681SAndroid Build Coastguard Worker   INSTKEYWORD(select,      Select);
757*9880d681SAndroid Build Coastguard Worker   INSTKEYWORD(va_arg,      VAArg);
758*9880d681SAndroid Build Coastguard Worker   INSTKEYWORD(ret,         Ret);
759*9880d681SAndroid Build Coastguard Worker   INSTKEYWORD(br,          Br);
760*9880d681SAndroid Build Coastguard Worker   INSTKEYWORD(switch,      Switch);
761*9880d681SAndroid Build Coastguard Worker   INSTKEYWORD(indirectbr,  IndirectBr);
762*9880d681SAndroid Build Coastguard Worker   INSTKEYWORD(invoke,      Invoke);
763*9880d681SAndroid Build Coastguard Worker   INSTKEYWORD(resume,      Resume);
764*9880d681SAndroid Build Coastguard Worker   INSTKEYWORD(unreachable, Unreachable);
765*9880d681SAndroid Build Coastguard Worker 
766*9880d681SAndroid Build Coastguard Worker   INSTKEYWORD(alloca,      Alloca);
767*9880d681SAndroid Build Coastguard Worker   INSTKEYWORD(load,        Load);
768*9880d681SAndroid Build Coastguard Worker   INSTKEYWORD(store,       Store);
769*9880d681SAndroid Build Coastguard Worker   INSTKEYWORD(cmpxchg,     AtomicCmpXchg);
770*9880d681SAndroid Build Coastguard Worker   INSTKEYWORD(atomicrmw,   AtomicRMW);
771*9880d681SAndroid Build Coastguard Worker   INSTKEYWORD(fence,       Fence);
772*9880d681SAndroid Build Coastguard Worker   INSTKEYWORD(getelementptr, GetElementPtr);
773*9880d681SAndroid Build Coastguard Worker 
774*9880d681SAndroid Build Coastguard Worker   INSTKEYWORD(extractelement, ExtractElement);
775*9880d681SAndroid Build Coastguard Worker   INSTKEYWORD(insertelement,  InsertElement);
776*9880d681SAndroid Build Coastguard Worker   INSTKEYWORD(shufflevector,  ShuffleVector);
777*9880d681SAndroid Build Coastguard Worker   INSTKEYWORD(extractvalue,   ExtractValue);
778*9880d681SAndroid Build Coastguard Worker   INSTKEYWORD(insertvalue,    InsertValue);
779*9880d681SAndroid Build Coastguard Worker   INSTKEYWORD(landingpad,     LandingPad);
780*9880d681SAndroid Build Coastguard Worker   INSTKEYWORD(cleanupret,     CleanupRet);
781*9880d681SAndroid Build Coastguard Worker   INSTKEYWORD(catchret,       CatchRet);
782*9880d681SAndroid Build Coastguard Worker   INSTKEYWORD(catchswitch,  CatchSwitch);
783*9880d681SAndroid Build Coastguard Worker   INSTKEYWORD(catchpad,     CatchPad);
784*9880d681SAndroid Build Coastguard Worker   INSTKEYWORD(cleanuppad,   CleanupPad);
785*9880d681SAndroid Build Coastguard Worker #undef INSTKEYWORD
786*9880d681SAndroid Build Coastguard Worker 
787*9880d681SAndroid Build Coastguard Worker #define DWKEYWORD(TYPE, TOKEN)                                                 \
788*9880d681SAndroid Build Coastguard Worker   do {                                                                         \
789*9880d681SAndroid Build Coastguard Worker     if (Keyword.startswith("DW_" #TYPE "_")) {                                 \
790*9880d681SAndroid Build Coastguard Worker       StrVal.assign(Keyword.begin(), Keyword.end());                           \
791*9880d681SAndroid Build Coastguard Worker       return lltok::TOKEN;                                                     \
792*9880d681SAndroid Build Coastguard Worker     }                                                                          \
793*9880d681SAndroid Build Coastguard Worker   } while (false)
794*9880d681SAndroid Build Coastguard Worker   DWKEYWORD(TAG, DwarfTag);
795*9880d681SAndroid Build Coastguard Worker   DWKEYWORD(ATE, DwarfAttEncoding);
796*9880d681SAndroid Build Coastguard Worker   DWKEYWORD(VIRTUALITY, DwarfVirtuality);
797*9880d681SAndroid Build Coastguard Worker   DWKEYWORD(LANG, DwarfLang);
798*9880d681SAndroid Build Coastguard Worker   DWKEYWORD(CC, DwarfCC);
799*9880d681SAndroid Build Coastguard Worker   DWKEYWORD(OP, DwarfOp);
800*9880d681SAndroid Build Coastguard Worker   DWKEYWORD(MACINFO, DwarfMacinfo);
801*9880d681SAndroid Build Coastguard Worker #undef DWKEYWORD
802*9880d681SAndroid Build Coastguard Worker   if (Keyword.startswith("DIFlag")) {
803*9880d681SAndroid Build Coastguard Worker     StrVal.assign(Keyword.begin(), Keyword.end());
804*9880d681SAndroid Build Coastguard Worker     return lltok::DIFlag;
805*9880d681SAndroid Build Coastguard Worker   }
806*9880d681SAndroid Build Coastguard Worker   if (Keyword == "NoDebug" || Keyword == "FullDebug" ||
807*9880d681SAndroid Build Coastguard Worker       Keyword == "LineTablesOnly") {
808*9880d681SAndroid Build Coastguard Worker     StrVal.assign(Keyword.begin(), Keyword.end());
809*9880d681SAndroid Build Coastguard Worker     return lltok::EmissionKind;
810*9880d681SAndroid Build Coastguard Worker   }
811*9880d681SAndroid Build Coastguard Worker 
812*9880d681SAndroid Build Coastguard Worker   // Check for [us]0x[0-9A-Fa-f]+ which are Hexadecimal constant generated by
813*9880d681SAndroid Build Coastguard Worker   // the CFE to avoid forcing it to deal with 64-bit numbers.
814*9880d681SAndroid Build Coastguard Worker   if ((TokStart[0] == 'u' || TokStart[0] == 's') &&
815*9880d681SAndroid Build Coastguard Worker       TokStart[1] == '0' && TokStart[2] == 'x' &&
816*9880d681SAndroid Build Coastguard Worker       isxdigit(static_cast<unsigned char>(TokStart[3]))) {
817*9880d681SAndroid Build Coastguard Worker     int len = CurPtr-TokStart-3;
818*9880d681SAndroid Build Coastguard Worker     uint32_t bits = len * 4;
819*9880d681SAndroid Build Coastguard Worker     StringRef HexStr(TokStart + 3, len);
820*9880d681SAndroid Build Coastguard Worker     if (!std::all_of(HexStr.begin(), HexStr.end(), isxdigit)) {
821*9880d681SAndroid Build Coastguard Worker       // Bad token, return it as an error.
822*9880d681SAndroid Build Coastguard Worker       CurPtr = TokStart+3;
823*9880d681SAndroid Build Coastguard Worker       return lltok::Error;
824*9880d681SAndroid Build Coastguard Worker     }
825*9880d681SAndroid Build Coastguard Worker     APInt Tmp(bits, HexStr, 16);
826*9880d681SAndroid Build Coastguard Worker     uint32_t activeBits = Tmp.getActiveBits();
827*9880d681SAndroid Build Coastguard Worker     if (activeBits > 0 && activeBits < bits)
828*9880d681SAndroid Build Coastguard Worker       Tmp = Tmp.trunc(activeBits);
829*9880d681SAndroid Build Coastguard Worker     APSIntVal = APSInt(Tmp, TokStart[0] == 'u');
830*9880d681SAndroid Build Coastguard Worker     return lltok::APSInt;
831*9880d681SAndroid Build Coastguard Worker   }
832*9880d681SAndroid Build Coastguard Worker 
833*9880d681SAndroid Build Coastguard Worker   // If this is "cc1234", return this as just "cc".
834*9880d681SAndroid Build Coastguard Worker   if (TokStart[0] == 'c' && TokStart[1] == 'c') {
835*9880d681SAndroid Build Coastguard Worker     CurPtr = TokStart+2;
836*9880d681SAndroid Build Coastguard Worker     return lltok::kw_cc;
837*9880d681SAndroid Build Coastguard Worker   }
838*9880d681SAndroid Build Coastguard Worker 
839*9880d681SAndroid Build Coastguard Worker   // Finally, if this isn't known, return an error.
840*9880d681SAndroid Build Coastguard Worker   CurPtr = TokStart+1;
841*9880d681SAndroid Build Coastguard Worker   return lltok::Error;
842*9880d681SAndroid Build Coastguard Worker }
843*9880d681SAndroid Build Coastguard Worker 
844*9880d681SAndroid Build Coastguard Worker /// Lex all tokens that start with a 0x prefix, knowing they match and are not
845*9880d681SAndroid Build Coastguard Worker /// labels.
846*9880d681SAndroid Build Coastguard Worker ///    HexFPConstant     0x[0-9A-Fa-f]+
847*9880d681SAndroid Build Coastguard Worker ///    HexFP80Constant   0xK[0-9A-Fa-f]+
848*9880d681SAndroid Build Coastguard Worker ///    HexFP128Constant  0xL[0-9A-Fa-f]+
849*9880d681SAndroid Build Coastguard Worker ///    HexPPC128Constant 0xM[0-9A-Fa-f]+
850*9880d681SAndroid Build Coastguard Worker ///    HexHalfConstant   0xH[0-9A-Fa-f]+
Lex0x()851*9880d681SAndroid Build Coastguard Worker lltok::Kind LLLexer::Lex0x() {
852*9880d681SAndroid Build Coastguard Worker   CurPtr = TokStart + 2;
853*9880d681SAndroid Build Coastguard Worker 
854*9880d681SAndroid Build Coastguard Worker   char Kind;
855*9880d681SAndroid Build Coastguard Worker   if ((CurPtr[0] >= 'K' && CurPtr[0] <= 'M') || CurPtr[0] == 'H') {
856*9880d681SAndroid Build Coastguard Worker     Kind = *CurPtr++;
857*9880d681SAndroid Build Coastguard Worker   } else {
858*9880d681SAndroid Build Coastguard Worker     Kind = 'J';
859*9880d681SAndroid Build Coastguard Worker   }
860*9880d681SAndroid Build Coastguard Worker 
861*9880d681SAndroid Build Coastguard Worker   if (!isxdigit(static_cast<unsigned char>(CurPtr[0]))) {
862*9880d681SAndroid Build Coastguard Worker     // Bad token, return it as an error.
863*9880d681SAndroid Build Coastguard Worker     CurPtr = TokStart+1;
864*9880d681SAndroid Build Coastguard Worker     return lltok::Error;
865*9880d681SAndroid Build Coastguard Worker   }
866*9880d681SAndroid Build Coastguard Worker 
867*9880d681SAndroid Build Coastguard Worker   while (isxdigit(static_cast<unsigned char>(CurPtr[0])))
868*9880d681SAndroid Build Coastguard Worker     ++CurPtr;
869*9880d681SAndroid Build Coastguard Worker 
870*9880d681SAndroid Build Coastguard Worker   if (Kind == 'J') {
871*9880d681SAndroid Build Coastguard Worker     // HexFPConstant - Floating point constant represented in IEEE format as a
872*9880d681SAndroid Build Coastguard Worker     // hexadecimal number for when exponential notation is not precise enough.
873*9880d681SAndroid Build Coastguard Worker     // Half, Float, and double only.
874*9880d681SAndroid Build Coastguard Worker     APFloatVal = APFloat(BitsToDouble(HexIntToVal(TokStart+2, CurPtr)));
875*9880d681SAndroid Build Coastguard Worker     return lltok::APFloat;
876*9880d681SAndroid Build Coastguard Worker   }
877*9880d681SAndroid Build Coastguard Worker 
878*9880d681SAndroid Build Coastguard Worker   uint64_t Pair[2];
879*9880d681SAndroid Build Coastguard Worker   switch (Kind) {
880*9880d681SAndroid Build Coastguard Worker   default: llvm_unreachable("Unknown kind!");
881*9880d681SAndroid Build Coastguard Worker   case 'K':
882*9880d681SAndroid Build Coastguard Worker     // F80HexFPConstant - x87 long double in hexadecimal format (10 bytes)
883*9880d681SAndroid Build Coastguard Worker     FP80HexToIntPair(TokStart+3, CurPtr, Pair);
884*9880d681SAndroid Build Coastguard Worker     APFloatVal = APFloat(APFloat::x87DoubleExtended, APInt(80, Pair));
885*9880d681SAndroid Build Coastguard Worker     return lltok::APFloat;
886*9880d681SAndroid Build Coastguard Worker   case 'L':
887*9880d681SAndroid Build Coastguard Worker     // F128HexFPConstant - IEEE 128-bit in hexadecimal format (16 bytes)
888*9880d681SAndroid Build Coastguard Worker     HexToIntPair(TokStart+3, CurPtr, Pair);
889*9880d681SAndroid Build Coastguard Worker     APFloatVal = APFloat(APFloat::IEEEquad, APInt(128, Pair));
890*9880d681SAndroid Build Coastguard Worker     return lltok::APFloat;
891*9880d681SAndroid Build Coastguard Worker   case 'M':
892*9880d681SAndroid Build Coastguard Worker     // PPC128HexFPConstant - PowerPC 128-bit in hexadecimal format (16 bytes)
893*9880d681SAndroid Build Coastguard Worker     HexToIntPair(TokStart+3, CurPtr, Pair);
894*9880d681SAndroid Build Coastguard Worker     APFloatVal = APFloat(APFloat::PPCDoubleDouble, APInt(128, Pair));
895*9880d681SAndroid Build Coastguard Worker     return lltok::APFloat;
896*9880d681SAndroid Build Coastguard Worker   case 'H':
897*9880d681SAndroid Build Coastguard Worker     APFloatVal = APFloat(APFloat::IEEEhalf,
898*9880d681SAndroid Build Coastguard Worker                          APInt(16,HexIntToVal(TokStart+3, CurPtr)));
899*9880d681SAndroid Build Coastguard Worker     return lltok::APFloat;
900*9880d681SAndroid Build Coastguard Worker   }
901*9880d681SAndroid Build Coastguard Worker }
902*9880d681SAndroid Build Coastguard Worker 
903*9880d681SAndroid Build Coastguard Worker /// Lex tokens for a label or a numeric constant, possibly starting with -.
904*9880d681SAndroid Build Coastguard Worker ///    Label             [-a-zA-Z$._0-9]+:
905*9880d681SAndroid Build Coastguard Worker ///    NInteger          -[0-9]+
906*9880d681SAndroid Build Coastguard Worker ///    FPConstant        [-+]?[0-9]+[.][0-9]*([eE][-+]?[0-9]+)?
907*9880d681SAndroid Build Coastguard Worker ///    PInteger          [0-9]+
908*9880d681SAndroid Build Coastguard Worker ///    HexFPConstant     0x[0-9A-Fa-f]+
909*9880d681SAndroid Build Coastguard Worker ///    HexFP80Constant   0xK[0-9A-Fa-f]+
910*9880d681SAndroid Build Coastguard Worker ///    HexFP128Constant  0xL[0-9A-Fa-f]+
911*9880d681SAndroid Build Coastguard Worker ///    HexPPC128Constant 0xM[0-9A-Fa-f]+
LexDigitOrNegative()912*9880d681SAndroid Build Coastguard Worker lltok::Kind LLLexer::LexDigitOrNegative() {
913*9880d681SAndroid Build Coastguard Worker   // If the letter after the negative is not a number, this is probably a label.
914*9880d681SAndroid Build Coastguard Worker   if (!isdigit(static_cast<unsigned char>(TokStart[0])) &&
915*9880d681SAndroid Build Coastguard Worker       !isdigit(static_cast<unsigned char>(CurPtr[0]))) {
916*9880d681SAndroid Build Coastguard Worker     // Okay, this is not a number after the -, it's probably a label.
917*9880d681SAndroid Build Coastguard Worker     if (const char *End = isLabelTail(CurPtr)) {
918*9880d681SAndroid Build Coastguard Worker       StrVal.assign(TokStart, End-1);
919*9880d681SAndroid Build Coastguard Worker       CurPtr = End;
920*9880d681SAndroid Build Coastguard Worker       return lltok::LabelStr;
921*9880d681SAndroid Build Coastguard Worker     }
922*9880d681SAndroid Build Coastguard Worker 
923*9880d681SAndroid Build Coastguard Worker     return lltok::Error;
924*9880d681SAndroid Build Coastguard Worker   }
925*9880d681SAndroid Build Coastguard Worker 
926*9880d681SAndroid Build Coastguard Worker   // At this point, it is either a label, int or fp constant.
927*9880d681SAndroid Build Coastguard Worker 
928*9880d681SAndroid Build Coastguard Worker   // Skip digits, we have at least one.
929*9880d681SAndroid Build Coastguard Worker   for (; isdigit(static_cast<unsigned char>(CurPtr[0])); ++CurPtr)
930*9880d681SAndroid Build Coastguard Worker     /*empty*/;
931*9880d681SAndroid Build Coastguard Worker 
932*9880d681SAndroid Build Coastguard Worker   // Check to see if this really is a label afterall, e.g. "-1:".
933*9880d681SAndroid Build Coastguard Worker   if (isLabelChar(CurPtr[0]) || CurPtr[0] == ':') {
934*9880d681SAndroid Build Coastguard Worker     if (const char *End = isLabelTail(CurPtr)) {
935*9880d681SAndroid Build Coastguard Worker       StrVal.assign(TokStart, End-1);
936*9880d681SAndroid Build Coastguard Worker       CurPtr = End;
937*9880d681SAndroid Build Coastguard Worker       return lltok::LabelStr;
938*9880d681SAndroid Build Coastguard Worker     }
939*9880d681SAndroid Build Coastguard Worker   }
940*9880d681SAndroid Build Coastguard Worker 
941*9880d681SAndroid Build Coastguard Worker   // If the next character is a '.', then it is a fp value, otherwise its
942*9880d681SAndroid Build Coastguard Worker   // integer.
943*9880d681SAndroid Build Coastguard Worker   if (CurPtr[0] != '.') {
944*9880d681SAndroid Build Coastguard Worker     if (TokStart[0] == '0' && TokStart[1] == 'x')
945*9880d681SAndroid Build Coastguard Worker       return Lex0x();
946*9880d681SAndroid Build Coastguard Worker     APSIntVal = APSInt(StringRef(TokStart, CurPtr - TokStart));
947*9880d681SAndroid Build Coastguard Worker     return lltok::APSInt;
948*9880d681SAndroid Build Coastguard Worker   }
949*9880d681SAndroid Build Coastguard Worker 
950*9880d681SAndroid Build Coastguard Worker   ++CurPtr;
951*9880d681SAndroid Build Coastguard Worker 
952*9880d681SAndroid Build Coastguard Worker   // Skip over [0-9]*([eE][-+]?[0-9]+)?
953*9880d681SAndroid Build Coastguard Worker   while (isdigit(static_cast<unsigned char>(CurPtr[0]))) ++CurPtr;
954*9880d681SAndroid Build Coastguard Worker 
955*9880d681SAndroid Build Coastguard Worker   if (CurPtr[0] == 'e' || CurPtr[0] == 'E') {
956*9880d681SAndroid Build Coastguard Worker     if (isdigit(static_cast<unsigned char>(CurPtr[1])) ||
957*9880d681SAndroid Build Coastguard Worker         ((CurPtr[1] == '-' || CurPtr[1] == '+') &&
958*9880d681SAndroid Build Coastguard Worker           isdigit(static_cast<unsigned char>(CurPtr[2])))) {
959*9880d681SAndroid Build Coastguard Worker       CurPtr += 2;
960*9880d681SAndroid Build Coastguard Worker       while (isdigit(static_cast<unsigned char>(CurPtr[0]))) ++CurPtr;
961*9880d681SAndroid Build Coastguard Worker     }
962*9880d681SAndroid Build Coastguard Worker   }
963*9880d681SAndroid Build Coastguard Worker 
964*9880d681SAndroid Build Coastguard Worker   APFloatVal = APFloat(APFloat::IEEEdouble,
965*9880d681SAndroid Build Coastguard Worker                        StringRef(TokStart, CurPtr - TokStart));
966*9880d681SAndroid Build Coastguard Worker   return lltok::APFloat;
967*9880d681SAndroid Build Coastguard Worker }
968*9880d681SAndroid Build Coastguard Worker 
969*9880d681SAndroid Build Coastguard Worker /// Lex a floating point constant starting with +.
970*9880d681SAndroid Build Coastguard Worker ///    FPConstant  [-+]?[0-9]+[.][0-9]*([eE][-+]?[0-9]+)?
LexPositive()971*9880d681SAndroid Build Coastguard Worker lltok::Kind LLLexer::LexPositive() {
972*9880d681SAndroid Build Coastguard Worker   // If the letter after the negative is a number, this is probably not a
973*9880d681SAndroid Build Coastguard Worker   // label.
974*9880d681SAndroid Build Coastguard Worker   if (!isdigit(static_cast<unsigned char>(CurPtr[0])))
975*9880d681SAndroid Build Coastguard Worker     return lltok::Error;
976*9880d681SAndroid Build Coastguard Worker 
977*9880d681SAndroid Build Coastguard Worker   // Skip digits.
978*9880d681SAndroid Build Coastguard Worker   for (++CurPtr; isdigit(static_cast<unsigned char>(CurPtr[0])); ++CurPtr)
979*9880d681SAndroid Build Coastguard Worker     /*empty*/;
980*9880d681SAndroid Build Coastguard Worker 
981*9880d681SAndroid Build Coastguard Worker   // At this point, we need a '.'.
982*9880d681SAndroid Build Coastguard Worker   if (CurPtr[0] != '.') {
983*9880d681SAndroid Build Coastguard Worker     CurPtr = TokStart+1;
984*9880d681SAndroid Build Coastguard Worker     return lltok::Error;
985*9880d681SAndroid Build Coastguard Worker   }
986*9880d681SAndroid Build Coastguard Worker 
987*9880d681SAndroid Build Coastguard Worker   ++CurPtr;
988*9880d681SAndroid Build Coastguard Worker 
989*9880d681SAndroid Build Coastguard Worker   // Skip over [0-9]*([eE][-+]?[0-9]+)?
990*9880d681SAndroid Build Coastguard Worker   while (isdigit(static_cast<unsigned char>(CurPtr[0]))) ++CurPtr;
991*9880d681SAndroid Build Coastguard Worker 
992*9880d681SAndroid Build Coastguard Worker   if (CurPtr[0] == 'e' || CurPtr[0] == 'E') {
993*9880d681SAndroid Build Coastguard Worker     if (isdigit(static_cast<unsigned char>(CurPtr[1])) ||
994*9880d681SAndroid Build Coastguard Worker         ((CurPtr[1] == '-' || CurPtr[1] == '+') &&
995*9880d681SAndroid Build Coastguard Worker         isdigit(static_cast<unsigned char>(CurPtr[2])))) {
996*9880d681SAndroid Build Coastguard Worker       CurPtr += 2;
997*9880d681SAndroid Build Coastguard Worker       while (isdigit(static_cast<unsigned char>(CurPtr[0]))) ++CurPtr;
998*9880d681SAndroid Build Coastguard Worker     }
999*9880d681SAndroid Build Coastguard Worker   }
1000*9880d681SAndroid Build Coastguard Worker 
1001*9880d681SAndroid Build Coastguard Worker   APFloatVal = APFloat(APFloat::IEEEdouble,
1002*9880d681SAndroid Build Coastguard Worker                        StringRef(TokStart, CurPtr - TokStart));
1003*9880d681SAndroid Build Coastguard Worker   return lltok::APFloat;
1004*9880d681SAndroid Build Coastguard Worker }
1005