31 const char *
Ptr =
nullptr;
32 const char *
End =
nullptr;
35 Cursor(std::nullopt_t) {}
42 bool isEOF()
const {
return Ptr ==
End; }
46 void advance(
unsigned I = 1) {
Ptr +=
I; }
51 assert(
C.Ptr >= Ptr &&
C.Ptr <= End);
57 operator bool()
const {
return Ptr !=
nullptr; }
74 StringValueStorage = std::move(StrVal);
75 StringValue = StringValueStorage;
80 this->IntVal = std::move(IntVal);
86 while (isblank(
C.peek()))
105 if (
C.peek() !=
'/' ||
C.peek(1) !=
'*')
108 while (
C.peek() !=
'*' ||
C.peek(1) !=
'/')
119 return isalpha(
C) || isdigit(
C) ||
C ==
'_' ||
C ==
'-' ||
C ==
'.' ||
128 Cursor
C = Cursor(
Value.substr(1,
Value.size() - 2));
131 Str.reserve(
C.remaining().size());
133 char Char =
C.peek();
135 if (
C.peek(1) ==
'\\') {
141 if (isxdigit(
C.peek(1)) && isxdigit(
C.peek(2))) {
142 Str += hexDigitValue(
C.peek(1)) * 16 + hexDigitValue(
C.peek(2));
156 for (
C.advance();
C.peek() !=
'"';
C.advance()) {
160 "end of machine instruction reached before the closing '\"'");
171 C.advance(PrefixLength);
172 if (
C.peek() ==
'"') {
240 .
Case(
"negate_ra_sign_state",
242 .
Case(
"negate_ra_sign_state_with_pc",
270 .
Case(
"inlineasm-br-indirect-target",
289 .
Case(
"machine-block-address-taken",
297 if (!isalpha(
C.peek()) &&
C.peek() !=
'_')
302 auto Identifier =
Range.upto(
C);
310 bool IsReference =
C.remaining().starts_with(
"%bb.");
311 if (!IsReference && !
C.remaining().starts_with(
"bb."))
314 unsigned PrefixLength = IsReference ? 4 : 3;
315 C.advance(PrefixLength);
316 if (!isdigit(
C.peek())) {
318 ErrorCallback(
C.location(),
"expected a number after '%bb.'");
321 auto NumberRange =
C;
322 while (isdigit(
C.peek()))
325 unsigned StringOffset = PrefixLength +
Number.size();
329 if (
C.peek() ==
'.') {
345 if (!
C.remaining().starts_with(Rule) || !isdigit(
C.peek(Rule.
size())))
348 C.advance(Rule.
size());
349 auto NumberRange =
C;
350 while (isdigit(
C.peek()))
358 if (!
C.remaining().starts_with(Rule) || !isdigit(
C.peek(Rule.
size())))
361 C.advance(Rule.
size());
362 auto NumberRange =
C;
363 while (isdigit(
C.peek()))
366 unsigned StringOffset = Rule.
size() +
Number.size();
367 if (
C.peek() ==
'.') {
398 if (!
C.remaining().starts_with(Rule))
407 if (!
C.remaining().starts_with(Rule))
409 if (isdigit(
C.peek(Rule.
size())))
417 if (!
C.remaining().starts_with(Rule))
419 if (isdigit(
C.peek(Rule.
size())))
435 auto NumberRange =
C;
436 while (isdigit(
C.peek()))
460 if (
C.peek() !=
'%' &&
C.peek() !=
'$')
463 if (
C.peek() ==
'%') {
464 if (isdigit(
C.peek(1)))
487 if (!isdigit(
C.peek(1)))
492 auto NumberRange =
C;
493 while (isdigit(
C.peek()))
511 if (!
C.remaining().starts_with(Rule))
514 C.advance(Rule.
size());
517 if (
C.peek() !=
'"') {
521 if (
C.peek() !=
'>') {
522 ErrorCallback(
C.location(),
523 "expected the '<mcsymbol ...' to be closed by a '>'");
536 ErrorCallback(
C.location(),
537 "unable to parse quoted string from opening quote");
542 if (R.peek() !=
'>') {
543 ErrorCallback(R.location(),
544 "expected the '<mcsymbol ...' to be closed by a '>'");
556 return C ==
'H' ||
C ==
'K' ||
C ==
'L' ||
C ==
'M' ||
C ==
'R';
562 while (isdigit(
C.peek()))
564 if ((
C.peek() ==
'e' ||
C.peek() ==
'E') &&
565 (isdigit(
C.peek(1)) ||
566 ((
C.peek(1) ==
'-' ||
C.peek(1) ==
'+') && isdigit(
C.peek(2))))) {
568 while (isdigit(
C.peek()))
576 if (
C.peek() !=
'0' || (
C.peek(1) !=
'x' &&
C.peek(1) !=
'X'))
580 unsigned PrefLen = 2;
585 while (isxdigit(
C.peek()))
588 if (StrVal.size() <= PrefLen)
598 if (!isdigit(
C.peek()) && (
C.peek() !=
'-' || !isdigit(
C.peek(1))))
602 while (isdigit(
C.peek()))
638 "use of unknown metadata keyword '" + StrVal +
"'");
676 if (
C.peek() ==
':' &&
C.peek(1) ==
':') {
705 while (
C.peek() !=
'`') {
709 "end of machine instruction reached before the closing '`'");
726 return C.remaining();
732 return R.remaining();
734 return R.remaining();
736 return R.remaining();
738 return R.remaining();
740 return R.remaining();
742 return R.remaining();
744 return R.remaining();
746 return R.remaining();
748 return R.remaining();
750 return R.remaining();
752 return R.remaining();
754 return R.remaining();
756 return R.remaining();
758 return R.remaining();
760 return R.remaining();
762 return R.remaining();
764 return R.remaining();
766 return R.remaining();
768 return R.remaining();
770 return R.remaining();
773 ErrorCallback(
C.location(),
774 Twine(
"unexpected character '") +
Twine(
C.peek()) +
"'");
775 return C.remaining();
static Cursor maybeLexEscapedIRValue(Cursor C, MIToken &Token, ErrorCallbackType ErrorCallback)
static Cursor skipComment(Cursor C)
Skip a line comment and return the updated cursor.
static bool isRegisterChar(char C)
Returns true for a character allowed in a register name.
static Cursor lexStringConstant(Cursor C, ErrorCallbackType ErrorCallback)
Lex a string constant using the following regular expression: "[^"]*".
static bool isNewlineChar(char C)
static MIToken::TokenKind symbolToken(char C)
static bool isValidHexFloatingPointPrefix(char C)
static MIToken::TokenKind getIdentifierKind(StringRef Identifier)
static Cursor maybeLexIRBlock(Cursor C, MIToken &Token, ErrorCallbackType ErrorCallback)
static Cursor maybeLexSymbol(Cursor C, MIToken &Token)
static Cursor maybeLexJumpTableIndex(Cursor C, MIToken &Token)
static Cursor maybeLexRegister(Cursor C, MIToken &Token, ErrorCallbackType ErrorCallback)
static Cursor maybeLexHexadecimalLiteral(Cursor C, MIToken &Token)
static Cursor lexVirtualRegister(Cursor C, MIToken &Token)
static Cursor maybeLexNumericalLiteral(Cursor C, MIToken &Token)
static Cursor maybeLexExclaim(Cursor C, MIToken &Token, ErrorCallbackType ErrorCallback)
static Cursor lexNamedVirtualRegister(Cursor C, MIToken &Token)
static std::string unescapeQuotedString(StringRef Value)
Unescapes the given string value.
static Cursor maybeLexIndexAndName(Cursor C, MIToken &Token, StringRef Rule, MIToken::TokenKind Kind)
static Cursor maybeLexNewline(Cursor C, MIToken &Token)
static Cursor maybeLexMCSymbol(Cursor C, MIToken &Token, ErrorCallbackType ErrorCallback)
static Cursor skipMachineOperandComment(Cursor C)
Machine operands can have comments, enclosed between /* and /.
static MIToken::TokenKind getMetadataKeywordKind(StringRef Identifier)
static Cursor maybeLexIdentifier(Cursor C, MIToken &Token)
static Cursor maybeLexStackObject(Cursor C, MIToken &Token)
static Cursor skipWhitespace(Cursor C)
Skip the leading whitespace characters and return the updated cursor.
static Cursor maybeLexExternalSymbol(Cursor C, MIToken &Token, ErrorCallbackType ErrorCallback)
static bool isIdentifierChar(char C)
Return true if the given character satisfies the following regular expression: [-a-zA-Z$....
static Cursor lexName(Cursor C, MIToken &Token, MIToken::TokenKind Type, unsigned PrefixLength, ErrorCallbackType ErrorCallback)
static Cursor maybeLexGlobalValue(Cursor C, MIToken &Token, ErrorCallbackType ErrorCallback)
static Cursor maybeLexIRValue(Cursor C, MIToken &Token, ErrorCallbackType ErrorCallback)
static Cursor maybeLexFixedStackObject(Cursor C, MIToken &Token)
static Cursor maybeLexMachineBasicBlock(Cursor C, MIToken &Token, ErrorCallbackType ErrorCallback)
static Cursor maybeLexStringConstant(Cursor C, MIToken &Token, ErrorCallbackType ErrorCallback)
static Cursor maybeLexSubRegisterIndex(Cursor C, MIToken &Token, ErrorCallbackType ErrorCallback)
static Cursor lexFloatingPointLiteral(Cursor Range, Cursor C, MIToken &Token)
static Cursor maybeLexConstantPoolItem(Cursor C, MIToken &Token)
static Cursor maybeLexIndex(Cursor C, MIToken &Token, StringRef Rule, MIToken::TokenKind Kind)
ConstantRange Range(APInt(BitWidth, Low), APInt(BitWidth, High))
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
This file implements the StringSwitch template, which mimics a switch() statement whose cases are str...
static bool peek(struct InternalInstruction *insn, uint8_t &byte)
An arbitrary precision integer that knows its signedness.
StringRef - Represent a constant reference to a string, i.e.
constexpr size_t size() const
size - Get the string size.
A switch()-like statement whose cases are string literals.
StringSwitch & Case(StringLiteral S, T Value)
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
The instances of the Type class are immutable: once they are created, they are never changed.
LLVM Value Representation.
An efficient, type-erasing, non-owning reference to a callable.
@ C
The default llvm calling convention, compatible with C.
LocationClass< Ty > location(Ty &L)
This is an optimization pass for GlobalISel generic memory operations.
StringRef lexMIToken(StringRef Source, MIToken &Token, function_ref< void(StringRef::iterator, const Twine &)> ErrorCallback)
Consume a single machine instruction token in the given source and return the remaining source string...
A token produced by the machine instruction lexer.
MIToken & setStringValue(StringRef StrVal)
@ kw_cfi_aarch64_negate_ra_sign_state
@ kw_cfi_llvm_def_aspace_cfa
@ kw_inlineasm_br_indirect_target
@ kw_cfi_aarch64_negate_ra_sign_state_with_pc
@ kw_cfi_def_cfa_register
@ kw_cfi_adjust_cfa_offset
@ kw_machine_block_address_taken
@ kw_ir_block_address_taken
MIToken & setIntegerValue(APSInt IntVal)
MIToken & reset(TokenKind Kind, StringRef Range)
MIToken & setOwnedStringValue(std::string StrVal)
StringRef::iterator location() const