LLLexer.cpp revision ab21db79ef1d2530880ad11f21f0b87ffca02dd4
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" 15df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner#include "llvm/DerivedTypes.h" 16df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner#include "llvm/Instruction.h" 17ff6c91efcf62d1cb99343fdcb2de6271520a1981Owen Anderson#include "llvm/LLVMContext.h" 18c25e7581b9b8088910da31702d4ca21c4734c6d7Torok Edwin#include "llvm/Support/ErrorHandling.h" 198e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner#include "llvm/Support/MemoryBuffer.h" 20d185f64f828ce1f8b476807a4a1345c0c53d8213Chris Lattner#include "llvm/Support/MathExtras.h" 2192bcb426c3e4503c99324afd4ed0a73521711a56Chris Lattner#include "llvm/Support/SourceMgr.h" 22df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner#include "llvm/Support/raw_ostream.h" 23df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner#include "llvm/Assembly/Parser.h" 24bcef7df6ec9aba7c5009a4d33944f80227563665Duncan Sands#include <cstdio> 25a896176973d59d8e22514b363d31e8d1becf185eChris Lattner#include <cstdlib> 265679d18c54ef46170e46f51bf471bb334f2b6525Misha Brukman#include <cstring> 278e3a8e0452695643d04c21e15c94b802aef81baeChris Lattnerusing namespace llvm; 288e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner 29df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattnerbool LLLexer::Error(LocTy ErrorLoc, const std::string &Msg) const { 30eeb4a84ac8d91fb1d5a7c484a1c7047409faee30Chris Lattner ErrorInfo = SM.GetMessage(ErrorLoc, Msg, "error"); 31df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner return true; 32df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner} 33df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner 348e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner//===----------------------------------------------------------------------===// 358e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner// Helper functions. 368e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner//===----------------------------------------------------------------------===// 378e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner 388e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner// atoull - Convert an ascii string of decimal digits into the unsigned long 398e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner// long representation... this does not have to do input error checking, 408e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner// because we know that the input will be matched by a suitable regex... 418e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner// 42df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattneruint64_t LLLexer::atoull(const char *Buffer, const char *End) { 438e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner uint64_t Result = 0; 448e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner for (; Buffer != End; Buffer++) { 458e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner uint64_t OldRes = Result; 468e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner Result *= 10; 478e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner Result += *Buffer-'0'; 488e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner if (Result < OldRes) { // Uh, oh, overflow detected!!! 49df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner Error("constant bigger than 64 bits detected!"); 508e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner return 0; 518e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner } 528e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner } 538e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner return Result; 548e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner} 558e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner 56df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattneruint64_t LLLexer::HexIntToVal(const char *Buffer, const char *End) { 578e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner uint64_t Result = 0; 588e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner for (; Buffer != End; ++Buffer) { 598e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner uint64_t OldRes = Result; 608e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner Result *= 16; 618e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner char C = *Buffer; 628e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner if (C >= '0' && C <= '9') 638e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner Result += C-'0'; 648e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner else if (C >= 'A' && C <= 'F') 658e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner Result += C-'A'+10; 668e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner else if (C >= 'a' && C <= 'f') 678e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner Result += C-'a'+10; 682c6fd8c7ceea0392635ce21038d2b7fc215d9116Bill Wendling 698e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner if (Result < OldRes) { // Uh, oh, overflow detected!!! 70df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner Error("constant bigger than 64 bits detected!"); 718e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner return 0; 728e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner } 738e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner } 748e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner return Result; 758e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner} 768e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner 77df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattnervoid LLLexer::HexToIntPair(const char *Buffer, const char *End, 78df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner uint64_t Pair[2]) { 798e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner Pair[0] = 0; 808e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner for (int i=0; i<16; i++, Buffer++) { 818e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner assert(Buffer != End); 828e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner Pair[0] *= 16; 838e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner char C = *Buffer; 848e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner if (C >= '0' && C <= '9') 858e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner Pair[0] += C-'0'; 868e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner else if (C >= 'A' && C <= 'F') 878e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner Pair[0] += C-'A'+10; 888e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner else if (C >= 'a' && C <= 'f') 898e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner Pair[0] += C-'a'+10; 908e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner } 918e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner Pair[1] = 0; 928e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner for (int i=0; i<16 && Buffer != End; i++, Buffer++) { 938e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner Pair[1] *= 16; 948e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner char C = *Buffer; 958e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner if (C >= '0' && C <= '9') 968e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner Pair[1] += C-'0'; 978e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner else if (C >= 'A' && C <= 'F') 988e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner Pair[1] += C-'A'+10; 998e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner else if (C >= 'a' && C <= 'f') 1008e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner Pair[1] += C-'a'+10; 1018e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner } 102d343c6b70ec03b357d42e47ce7c00b3c3cb78efdChris Lattner if (Buffer != End) 103df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner Error("constant bigger than 128 bits detected!"); 1048e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner} 1058e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner 1061b25cb2416c46a6cebf2a6c52235e9fe46a10d11Dale Johannesen/// FP80HexToIntPair - translate an 80 bit FP80 number (20 hexits) into 1071b25cb2416c46a6cebf2a6c52235e9fe46a10d11Dale Johannesen/// { low64, high16 } as usual for an APInt. 1081b25cb2416c46a6cebf2a6c52235e9fe46a10d11Dale Johannesenvoid LLLexer::FP80HexToIntPair(const char *Buffer, const char *End, 1091b25cb2416c46a6cebf2a6c52235e9fe46a10d11Dale Johannesen uint64_t Pair[2]) { 1101b25cb2416c46a6cebf2a6c52235e9fe46a10d11Dale Johannesen Pair[1] = 0; 1111b25cb2416c46a6cebf2a6c52235e9fe46a10d11Dale Johannesen for (int i=0; i<4 && Buffer != End; i++, Buffer++) { 1121b25cb2416c46a6cebf2a6c52235e9fe46a10d11Dale Johannesen assert(Buffer != End); 1131b25cb2416c46a6cebf2a6c52235e9fe46a10d11Dale Johannesen Pair[1] *= 16; 1141b25cb2416c46a6cebf2a6c52235e9fe46a10d11Dale Johannesen char C = *Buffer; 1151b25cb2416c46a6cebf2a6c52235e9fe46a10d11Dale Johannesen if (C >= '0' && C <= '9') 1161b25cb2416c46a6cebf2a6c52235e9fe46a10d11Dale Johannesen Pair[1] += C-'0'; 1171b25cb2416c46a6cebf2a6c52235e9fe46a10d11Dale Johannesen else if (C >= 'A' && C <= 'F') 1181b25cb2416c46a6cebf2a6c52235e9fe46a10d11Dale Johannesen Pair[1] += C-'A'+10; 1191b25cb2416c46a6cebf2a6c52235e9fe46a10d11Dale Johannesen else if (C >= 'a' && C <= 'f') 1201b25cb2416c46a6cebf2a6c52235e9fe46a10d11Dale Johannesen Pair[1] += C-'a'+10; 1211b25cb2416c46a6cebf2a6c52235e9fe46a10d11Dale Johannesen } 1221b25cb2416c46a6cebf2a6c52235e9fe46a10d11Dale Johannesen Pair[0] = 0; 1231b25cb2416c46a6cebf2a6c52235e9fe46a10d11Dale Johannesen for (int i=0; i<16; i++, Buffer++) { 1241b25cb2416c46a6cebf2a6c52235e9fe46a10d11Dale Johannesen Pair[0] *= 16; 1251b25cb2416c46a6cebf2a6c52235e9fe46a10d11Dale Johannesen char C = *Buffer; 1261b25cb2416c46a6cebf2a6c52235e9fe46a10d11Dale Johannesen if (C >= '0' && C <= '9') 1271b25cb2416c46a6cebf2a6c52235e9fe46a10d11Dale Johannesen Pair[0] += C-'0'; 1281b25cb2416c46a6cebf2a6c52235e9fe46a10d11Dale Johannesen else if (C >= 'A' && C <= 'F') 1291b25cb2416c46a6cebf2a6c52235e9fe46a10d11Dale Johannesen Pair[0] += C-'A'+10; 1301b25cb2416c46a6cebf2a6c52235e9fe46a10d11Dale Johannesen else if (C >= 'a' && C <= 'f') 1311b25cb2416c46a6cebf2a6c52235e9fe46a10d11Dale Johannesen Pair[0] += C-'a'+10; 1321b25cb2416c46a6cebf2a6c52235e9fe46a10d11Dale Johannesen } 1331b25cb2416c46a6cebf2a6c52235e9fe46a10d11Dale Johannesen if (Buffer != End) 1341b25cb2416c46a6cebf2a6c52235e9fe46a10d11Dale Johannesen Error("constant bigger than 128 bits detected!"); 1351b25cb2416c46a6cebf2a6c52235e9fe46a10d11Dale Johannesen} 1361b25cb2416c46a6cebf2a6c52235e9fe46a10d11Dale Johannesen 1378e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner// UnEscapeLexed - Run through the specified buffer and change \xx codes to the 1388e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner// appropriate character. 1398e3a8e0452695643d04c21e15c94b802aef81baeChris Lattnerstatic void UnEscapeLexed(std::string &Str) { 1408e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner if (Str.empty()) return; 1412c6fd8c7ceea0392635ce21038d2b7fc215d9116Bill Wendling 1428e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner char *Buffer = &Str[0], *EndBuffer = Buffer+Str.size(); 1438e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner char *BOut = Buffer; 1448e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner for (char *BIn = Buffer; BIn != EndBuffer; ) { 1458e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner if (BIn[0] == '\\') { 1468e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner if (BIn < EndBuffer-1 && BIn[1] == '\\') { 1478e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner *BOut++ = '\\'; // Two \ becomes one 1488e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner BIn += 2; 1498e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner } else if (BIn < EndBuffer-2 && isxdigit(BIn[1]) && isxdigit(BIn[2])) { 1508e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner char Tmp = BIn[3]; BIn[3] = 0; // Terminate string 1518e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner *BOut = (char)strtol(BIn+1, 0, 16); // Convert to number 1528e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner BIn[3] = Tmp; // Restore character 1538e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner BIn += 3; // Skip over handled chars 1548e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner ++BOut; 1558e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner } else { 1568e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner *BOut++ = *BIn++; 1578e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner } 1588e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner } else { 1598e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner *BOut++ = *BIn++; 1608e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner } 1618e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner } 1628e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner Str.resize(BOut-Buffer); 1638e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner} 1648e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner 1658e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner/// isLabelChar - Return true for [-a-zA-Z$._0-9]. 1668e3a8e0452695643d04c21e15c94b802aef81baeChris Lattnerstatic bool isLabelChar(char C) { 1678e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner return isalnum(C) || C == '-' || C == '$' || C == '.' || C == '_'; 1688e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner} 1698e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner 1708e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner 1718e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner/// isLabelTail - Return true if this pointer points to a valid end of a label. 1728e3a8e0452695643d04c21e15c94b802aef81baeChris Lattnerstatic const char *isLabelTail(const char *CurPtr) { 1738e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner while (1) { 1748e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner if (CurPtr[0] == ':') return CurPtr+1; 1758e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner if (!isLabelChar(CurPtr[0])) return 0; 1768e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner ++CurPtr; 1778e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner } 1788e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner} 1798e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner 1808e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner 1818e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner 1828e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner//===----------------------------------------------------------------------===// 1838e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner// Lexer definition. 1848e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner//===----------------------------------------------------------------------===// 1858e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner 186ff6c91efcf62d1cb99343fdcb2de6271520a1981Owen AndersonLLLexer::LLLexer(MemoryBuffer *StartBuf, SourceMgr &sm, SMDiagnostic &Err, 187ff6c91efcf62d1cb99343fdcb2de6271520a1981Owen Anderson LLVMContext &C) 188ff6c91efcf62d1cb99343fdcb2de6271520a1981Owen Anderson : CurBuf(StartBuf), ErrorInfo(Err), SM(sm), Context(C), APFloatVal(0.0) { 1898e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner CurPtr = CurBuf->getBufferStart(); 1908e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner} 1918e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner 1928e3a8e0452695643d04c21e15c94b802aef81baeChris Lattnerstd::string LLLexer::getFilename() const { 1938e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner return CurBuf->getBufferIdentifier(); 1948e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner} 1958e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner 1968e3a8e0452695643d04c21e15c94b802aef81baeChris Lattnerint LLLexer::getNextChar() { 1978e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner char CurChar = *CurPtr++; 1988e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner switch (CurChar) { 1998e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner default: return (unsigned char)CurChar; 2008e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner case 0: 2018e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner // A nul character in the stream is either the end of the current buffer or 2028e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner // a random nul in the file. Disambiguate that here. 2038e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner if (CurPtr-1 != CurBuf->getBufferEnd()) 2048e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner return 0; // Just whitespace. 2052c6fd8c7ceea0392635ce21038d2b7fc215d9116Bill Wendling 2068e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner // Otherwise, return end of file. 2072c6fd8c7ceea0392635ce21038d2b7fc215d9116Bill Wendling --CurPtr; // Another call to lex will return EOF again. 2088e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner return EOF; 2092c6fd8c7ceea0392635ce21038d2b7fc215d9116Bill Wendling } 2108e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner} 2118e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner 2128e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner 213df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattnerlltok::Kind LLLexer::LexToken() { 2148e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner TokStart = CurPtr; 2152c6fd8c7ceea0392635ce21038d2b7fc215d9116Bill Wendling 2168e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner int CurChar = getNextChar(); 2178e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner switch (CurChar) { 2188e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner default: 2198e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner // Handle letters: [a-zA-Z_] 2208e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner if (isalpha(CurChar) || CurChar == '_') 2218e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner return LexIdentifier(); 2222c6fd8c7ceea0392635ce21038d2b7fc215d9116Bill Wendling 223df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner return lltok::Error; 224df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner case EOF: return lltok::Eof; 2258e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner case 0: 2268e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner case ' ': 2278e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner case '\t': 2288e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner case '\n': 2298e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner case '\r': 2308e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner // Ignore whitespace. 2318e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner return LexToken(); 2328e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner case '+': return LexPositive(); 2338e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner case '@': return LexAt(); 2348e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner case '%': return LexPercent(); 2358e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner case '"': return LexQuote(); 2368e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner case '.': 2378e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner if (const char *Ptr = isLabelTail(CurPtr)) { 2388e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner CurPtr = Ptr; 239df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner StrVal.assign(TokStart, CurPtr-1); 240df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner return lltok::LabelStr; 2418e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner } 2428e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner if (CurPtr[0] == '.' && CurPtr[1] == '.') { 2438e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner CurPtr += 2; 244df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner return lltok::dotdotdot; 2458e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner } 246df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner return lltok::Error; 2478e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner case '$': 2488e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner if (const char *Ptr = isLabelTail(CurPtr)) { 2498e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner CurPtr = Ptr; 250df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner StrVal.assign(TokStart, CurPtr-1); 251df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner return lltok::LabelStr; 2528e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner } 253df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner return lltok::Error; 2548e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner case ';': 2558e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner SkipLineComment(); 2568e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner return LexToken(); 257eff2ab61b5d411fe64ba601d402b7c549644b590Devang Patel case '!': return LexMetadata(); 2588e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner case '0': case '1': case '2': case '3': case '4': 2598e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner case '5': case '6': case '7': case '8': case '9': 2602c6fd8c7ceea0392635ce21038d2b7fc215d9116Bill Wendling case '-': 2618e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner return LexDigitOrNegative(); 262df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner case '=': return lltok::equal; 263df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner case '[': return lltok::lsquare; 264df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner case ']': return lltok::rsquare; 265df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner case '{': return lltok::lbrace; 266df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner case '}': return lltok::rbrace; 267df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner case '<': return lltok::less; 268df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner case '>': return lltok::greater; 269df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner case '(': return lltok::lparen; 270df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner case ')': return lltok::rparen; 271df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner case ',': return lltok::comma; 272df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner case '*': return lltok::star; 273df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner case '\\': return lltok::backslash; 2748e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner } 2758e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner} 2768e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner 2778e3a8e0452695643d04c21e15c94b802aef81baeChris Lattnervoid LLLexer::SkipLineComment() { 2788e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner while (1) { 2798e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner if (CurPtr[0] == '\n' || CurPtr[0] == '\r' || getNextChar() == EOF) 2808e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner return; 2818e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner } 2828e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner} 2838e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner 2848e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner/// LexAt - Lex all tokens that start with an @ character: 285df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner/// GlobalVar @\"[^\"]*\" 286df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner/// GlobalVar @[-a-zA-Z$._][-a-zA-Z$._0-9]* 287df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner/// GlobalVarID @[0-9]+ 288df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattnerlltok::Kind LLLexer::LexAt() { 2898e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner // Handle AtStringConstant: @\"[^\"]*\" 2908e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner if (CurPtr[0] == '"') { 2918e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner ++CurPtr; 2922c6fd8c7ceea0392635ce21038d2b7fc215d9116Bill Wendling 2938e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner while (1) { 2948e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner int CurChar = getNextChar(); 2952c6fd8c7ceea0392635ce21038d2b7fc215d9116Bill Wendling 2962c6fd8c7ceea0392635ce21038d2b7fc215d9116Bill Wendling if (CurChar == EOF) { 297df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner Error("end of file in global variable name"); 298df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner return lltok::Error; 2998e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner } 3008e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner if (CurChar == '"') { 301df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner StrVal.assign(TokStart+2, CurPtr-1); 302df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner UnEscapeLexed(StrVal); 303df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner return lltok::GlobalVar; 3048e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner } 3058e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner } 3068e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner } 3072c6fd8c7ceea0392635ce21038d2b7fc215d9116Bill Wendling 3088e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner // Handle GlobalVarName: @[-a-zA-Z$._][-a-zA-Z$._0-9]* 3092c6fd8c7ceea0392635ce21038d2b7fc215d9116Bill Wendling if (isalpha(CurPtr[0]) || CurPtr[0] == '-' || CurPtr[0] == '$' || 3108e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner CurPtr[0] == '.' || CurPtr[0] == '_') { 3118e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner ++CurPtr; 3122c6fd8c7ceea0392635ce21038d2b7fc215d9116Bill Wendling while (isalnum(CurPtr[0]) || CurPtr[0] == '-' || CurPtr[0] == '$' || 3138e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner CurPtr[0] == '.' || CurPtr[0] == '_') 3148e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner ++CurPtr; 3158e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner 316df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner StrVal.assign(TokStart+1, CurPtr); // Skip @ 317df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner return lltok::GlobalVar; 3188e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner } 3192c6fd8c7ceea0392635ce21038d2b7fc215d9116Bill Wendling 3208e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner // Handle GlobalVarID: @[0-9]+ 3218e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner if (isdigit(CurPtr[0])) { 3222c6fd8c7ceea0392635ce21038d2b7fc215d9116Bill Wendling for (++CurPtr; isdigit(CurPtr[0]); ++CurPtr) 3232c6fd8c7ceea0392635ce21038d2b7fc215d9116Bill Wendling /*empty*/; 3242c6fd8c7ceea0392635ce21038d2b7fc215d9116Bill Wendling 3258e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner uint64_t Val = atoull(TokStart+1, CurPtr); 3268e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner if ((unsigned)Val != Val) 327df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner Error("invalid value number (too large)!"); 328df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner UIntVal = unsigned(Val); 329df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner return lltok::GlobalID; 3308e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner } 3312c6fd8c7ceea0392635ce21038d2b7fc215d9116Bill Wendling 332df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner return lltok::Error; 3338e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner} 3348e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner 3358e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner 3368e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner/// LexPercent - Lex all tokens that start with a % character: 337df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner/// LocalVar ::= %\"[^\"]*\" 338df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner/// LocalVar ::= %[-a-zA-Z$._][-a-zA-Z$._0-9]* 339df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner/// LocalVarID ::= %[0-9]+ 340df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattnerlltok::Kind LLLexer::LexPercent() { 341df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner // Handle LocalVarName: %\"[^\"]*\" 3428e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner if (CurPtr[0] == '"') { 3438e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner ++CurPtr; 3442c6fd8c7ceea0392635ce21038d2b7fc215d9116Bill Wendling 3458e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner while (1) { 3468e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner int CurChar = getNextChar(); 3472c6fd8c7ceea0392635ce21038d2b7fc215d9116Bill Wendling 3482c6fd8c7ceea0392635ce21038d2b7fc215d9116Bill Wendling if (CurChar == EOF) { 349df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner Error("end of file in string constant"); 350df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner return lltok::Error; 3518e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner } 3528e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner if (CurChar == '"') { 353df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner StrVal.assign(TokStart+2, CurPtr-1); 354df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner UnEscapeLexed(StrVal); 355df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner return lltok::LocalVar; 3568e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner } 3578e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner } 3588e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner } 3592c6fd8c7ceea0392635ce21038d2b7fc215d9116Bill Wendling 3608e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner // Handle LocalVarName: %[-a-zA-Z$._][-a-zA-Z$._0-9]* 3612c6fd8c7ceea0392635ce21038d2b7fc215d9116Bill Wendling if (isalpha(CurPtr[0]) || CurPtr[0] == '-' || CurPtr[0] == '$' || 3628e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner CurPtr[0] == '.' || CurPtr[0] == '_') { 3638e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner ++CurPtr; 3642c6fd8c7ceea0392635ce21038d2b7fc215d9116Bill Wendling while (isalnum(CurPtr[0]) || CurPtr[0] == '-' || CurPtr[0] == '$' || 3658e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner CurPtr[0] == '.' || CurPtr[0] == '_') 3668e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner ++CurPtr; 3672c6fd8c7ceea0392635ce21038d2b7fc215d9116Bill Wendling 368df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner StrVal.assign(TokStart+1, CurPtr); // Skip % 369df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner return lltok::LocalVar; 3708e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner } 3712c6fd8c7ceea0392635ce21038d2b7fc215d9116Bill Wendling 3728e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner // Handle LocalVarID: %[0-9]+ 3738e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner if (isdigit(CurPtr[0])) { 3742c6fd8c7ceea0392635ce21038d2b7fc215d9116Bill Wendling for (++CurPtr; isdigit(CurPtr[0]); ++CurPtr) 3752c6fd8c7ceea0392635ce21038d2b7fc215d9116Bill Wendling /*empty*/; 3762c6fd8c7ceea0392635ce21038d2b7fc215d9116Bill Wendling 3778e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner uint64_t Val = atoull(TokStart+1, CurPtr); 3788e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner if ((unsigned)Val != Val) 379df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner Error("invalid value number (too large)!"); 380df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner UIntVal = unsigned(Val); 381df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner return lltok::LocalVarID; 3828e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner } 3832c6fd8c7ceea0392635ce21038d2b7fc215d9116Bill Wendling 384df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner return lltok::Error; 3858e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner} 3868e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner 3878e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner/// LexQuote - Lex all tokens that start with a " character: 3888e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner/// QuoteLabel "[^"]+": 3898e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner/// StringConstant "[^"]*" 390df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattnerlltok::Kind LLLexer::LexQuote() { 3918e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner while (1) { 3928e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner int CurChar = getNextChar(); 3932c6fd8c7ceea0392635ce21038d2b7fc215d9116Bill Wendling 3942c6fd8c7ceea0392635ce21038d2b7fc215d9116Bill Wendling if (CurChar == EOF) { 395df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner Error("end of file in quoted string"); 396df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner return lltok::Error; 3978e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner } 3982c6fd8c7ceea0392635ce21038d2b7fc215d9116Bill Wendling 3998e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner if (CurChar != '"') continue; 4008e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner 4018e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner if (CurPtr[0] != ':') { 402df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner StrVal.assign(TokStart+1, CurPtr-1); 403df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner UnEscapeLexed(StrVal); 404df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner return lltok::StringConstant; 4058e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner } 4062c6fd8c7ceea0392635ce21038d2b7fc215d9116Bill Wendling 4078e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner ++CurPtr; 408df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner StrVal.assign(TokStart+1, CurPtr-2); 409df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner UnEscapeLexed(StrVal); 410df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner return lltok::LabelStr; 4118e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner } 4128e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner} 4138e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner 4148e3a8e0452695643d04c21e15c94b802aef81baeChris Lattnerstatic bool JustWhitespaceNewLine(const char *&Ptr) { 4158e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner const char *ThisPtr = Ptr; 4168e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner while (*ThisPtr == ' ' || *ThisPtr == '\t') 4178e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner ++ThisPtr; 4188e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner if (*ThisPtr == '\n' || *ThisPtr == '\r') { 4198e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner Ptr = ThisPtr; 4208e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner return true; 4218e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner } 4228e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner return false; 4238e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner} 4248e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner 425eff2ab61b5d411fe64ba601d402b7c549644b590Devang Patel/// LexMetadata: 426eff2ab61b5d411fe64ba601d402b7c549644b590Devang Patel/// !{...} 427eff2ab61b5d411fe64ba601d402b7c549644b590Devang Patel/// !42 428eff2ab61b5d411fe64ba601d402b7c549644b590Devang Patel/// !foo 429eff2ab61b5d411fe64ba601d402b7c549644b590Devang Patellltok::Kind LLLexer::LexMetadata() { 430eff2ab61b5d411fe64ba601d402b7c549644b590Devang Patel if (isalpha(CurPtr[0])) { 431eff2ab61b5d411fe64ba601d402b7c549644b590Devang Patel ++CurPtr; 432eff2ab61b5d411fe64ba601d402b7c549644b590Devang Patel while (isalnum(CurPtr[0]) || CurPtr[0] == '-' || CurPtr[0] == '$' || 433eff2ab61b5d411fe64ba601d402b7c549644b590Devang Patel CurPtr[0] == '.' || CurPtr[0] == '_') 434eff2ab61b5d411fe64ba601d402b7c549644b590Devang Patel ++CurPtr; 4358e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner 436eff2ab61b5d411fe64ba601d402b7c549644b590Devang Patel StrVal.assign(TokStart+1, CurPtr); // Skip ! 4370475c9170e9621292a48c688c3976031be5650bbDevang Patel return lltok::NamedOrCustomMD; 438eff2ab61b5d411fe64ba601d402b7c549644b590Devang Patel } 439eff2ab61b5d411fe64ba601d402b7c549644b590Devang Patel return lltok::Metadata; 440eff2ab61b5d411fe64ba601d402b7c549644b590Devang Patel} 441eff2ab61b5d411fe64ba601d402b7c549644b590Devang Patel 4428e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner/// LexIdentifier: Handle several related productions: 4438e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner/// Label [-a-zA-Z$._0-9]+: 4448e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner/// IntegerType i[0-9]+ 4458e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner/// Keyword sdiv, float, ... 4468e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner/// HexIntConstant [us]0x[0-9A-Fa-f]+ 447df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattnerlltok::Kind LLLexer::LexIdentifier() { 4488e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner const char *StartChar = CurPtr; 4498e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner const char *IntEnd = CurPtr[-1] == 'i' ? 0 : StartChar; 4508e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner const char *KeywordEnd = 0; 4512c6fd8c7ceea0392635ce21038d2b7fc215d9116Bill Wendling 4528e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner for (; isLabelChar(*CurPtr); ++CurPtr) { 4538e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner // If we decide this is an integer, remember the end of the sequence. 4548e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner if (!IntEnd && !isdigit(*CurPtr)) IntEnd = CurPtr; 4558e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner if (!KeywordEnd && !isalnum(*CurPtr) && *CurPtr != '_') KeywordEnd = CurPtr; 4568e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner } 4572c6fd8c7ceea0392635ce21038d2b7fc215d9116Bill Wendling 4588e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner // If we stopped due to a colon, this really is a label. 4598e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner if (*CurPtr == ':') { 460df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner StrVal.assign(StartChar-1, CurPtr++); 461df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner return lltok::LabelStr; 4628e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner } 4632c6fd8c7ceea0392635ce21038d2b7fc215d9116Bill Wendling 4648e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner // Otherwise, this wasn't a label. If this was valid as an integer type, 4658e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner // return it. 4668e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner if (IntEnd == 0) IntEnd = CurPtr; 4678e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner if (IntEnd != StartChar) { 4688e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner CurPtr = IntEnd; 4698e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner uint64_t NumBits = atoull(StartChar, CurPtr); 4702c6fd8c7ceea0392635ce21038d2b7fc215d9116Bill Wendling if (NumBits < IntegerType::MIN_INT_BITS || 4718e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner NumBits > IntegerType::MAX_INT_BITS) { 472df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner Error("bitwidth for integer type out of range!"); 473df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner return lltok::Error; 4748e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner } 4751d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson TyVal = IntegerType::get(Context, NumBits); 476df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner return lltok::Type; 4778e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner } 4782c6fd8c7ceea0392635ce21038d2b7fc215d9116Bill Wendling 4798e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner // Otherwise, this was a letter sequence. See which keyword this is. 4808e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner if (KeywordEnd == 0) KeywordEnd = CurPtr; 4818e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner CurPtr = KeywordEnd; 4828e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner --StartChar; 4838e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner unsigned Len = CurPtr-StartChar; 484df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner#define KEYWORD(STR) \ 485df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner if (Len == strlen(#STR) && !memcmp(StartChar, #STR, strlen(#STR))) \ 486df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner return lltok::kw_##STR; 487df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner 488df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner KEYWORD(begin); KEYWORD(end); 489df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner KEYWORD(true); KEYWORD(false); 490df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner KEYWORD(declare); KEYWORD(define); 491df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner KEYWORD(global); KEYWORD(constant); 492df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner 493bb46f52027416598a662dc1c58f48d9d56b1a65bRafael Espindola KEYWORD(private); 4943d10a5a75794356a0a568ce283713adc3a963200Bill Wendling KEYWORD(linker_private); 495df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner KEYWORD(internal); 496266c7bbbbcc4b326dea82e577de1a415d6acc23eChris Lattner KEYWORD(available_externally); 497df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner KEYWORD(linkonce); 498667d4b8de6dea70195ff12ef39a4deebffa2f5c7Duncan Sands KEYWORD(linkonce_odr); 499df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner KEYWORD(weak); 500667d4b8de6dea70195ff12ef39a4deebffa2f5c7Duncan Sands KEYWORD(weak_odr); 501df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner KEYWORD(appending); 502df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner KEYWORD(dllimport); 503df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner KEYWORD(dllexport); 504df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner KEYWORD(common); 505df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner KEYWORD(default); 506df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner KEYWORD(hidden); 507df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner KEYWORD(protected); 508df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner KEYWORD(extern_weak); 509df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner KEYWORD(external); 510df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner KEYWORD(thread_local); 511df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner KEYWORD(zeroinitializer); 512df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner KEYWORD(undef); 513df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner KEYWORD(null); 514df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner KEYWORD(to); 515df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner KEYWORD(tail); 516df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner KEYWORD(target); 517df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner KEYWORD(triple); 518df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner KEYWORD(deplibs); 519df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner KEYWORD(datalayout); 520df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner KEYWORD(volatile); 52108d012eba490c4906ec773c39db9f2a18a78c997Dan Gohman KEYWORD(nuw); 52208d012eba490c4906ec773c39db9f2a18a78c997Dan Gohman KEYWORD(nsw); 5231224c386981f7948f298ed9ad444c40609570f2eDan Gohman KEYWORD(exact); 524dd8004dc73d091ccb3927dbbc3b41639a3738ae3Dan Gohman KEYWORD(inbounds); 525df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner KEYWORD(align); 526df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner KEYWORD(addrspace); 527df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner KEYWORD(section); 528df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner KEYWORD(alias); 529df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner KEYWORD(module); 530df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner KEYWORD(asm); 531df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner KEYWORD(sideeffect); 5328ba2d5befc05ca73d3bac8708819bbbe759e2cf9Dale Johannesen KEYWORD(alignstack); 533df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner KEYWORD(gc); 534df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner 535df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner KEYWORD(ccc); 536df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner KEYWORD(fastcc); 537df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner KEYWORD(coldcc); 538df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner KEYWORD(x86_stdcallcc); 539df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner KEYWORD(x86_fastcallcc); 540385f5a99ecc7fee48a7539bc63d3e1d3b5089c0dAnton Korobeynikov KEYWORD(arm_apcscc); 541385f5a99ecc7fee48a7539bc63d3e1d3b5089c0dAnton Korobeynikov KEYWORD(arm_aapcscc); 542385f5a99ecc7fee48a7539bc63d3e1d3b5089c0dAnton Korobeynikov KEYWORD(arm_aapcs_vfpcc); 543385f5a99ecc7fee48a7539bc63d3e1d3b5089c0dAnton Korobeynikov 544df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner KEYWORD(cc); 545df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner KEYWORD(c); 546df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner 547df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner KEYWORD(signext); 548df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner KEYWORD(zeroext); 549df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner KEYWORD(inreg); 550df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner KEYWORD(sret); 551df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner KEYWORD(nounwind); 552df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner KEYWORD(noreturn); 553df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner KEYWORD(noalias); 554df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner KEYWORD(nocapture); 555df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner KEYWORD(byval); 556df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner KEYWORD(nest); 557df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner KEYWORD(readnone); 558df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner KEYWORD(readonly); 559df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner 560de86d473fcc18fe769fa9edb075984880ef1a015Dale Johannesen KEYWORD(inlinehint); 561df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner KEYWORD(noinline); 562df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner KEYWORD(alwaysinline); 563df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner KEYWORD(optsize); 564df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner KEYWORD(ssp); 565df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner KEYWORD(sspreq); 566d18e31ae17390d9c6f6cf93d18badf962452031dDevang Patel KEYWORD(noredzone); 567578efa920abd218ba75a0fb3c9b8398f4c0a774bDevang Patel KEYWORD(noimplicitfloat); 568c5ec8a78ea898087ad361e5b755f74a76150e5fdAnton Korobeynikov KEYWORD(naked); 569df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner 570df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner KEYWORD(type); 571df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner KEYWORD(opaque); 572df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner 573df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner KEYWORD(eq); KEYWORD(ne); KEYWORD(slt); KEYWORD(sgt); KEYWORD(sle); 574df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner KEYWORD(sge); KEYWORD(ult); KEYWORD(ugt); KEYWORD(ule); KEYWORD(uge); 575df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner KEYWORD(oeq); KEYWORD(one); KEYWORD(olt); KEYWORD(ogt); KEYWORD(ole); 576df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner KEYWORD(oge); KEYWORD(ord); KEYWORD(uno); KEYWORD(ueq); KEYWORD(une); 5779ea4034e007a83c778cd306ea66481be1317a51bMisha Brukman 578df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner KEYWORD(x); 5798e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner#undef KEYWORD 5808e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner 5818e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner // Keywords for types. 582df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner#define TYPEKEYWORD(STR, LLVMTY) \ 5838e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner if (Len == strlen(STR) && !memcmp(StartChar, STR, strlen(STR))) { \ 584df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner TyVal = LLVMTY; return lltok::Type; } 5851d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson TYPEKEYWORD("void", Type::getVoidTy(Context)); 5861d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson TYPEKEYWORD("float", Type::getFloatTy(Context)); 5871d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson TYPEKEYWORD("double", Type::getDoubleTy(Context)); 5881d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson TYPEKEYWORD("x86_fp80", Type::getX86_FP80Ty(Context)); 5891d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson TYPEKEYWORD("fp128", Type::getFP128Ty(Context)); 5901d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson TYPEKEYWORD("ppc_fp128", Type::getPPC_FP128Ty(Context)); 5911d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson TYPEKEYWORD("label", Type::getLabelTy(Context)); 5921d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson TYPEKEYWORD("metadata", Type::getMetadataTy(Context)); 5938e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner#undef TYPEKEYWORD 5948e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner 5958e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner // Handle special forms for autoupgrading. Drop these in LLVM 3.0. This is 5968e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner // to avoid conflicting with the sext/zext instructions, below. 5978e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner if (Len == 4 && !memcmp(StartChar, "sext", 4)) { 5988e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner // Scan CurPtr ahead, seeing if there is just whitespace before the newline. 5998e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner if (JustWhitespaceNewLine(CurPtr)) 600df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner return lltok::kw_signext; 6018e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner } else if (Len == 4 && !memcmp(StartChar, "zext", 4)) { 6028e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner // Scan CurPtr ahead, seeing if there is just whitespace before the newline. 6038e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner if (JustWhitespaceNewLine(CurPtr)) 604df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner return lltok::kw_zeroext; 60513ad5aaaff8a446758b402fd5e9aea22f5bc5682Victor Hernandez } else if (Len == 6 && !memcmp(StartChar, "malloc", 6)) { 606cf4d2f11a1acc12a0f6b50991907e4a998ee9cddChris Lattner // FIXME: Remove in LLVM 3.0. 607cf4d2f11a1acc12a0f6b50991907e4a998ee9cddChris Lattner // Autoupgrade malloc instruction. 60813ad5aaaff8a446758b402fd5e9aea22f5bc5682Victor Hernandez return lltok::kw_malloc; 609046e78ce55a7c3d82b7b6758d2d77f2d99f970bfVictor Hernandez } else if (Len == 4 && !memcmp(StartChar, "free", 4)) { 610046e78ce55a7c3d82b7b6758d2d77f2d99f970bfVictor Hernandez // FIXME: Remove in LLVM 3.0. 611046e78ce55a7c3d82b7b6758d2d77f2d99f970bfVictor Hernandez // Autoupgrade malloc instruction. 612046e78ce55a7c3d82b7b6758d2d77f2d99f970bfVictor Hernandez return lltok::kw_free; 6138e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner } 6142c6fd8c7ceea0392635ce21038d2b7fc215d9116Bill Wendling 6158e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner // Keywords for instructions. 616df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner#define INSTKEYWORD(STR, Enum) \ 617df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner if (Len == strlen(#STR) && !memcmp(StartChar, #STR, strlen(#STR))) { \ 618df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner UIntVal = Instruction::Enum; return lltok::kw_##STR; } 619df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner 620ae3a0be92e33bc716722aa600983fc1535acb122Dan Gohman INSTKEYWORD(add, Add); INSTKEYWORD(fadd, FAdd); 621ae3a0be92e33bc716722aa600983fc1535acb122Dan Gohman INSTKEYWORD(sub, Sub); INSTKEYWORD(fsub, FSub); 622ae3a0be92e33bc716722aa600983fc1535acb122Dan Gohman INSTKEYWORD(mul, Mul); INSTKEYWORD(fmul, FMul); 623df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner INSTKEYWORD(udiv, UDiv); INSTKEYWORD(sdiv, SDiv); INSTKEYWORD(fdiv, FDiv); 624df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner INSTKEYWORD(urem, URem); INSTKEYWORD(srem, SRem); INSTKEYWORD(frem, FRem); 625df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner INSTKEYWORD(shl, Shl); INSTKEYWORD(lshr, LShr); INSTKEYWORD(ashr, AShr); 626df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner INSTKEYWORD(and, And); INSTKEYWORD(or, Or); INSTKEYWORD(xor, Xor); 627df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner INSTKEYWORD(icmp, ICmp); INSTKEYWORD(fcmp, FCmp); 628df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner 629df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner INSTKEYWORD(phi, PHI); 630df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner INSTKEYWORD(call, Call); 631df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner INSTKEYWORD(trunc, Trunc); 632df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner INSTKEYWORD(zext, ZExt); 633df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner INSTKEYWORD(sext, SExt); 634df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner INSTKEYWORD(fptrunc, FPTrunc); 635df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner INSTKEYWORD(fpext, FPExt); 636df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner INSTKEYWORD(uitofp, UIToFP); 637df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner INSTKEYWORD(sitofp, SIToFP); 638df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner INSTKEYWORD(fptoui, FPToUI); 639df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner INSTKEYWORD(fptosi, FPToSI); 640df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner INSTKEYWORD(inttoptr, IntToPtr); 641df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner INSTKEYWORD(ptrtoint, PtrToInt); 642df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner INSTKEYWORD(bitcast, BitCast); 643df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner INSTKEYWORD(select, Select); 644df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner INSTKEYWORD(va_arg, VAArg); 645df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner INSTKEYWORD(ret, Ret); 646df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner INSTKEYWORD(br, Br); 647df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner INSTKEYWORD(switch, Switch); 648ab21db79ef1d2530880ad11f21f0b87ffca02dd4Chris Lattner INSTKEYWORD(indirectbr, IndirectBr); 649df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner INSTKEYWORD(invoke, Invoke); 650df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner INSTKEYWORD(unwind, Unwind); 651df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner INSTKEYWORD(unreachable, Unreachable); 652df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner 653df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner INSTKEYWORD(alloca, Alloca); 654df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner INSTKEYWORD(load, Load); 655df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner INSTKEYWORD(store, Store); 656df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner INSTKEYWORD(getelementptr, GetElementPtr); 657df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner 658df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner INSTKEYWORD(extractelement, ExtractElement); 659df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner INSTKEYWORD(insertelement, InsertElement); 660df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner INSTKEYWORD(shufflevector, ShuffleVector); 661df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner INSTKEYWORD(getresult, ExtractValue); 662df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner INSTKEYWORD(extractvalue, ExtractValue); 663df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner INSTKEYWORD(insertvalue, InsertValue); 6642c6fd8c7ceea0392635ce21038d2b7fc215d9116Bill Wendling#undef INSTKEYWORD 6652c6fd8c7ceea0392635ce21038d2b7fc215d9116Bill Wendling 6668e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner // Check for [us]0x[0-9A-Fa-f]+ which are Hexadecimal constant generated by 6678e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner // the CFE to avoid forcing it to deal with 64-bit numbers. 6688e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner if ((TokStart[0] == 'u' || TokStart[0] == 's') && 6698e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner TokStart[1] == '0' && TokStart[2] == 'x' && isxdigit(TokStart[3])) { 6708e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner int len = CurPtr-TokStart-3; 6718e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner uint32_t bits = len * 4; 672689ad6ef3fd2e89394f1e8860dfebfe56b73c3daDaniel Dunbar APInt Tmp(bits, StringRef(TokStart+3, len), 16); 6738e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner uint32_t activeBits = Tmp.getActiveBits(); 6748e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner if (activeBits > 0 && activeBits < bits) 6758e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner Tmp.trunc(activeBits); 676df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner APSIntVal = APSInt(Tmp, TokStart[0] == 'u'); 677df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner return lltok::APSInt; 6788e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner } 6792c6fd8c7ceea0392635ce21038d2b7fc215d9116Bill Wendling 6804ce0df610879e82d9853c6a38a75b1883feaee06Chris Lattner // If this is "cc1234", return this as just "cc". 6818e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner if (TokStart[0] == 'c' && TokStart[1] == 'c') { 6828e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner CurPtr = TokStart+2; 683df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner return lltok::kw_cc; 6848e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner } 6852c6fd8c7ceea0392635ce21038d2b7fc215d9116Bill Wendling 6864ce0df610879e82d9853c6a38a75b1883feaee06Chris Lattner // If this starts with "call", return it as CALL. This is to support old 6874ce0df610879e82d9853c6a38a75b1883feaee06Chris Lattner // broken .ll files. FIXME: remove this with LLVM 3.0. 6884ce0df610879e82d9853c6a38a75b1883feaee06Chris Lattner if (CurPtr-TokStart > 4 && !memcmp(TokStart, "call", 4)) { 6894ce0df610879e82d9853c6a38a75b1883feaee06Chris Lattner CurPtr = TokStart+4; 690df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner UIntVal = Instruction::Call; 691df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner return lltok::kw_call; 6924ce0df610879e82d9853c6a38a75b1883feaee06Chris Lattner } 6932c6fd8c7ceea0392635ce21038d2b7fc215d9116Bill Wendling 694df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner // Finally, if this isn't known, return an error. 6958e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner CurPtr = TokStart+1; 696df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner return lltok::Error; 6978e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner} 6988e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner 6998e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner 7008e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner/// Lex0x: Handle productions that start with 0x, knowing that it matches and 7018e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner/// that this is not a label: 7028e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner/// HexFPConstant 0x[0-9A-Fa-f]+ 7038e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner/// HexFP80Constant 0xK[0-9A-Fa-f]+ 7048e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner/// HexFP128Constant 0xL[0-9A-Fa-f]+ 7058e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner/// HexPPC128Constant 0xM[0-9A-Fa-f]+ 706df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattnerlltok::Kind LLLexer::Lex0x() { 7078e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner CurPtr = TokStart + 2; 7082c6fd8c7ceea0392635ce21038d2b7fc215d9116Bill Wendling 7098e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner char Kind; 7108e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner if (CurPtr[0] >= 'K' && CurPtr[0] <= 'M') { 7118e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner Kind = *CurPtr++; 7128e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner } else { 7138e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner Kind = 'J'; 7148e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner } 7158e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner 7168e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner if (!isxdigit(CurPtr[0])) { 717df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner // Bad token, return it as an error. 7188e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner CurPtr = TokStart+1; 719df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner return lltok::Error; 7208e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner } 7212c6fd8c7ceea0392635ce21038d2b7fc215d9116Bill Wendling 7228e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner while (isxdigit(CurPtr[0])) 7238e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner ++CurPtr; 7242c6fd8c7ceea0392635ce21038d2b7fc215d9116Bill Wendling 7258e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner if (Kind == 'J') { 7268e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner // HexFPConstant - Floating point constant represented in IEEE format as a 7278e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner // hexadecimal number for when exponential notation is not precise enough. 7288e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner // Float and double only. 729df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner APFloatVal = APFloat(BitsToDouble(HexIntToVal(TokStart+2, CurPtr))); 730df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner return lltok::APFloat; 7318e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner } 7322c6fd8c7ceea0392635ce21038d2b7fc215d9116Bill Wendling 7338e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner uint64_t Pair[2]; 7348e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner switch (Kind) { 735c23197a26f34f559ea9797de51e187087c039c42Torok Edwin default: llvm_unreachable("Unknown kind!"); 7368e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner case 'K': 7378e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner // F80HexFPConstant - x87 long double in hexadecimal format (10 bytes) 7381b25cb2416c46a6cebf2a6c52235e9fe46a10d11Dale Johannesen FP80HexToIntPair(TokStart+3, CurPtr, Pair); 739df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner APFloatVal = APFloat(APInt(80, 2, Pair)); 740df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner return lltok::APFloat; 7418e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner case 'L': 7428e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner // F128HexFPConstant - IEEE 128-bit in hexadecimal format (16 bytes) 7431b25cb2416c46a6cebf2a6c52235e9fe46a10d11Dale Johannesen HexToIntPair(TokStart+3, CurPtr, Pair); 744df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner APFloatVal = APFloat(APInt(128, 2, Pair), true); 745df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner return lltok::APFloat; 7468e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner case 'M': 7478e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner // PPC128HexFPConstant - PowerPC 128-bit in hexadecimal format (16 bytes) 7481b25cb2416c46a6cebf2a6c52235e9fe46a10d11Dale Johannesen HexToIntPair(TokStart+3, CurPtr, Pair); 749df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner APFloatVal = APFloat(APInt(128, 2, Pair)); 750df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner return lltok::APFloat; 7518e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner } 7528e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner} 7538e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner 7548e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner/// LexIdentifier: Handle several related productions: 7558e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner/// Label [-a-zA-Z$._0-9]+: 7568e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner/// NInteger -[0-9]+ 7578e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner/// FPConstant [-+]?[0-9]+[.][0-9]*([eE][-+]?[0-9]+)? 7588e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner/// PInteger [0-9]+ 7598e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner/// HexFPConstant 0x[0-9A-Fa-f]+ 7608e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner/// HexFP80Constant 0xK[0-9A-Fa-f]+ 7618e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner/// HexFP128Constant 0xL[0-9A-Fa-f]+ 7628e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner/// HexPPC128Constant 0xM[0-9A-Fa-f]+ 763df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattnerlltok::Kind LLLexer::LexDigitOrNegative() { 7648e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner // If the letter after the negative is a number, this is probably a label. 7658e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner if (!isdigit(TokStart[0]) && !isdigit(CurPtr[0])) { 7668e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner // Okay, this is not a number after the -, it's probably a label. 7678e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner if (const char *End = isLabelTail(CurPtr)) { 768df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner StrVal.assign(TokStart, End-1); 7698e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner CurPtr = End; 770df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner return lltok::LabelStr; 7718e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner } 7722c6fd8c7ceea0392635ce21038d2b7fc215d9116Bill Wendling 773df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner return lltok::Error; 7748e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner } 7752c6fd8c7ceea0392635ce21038d2b7fc215d9116Bill Wendling 7768e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner // At this point, it is either a label, int or fp constant. 7772c6fd8c7ceea0392635ce21038d2b7fc215d9116Bill Wendling 7788e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner // Skip digits, we have at least one. 7792c6fd8c7ceea0392635ce21038d2b7fc215d9116Bill Wendling for (; isdigit(CurPtr[0]); ++CurPtr) 7802c6fd8c7ceea0392635ce21038d2b7fc215d9116Bill Wendling /*empty*/; 7812c6fd8c7ceea0392635ce21038d2b7fc215d9116Bill Wendling 7828e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner // Check to see if this really is a label afterall, e.g. "-1:". 7838e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner if (isLabelChar(CurPtr[0]) || CurPtr[0] == ':') { 7848e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner if (const char *End = isLabelTail(CurPtr)) { 785df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner StrVal.assign(TokStart, End-1); 7868e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner CurPtr = End; 787df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner return lltok::LabelStr; 7888e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner } 7898e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner } 7902c6fd8c7ceea0392635ce21038d2b7fc215d9116Bill Wendling 7918e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner // If the next character is a '.', then it is a fp value, otherwise its 7928e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner // integer. 7938e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner if (CurPtr[0] != '.') { 7948e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner if (TokStart[0] == '0' && TokStart[1] == 'x') 7958e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner return Lex0x(); 7968e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner unsigned Len = CurPtr-TokStart; 7978e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner uint32_t numBits = ((Len * 64) / 19) + 2; 798689ad6ef3fd2e89394f1e8860dfebfe56b73c3daDaniel Dunbar APInt Tmp(numBits, StringRef(TokStart, Len), 10); 7998e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner if (TokStart[0] == '-') { 8008e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner uint32_t minBits = Tmp.getMinSignedBits(); 8018e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner if (minBits > 0 && minBits < numBits) 8028e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner Tmp.trunc(minBits); 803df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner APSIntVal = APSInt(Tmp, false); 8048e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner } else { 8058e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner uint32_t activeBits = Tmp.getActiveBits(); 8068e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner if (activeBits > 0 && activeBits < numBits) 8078e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner Tmp.trunc(activeBits); 808df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner APSIntVal = APSInt(Tmp, true); 8098e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner } 810df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner return lltok::APSInt; 8118e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner } 8128e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner 8138e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner ++CurPtr; 8142c6fd8c7ceea0392635ce21038d2b7fc215d9116Bill Wendling 8158e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner // Skip over [0-9]*([eE][-+]?[0-9]+)? 8168e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner while (isdigit(CurPtr[0])) ++CurPtr; 8172c6fd8c7ceea0392635ce21038d2b7fc215d9116Bill Wendling 8188e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner if (CurPtr[0] == 'e' || CurPtr[0] == 'E') { 8192c6fd8c7ceea0392635ce21038d2b7fc215d9116Bill Wendling if (isdigit(CurPtr[1]) || 8208e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner ((CurPtr[1] == '-' || CurPtr[1] == '+') && isdigit(CurPtr[2]))) { 8218e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner CurPtr += 2; 8228e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner while (isdigit(CurPtr[0])) ++CurPtr; 8238e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner } 8248e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner } 8252c6fd8c7ceea0392635ce21038d2b7fc215d9116Bill Wendling 826df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner APFloatVal = APFloat(atof(TokStart)); 827df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner return lltok::APFloat; 8288e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner} 8298e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner 8308e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner/// FPConstant [-+]?[0-9]+[.][0-9]*([eE][-+]?[0-9]+)? 831df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattnerlltok::Kind LLLexer::LexPositive() { 8328e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner // If the letter after the negative is a number, this is probably not a 8338e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner // label. 8348e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner if (!isdigit(CurPtr[0])) 835df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner return lltok::Error; 8362c6fd8c7ceea0392635ce21038d2b7fc215d9116Bill Wendling 8378e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner // Skip digits. 8382c6fd8c7ceea0392635ce21038d2b7fc215d9116Bill Wendling for (++CurPtr; isdigit(CurPtr[0]); ++CurPtr) 8392c6fd8c7ceea0392635ce21038d2b7fc215d9116Bill Wendling /*empty*/; 8408e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner 8418e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner // At this point, we need a '.'. 8428e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner if (CurPtr[0] != '.') { 8438e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner CurPtr = TokStart+1; 844df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner return lltok::Error; 8458e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner } 8462c6fd8c7ceea0392635ce21038d2b7fc215d9116Bill Wendling 8478e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner ++CurPtr; 8482c6fd8c7ceea0392635ce21038d2b7fc215d9116Bill Wendling 8498e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner // Skip over [0-9]*([eE][-+]?[0-9]+)? 8508e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner while (isdigit(CurPtr[0])) ++CurPtr; 8512c6fd8c7ceea0392635ce21038d2b7fc215d9116Bill Wendling 8528e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner if (CurPtr[0] == 'e' || CurPtr[0] == 'E') { 8532c6fd8c7ceea0392635ce21038d2b7fc215d9116Bill Wendling if (isdigit(CurPtr[1]) || 8548e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner ((CurPtr[1] == '-' || CurPtr[1] == '+') && isdigit(CurPtr[2]))) { 8558e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner CurPtr += 2; 8568e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner while (isdigit(CurPtr[0])) ++CurPtr; 8578e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner } 8588e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner } 8592c6fd8c7ceea0392635ce21038d2b7fc215d9116Bill Wendling 860df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner APFloatVal = APFloat(atof(TokStart)); 861df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner return lltok::APFloat; 8628e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner} 863