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