LLLexer.cpp revision 87d0b9ed1462705dd9bf1cb7f67d0bf03af776c8
18e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner//===- LLLexer.cpp - Lexer for .ll Files ----------------------------------===// 28e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner// 38e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner// The LLVM Compiler Infrastructure 48e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner// 54ee451de366474b9c228b4e5fa573795a715216dChris Lattner// This file is distributed under the University of Illinois Open Source 64ee451de366474b9c228b4e5fa573795a715216dChris Lattner// License. See LICENSE.TXT for details. 78e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner// 88e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner//===----------------------------------------------------------------------===// 98e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner// 108e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner// Implement the Lexer for .ll files. 118e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner// 128e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner//===----------------------------------------------------------------------===// 138e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner 148e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner#include "LLLexer.h" 157336f7febb5170b374a4cbffee273ad82ff8a1a3Jordan Rose#include "llvm/ADT/StringExtras.h" 16d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/ADT/Twine.h" 17d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/Assembly/Parser.h" 180b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/DerivedTypes.h" 190b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Instruction.h" 200b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/LLVMContext.h" 21c25e7581b9b8088910da31702d4ca21c4734c6d7Torok Edwin#include "llvm/Support/ErrorHandling.h" 22d185f64f828ce1f8b476807a4a1345c0c53d8213Chris Lattner#include "llvm/Support/MathExtras.h" 23d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/Support/MemoryBuffer.h" 2492bcb426c3e4503c99324afd4ed0a73521711a56Chris Lattner#include "llvm/Support/SourceMgr.h" 25df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner#include "llvm/Support/raw_ostream.h" 26476b242fe7a61e5f9ac6214b0bc5c680d24f152eNick Lewycky#include <cctype> 27bcef7df6ec9aba7c5009a4d33944f80227563665Duncan Sands#include <cstdio> 28a896176973d59d8e22514b363d31e8d1becf185eChris Lattner#include <cstdlib> 295679d18c54ef46170e46f51bf471bb334f2b6525Misha Brukman#include <cstring> 308e3a8e0452695643d04c21e15c94b802aef81baeChris Lattnerusing namespace llvm; 318e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner 32d1e1703c39742f3c9fc3d27a442ff59bbdbfb5aaBenjamin Kramerbool LLLexer::Error(LocTy ErrorLoc, const Twine &Msg) const { 333f2d5f60b31fd057c10f77b2e607b23a8c94f6d3Chris Lattner ErrorInfo = SM.GetMessage(ErrorLoc, SourceMgr::DK_Error, Msg); 34df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner return true; 35df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner} 36df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner 378e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner//===----------------------------------------------------------------------===// 388e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner// Helper functions. 398e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner//===----------------------------------------------------------------------===// 408e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner 418e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner// atoull - Convert an ascii string of decimal digits into the unsigned long 428e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner// long representation... this does not have to do input error checking, 438e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner// because we know that the input will be matched by a suitable regex... 448e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner// 45df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattneruint64_t LLLexer::atoull(const char *Buffer, const char *End) { 468e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner uint64_t Result = 0; 478e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner for (; Buffer != End; Buffer++) { 488e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner uint64_t OldRes = Result; 498e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner Result *= 10; 508e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner Result += *Buffer-'0'; 518e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner if (Result < OldRes) { // Uh, oh, overflow detected!!! 52df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner Error("constant bigger than 64 bits detected!"); 538e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner return 0; 548e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner } 558e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner } 568e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner return Result; 578e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner} 588e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner 59df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattneruint64_t LLLexer::HexIntToVal(const char *Buffer, const char *End) { 608e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner uint64_t Result = 0; 618e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner for (; Buffer != End; ++Buffer) { 628e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner uint64_t OldRes = Result; 638e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner Result *= 16; 647336f7febb5170b374a4cbffee273ad82ff8a1a3Jordan Rose Result += hexDigitValue(*Buffer); 652c6fd8c7ceea0392635ce21038d2b7fc215d9116Bill Wendling 668e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner if (Result < OldRes) { // Uh, oh, overflow detected!!! 67df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner Error("constant bigger than 64 bits detected!"); 688e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner return 0; 698e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner } 708e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner } 718e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner return Result; 728e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner} 738e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner 74df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattnervoid LLLexer::HexToIntPair(const char *Buffer, const char *End, 75df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner uint64_t Pair[2]) { 768e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner Pair[0] = 0; 778e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner for (int i=0; i<16; i++, Buffer++) { 788e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner assert(Buffer != End); 798e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner Pair[0] *= 16; 807336f7febb5170b374a4cbffee273ad82ff8a1a3Jordan Rose Pair[0] += hexDigitValue(*Buffer); 818e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner } 828e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner Pair[1] = 0; 838e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner for (int i=0; i<16 && Buffer != End; i++, Buffer++) { 848e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner Pair[1] *= 16; 857336f7febb5170b374a4cbffee273ad82ff8a1a3Jordan Rose Pair[1] += hexDigitValue(*Buffer); 868e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner } 87d343c6b70ec03b357d42e47ce7c00b3c3cb78efdChris Lattner if (Buffer != End) 88df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner Error("constant bigger than 128 bits detected!"); 898e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner} 908e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner 911b25cb2416c46a6cebf2a6c52235e9fe46a10d11Dale Johannesen/// FP80HexToIntPair - translate an 80 bit FP80 number (20 hexits) into 921b25cb2416c46a6cebf2a6c52235e9fe46a10d11Dale Johannesen/// { low64, high16 } as usual for an APInt. 931b25cb2416c46a6cebf2a6c52235e9fe46a10d11Dale Johannesenvoid LLLexer::FP80HexToIntPair(const char *Buffer, const char *End, 941b25cb2416c46a6cebf2a6c52235e9fe46a10d11Dale Johannesen uint64_t Pair[2]) { 951b25cb2416c46a6cebf2a6c52235e9fe46a10d11Dale Johannesen Pair[1] = 0; 961b25cb2416c46a6cebf2a6c52235e9fe46a10d11Dale Johannesen for (int i=0; i<4 && Buffer != End; i++, Buffer++) { 971b25cb2416c46a6cebf2a6c52235e9fe46a10d11Dale Johannesen assert(Buffer != End); 981b25cb2416c46a6cebf2a6c52235e9fe46a10d11Dale Johannesen Pair[1] *= 16; 997336f7febb5170b374a4cbffee273ad82ff8a1a3Jordan Rose Pair[1] += hexDigitValue(*Buffer); 1001b25cb2416c46a6cebf2a6c52235e9fe46a10d11Dale Johannesen } 1011b25cb2416c46a6cebf2a6c52235e9fe46a10d11Dale Johannesen Pair[0] = 0; 1021b25cb2416c46a6cebf2a6c52235e9fe46a10d11Dale Johannesen for (int i=0; i<16; i++, Buffer++) { 1031b25cb2416c46a6cebf2a6c52235e9fe46a10d11Dale Johannesen Pair[0] *= 16; 1047336f7febb5170b374a4cbffee273ad82ff8a1a3Jordan Rose Pair[0] += hexDigitValue(*Buffer); 1051b25cb2416c46a6cebf2a6c52235e9fe46a10d11Dale Johannesen } 1061b25cb2416c46a6cebf2a6c52235e9fe46a10d11Dale Johannesen if (Buffer != End) 1071b25cb2416c46a6cebf2a6c52235e9fe46a10d11Dale Johannesen Error("constant bigger than 128 bits detected!"); 1081b25cb2416c46a6cebf2a6c52235e9fe46a10d11Dale Johannesen} 1091b25cb2416c46a6cebf2a6c52235e9fe46a10d11Dale Johannesen 1108e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner// UnEscapeLexed - Run through the specified buffer and change \xx codes to the 1118e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner// appropriate character. 1128e3a8e0452695643d04c21e15c94b802aef81baeChris Lattnerstatic void UnEscapeLexed(std::string &Str) { 1138e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner if (Str.empty()) return; 1142c6fd8c7ceea0392635ce21038d2b7fc215d9116Bill Wendling 1158e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner char *Buffer = &Str[0], *EndBuffer = Buffer+Str.size(); 1168e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner char *BOut = Buffer; 1178e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner for (char *BIn = Buffer; BIn != EndBuffer; ) { 1188e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner if (BIn[0] == '\\') { 1198e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner if (BIn < EndBuffer-1 && BIn[1] == '\\') { 1208e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner *BOut++ = '\\'; // Two \ becomes one 1218e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner BIn += 2; 12287d0b9ed1462705dd9bf1cb7f67d0bf03af776c8Guy Benyei } else if (BIn < EndBuffer-2 && 12387d0b9ed1462705dd9bf1cb7f67d0bf03af776c8Guy Benyei isxdigit(static_cast<unsigned char>(BIn[1])) && 12487d0b9ed1462705dd9bf1cb7f67d0bf03af776c8Guy Benyei isxdigit(static_cast<unsigned char>(BIn[2]))) { 1257336f7febb5170b374a4cbffee273ad82ff8a1a3Jordan Rose *BOut = hexDigitValue(BIn[1]) * 16 + hexDigitValue(BIn[2]); 1268e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner BIn += 3; // Skip over handled chars 1278e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner ++BOut; 1288e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner } else { 1298e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner *BOut++ = *BIn++; 1308e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner } 1318e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner } else { 1328e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner *BOut++ = *BIn++; 1338e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner } 1348e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner } 1358e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner Str.resize(BOut-Buffer); 1368e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner} 1378e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner 1388e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner/// isLabelChar - Return true for [-a-zA-Z$._0-9]. 1398e3a8e0452695643d04c21e15c94b802aef81baeChris Lattnerstatic bool isLabelChar(char C) { 14087d0b9ed1462705dd9bf1cb7f67d0bf03af776c8Guy Benyei return isalnum(static_cast<unsigned char>(C)) || C == '-' || C == '$' || 14187d0b9ed1462705dd9bf1cb7f67d0bf03af776c8Guy Benyei C == '.' || C == '_'; 1428e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner} 1438e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner 1448e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner 1458e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner/// isLabelTail - Return true if this pointer points to a valid end of a label. 1468e3a8e0452695643d04c21e15c94b802aef81baeChris Lattnerstatic const char *isLabelTail(const char *CurPtr) { 1478e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner while (1) { 1488e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner if (CurPtr[0] == ':') return CurPtr+1; 1498e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner if (!isLabelChar(CurPtr[0])) return 0; 1508e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner ++CurPtr; 1518e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner } 1528e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner} 1538e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner 1548e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner 1558e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner 1568e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner//===----------------------------------------------------------------------===// 1578e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner// Lexer definition. 1588e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner//===----------------------------------------------------------------------===// 1598e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner 160ff6c91efcf62d1cb99343fdcb2de6271520a1981Owen AndersonLLLexer::LLLexer(MemoryBuffer *StartBuf, SourceMgr &sm, SMDiagnostic &Err, 161ff6c91efcf62d1cb99343fdcb2de6271520a1981Owen Anderson LLVMContext &C) 162ff6c91efcf62d1cb99343fdcb2de6271520a1981Owen Anderson : CurBuf(StartBuf), ErrorInfo(Err), SM(sm), Context(C), APFloatVal(0.0) { 1638e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner CurPtr = CurBuf->getBufferStart(); 1648e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner} 1658e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner 1668e3a8e0452695643d04c21e15c94b802aef81baeChris Lattnerstd::string LLLexer::getFilename() const { 1678e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner return CurBuf->getBufferIdentifier(); 1688e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner} 1698e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner 1708e3a8e0452695643d04c21e15c94b802aef81baeChris Lattnerint LLLexer::getNextChar() { 1718e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner char CurChar = *CurPtr++; 1728e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner switch (CurChar) { 1738e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner default: return (unsigned char)CurChar; 1748e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner case 0: 1758e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner // A nul character in the stream is either the end of the current buffer or 1768e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner // a random nul in the file. Disambiguate that here. 1778e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner if (CurPtr-1 != CurBuf->getBufferEnd()) 1788e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner return 0; // Just whitespace. 1792c6fd8c7ceea0392635ce21038d2b7fc215d9116Bill Wendling 1808e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner // Otherwise, return end of file. 1812c6fd8c7ceea0392635ce21038d2b7fc215d9116Bill Wendling --CurPtr; // Another call to lex will return EOF again. 1828e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner return EOF; 1832c6fd8c7ceea0392635ce21038d2b7fc215d9116Bill Wendling } 1848e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner} 1858e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner 1868e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner 187df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattnerlltok::Kind LLLexer::LexToken() { 1888e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner TokStart = CurPtr; 1892c6fd8c7ceea0392635ce21038d2b7fc215d9116Bill Wendling 1908e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner int CurChar = getNextChar(); 1918e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner switch (CurChar) { 1928e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner default: 1938e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner // Handle letters: [a-zA-Z_] 19487d0b9ed1462705dd9bf1cb7f67d0bf03af776c8Guy Benyei if (isalpha(static_cast<unsigned char>(CurChar)) || CurChar == '_') 1958e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner return LexIdentifier(); 1962c6fd8c7ceea0392635ce21038d2b7fc215d9116Bill Wendling 197df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner return lltok::Error; 198df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner case EOF: return lltok::Eof; 1998e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner case 0: 2008e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner case ' ': 2018e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner case '\t': 2028e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner case '\n': 2038e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner case '\r': 2048e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner // Ignore whitespace. 2058e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner return LexToken(); 2068e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner case '+': return LexPositive(); 2078e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner case '@': return LexAt(); 2088e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner case '%': return LexPercent(); 2098e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner case '"': return LexQuote(); 2108e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner case '.': 2118e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner if (const char *Ptr = isLabelTail(CurPtr)) { 2128e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner CurPtr = Ptr; 213df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner StrVal.assign(TokStart, CurPtr-1); 214df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner return lltok::LabelStr; 2158e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner } 2168e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner if (CurPtr[0] == '.' && CurPtr[1] == '.') { 2178e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner CurPtr += 2; 218df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner return lltok::dotdotdot; 2198e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner } 220df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner return lltok::Error; 2218e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner case '$': 2228e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner if (const char *Ptr = isLabelTail(CurPtr)) { 2238e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner CurPtr = Ptr; 224df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner StrVal.assign(TokStart, CurPtr-1); 225df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner return lltok::LabelStr; 2268e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner } 227df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner return lltok::Error; 2288e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner case ';': 2298e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner SkipLineComment(); 2308e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner return LexToken(); 231e434d277ca5183eeb6f881000732dcf4c8edd52eChris Lattner case '!': return LexExclaim(); 23295ce4c2ffb0ff31a79b060fb112659322a5be3bfBill Wendling case '#': return LexHash(); 2338e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner case '0': case '1': case '2': case '3': case '4': 2348e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner case '5': case '6': case '7': case '8': case '9': 2352c6fd8c7ceea0392635ce21038d2b7fc215d9116Bill Wendling case '-': 2368e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner return LexDigitOrNegative(); 237df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner case '=': return lltok::equal; 238df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner case '[': return lltok::lsquare; 239df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner case ']': return lltok::rsquare; 240df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner case '{': return lltok::lbrace; 241df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner case '}': return lltok::rbrace; 242df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner case '<': return lltok::less; 243df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner case '>': return lltok::greater; 244df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner case '(': return lltok::lparen; 245df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner case ')': return lltok::rparen; 246df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner case ',': return lltok::comma; 247df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner case '*': return lltok::star; 248df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner case '\\': return lltok::backslash; 2498e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner } 2508e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner} 2518e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner 2528e3a8e0452695643d04c21e15c94b802aef81baeChris Lattnervoid LLLexer::SkipLineComment() { 2538e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner while (1) { 2548e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner if (CurPtr[0] == '\n' || CurPtr[0] == '\r' || getNextChar() == EOF) 2558e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner return; 2568e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner } 2578e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner} 2588e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner 2598e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner/// LexAt - Lex all tokens that start with an @ character: 260df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner/// GlobalVar @\"[^\"]*\" 261df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner/// GlobalVar @[-a-zA-Z$._][-a-zA-Z$._0-9]* 262df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner/// GlobalVarID @[0-9]+ 263df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattnerlltok::Kind LLLexer::LexAt() { 2648e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner // Handle AtStringConstant: @\"[^\"]*\" 2658e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner if (CurPtr[0] == '"') { 2668e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner ++CurPtr; 2672c6fd8c7ceea0392635ce21038d2b7fc215d9116Bill Wendling 2688e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner while (1) { 2698e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner int CurChar = getNextChar(); 2702c6fd8c7ceea0392635ce21038d2b7fc215d9116Bill Wendling 2712c6fd8c7ceea0392635ce21038d2b7fc215d9116Bill Wendling if (CurChar == EOF) { 272df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner Error("end of file in global variable name"); 273df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner return lltok::Error; 2748e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner } 2758e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner if (CurChar == '"') { 276df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner StrVal.assign(TokStart+2, CurPtr-1); 277df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner UnEscapeLexed(StrVal); 278df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner return lltok::GlobalVar; 2798e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner } 2808e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner } 2818e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner } 2822c6fd8c7ceea0392635ce21038d2b7fc215d9116Bill Wendling 2838e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner // Handle GlobalVarName: @[-a-zA-Z$._][-a-zA-Z$._0-9]* 2849fa89334f1045b56e8ae409004e119d47ef17ec7Nick Lewycky if (ReadVarName()) 285df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner return lltok::GlobalVar; 2862c6fd8c7ceea0392635ce21038d2b7fc215d9116Bill Wendling 2878e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner // Handle GlobalVarID: @[0-9]+ 28887d0b9ed1462705dd9bf1cb7f67d0bf03af776c8Guy Benyei if (isdigit(static_cast<unsigned char>(CurPtr[0]))) { 28987d0b9ed1462705dd9bf1cb7f67d0bf03af776c8Guy Benyei for (++CurPtr; isdigit(static_cast<unsigned char>(CurPtr[0])); ++CurPtr) 2902c6fd8c7ceea0392635ce21038d2b7fc215d9116Bill Wendling /*empty*/; 2912c6fd8c7ceea0392635ce21038d2b7fc215d9116Bill Wendling 2928e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner uint64_t Val = atoull(TokStart+1, CurPtr); 2938e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner if ((unsigned)Val != Val) 294df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner Error("invalid value number (too large)!"); 295df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner UIntVal = unsigned(Val); 296df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner return lltok::GlobalID; 2978e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner } 2982c6fd8c7ceea0392635ce21038d2b7fc215d9116Bill Wendling 299df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner return lltok::Error; 3008e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner} 3018e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner 3029fa89334f1045b56e8ae409004e119d47ef17ec7Nick Lewycky/// ReadString - Read a string until the closing quote. 3039fa89334f1045b56e8ae409004e119d47ef17ec7Nick Lewyckylltok::Kind LLLexer::ReadString(lltok::Kind kind) { 3049fa89334f1045b56e8ae409004e119d47ef17ec7Nick Lewycky const char *Start = CurPtr; 3059fa89334f1045b56e8ae409004e119d47ef17ec7Nick Lewycky while (1) { 3069fa89334f1045b56e8ae409004e119d47ef17ec7Nick Lewycky int CurChar = getNextChar(); 3079fa89334f1045b56e8ae409004e119d47ef17ec7Nick Lewycky 3089fa89334f1045b56e8ae409004e119d47ef17ec7Nick Lewycky if (CurChar == EOF) { 3099fa89334f1045b56e8ae409004e119d47ef17ec7Nick Lewycky Error("end of file in string constant"); 3109fa89334f1045b56e8ae409004e119d47ef17ec7Nick Lewycky return lltok::Error; 3119fa89334f1045b56e8ae409004e119d47ef17ec7Nick Lewycky } 3129fa89334f1045b56e8ae409004e119d47ef17ec7Nick Lewycky if (CurChar == '"') { 3139fa89334f1045b56e8ae409004e119d47ef17ec7Nick Lewycky StrVal.assign(Start, CurPtr-1); 3149fa89334f1045b56e8ae409004e119d47ef17ec7Nick Lewycky UnEscapeLexed(StrVal); 3159fa89334f1045b56e8ae409004e119d47ef17ec7Nick Lewycky return kind; 3169fa89334f1045b56e8ae409004e119d47ef17ec7Nick Lewycky } 3179fa89334f1045b56e8ae409004e119d47ef17ec7Nick Lewycky } 3189fa89334f1045b56e8ae409004e119d47ef17ec7Nick Lewycky} 3199fa89334f1045b56e8ae409004e119d47ef17ec7Nick Lewycky 3209fa89334f1045b56e8ae409004e119d47ef17ec7Nick Lewycky/// ReadVarName - Read the rest of a token containing a variable name. 3219fa89334f1045b56e8ae409004e119d47ef17ec7Nick Lewyckybool LLLexer::ReadVarName() { 3229fa89334f1045b56e8ae409004e119d47ef17ec7Nick Lewycky const char *NameStart = CurPtr; 32387d0b9ed1462705dd9bf1cb7f67d0bf03af776c8Guy Benyei if (isalpha(static_cast<unsigned char>(CurPtr[0])) || 32487d0b9ed1462705dd9bf1cb7f67d0bf03af776c8Guy Benyei CurPtr[0] == '-' || CurPtr[0] == '$' || 3259fa89334f1045b56e8ae409004e119d47ef17ec7Nick Lewycky CurPtr[0] == '.' || CurPtr[0] == '_') { 3269fa89334f1045b56e8ae409004e119d47ef17ec7Nick Lewycky ++CurPtr; 32787d0b9ed1462705dd9bf1cb7f67d0bf03af776c8Guy Benyei while (isalnum(static_cast<unsigned char>(CurPtr[0])) || 32887d0b9ed1462705dd9bf1cb7f67d0bf03af776c8Guy Benyei CurPtr[0] == '-' || CurPtr[0] == '$' || 3299fa89334f1045b56e8ae409004e119d47ef17ec7Nick Lewycky CurPtr[0] == '.' || CurPtr[0] == '_') 3309fa89334f1045b56e8ae409004e119d47ef17ec7Nick Lewycky ++CurPtr; 3319fa89334f1045b56e8ae409004e119d47ef17ec7Nick Lewycky 3329fa89334f1045b56e8ae409004e119d47ef17ec7Nick Lewycky StrVal.assign(NameStart, CurPtr); 3339fa89334f1045b56e8ae409004e119d47ef17ec7Nick Lewycky return true; 3349fa89334f1045b56e8ae409004e119d47ef17ec7Nick Lewycky } 3359fa89334f1045b56e8ae409004e119d47ef17ec7Nick Lewycky return false; 3369fa89334f1045b56e8ae409004e119d47ef17ec7Nick Lewycky} 3378e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner 3388e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner/// LexPercent - Lex all tokens that start with a % character: 339df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner/// LocalVar ::= %\"[^\"]*\" 340df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner/// LocalVar ::= %[-a-zA-Z$._][-a-zA-Z$._0-9]* 341df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner/// LocalVarID ::= %[0-9]+ 342df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattnerlltok::Kind LLLexer::LexPercent() { 343df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner // Handle LocalVarName: %\"[^\"]*\" 3448e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner if (CurPtr[0] == '"') { 3458e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner ++CurPtr; 3469fa89334f1045b56e8ae409004e119d47ef17ec7Nick Lewycky return ReadString(lltok::LocalVar); 3478e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner } 3482c6fd8c7ceea0392635ce21038d2b7fc215d9116Bill Wendling 3498e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner // Handle LocalVarName: %[-a-zA-Z$._][-a-zA-Z$._0-9]* 3509fa89334f1045b56e8ae409004e119d47ef17ec7Nick Lewycky if (ReadVarName()) 351df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner return lltok::LocalVar; 3522c6fd8c7ceea0392635ce21038d2b7fc215d9116Bill Wendling 3538e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner // Handle LocalVarID: %[0-9]+ 35487d0b9ed1462705dd9bf1cb7f67d0bf03af776c8Guy Benyei if (isdigit(static_cast<unsigned char>(CurPtr[0]))) { 35587d0b9ed1462705dd9bf1cb7f67d0bf03af776c8Guy Benyei for (++CurPtr; isdigit(static_cast<unsigned char>(CurPtr[0])); ++CurPtr) 3562c6fd8c7ceea0392635ce21038d2b7fc215d9116Bill Wendling /*empty*/; 3572c6fd8c7ceea0392635ce21038d2b7fc215d9116Bill Wendling 3588e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner uint64_t Val = atoull(TokStart+1, CurPtr); 3598e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner if ((unsigned)Val != Val) 360df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner Error("invalid value number (too large)!"); 361df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner UIntVal = unsigned(Val); 362df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner return lltok::LocalVarID; 3638e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner } 3642c6fd8c7ceea0392635ce21038d2b7fc215d9116Bill Wendling 365df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner return lltok::Error; 3668e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner} 3678e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner 3688e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner/// LexQuote - Lex all tokens that start with a " character: 3698e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner/// QuoteLabel "[^"]+": 3708e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner/// StringConstant "[^"]*" 371df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattnerlltok::Kind LLLexer::LexQuote() { 3729fa89334f1045b56e8ae409004e119d47ef17ec7Nick Lewycky lltok::Kind kind = ReadString(lltok::StringConstant); 3739fa89334f1045b56e8ae409004e119d47ef17ec7Nick Lewycky if (kind == lltok::Error || kind == lltok::Eof) 3749fa89334f1045b56e8ae409004e119d47ef17ec7Nick Lewycky return kind; 3752c6fd8c7ceea0392635ce21038d2b7fc215d9116Bill Wendling 3769fa89334f1045b56e8ae409004e119d47ef17ec7Nick Lewycky if (CurPtr[0] == ':') { 3778e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner ++CurPtr; 3789fa89334f1045b56e8ae409004e119d47ef17ec7Nick Lewycky kind = lltok::LabelStr; 3798e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner } 3809fa89334f1045b56e8ae409004e119d47ef17ec7Nick Lewycky 3819fa89334f1045b56e8ae409004e119d47ef17ec7Nick Lewycky return kind; 3828e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner} 3838e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner 384e434d277ca5183eeb6f881000732dcf4c8edd52eChris Lattner/// LexExclaim: 385eff2ab61b5d411fe64ba601d402b7c549644b590Devang Patel/// !foo 3861d92831759620a2e5ce4f5a3088c0a1a77a48c8fChris Lattner/// ! 387e434d277ca5183eeb6f881000732dcf4c8edd52eChris Lattnerlltok::Kind LLLexer::LexExclaim() { 3881d92831759620a2e5ce4f5a3088c0a1a77a48c8fChris Lattner // Lex a metadata name as a MetadataVar. 38987d0b9ed1462705dd9bf1cb7f67d0bf03af776c8Guy Benyei if (isalpha(static_cast<unsigned char>(CurPtr[0])) || 39087d0b9ed1462705dd9bf1cb7f67d0bf03af776c8Guy Benyei CurPtr[0] == '-' || CurPtr[0] == '$' || 3919100a78bce4e1d34d8ffd5efa2cc79ed864dd1c0Nick Lewycky CurPtr[0] == '.' || CurPtr[0] == '_' || CurPtr[0] == '\\') { 392eff2ab61b5d411fe64ba601d402b7c549644b590Devang Patel ++CurPtr; 39387d0b9ed1462705dd9bf1cb7f67d0bf03af776c8Guy Benyei while (isalnum(static_cast<unsigned char>(CurPtr[0])) || 39487d0b9ed1462705dd9bf1cb7f67d0bf03af776c8Guy Benyei CurPtr[0] == '-' || CurPtr[0] == '$' || 3959100a78bce4e1d34d8ffd5efa2cc79ed864dd1c0Nick Lewycky CurPtr[0] == '.' || CurPtr[0] == '_' || CurPtr[0] == '\\') 396eff2ab61b5d411fe64ba601d402b7c549644b590Devang Patel ++CurPtr; 3978e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner 398eff2ab61b5d411fe64ba601d402b7c549644b590Devang Patel StrVal.assign(TokStart+1, CurPtr); // Skip ! 3999100a78bce4e1d34d8ffd5efa2cc79ed864dd1c0Nick Lewycky UnEscapeLexed(StrVal); 4001d92831759620a2e5ce4f5a3088c0a1a77a48c8fChris Lattner return lltok::MetadataVar; 401eff2ab61b5d411fe64ba601d402b7c549644b590Devang Patel } 402e434d277ca5183eeb6f881000732dcf4c8edd52eChris Lattner return lltok::exclaim; 403eff2ab61b5d411fe64ba601d402b7c549644b590Devang Patel} 40415c13d3e63d7745bccad74d547af4e3482193eaaMichael Ilseman 40595ce4c2ffb0ff31a79b060fb112659322a5be3bfBill Wendling/// LexHash - Lex all tokens that start with a # character: 40695ce4c2ffb0ff31a79b060fb112659322a5be3bfBill Wendling/// AttrGrpID ::= #[0-9]+ 40795ce4c2ffb0ff31a79b060fb112659322a5be3bfBill Wendlinglltok::Kind LLLexer::LexHash() { 40895ce4c2ffb0ff31a79b060fb112659322a5be3bfBill Wendling // Handle AttrGrpID: #[0-9]+ 40987d0b9ed1462705dd9bf1cb7f67d0bf03af776c8Guy Benyei if (isdigit(static_cast<unsigned char>(CurPtr[0]))) { 41087d0b9ed1462705dd9bf1cb7f67d0bf03af776c8Guy Benyei for (++CurPtr; isdigit(static_cast<unsigned char>(CurPtr[0])); ++CurPtr) 41195ce4c2ffb0ff31a79b060fb112659322a5be3bfBill Wendling /*empty*/; 41295ce4c2ffb0ff31a79b060fb112659322a5be3bfBill Wendling 41395ce4c2ffb0ff31a79b060fb112659322a5be3bfBill Wendling uint64_t Val = atoull(TokStart+1, CurPtr); 41495ce4c2ffb0ff31a79b060fb112659322a5be3bfBill Wendling if ((unsigned)Val != Val) 41595ce4c2ffb0ff31a79b060fb112659322a5be3bfBill Wendling Error("invalid value number (too large)!"); 41695ce4c2ffb0ff31a79b060fb112659322a5be3bfBill Wendling UIntVal = unsigned(Val); 41795ce4c2ffb0ff31a79b060fb112659322a5be3bfBill Wendling return lltok::AttrGrpID; 41895ce4c2ffb0ff31a79b060fb112659322a5be3bfBill Wendling } 41995ce4c2ffb0ff31a79b060fb112659322a5be3bfBill Wendling 42095ce4c2ffb0ff31a79b060fb112659322a5be3bfBill Wendling return lltok::Error; 42195ce4c2ffb0ff31a79b060fb112659322a5be3bfBill Wendling} 42295ce4c2ffb0ff31a79b060fb112659322a5be3bfBill Wendling 4238e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner/// LexIdentifier: Handle several related productions: 4248e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner/// Label [-a-zA-Z$._0-9]+: 4258e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner/// IntegerType i[0-9]+ 4268e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner/// Keyword sdiv, float, ... 4278e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner/// HexIntConstant [us]0x[0-9A-Fa-f]+ 428df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattnerlltok::Kind LLLexer::LexIdentifier() { 4298e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner const char *StartChar = CurPtr; 4308e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner const char *IntEnd = CurPtr[-1] == 'i' ? 0 : StartChar; 4318e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner const char *KeywordEnd = 0; 4322c6fd8c7ceea0392635ce21038d2b7fc215d9116Bill Wendling 4338e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner for (; isLabelChar(*CurPtr); ++CurPtr) { 4348e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner // If we decide this is an integer, remember the end of the sequence. 43587d0b9ed1462705dd9bf1cb7f67d0bf03af776c8Guy Benyei if (!IntEnd && !isdigit(static_cast<unsigned char>(*CurPtr))) 43687d0b9ed1462705dd9bf1cb7f67d0bf03af776c8Guy Benyei IntEnd = CurPtr; 43787d0b9ed1462705dd9bf1cb7f67d0bf03af776c8Guy Benyei if (!KeywordEnd && !isalnum(static_cast<unsigned char>(*CurPtr)) && 43887d0b9ed1462705dd9bf1cb7f67d0bf03af776c8Guy Benyei *CurPtr != '_') 43987d0b9ed1462705dd9bf1cb7f67d0bf03af776c8Guy Benyei KeywordEnd = CurPtr; 4408e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner } 4412c6fd8c7ceea0392635ce21038d2b7fc215d9116Bill Wendling 4428e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner // If we stopped due to a colon, this really is a label. 4438e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner if (*CurPtr == ':') { 444df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner StrVal.assign(StartChar-1, CurPtr++); 445df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner return lltok::LabelStr; 4468e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner } 4472c6fd8c7ceea0392635ce21038d2b7fc215d9116Bill Wendling 4488e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner // Otherwise, this wasn't a label. If this was valid as an integer type, 4498e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner // return it. 4508e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner if (IntEnd == 0) IntEnd = CurPtr; 4518e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner if (IntEnd != StartChar) { 4528e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner CurPtr = IntEnd; 4538e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner uint64_t NumBits = atoull(StartChar, CurPtr); 4542c6fd8c7ceea0392635ce21038d2b7fc215d9116Bill Wendling if (NumBits < IntegerType::MIN_INT_BITS || 4558e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner NumBits > IntegerType::MAX_INT_BITS) { 456df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner Error("bitwidth for integer type out of range!"); 457df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner return lltok::Error; 4588e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner } 4591d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson TyVal = IntegerType::get(Context, NumBits); 460df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner return lltok::Type; 4618e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner } 4622c6fd8c7ceea0392635ce21038d2b7fc215d9116Bill Wendling 4638e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner // Otherwise, this was a letter sequence. See which keyword this is. 4648e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner if (KeywordEnd == 0) KeywordEnd = CurPtr; 4658e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner CurPtr = KeywordEnd; 4668e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner --StartChar; 4678e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner unsigned Len = CurPtr-StartChar; 468ae510f3936f2510cebff86ea38536b30fdf2a30cBill Wendling#define KEYWORD(STR) \ 469ae510f3936f2510cebff86ea38536b30fdf2a30cBill Wendling do { \ 470ae510f3936f2510cebff86ea38536b30fdf2a30cBill Wendling if (Len == strlen(#STR) && !memcmp(StartChar, #STR, strlen(#STR))) \ 471ae510f3936f2510cebff86ea38536b30fdf2a30cBill Wendling return lltok::kw_##STR; \ 472ae510f3936f2510cebff86ea38536b30fdf2a30cBill Wendling } while (0) 473df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner 474df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner KEYWORD(true); KEYWORD(false); 475df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner KEYWORD(declare); KEYWORD(define); 476df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner KEYWORD(global); KEYWORD(constant); 477df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner 478bb46f52027416598a662dc1c58f48d9d56b1a65bRafael Espindola KEYWORD(private); 4793d10a5a75794356a0a568ce283713adc3a963200Bill Wendling KEYWORD(linker_private); 4805e721d768254a920b78b9129d79a84c0163cb3f4Bill Wendling KEYWORD(linker_private_weak); 48132811bef956e0fae4329e6515420d85f7e510660Bill Wendling KEYWORD(linker_private_weak_def_auto); // FIXME: For backwards compatibility. 482df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner KEYWORD(internal); 483266c7bbbbcc4b326dea82e577de1a415d6acc23eChris Lattner KEYWORD(available_externally); 484df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner KEYWORD(linkonce); 485667d4b8de6dea70195ff12ef39a4deebffa2f5c7Duncan Sands KEYWORD(linkonce_odr); 48632811bef956e0fae4329e6515420d85f7e510660Bill Wendling KEYWORD(linkonce_odr_auto_hide); 487df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner KEYWORD(weak); 488667d4b8de6dea70195ff12ef39a4deebffa2f5c7Duncan Sands KEYWORD(weak_odr); 489df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner KEYWORD(appending); 490df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner KEYWORD(dllimport); 491df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner KEYWORD(dllexport); 492df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner KEYWORD(common); 493df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner KEYWORD(default); 494df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner KEYWORD(hidden); 495df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner KEYWORD(protected); 496bea4626f93c830e31f82cc947df28fdae583cd09Rafael Espindola KEYWORD(unnamed_addr); 497a2de37c897556fbd1f94a3ed84ad27accd8f8debMichael Gottesman KEYWORD(externally_initialized); 498df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner KEYWORD(extern_weak); 499df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner KEYWORD(external); 500df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner KEYWORD(thread_local); 501ce718ff9f42c7da092eaa01dd0242e8d5ba84713Hans Wennborg KEYWORD(localdynamic); 502ce718ff9f42c7da092eaa01dd0242e8d5ba84713Hans Wennborg KEYWORD(initialexec); 503ce718ff9f42c7da092eaa01dd0242e8d5ba84713Hans Wennborg KEYWORD(localexec); 504df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner KEYWORD(zeroinitializer); 505df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner KEYWORD(undef); 506df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner KEYWORD(null); 507df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner KEYWORD(to); 508df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner KEYWORD(tail); 509df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner KEYWORD(target); 510df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner KEYWORD(triple); 5110f96817d010c4d2abbb0e1c1cfc56ff537010081Bill Wendling KEYWORD(unwind); 5123defc0bfa600cc253f0cba0fe781aa49435d968aBill Wendling KEYWORD(deplibs); // FIXME: Remove in 4.0. 513df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner KEYWORD(datalayout); 514df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner KEYWORD(volatile); 51547f3513dd574535aeb40c9eb11134f0899e92269Eli Friedman KEYWORD(atomic); 51647f3513dd574535aeb40c9eb11134f0899e92269Eli Friedman KEYWORD(unordered); 51747f3513dd574535aeb40c9eb11134f0899e92269Eli Friedman KEYWORD(monotonic); 51847f3513dd574535aeb40c9eb11134f0899e92269Eli Friedman KEYWORD(acquire); 51947f3513dd574535aeb40c9eb11134f0899e92269Eli Friedman KEYWORD(release); 52047f3513dd574535aeb40c9eb11134f0899e92269Eli Friedman KEYWORD(acq_rel); 52147f3513dd574535aeb40c9eb11134f0899e92269Eli Friedman KEYWORD(seq_cst); 52247f3513dd574535aeb40c9eb11134f0899e92269Eli Friedman KEYWORD(singlethread); 52347f3513dd574535aeb40c9eb11134f0899e92269Eli Friedman 524ae510f3936f2510cebff86ea38536b30fdf2a30cBill Wendling KEYWORD(nnan); 525ae510f3936f2510cebff86ea38536b30fdf2a30cBill Wendling KEYWORD(ninf); 526ae510f3936f2510cebff86ea38536b30fdf2a30cBill Wendling KEYWORD(nsz); 527ae510f3936f2510cebff86ea38536b30fdf2a30cBill Wendling KEYWORD(arcp); 528ae510f3936f2510cebff86ea38536b30fdf2a30cBill Wendling KEYWORD(fast); 52908d012eba490c4906ec773c39db9f2a18a78c997Dan Gohman KEYWORD(nuw); 53008d012eba490c4906ec773c39db9f2a18a78c997Dan Gohman KEYWORD(nsw); 5311224c386981f7948f298ed9ad444c40609570f2eDan Gohman KEYWORD(exact); 532dd8004dc73d091ccb3927dbbc3b41639a3738ae3Dan Gohman KEYWORD(inbounds); 533df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner KEYWORD(align); 534df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner KEYWORD(addrspace); 535df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner KEYWORD(section); 536df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner KEYWORD(alias); 537df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner KEYWORD(module); 538df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner KEYWORD(asm); 539df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner KEYWORD(sideeffect); 5408ba2d5befc05ca73d3bac8708819bbbe759e2cf9Dale Johannesen KEYWORD(alignstack); 541581600bfc3060ee13afb278cd87e25da5b5f7db2Chad Rosier KEYWORD(inteldialect); 542df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner KEYWORD(gc); 543df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner 544df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner KEYWORD(ccc); 545df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner KEYWORD(fastcc); 546df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner KEYWORD(coldcc); 547df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner KEYWORD(x86_stdcallcc); 548df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner KEYWORD(x86_fastcallcc); 549ded05e34b65dc42998e9db6ca1abd513e7a9d120Anton Korobeynikov KEYWORD(x86_thiscallcc); 550385f5a99ecc7fee48a7539bc63d3e1d3b5089c0dAnton Korobeynikov KEYWORD(arm_apcscc); 551385f5a99ecc7fee48a7539bc63d3e1d3b5089c0dAnton Korobeynikov KEYWORD(arm_aapcscc); 552385f5a99ecc7fee48a7539bc63d3e1d3b5089c0dAnton Korobeynikov KEYWORD(arm_aapcs_vfpcc); 553211a14e476abc9b864ab6a5d5e0bbb86d288b650Anton Korobeynikov KEYWORD(msp430_intrcc); 554f9930da2ef72350c6c805af09e754e4e6e13d47bChe-Liang Chiou KEYWORD(ptx_kernel); 555f9930da2ef72350c6c805af09e754e4e6e13d47bChe-Liang Chiou KEYWORD(ptx_device); 556e53d6051b7e173722351a5647bfd71eebee3d837Micah Villmow KEYWORD(spir_kernel); 557e53d6051b7e173722351a5647bfd71eebee3d837Micah Villmow KEYWORD(spir_func); 5583575222175b4982f380ff291bb17be67aadc0966Elena Demikhovsky KEYWORD(intel_ocl_bicc); 559385f5a99ecc7fee48a7539bc63d3e1d3b5089c0dAnton Korobeynikov 560df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner KEYWORD(cc); 561df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner KEYWORD(c); 562df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner 56395ce4c2ffb0ff31a79b060fb112659322a5be3bfBill Wendling KEYWORD(attributes); 56495ce4c2ffb0ff31a79b060fb112659322a5be3bfBill Wendling 56595ce4c2ffb0ff31a79b060fb112659322a5be3bfBill Wendling KEYWORD(address_safety); 56695ce4c2ffb0ff31a79b060fb112659322a5be3bfBill Wendling KEYWORD(alwaysinline); 56795ce4c2ffb0ff31a79b060fb112659322a5be3bfBill Wendling KEYWORD(byval); 56895ce4c2ffb0ff31a79b060fb112659322a5be3bfBill Wendling KEYWORD(inlinehint); 569df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner KEYWORD(inreg); 57095ce4c2ffb0ff31a79b060fb112659322a5be3bfBill Wendling KEYWORD(minsize); 57195ce4c2ffb0ff31a79b060fb112659322a5be3bfBill Wendling KEYWORD(naked); 57295ce4c2ffb0ff31a79b060fb112659322a5be3bfBill Wendling KEYWORD(nest); 573df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner KEYWORD(noalias); 574df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner KEYWORD(nocapture); 57595ce4c2ffb0ff31a79b060fb112659322a5be3bfBill Wendling KEYWORD(noduplicate); 57695ce4c2ffb0ff31a79b060fb112659322a5be3bfBill Wendling KEYWORD(noimplicitfloat); 57795ce4c2ffb0ff31a79b060fb112659322a5be3bfBill Wendling KEYWORD(noinline); 57895ce4c2ffb0ff31a79b060fb112659322a5be3bfBill Wendling KEYWORD(nonlazybind); 57995ce4c2ffb0ff31a79b060fb112659322a5be3bfBill Wendling KEYWORD(noredzone); 58095ce4c2ffb0ff31a79b060fb112659322a5be3bfBill Wendling KEYWORD(noreturn); 58195ce4c2ffb0ff31a79b060fb112659322a5be3bfBill Wendling KEYWORD(nounwind); 58295ce4c2ffb0ff31a79b060fb112659322a5be3bfBill Wendling KEYWORD(optsize); 583df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner KEYWORD(readnone); 584df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner KEYWORD(readonly); 58525456ef74ca7ac9bf46451f28d995f785e2596deRafael Espindola KEYWORD(returns_twice); 58695ce4c2ffb0ff31a79b060fb112659322a5be3bfBill Wendling KEYWORD(signext); 58795ce4c2ffb0ff31a79b060fb112659322a5be3bfBill Wendling KEYWORD(sret); 588df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner KEYWORD(ssp); 589df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner KEYWORD(sspreq); 590114baee1fa017daefad2339c77b45b9ca3d79a41Bill Wendling KEYWORD(sspstrong); 591ab39afa9d9b99c61842c8e3d0eb706bd16efdcf3Kostya Serebryany KEYWORD(thread_safety); 592ab39afa9d9b99c61842c8e3d0eb706bd16efdcf3Kostya Serebryany KEYWORD(uninitialized_checks); 59395ce4c2ffb0ff31a79b060fb112659322a5be3bfBill Wendling KEYWORD(uwtable); 59495ce4c2ffb0ff31a79b060fb112659322a5be3bfBill Wendling KEYWORD(zeroext); 595df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner 596df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner KEYWORD(type); 597df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner KEYWORD(opaque); 598df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner 599df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner KEYWORD(eq); KEYWORD(ne); KEYWORD(slt); KEYWORD(sgt); KEYWORD(sle); 600df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner KEYWORD(sge); KEYWORD(ult); KEYWORD(ugt); KEYWORD(ule); KEYWORD(uge); 601df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner KEYWORD(oeq); KEYWORD(one); KEYWORD(olt); KEYWORD(ogt); KEYWORD(ole); 602df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner KEYWORD(oge); KEYWORD(ord); KEYWORD(uno); KEYWORD(ueq); KEYWORD(une); 6039ea4034e007a83c778cd306ea66481be1317a51bMisha Brukman 604ff03048c1350fcc4fda1ef6d6c57252f3a950854Eli Friedman KEYWORD(xchg); KEYWORD(nand); KEYWORD(max); KEYWORD(min); KEYWORD(umax); 605ff03048c1350fcc4fda1ef6d6c57252f3a950854Eli Friedman KEYWORD(umin); 606ff03048c1350fcc4fda1ef6d6c57252f3a950854Eli Friedman 607df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner KEYWORD(x); 60809d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner KEYWORD(blockaddress); 609e6e8826870bee3facb04f950f0bd725f8a88623dBill Wendling 610e6e8826870bee3facb04f950f0bd725f8a88623dBill Wendling KEYWORD(personality); 611e6e8826870bee3facb04f950f0bd725f8a88623dBill Wendling KEYWORD(cleanup); 612e6e8826870bee3facb04f950f0bd725f8a88623dBill Wendling KEYWORD(catch); 613e6e8826870bee3facb04f950f0bd725f8a88623dBill Wendling KEYWORD(filter); 6148e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner#undef KEYWORD 6158e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner 6168e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner // Keywords for types. 617df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner#define TYPEKEYWORD(STR, LLVMTY) \ 6188e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner if (Len == strlen(STR) && !memcmp(StartChar, STR, strlen(STR))) { \ 619df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner TyVal = LLVMTY; return lltok::Type; } 6201d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson TYPEKEYWORD("void", Type::getVoidTy(Context)); 621ce16339930a2b03e53b4e6399ef59c092a7f2cfaDan Gohman TYPEKEYWORD("half", Type::getHalfTy(Context)); 6221d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson TYPEKEYWORD("float", Type::getFloatTy(Context)); 6231d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson TYPEKEYWORD("double", Type::getDoubleTy(Context)); 6241d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson TYPEKEYWORD("x86_fp80", Type::getX86_FP80Ty(Context)); 6251d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson TYPEKEYWORD("fp128", Type::getFP128Ty(Context)); 6261d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson TYPEKEYWORD("ppc_fp128", Type::getPPC_FP128Ty(Context)); 6271d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson TYPEKEYWORD("label", Type::getLabelTy(Context)); 6281d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson TYPEKEYWORD("metadata", Type::getMetadataTy(Context)); 629bb811a244567aa8a1522203f15588f4d001b7353Dale Johannesen TYPEKEYWORD("x86_mmx", Type::getX86_MMXTy(Context)); 6308e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner#undef TYPEKEYWORD 6318e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner 6328e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner // Keywords for instructions. 633df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner#define INSTKEYWORD(STR, Enum) \ 634df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner if (Len == strlen(#STR) && !memcmp(StartChar, #STR, strlen(#STR))) { \ 635df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner UIntVal = Instruction::Enum; return lltok::kw_##STR; } 636df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner 637ae3a0be92e33bc716722aa600983fc1535acb122Dan Gohman INSTKEYWORD(add, Add); INSTKEYWORD(fadd, FAdd); 638ae3a0be92e33bc716722aa600983fc1535acb122Dan Gohman INSTKEYWORD(sub, Sub); INSTKEYWORD(fsub, FSub); 639ae3a0be92e33bc716722aa600983fc1535acb122Dan Gohman INSTKEYWORD(mul, Mul); INSTKEYWORD(fmul, FMul); 640df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner INSTKEYWORD(udiv, UDiv); INSTKEYWORD(sdiv, SDiv); INSTKEYWORD(fdiv, FDiv); 641df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner INSTKEYWORD(urem, URem); INSTKEYWORD(srem, SRem); INSTKEYWORD(frem, FRem); 642df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner INSTKEYWORD(shl, Shl); INSTKEYWORD(lshr, LShr); INSTKEYWORD(ashr, AShr); 643df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner INSTKEYWORD(and, And); INSTKEYWORD(or, Or); INSTKEYWORD(xor, Xor); 644df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner INSTKEYWORD(icmp, ICmp); INSTKEYWORD(fcmp, FCmp); 645df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner 646df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner INSTKEYWORD(phi, PHI); 647df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner INSTKEYWORD(call, Call); 648df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner INSTKEYWORD(trunc, Trunc); 649df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner INSTKEYWORD(zext, ZExt); 650df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner INSTKEYWORD(sext, SExt); 651df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner INSTKEYWORD(fptrunc, FPTrunc); 652df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner INSTKEYWORD(fpext, FPExt); 653df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner INSTKEYWORD(uitofp, UIToFP); 654df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner INSTKEYWORD(sitofp, SIToFP); 655df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner INSTKEYWORD(fptoui, FPToUI); 656df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner INSTKEYWORD(fptosi, FPToSI); 657df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner INSTKEYWORD(inttoptr, IntToPtr); 658df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner INSTKEYWORD(ptrtoint, PtrToInt); 659df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner INSTKEYWORD(bitcast, BitCast); 660df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner INSTKEYWORD(select, Select); 661df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner INSTKEYWORD(va_arg, VAArg); 662df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner INSTKEYWORD(ret, Ret); 663df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner INSTKEYWORD(br, Br); 664df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner INSTKEYWORD(switch, Switch); 665ab21db79ef1d2530880ad11f21f0b87ffca02dd4Chris Lattner INSTKEYWORD(indirectbr, IndirectBr); 666df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner INSTKEYWORD(invoke, Invoke); 667dccc03b2423fe65efb5963ae816b99c24fc53374Bill Wendling INSTKEYWORD(resume, Resume); 668df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner INSTKEYWORD(unreachable, Unreachable); 669df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner 670df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner INSTKEYWORD(alloca, Alloca); 671df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner INSTKEYWORD(load, Load); 672df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner INSTKEYWORD(store, Store); 673ff03048c1350fcc4fda1ef6d6c57252f3a950854Eli Friedman INSTKEYWORD(cmpxchg, AtomicCmpXchg); 674ff03048c1350fcc4fda1ef6d6c57252f3a950854Eli Friedman INSTKEYWORD(atomicrmw, AtomicRMW); 67547f3513dd574535aeb40c9eb11134f0899e92269Eli Friedman INSTKEYWORD(fence, Fence); 676df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner INSTKEYWORD(getelementptr, GetElementPtr); 677df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner 678df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner INSTKEYWORD(extractelement, ExtractElement); 679df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner INSTKEYWORD(insertelement, InsertElement); 680df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner INSTKEYWORD(shufflevector, ShuffleVector); 681df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner INSTKEYWORD(extractvalue, ExtractValue); 682df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner INSTKEYWORD(insertvalue, InsertValue); 683e6e8826870bee3facb04f950f0bd725f8a88623dBill Wendling INSTKEYWORD(landingpad, LandingPad); 6842c6fd8c7ceea0392635ce21038d2b7fc215d9116Bill Wendling#undef INSTKEYWORD 6852c6fd8c7ceea0392635ce21038d2b7fc215d9116Bill Wendling 6868e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner // Check for [us]0x[0-9A-Fa-f]+ which are Hexadecimal constant generated by 6878e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner // the CFE to avoid forcing it to deal with 64-bit numbers. 6888e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner if ((TokStart[0] == 'u' || TokStart[0] == 's') && 68987d0b9ed1462705dd9bf1cb7f67d0bf03af776c8Guy Benyei TokStart[1] == '0' && TokStart[2] == 'x' && 69087d0b9ed1462705dd9bf1cb7f67d0bf03af776c8Guy Benyei isxdigit(static_cast<unsigned char>(TokStart[3]))) { 6918e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner int len = CurPtr-TokStart-3; 6928e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner uint32_t bits = len * 4; 693689ad6ef3fd2e89394f1e8860dfebfe56b73c3daDaniel Dunbar APInt Tmp(bits, StringRef(TokStart+3, len), 16); 6948e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner uint32_t activeBits = Tmp.getActiveBits(); 6958e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner if (activeBits > 0 && activeBits < bits) 69640f8f6264d5af2c38e797e0dc59827cd231e8ff7Jay Foad Tmp = Tmp.trunc(activeBits); 697df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner APSIntVal = APSInt(Tmp, TokStart[0] == 'u'); 698df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner return lltok::APSInt; 6998e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner } 7002c6fd8c7ceea0392635ce21038d2b7fc215d9116Bill Wendling 7014ce0df610879e82d9853c6a38a75b1883feaee06Chris Lattner // If this is "cc1234", return this as just "cc". 7028e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner if (TokStart[0] == 'c' && TokStart[1] == 'c') { 7038e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner CurPtr = TokStart+2; 704df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner return lltok::kw_cc; 7058e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner } 7062c6fd8c7ceea0392635ce21038d2b7fc215d9116Bill Wendling 707df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner // Finally, if this isn't known, return an error. 7088e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner CurPtr = TokStart+1; 709df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner return lltok::Error; 7108e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner} 7118e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner 71210c6d12a9fd4dab411091f64db4db69670b88850Bill Wendling 7138e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner/// Lex0x: Handle productions that start with 0x, knowing that it matches and 7148e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner/// that this is not a label: 7158e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner/// HexFPConstant 0x[0-9A-Fa-f]+ 7168e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner/// HexFP80Constant 0xK[0-9A-Fa-f]+ 7178e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner/// HexFP128Constant 0xL[0-9A-Fa-f]+ 7188e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner/// HexPPC128Constant 0xM[0-9A-Fa-f]+ 719057beb8d4fe8d5dad98ad80a49a649730c3a3eb0Tobias Grosser/// HexHalfConstant 0xH[0-9A-Fa-f]+ 720df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattnerlltok::Kind LLLexer::Lex0x() { 7218e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner CurPtr = TokStart + 2; 7222c6fd8c7ceea0392635ce21038d2b7fc215d9116Bill Wendling 7238e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner char Kind; 7248d2a004822f9cc5bf38d5ef14494e2f0faa82b8cDavid Blaikie if ((CurPtr[0] >= 'K' && CurPtr[0] <= 'M') || CurPtr[0] == 'H') { 7258e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner Kind = *CurPtr++; 7268e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner } else { 7278e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner Kind = 'J'; 7288e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner } 7298e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner 73087d0b9ed1462705dd9bf1cb7f67d0bf03af776c8Guy Benyei if (!isxdigit(static_cast<unsigned char>(CurPtr[0]))) { 731df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner // Bad token, return it as an error. 7328e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner CurPtr = TokStart+1; 733df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner return lltok::Error; 7348e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner } 7352c6fd8c7ceea0392635ce21038d2b7fc215d9116Bill Wendling 73687d0b9ed1462705dd9bf1cb7f67d0bf03af776c8Guy Benyei while (isxdigit(static_cast<unsigned char>(CurPtr[0]))) 7378e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner ++CurPtr; 7382c6fd8c7ceea0392635ce21038d2b7fc215d9116Bill Wendling 7398e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner if (Kind == 'J') { 7408e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner // HexFPConstant - Floating point constant represented in IEEE format as a 7418e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner // hexadecimal number for when exponential notation is not precise enough. 742ce16339930a2b03e53b4e6399ef59c092a7f2cfaDan Gohman // Half, Float, and double only. 743df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner APFloatVal = APFloat(BitsToDouble(HexIntToVal(TokStart+2, CurPtr))); 744df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner return lltok::APFloat; 7458e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner } 7462c6fd8c7ceea0392635ce21038d2b7fc215d9116Bill Wendling 7478e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner uint64_t Pair[2]; 7488e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner switch (Kind) { 749c23197a26f34f559ea9797de51e187087c039c42Torok Edwin default: llvm_unreachable("Unknown kind!"); 7508e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner case 'K': 7518e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner // F80HexFPConstant - x87 long double in hexadecimal format (10 bytes) 7521b25cb2416c46a6cebf2a6c52235e9fe46a10d11Dale Johannesen FP80HexToIntPair(TokStart+3, CurPtr, Pair); 7530a29cb045444c13160e90fe7942a9d7c720185edTim Northover APFloatVal = APFloat(APFloat::x87DoubleExtended, APInt(80, Pair)); 754df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner return lltok::APFloat; 7558e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner case 'L': 7568e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner // F128HexFPConstant - IEEE 128-bit in hexadecimal format (16 bytes) 7571b25cb2416c46a6cebf2a6c52235e9fe46a10d11Dale Johannesen HexToIntPair(TokStart+3, CurPtr, Pair); 7580a29cb045444c13160e90fe7942a9d7c720185edTim Northover APFloatVal = APFloat(APFloat::IEEEquad, APInt(128, Pair)); 759df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner return lltok::APFloat; 7608e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner case 'M': 7618e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner // PPC128HexFPConstant - PowerPC 128-bit in hexadecimal format (16 bytes) 7621b25cb2416c46a6cebf2a6c52235e9fe46a10d11Dale Johannesen HexToIntPair(TokStart+3, CurPtr, Pair); 7630a29cb045444c13160e90fe7942a9d7c720185edTim Northover APFloatVal = APFloat(APFloat::PPCDoubleDouble, APInt(128, Pair)); 764df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner return lltok::APFloat; 765057beb8d4fe8d5dad98ad80a49a649730c3a3eb0Tobias Grosser case 'H': 7660a29cb045444c13160e90fe7942a9d7c720185edTim Northover APFloatVal = APFloat(APFloat::IEEEhalf, 7670a29cb045444c13160e90fe7942a9d7c720185edTim Northover APInt(16,HexIntToVal(TokStart+3, CurPtr))); 768057beb8d4fe8d5dad98ad80a49a649730c3a3eb0Tobias Grosser return lltok::APFloat; 7698e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner } 7708e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner} 7718e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner 7728e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner/// LexIdentifier: Handle several related productions: 7738e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner/// Label [-a-zA-Z$._0-9]+: 7748e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner/// NInteger -[0-9]+ 7758e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner/// FPConstant [-+]?[0-9]+[.][0-9]*([eE][-+]?[0-9]+)? 7768e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner/// PInteger [0-9]+ 7778e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner/// HexFPConstant 0x[0-9A-Fa-f]+ 7788e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner/// HexFP80Constant 0xK[0-9A-Fa-f]+ 7798e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner/// HexFP128Constant 0xL[0-9A-Fa-f]+ 7808e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner/// HexPPC128Constant 0xM[0-9A-Fa-f]+ 781df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattnerlltok::Kind LLLexer::LexDigitOrNegative() { 78206be8b8a698b3d71aa93f30456b197ca6d54b1d0Craig Topper // If the letter after the negative is not a number, this is probably a label. 78387d0b9ed1462705dd9bf1cb7f67d0bf03af776c8Guy Benyei if (!isdigit(static_cast<unsigned char>(TokStart[0])) && 78487d0b9ed1462705dd9bf1cb7f67d0bf03af776c8Guy Benyei !isdigit(static_cast<unsigned char>(CurPtr[0]))) { 7858e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner // Okay, this is not a number after the -, it's probably a label. 7868e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner if (const char *End = isLabelTail(CurPtr)) { 787df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner StrVal.assign(TokStart, End-1); 7888e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner CurPtr = End; 789df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner return lltok::LabelStr; 7908e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner } 7912c6fd8c7ceea0392635ce21038d2b7fc215d9116Bill Wendling 792df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner return lltok::Error; 7938e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner } 7942c6fd8c7ceea0392635ce21038d2b7fc215d9116Bill Wendling 7958e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner // At this point, it is either a label, int or fp constant. 7962c6fd8c7ceea0392635ce21038d2b7fc215d9116Bill Wendling 7978e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner // Skip digits, we have at least one. 79887d0b9ed1462705dd9bf1cb7f67d0bf03af776c8Guy Benyei for (; isdigit(static_cast<unsigned char>(CurPtr[0])); ++CurPtr) 7992c6fd8c7ceea0392635ce21038d2b7fc215d9116Bill Wendling /*empty*/; 8002c6fd8c7ceea0392635ce21038d2b7fc215d9116Bill Wendling 8018e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner // Check to see if this really is a label afterall, e.g. "-1:". 8028e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner if (isLabelChar(CurPtr[0]) || CurPtr[0] == ':') { 8038e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner if (const char *End = isLabelTail(CurPtr)) { 804df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner StrVal.assign(TokStart, End-1); 8058e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner CurPtr = End; 806df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner return lltok::LabelStr; 8078e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner } 8088e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner } 8092c6fd8c7ceea0392635ce21038d2b7fc215d9116Bill Wendling 8108e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner // If the next character is a '.', then it is a fp value, otherwise its 8118e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner // integer. 8128e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner if (CurPtr[0] != '.') { 8138e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner if (TokStart[0] == '0' && TokStart[1] == 'x') 8148e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner return Lex0x(); 8158e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner unsigned Len = CurPtr-TokStart; 8168e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner uint32_t numBits = ((Len * 64) / 19) + 2; 817689ad6ef3fd2e89394f1e8860dfebfe56b73c3daDaniel Dunbar APInt Tmp(numBits, StringRef(TokStart, Len), 10); 8188e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner if (TokStart[0] == '-') { 8198e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner uint32_t minBits = Tmp.getMinSignedBits(); 8208e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner if (minBits > 0 && minBits < numBits) 82140f8f6264d5af2c38e797e0dc59827cd231e8ff7Jay Foad Tmp = Tmp.trunc(minBits); 822df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner APSIntVal = APSInt(Tmp, false); 8238e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner } else { 8248e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner uint32_t activeBits = Tmp.getActiveBits(); 8258e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner if (activeBits > 0 && activeBits < numBits) 82640f8f6264d5af2c38e797e0dc59827cd231e8ff7Jay Foad Tmp = Tmp.trunc(activeBits); 827df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner APSIntVal = APSInt(Tmp, true); 8288e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner } 829df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner return lltok::APSInt; 8308e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner } 8318e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner 8328e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner ++CurPtr; 8332c6fd8c7ceea0392635ce21038d2b7fc215d9116Bill Wendling 8348e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner // Skip over [0-9]*([eE][-+]?[0-9]+)? 83587d0b9ed1462705dd9bf1cb7f67d0bf03af776c8Guy Benyei while (isdigit(static_cast<unsigned char>(CurPtr[0]))) ++CurPtr; 8362c6fd8c7ceea0392635ce21038d2b7fc215d9116Bill Wendling 8378e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner if (CurPtr[0] == 'e' || CurPtr[0] == 'E') { 83887d0b9ed1462705dd9bf1cb7f67d0bf03af776c8Guy Benyei if (isdigit(static_cast<unsigned char>(CurPtr[1])) || 83987d0b9ed1462705dd9bf1cb7f67d0bf03af776c8Guy Benyei ((CurPtr[1] == '-' || CurPtr[1] == '+') && 84087d0b9ed1462705dd9bf1cb7f67d0bf03af776c8Guy Benyei isdigit(static_cast<unsigned char>(CurPtr[2])))) { 8418e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner CurPtr += 2; 84287d0b9ed1462705dd9bf1cb7f67d0bf03af776c8Guy Benyei while (isdigit(static_cast<unsigned char>(CurPtr[0]))) ++CurPtr; 8438e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner } 8448e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner } 8452c6fd8c7ceea0392635ce21038d2b7fc215d9116Bill Wendling 8462402123413080aee8e9418e4f08b8613ef5cc360Nick Lewycky APFloatVal = APFloat(std::atof(TokStart)); 847df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner return lltok::APFloat; 8488e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner} 8498e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner 8508e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner/// FPConstant [-+]?[0-9]+[.][0-9]*([eE][-+]?[0-9]+)? 851df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattnerlltok::Kind LLLexer::LexPositive() { 8528e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner // If the letter after the negative is a number, this is probably not a 8538e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner // label. 85487d0b9ed1462705dd9bf1cb7f67d0bf03af776c8Guy Benyei if (!isdigit(static_cast<unsigned char>(CurPtr[0]))) 855df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner return lltok::Error; 8562c6fd8c7ceea0392635ce21038d2b7fc215d9116Bill Wendling 8578e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner // Skip digits. 85887d0b9ed1462705dd9bf1cb7f67d0bf03af776c8Guy Benyei for (++CurPtr; isdigit(static_cast<unsigned char>(CurPtr[0])); ++CurPtr) 8592c6fd8c7ceea0392635ce21038d2b7fc215d9116Bill Wendling /*empty*/; 8608e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner 8618e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner // At this point, we need a '.'. 8628e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner if (CurPtr[0] != '.') { 8638e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner CurPtr = TokStart+1; 864df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner return lltok::Error; 8658e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner } 8662c6fd8c7ceea0392635ce21038d2b7fc215d9116Bill Wendling 8678e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner ++CurPtr; 8682c6fd8c7ceea0392635ce21038d2b7fc215d9116Bill Wendling 8698e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner // Skip over [0-9]*([eE][-+]?[0-9]+)? 87087d0b9ed1462705dd9bf1cb7f67d0bf03af776c8Guy Benyei while (isdigit(static_cast<unsigned char>(CurPtr[0]))) ++CurPtr; 8712c6fd8c7ceea0392635ce21038d2b7fc215d9116Bill Wendling 8728e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner if (CurPtr[0] == 'e' || CurPtr[0] == 'E') { 87387d0b9ed1462705dd9bf1cb7f67d0bf03af776c8Guy Benyei if (isdigit(static_cast<unsigned char>(CurPtr[1])) || 87487d0b9ed1462705dd9bf1cb7f67d0bf03af776c8Guy Benyei ((CurPtr[1] == '-' || CurPtr[1] == '+') && 87587d0b9ed1462705dd9bf1cb7f67d0bf03af776c8Guy Benyei isdigit(static_cast<unsigned char>(CurPtr[2])))) { 8768e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner CurPtr += 2; 87787d0b9ed1462705dd9bf1cb7f67d0bf03af776c8Guy Benyei while (isdigit(static_cast<unsigned char>(CurPtr[0]))) ++CurPtr; 8788e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner } 8798e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner } 8802c6fd8c7ceea0392635ce21038d2b7fc215d9116Bill Wendling 8812402123413080aee8e9418e4f08b8613ef5cc360Nick Lewycky APFloatVal = APFloat(std::atof(TokStart)); 882df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner return lltok::APFloat; 8838e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner} 884