1cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar//===- MILexer.cpp - Machine instructions lexer implementation ----------===// 2cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar// 3cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar// The LLVM Compiler Infrastructure 4cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar// 5cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar// This file is distributed under the University of Illinois Open Source 6cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar// License. See LICENSE.TXT for details. 7cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar// 8cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar//===----------------------------------------------------------------------===// 9cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar// 10cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar// This file implements the lexing of machine instructions. 11cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar// 12cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar//===----------------------------------------------------------------------===// 13cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar 14cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar#include "MILexer.h" 15cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar#include "llvm/ADT/StringExtras.h" 16cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar#include "llvm/ADT/StringSwitch.h" 17cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar#include "llvm/ADT/Twine.h" 18cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar#include <cctype> 19cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar 20cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainarusing namespace llvm; 21cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar 22cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainarnamespace { 23cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar 24cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar/// This class provides a way to iterate and get characters from the source 25cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar/// string. 26cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainarclass Cursor { 27cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar const char *Ptr; 28cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar const char *End; 29cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar 30cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainarpublic: 31cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar Cursor(NoneType) : Ptr(nullptr), End(nullptr) {} 32cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar 33cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar explicit Cursor(StringRef Str) { 34cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar Ptr = Str.data(); 35cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar End = Ptr + Str.size(); 36cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar } 37cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar 38cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar bool isEOF() const { return Ptr == End; } 39cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar 40cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar char peek(int I = 0) const { return End - Ptr <= I ? 0 : Ptr[I]; } 41cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar 42cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar void advance(unsigned I = 1) { Ptr += I; } 43cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar 44cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar StringRef remaining() const { return StringRef(Ptr, End - Ptr); } 45cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar 46cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar StringRef upto(Cursor C) const { 47cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar assert(C.Ptr >= Ptr && C.Ptr <= End); 48cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar return StringRef(Ptr, C.Ptr - Ptr); 49cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar } 50cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar 51cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar StringRef::iterator location() const { return Ptr; } 52cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar 53cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar operator bool() const { return Ptr != nullptr; } 54cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar}; 55cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar 56cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar} // end anonymous namespace 57cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar 58cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga NainarMIToken &MIToken::reset(TokenKind Kind, StringRef Range) { 59cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar this->Kind = Kind; 60cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar this->Range = Range; 61cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar return *this; 62cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar} 63cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar 64cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga NainarMIToken &MIToken::setStringValue(StringRef StrVal) { 65cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar StringValue = StrVal; 66cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar return *this; 67cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar} 68cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar 69cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga NainarMIToken &MIToken::setOwnedStringValue(std::string StrVal) { 70cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar StringValueStorage = std::move(StrVal); 71cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar StringValue = StringValueStorage; 72cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar return *this; 73cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar} 74cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar 75cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga NainarMIToken &MIToken::setIntegerValue(APSInt IntVal) { 76cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar this->IntVal = std::move(IntVal); 77cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar return *this; 78cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar} 79cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar 80cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar/// Skip the leading whitespace characters and return the updated cursor. 81cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainarstatic Cursor skipWhitespace(Cursor C) { 82cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar while (isblank(C.peek())) 83cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar C.advance(); 84cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar return C; 85cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar} 86cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar 87cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainarstatic bool isNewlineChar(char C) { return C == '\n' || C == '\r'; } 88cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar 89cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar/// Skip a line comment and return the updated cursor. 90cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainarstatic Cursor skipComment(Cursor C) { 91cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar if (C.peek() != ';') 92cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar return C; 93cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar while (!isNewlineChar(C.peek()) && !C.isEOF()) 94cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar C.advance(); 95cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar return C; 96cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar} 97cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar 98cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar/// Return true if the given character satisfies the following regular 99cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar/// expression: [-a-zA-Z$._0-9] 100cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainarstatic bool isIdentifierChar(char C) { 101cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar return isalpha(C) || isdigit(C) || C == '_' || C == '-' || C == '.' || 102cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar C == '$'; 103cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar} 104cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar 105cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar/// Unescapes the given string value. 106cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar/// 107cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar/// Expects the string value to be quoted. 108cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainarstatic std::string unescapeQuotedString(StringRef Value) { 109cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar assert(Value.front() == '"' && Value.back() == '"'); 110cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar Cursor C = Cursor(Value.substr(1, Value.size() - 2)); 111cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar 112cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar std::string Str; 113cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar Str.reserve(C.remaining().size()); 114cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar while (!C.isEOF()) { 115cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar char Char = C.peek(); 116cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar if (Char == '\\') { 117cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar if (C.peek(1) == '\\') { 118cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar // Two '\' become one 119cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar Str += '\\'; 120cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar C.advance(2); 121cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar continue; 122cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar } 123cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar if (isxdigit(C.peek(1)) && isxdigit(C.peek(2))) { 124cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar Str += hexDigitValue(C.peek(1)) * 16 + hexDigitValue(C.peek(2)); 125cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar C.advance(3); 126cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar continue; 127cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar } 128cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar } 129cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar Str += Char; 130cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar C.advance(); 131cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar } 132cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar return Str; 133cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar} 134cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar 135cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar/// Lex a string constant using the following regular expression: \"[^\"]*\" 136cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainarstatic Cursor lexStringConstant( 137cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar Cursor C, 138cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar function_ref<void(StringRef::iterator Loc, const Twine &)> ErrorCallback) { 139cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar assert(C.peek() == '"'); 140cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar for (C.advance(); C.peek() != '"'; C.advance()) { 141cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar if (C.isEOF() || isNewlineChar(C.peek())) { 142cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar ErrorCallback( 143cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar C.location(), 144cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar "end of machine instruction reached before the closing '\"'"); 145cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar return None; 146cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar } 147cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar } 148cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar C.advance(); 149cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar return C; 150cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar} 151cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar 152cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainarstatic Cursor lexName( 153cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar Cursor C, MIToken &Token, MIToken::TokenKind Type, unsigned PrefixLength, 154cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar function_ref<void(StringRef::iterator Loc, const Twine &)> ErrorCallback) { 155cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar auto Range = C; 156cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar C.advance(PrefixLength); 157cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar if (C.peek() == '"') { 158cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar if (Cursor R = lexStringConstant(C, ErrorCallback)) { 159cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar StringRef String = Range.upto(R); 160cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar Token.reset(Type, String) 161cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar .setOwnedStringValue( 162cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar unescapeQuotedString(String.drop_front(PrefixLength))); 163cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar return R; 164cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar } 165cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar Token.reset(MIToken::Error, Range.remaining()); 166cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar return Range; 167cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar } 168cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar while (isIdentifierChar(C.peek())) 169cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar C.advance(); 170cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar Token.reset(Type, Range.upto(C)) 171cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar .setStringValue(Range.upto(C).drop_front(PrefixLength)); 172cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar return C; 173cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar} 174cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar 175cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainarstatic Cursor maybeLexIntegerType(Cursor C, MIToken &Token) { 176cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar if (C.peek() != 'i' || !isdigit(C.peek(1))) 177cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar return None; 178cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar auto Range = C; 179cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar C.advance(); // Skip 'i' 180cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar while (isdigit(C.peek())) 181cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar C.advance(); 182cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar Token.reset(MIToken::IntegerType, Range.upto(C)); 183cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar return C; 184cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar} 185cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar 186cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainarstatic MIToken::TokenKind getIdentifierKind(StringRef Identifier) { 187cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar return StringSwitch<MIToken::TokenKind>(Identifier) 188cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar .Case("_", MIToken::underscore) 189cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar .Case("implicit", MIToken::kw_implicit) 190cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar .Case("implicit-def", MIToken::kw_implicit_define) 191cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar .Case("def", MIToken::kw_def) 192cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar .Case("dead", MIToken::kw_dead) 193cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar .Case("killed", MIToken::kw_killed) 194cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar .Case("undef", MIToken::kw_undef) 195cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar .Case("internal", MIToken::kw_internal) 196cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar .Case("early-clobber", MIToken::kw_early_clobber) 197cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar .Case("debug-use", MIToken::kw_debug_use) 198cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar .Case("tied-def", MIToken::kw_tied_def) 199cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar .Case("frame-setup", MIToken::kw_frame_setup) 200cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar .Case("debug-location", MIToken::kw_debug_location) 201cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar .Case(".cfi_same_value", MIToken::kw_cfi_same_value) 202cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar .Case(".cfi_offset", MIToken::kw_cfi_offset) 203cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar .Case(".cfi_def_cfa_register", MIToken::kw_cfi_def_cfa_register) 204cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar .Case(".cfi_def_cfa_offset", MIToken::kw_cfi_def_cfa_offset) 205cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar .Case(".cfi_def_cfa", MIToken::kw_cfi_def_cfa) 206cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar .Case("blockaddress", MIToken::kw_blockaddress) 207cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar .Case("target-index", MIToken::kw_target_index) 208cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar .Case("half", MIToken::kw_half) 209cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar .Case("float", MIToken::kw_float) 210cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar .Case("double", MIToken::kw_double) 211cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar .Case("x86_fp80", MIToken::kw_x86_fp80) 212cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar .Case("fp128", MIToken::kw_fp128) 213cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar .Case("ppc_fp128", MIToken::kw_ppc_fp128) 214cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar .Case("target-flags", MIToken::kw_target_flags) 215cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar .Case("volatile", MIToken::kw_volatile) 216cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar .Case("non-temporal", MIToken::kw_non_temporal) 217cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar .Case("invariant", MIToken::kw_invariant) 218cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar .Case("align", MIToken::kw_align) 219cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar .Case("stack", MIToken::kw_stack) 220cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar .Case("got", MIToken::kw_got) 221cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar .Case("jump-table", MIToken::kw_jump_table) 222cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar .Case("constant-pool", MIToken::kw_constant_pool) 223cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar .Case("call-entry", MIToken::kw_call_entry) 224cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar .Case("liveout", MIToken::kw_liveout) 225cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar .Case("address-taken", MIToken::kw_address_taken) 226cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar .Case("landing-pad", MIToken::kw_landing_pad) 227cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar .Case("liveins", MIToken::kw_liveins) 228cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar .Case("successors", MIToken::kw_successors) 229cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar .Default(MIToken::Identifier); 230cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar} 231cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar 232cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainarstatic Cursor maybeLexIdentifier(Cursor C, MIToken &Token) { 233cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar if (!isalpha(C.peek()) && C.peek() != '_' && C.peek() != '.') 234cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar return None; 235cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar auto Range = C; 236cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar while (isIdentifierChar(C.peek())) 237cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar C.advance(); 238cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar auto Identifier = Range.upto(C); 239cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar Token.reset(getIdentifierKind(Identifier), Identifier) 240cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar .setStringValue(Identifier); 241cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar return C; 242cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar} 243cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar 244cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainarstatic Cursor maybeLexMachineBasicBlock( 245cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar Cursor C, MIToken &Token, 246cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar function_ref<void(StringRef::iterator Loc, const Twine &)> ErrorCallback) { 247cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar bool IsReference = C.remaining().startswith("%bb."); 248cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar if (!IsReference && !C.remaining().startswith("bb.")) 249cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar return None; 250cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar auto Range = C; 251cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar unsigned PrefixLength = IsReference ? 4 : 3; 252cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar C.advance(PrefixLength); // Skip '%bb.' or 'bb.' 253cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar if (!isdigit(C.peek())) { 254cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar Token.reset(MIToken::Error, C.remaining()); 255cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar ErrorCallback(C.location(), "expected a number after '%bb.'"); 256cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar return C; 257cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar } 258cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar auto NumberRange = C; 259cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar while (isdigit(C.peek())) 260cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar C.advance(); 261cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar StringRef Number = NumberRange.upto(C); 262cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar unsigned StringOffset = PrefixLength + Number.size(); // Drop '%bb.<id>' 263cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar if (C.peek() == '.') { 264cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar C.advance(); // Skip '.' 265cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar ++StringOffset; 266cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar while (isIdentifierChar(C.peek())) 267cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar C.advance(); 268cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar } 269cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar Token.reset(IsReference ? MIToken::MachineBasicBlock 270cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar : MIToken::MachineBasicBlockLabel, 271cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar Range.upto(C)) 272cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar .setIntegerValue(APSInt(Number)) 273cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar .setStringValue(Range.upto(C).drop_front(StringOffset)); 274cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar return C; 275cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar} 276cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar 277cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainarstatic Cursor maybeLexIndex(Cursor C, MIToken &Token, StringRef Rule, 278cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar MIToken::TokenKind Kind) { 279cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar if (!C.remaining().startswith(Rule) || !isdigit(C.peek(Rule.size()))) 280cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar return None; 281cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar auto Range = C; 282cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar C.advance(Rule.size()); 283cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar auto NumberRange = C; 284cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar while (isdigit(C.peek())) 285cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar C.advance(); 286cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar Token.reset(Kind, Range.upto(C)).setIntegerValue(APSInt(NumberRange.upto(C))); 287cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar return C; 288cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar} 289cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar 290cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainarstatic Cursor maybeLexIndexAndName(Cursor C, MIToken &Token, StringRef Rule, 291cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar MIToken::TokenKind Kind) { 292cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar if (!C.remaining().startswith(Rule) || !isdigit(C.peek(Rule.size()))) 293cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar return None; 294cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar auto Range = C; 295cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar C.advance(Rule.size()); 296cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar auto NumberRange = C; 297cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar while (isdigit(C.peek())) 298cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar C.advance(); 299cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar StringRef Number = NumberRange.upto(C); 300cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar unsigned StringOffset = Rule.size() + Number.size(); 301cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar if (C.peek() == '.') { 302cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar C.advance(); 303cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar ++StringOffset; 304cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar while (isIdentifierChar(C.peek())) 305cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar C.advance(); 306cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar } 307cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar Token.reset(Kind, Range.upto(C)) 308cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar .setIntegerValue(APSInt(Number)) 309cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar .setStringValue(Range.upto(C).drop_front(StringOffset)); 310cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar return C; 311cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar} 312cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar 313cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainarstatic Cursor maybeLexJumpTableIndex(Cursor C, MIToken &Token) { 314cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar return maybeLexIndex(C, Token, "%jump-table.", MIToken::JumpTableIndex); 315cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar} 316cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar 317cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainarstatic Cursor maybeLexStackObject(Cursor C, MIToken &Token) { 318cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar return maybeLexIndexAndName(C, Token, "%stack.", MIToken::StackObject); 319cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar} 320cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar 321cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainarstatic Cursor maybeLexFixedStackObject(Cursor C, MIToken &Token) { 322cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar return maybeLexIndex(C, Token, "%fixed-stack.", MIToken::FixedStackObject); 323cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar} 324cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar 325cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainarstatic Cursor maybeLexConstantPoolItem(Cursor C, MIToken &Token) { 326cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar return maybeLexIndex(C, Token, "%const.", MIToken::ConstantPoolItem); 327cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar} 328cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar 329cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainarstatic Cursor maybeLexIRBlock( 330cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar Cursor C, MIToken &Token, 331cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar function_ref<void(StringRef::iterator Loc, const Twine &)> ErrorCallback) { 332cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar const StringRef Rule = "%ir-block."; 333cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar if (!C.remaining().startswith(Rule)) 334cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar return None; 335cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar if (isdigit(C.peek(Rule.size()))) 336cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar return maybeLexIndex(C, Token, Rule, MIToken::IRBlock); 337cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar return lexName(C, Token, MIToken::NamedIRBlock, Rule.size(), ErrorCallback); 338cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar} 339cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar 340cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainarstatic Cursor maybeLexIRValue( 341cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar Cursor C, MIToken &Token, 342cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar function_ref<void(StringRef::iterator Loc, const Twine &)> ErrorCallback) { 343cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar const StringRef Rule = "%ir."; 344cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar if (!C.remaining().startswith(Rule)) 345cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar return None; 346cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar if (isdigit(C.peek(Rule.size()))) 347cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar return maybeLexIndex(C, Token, Rule, MIToken::IRValue); 348cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar return lexName(C, Token, MIToken::NamedIRValue, Rule.size(), ErrorCallback); 349cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar} 350cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar 351cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainarstatic Cursor lexVirtualRegister(Cursor C, MIToken &Token) { 352cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar auto Range = C; 353cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar C.advance(); // Skip '%' 354cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar auto NumberRange = C; 355cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar while (isdigit(C.peek())) 356cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar C.advance(); 357cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar Token.reset(MIToken::VirtualRegister, Range.upto(C)) 358cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar .setIntegerValue(APSInt(NumberRange.upto(C))); 359cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar return C; 360cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar} 361cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar 362cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainarstatic Cursor maybeLexRegister(Cursor C, MIToken &Token) { 363cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar if (C.peek() != '%') 364cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar return None; 365cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar if (isdigit(C.peek(1))) 366cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar return lexVirtualRegister(C, Token); 367cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar auto Range = C; 368cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar C.advance(); // Skip '%' 369cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar while (isIdentifierChar(C.peek())) 370cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar C.advance(); 371cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar Token.reset(MIToken::NamedRegister, Range.upto(C)) 372cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar .setStringValue(Range.upto(C).drop_front(1)); // Drop the '%' 373cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar return C; 374cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar} 375cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar 376cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainarstatic Cursor maybeLexGlobalValue( 377cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar Cursor C, MIToken &Token, 378cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar function_ref<void(StringRef::iterator Loc, const Twine &)> ErrorCallback) { 379cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar if (C.peek() != '@') 380cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar return None; 381cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar if (!isdigit(C.peek(1))) 382cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar return lexName(C, Token, MIToken::NamedGlobalValue, /*PrefixLength=*/1, 383cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar ErrorCallback); 384cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar auto Range = C; 385cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar C.advance(1); // Skip the '@' 386cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar auto NumberRange = C; 387cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar while (isdigit(C.peek())) 388cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar C.advance(); 389cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar Token.reset(MIToken::GlobalValue, Range.upto(C)) 390cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar .setIntegerValue(APSInt(NumberRange.upto(C))); 391cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar return C; 392cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar} 393cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar 394cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainarstatic Cursor maybeLexExternalSymbol( 395cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar Cursor C, MIToken &Token, 396cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar function_ref<void(StringRef::iterator Loc, const Twine &)> ErrorCallback) { 397cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar if (C.peek() != '$') 398cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar return None; 399cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar return lexName(C, Token, MIToken::ExternalSymbol, /*PrefixLength=*/1, 400cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar ErrorCallback); 401cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar} 402cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar 403cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainarstatic bool isValidHexFloatingPointPrefix(char C) { 404cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar return C == 'H' || C == 'K' || C == 'L' || C == 'M'; 405cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar} 406cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar 407cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainarstatic Cursor maybeLexHexFloatingPointLiteral(Cursor C, MIToken &Token) { 408cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar if (C.peek() != '0' || C.peek(1) != 'x') 409cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar return None; 410cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar Cursor Range = C; 411cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar C.advance(2); // Skip '0x' 412cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar if (isValidHexFloatingPointPrefix(C.peek())) 413cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar C.advance(); 414cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar while (isxdigit(C.peek())) 415cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar C.advance(); 416cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar Token.reset(MIToken::FloatingPointLiteral, Range.upto(C)); 417cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar return C; 418cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar} 419cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar 420cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainarstatic Cursor lexFloatingPointLiteral(Cursor Range, Cursor C, MIToken &Token) { 421cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar C.advance(); 422cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar // Skip over [0-9]*([eE][-+]?[0-9]+)? 423cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar while (isdigit(C.peek())) 424cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar C.advance(); 425cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar if ((C.peek() == 'e' || C.peek() == 'E') && 426cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar (isdigit(C.peek(1)) || 427cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar ((C.peek(1) == '-' || C.peek(1) == '+') && isdigit(C.peek(2))))) { 428cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar C.advance(2); 429cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar while (isdigit(C.peek())) 430cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar C.advance(); 431cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar } 432cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar Token.reset(MIToken::FloatingPointLiteral, Range.upto(C)); 433cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar return C; 434cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar} 435cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar 436cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainarstatic Cursor maybeLexNumericalLiteral(Cursor C, MIToken &Token) { 437cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar if (!isdigit(C.peek()) && (C.peek() != '-' || !isdigit(C.peek(1)))) 438cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar return None; 439cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar auto Range = C; 440cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar C.advance(); 441cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar while (isdigit(C.peek())) 442cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar C.advance(); 443cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar if (C.peek() == '.') 444cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar return lexFloatingPointLiteral(Range, C, Token); 445cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar StringRef StrVal = Range.upto(C); 446cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar Token.reset(MIToken::IntegerLiteral, StrVal).setIntegerValue(APSInt(StrVal)); 447cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar return C; 448cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar} 449cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar 450cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainarstatic MIToken::TokenKind getMetadataKeywordKind(StringRef Identifier) { 451cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar return StringSwitch<MIToken::TokenKind>(Identifier) 452cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar .Case("!tbaa", MIToken::md_tbaa) 453cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar .Case("!alias.scope", MIToken::md_alias_scope) 454cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar .Case("!noalias", MIToken::md_noalias) 455cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar .Case("!range", MIToken::md_range) 456cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar .Default(MIToken::Error); 457cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar} 458cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar 459cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainarstatic Cursor maybeLexExlaim( 460cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar Cursor C, MIToken &Token, 461cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar function_ref<void(StringRef::iterator Loc, const Twine &)> ErrorCallback) { 462cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar if (C.peek() != '!') 463cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar return None; 464cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar auto Range = C; 465cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar C.advance(1); 466cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar if (isdigit(C.peek()) || !isIdentifierChar(C.peek())) { 467cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar Token.reset(MIToken::exclaim, Range.upto(C)); 468cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar return C; 469cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar } 470cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar while (isIdentifierChar(C.peek())) 471cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar C.advance(); 472cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar StringRef StrVal = Range.upto(C); 473cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar Token.reset(getMetadataKeywordKind(StrVal), StrVal); 474cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar if (Token.isError()) 475cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar ErrorCallback(Token.location(), 476cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar "use of unknown metadata keyword '" + StrVal + "'"); 477cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar return C; 478cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar} 479cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar 480cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainarstatic MIToken::TokenKind symbolToken(char C) { 481cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar switch (C) { 482cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar case ',': 483cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar return MIToken::comma; 484cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar case '=': 485cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar return MIToken::equal; 486cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar case ':': 487cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar return MIToken::colon; 488cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar case '(': 489cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar return MIToken::lparen; 490cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar case ')': 491cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar return MIToken::rparen; 492cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar case '{': 493cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar return MIToken::lbrace; 494cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar case '}': 495cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar return MIToken::rbrace; 496cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar case '+': 497cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar return MIToken::plus; 498cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar case '-': 499cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar return MIToken::minus; 500cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar default: 501cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar return MIToken::Error; 502cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar } 503cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar} 504cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar 505cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainarstatic Cursor maybeLexSymbol(Cursor C, MIToken &Token) { 506cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar MIToken::TokenKind Kind; 507cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar unsigned Length = 1; 508cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar if (C.peek() == ':' && C.peek(1) == ':') { 509cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar Kind = MIToken::coloncolon; 510cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar Length = 2; 511cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar } else 512cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar Kind = symbolToken(C.peek()); 513cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar if (Kind == MIToken::Error) 514cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar return None; 515cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar auto Range = C; 516cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar C.advance(Length); 517cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar Token.reset(Kind, Range.upto(C)); 518cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar return C; 519cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar} 520cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar 521cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainarstatic Cursor maybeLexNewline(Cursor C, MIToken &Token) { 522cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar if (!isNewlineChar(C.peek())) 523cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar return None; 524cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar auto Range = C; 525cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar C.advance(); 526cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar Token.reset(MIToken::Newline, Range.upto(C)); 527cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar return C; 528cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar} 529cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar 530cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainarstatic Cursor maybeLexEscapedIRValue( 531cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar Cursor C, MIToken &Token, 532cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar function_ref<void(StringRef::iterator Loc, const Twine &)> ErrorCallback) { 533cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar if (C.peek() != '`') 534cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar return None; 535cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar auto Range = C; 536cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar C.advance(); 537cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar auto StrRange = C; 538cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar while (C.peek() != '`') { 539cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar if (C.isEOF() || isNewlineChar(C.peek())) { 540cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar ErrorCallback( 541cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar C.location(), 542cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar "end of machine instruction reached before the closing '`'"); 543cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar Token.reset(MIToken::Error, Range.remaining()); 544cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar return C; 545cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar } 546cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar C.advance(); 547cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar } 548cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar StringRef Value = StrRange.upto(C); 549cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar C.advance(); 550cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar Token.reset(MIToken::QuotedIRValue, Range.upto(C)).setStringValue(Value); 551cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar return C; 552cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar} 553cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar 554cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga NainarStringRef llvm::lexMIToken( 555cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar StringRef Source, MIToken &Token, 556cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar function_ref<void(StringRef::iterator Loc, const Twine &)> ErrorCallback) { 557cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar auto C = skipComment(skipWhitespace(Cursor(Source))); 558cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar if (C.isEOF()) { 559cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar Token.reset(MIToken::Eof, C.remaining()); 560cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar return C.remaining(); 561cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar } 562cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar 563cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar if (Cursor R = maybeLexIntegerType(C, Token)) 564cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar return R.remaining(); 565cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar if (Cursor R = maybeLexMachineBasicBlock(C, Token, ErrorCallback)) 566cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar return R.remaining(); 567cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar if (Cursor R = maybeLexIdentifier(C, Token)) 568cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar return R.remaining(); 569cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar if (Cursor R = maybeLexJumpTableIndex(C, Token)) 570cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar return R.remaining(); 571cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar if (Cursor R = maybeLexStackObject(C, Token)) 572cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar return R.remaining(); 573cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar if (Cursor R = maybeLexFixedStackObject(C, Token)) 574cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar return R.remaining(); 575cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar if (Cursor R = maybeLexConstantPoolItem(C, Token)) 576cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar return R.remaining(); 577cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar if (Cursor R = maybeLexIRBlock(C, Token, ErrorCallback)) 578cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar return R.remaining(); 579cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar if (Cursor R = maybeLexIRValue(C, Token, ErrorCallback)) 580cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar return R.remaining(); 581cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar if (Cursor R = maybeLexRegister(C, Token)) 582cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar return R.remaining(); 583cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar if (Cursor R = maybeLexGlobalValue(C, Token, ErrorCallback)) 584cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar return R.remaining(); 585cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar if (Cursor R = maybeLexExternalSymbol(C, Token, ErrorCallback)) 586cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar return R.remaining(); 587cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar if (Cursor R = maybeLexHexFloatingPointLiteral(C, Token)) 588cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar return R.remaining(); 589cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar if (Cursor R = maybeLexNumericalLiteral(C, Token)) 590cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar return R.remaining(); 591cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar if (Cursor R = maybeLexExlaim(C, Token, ErrorCallback)) 592cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar return R.remaining(); 593cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar if (Cursor R = maybeLexSymbol(C, Token)) 594cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar return R.remaining(); 595cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar if (Cursor R = maybeLexNewline(C, Token)) 596cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar return R.remaining(); 597cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar if (Cursor R = maybeLexEscapedIRValue(C, Token, ErrorCallback)) 598cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar return R.remaining(); 599cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar 600cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar Token.reset(MIToken::Error, C.remaining()); 601cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar ErrorCallback(C.location(), 602cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar Twine("unexpected character '") + Twine(C.peek()) + "'"); 603cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar return C.remaining(); 604cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar} 605