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