LCOV - code coverage report
Current view: top level - lib/AsmParser - LLLexer.cpp (source / functions) Hit Total Coverage
Test: llvm-toolchain.info Lines: 379 412 92.0 %
Date: 2018-10-20 13:21:21 Functions: 26 27 96.3 %
Legend: Lines: hit not hit

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

Generated by: LCOV version 1.13