Lines Matching refs:C
50 StringRef upto(Cursor C) const { in upto()
51 assert(C.Ptr >= Ptr && C.Ptr <= End); in upto()
52 return StringRef(Ptr, C.Ptr - Ptr); in upto()
85 static Cursor skipWhitespace(Cursor C) { in skipWhitespace() argument
86 while (isblank(C.peek())) in skipWhitespace()
87 C.advance(); in skipWhitespace()
88 return C; in skipWhitespace()
91 static bool isNewlineChar(char C) { return C == '\n' || C == '\r'; } in isNewlineChar() argument
94 static Cursor skipComment(Cursor C) { in skipComment() argument
95 if (C.peek() != ';') in skipComment()
96 return C; in skipComment()
97 while (!isNewlineChar(C.peek()) && !C.isEOF()) in skipComment()
98 C.advance(); in skipComment()
99 return C; in skipComment()
104 static Cursor skipMachineOperandComment(Cursor C) { in skipMachineOperandComment() argument
105 if (C.peek() != '/' || C.peek(1) != '*') in skipMachineOperandComment()
106 return C; in skipMachineOperandComment()
108 while (C.peek() != '*' || C.peek(1) != '/') in skipMachineOperandComment()
109 C.advance(); in skipMachineOperandComment()
111 C.advance(); in skipMachineOperandComment()
112 C.advance(); in skipMachineOperandComment()
113 return C; in skipMachineOperandComment()
118 static bool isIdentifierChar(char C) { in isIdentifierChar() argument
119 return isalpha(C) || isdigit(C) || C == '_' || C == '-' || C == '.' || in isIdentifierChar()
120 C == '$'; in isIdentifierChar()
128 Cursor C = Cursor(Value.substr(1, Value.size() - 2)); in unescapeQuotedString() local
131 Str.reserve(C.remaining().size()); in unescapeQuotedString()
132 while (!C.isEOF()) { in unescapeQuotedString()
133 char Char = C.peek(); in unescapeQuotedString()
135 if (C.peek(1) == '\\') { in unescapeQuotedString()
138 C.advance(2); in unescapeQuotedString()
141 if (isxdigit(C.peek(1)) && isxdigit(C.peek(2))) { in unescapeQuotedString()
142 Str += hexDigitValue(C.peek(1)) * 16 + hexDigitValue(C.peek(2)); in unescapeQuotedString()
143 C.advance(3); in unescapeQuotedString()
148 C.advance(); in unescapeQuotedString()
154 static Cursor lexStringConstant(Cursor C, ErrorCallbackType ErrorCallback) { in lexStringConstant() argument
155 assert(C.peek() == '"'); in lexStringConstant()
156 for (C.advance(); C.peek() != '"'; C.advance()) { in lexStringConstant()
157 if (C.isEOF() || isNewlineChar(C.peek())) { in lexStringConstant()
159 C.location(), in lexStringConstant()
164 C.advance(); in lexStringConstant()
165 return C; in lexStringConstant()
168 static Cursor lexName(Cursor C, MIToken &Token, MIToken::TokenKind Type, in lexName() argument
170 auto Range = C; in lexName()
171 C.advance(PrefixLength); in lexName()
172 if (C.peek() == '"') { in lexName()
173 if (Cursor R = lexStringConstant(C, ErrorCallback)) { in lexName()
183 while (isIdentifierChar(C.peek())) in lexName()
184 C.advance(); in lexName()
185 Token.reset(Type, Range.upto(C)) in lexName()
186 .setStringValue(Range.upto(C).drop_front(PrefixLength)); in lexName()
187 return C; in lexName()
289 static Cursor maybeLexIdentifier(Cursor C, MIToken &Token) { in maybeLexIdentifier() argument
290 if (!isalpha(C.peek()) && C.peek() != '_') in maybeLexIdentifier()
292 auto Range = C; in maybeLexIdentifier()
293 while (isIdentifierChar(C.peek())) in maybeLexIdentifier()
294 C.advance(); in maybeLexIdentifier()
295 auto Identifier = Range.upto(C); in maybeLexIdentifier()
298 return C; in maybeLexIdentifier()
301 static Cursor maybeLexMachineBasicBlock(Cursor C, MIToken &Token, in maybeLexMachineBasicBlock() argument
303 bool IsReference = C.remaining().starts_with("%bb."); in maybeLexMachineBasicBlock()
304 if (!IsReference && !C.remaining().starts_with("bb.")) in maybeLexMachineBasicBlock()
306 auto Range = C; in maybeLexMachineBasicBlock()
308 C.advance(PrefixLength); // Skip '%bb.' or 'bb.' in maybeLexMachineBasicBlock()
309 if (!isdigit(C.peek())) { in maybeLexMachineBasicBlock()
310 Token.reset(MIToken::Error, C.remaining()); in maybeLexMachineBasicBlock()
311 ErrorCallback(C.location(), "expected a number after '%bb.'"); in maybeLexMachineBasicBlock()
312 return C; in maybeLexMachineBasicBlock()
314 auto NumberRange = C; in maybeLexMachineBasicBlock()
315 while (isdigit(C.peek())) in maybeLexMachineBasicBlock()
316 C.advance(); in maybeLexMachineBasicBlock()
317 StringRef Number = NumberRange.upto(C); in maybeLexMachineBasicBlock()
322 if (C.peek() == '.') { in maybeLexMachineBasicBlock()
323 C.advance(); // Skip '.' in maybeLexMachineBasicBlock()
325 while (isIdentifierChar(C.peek())) in maybeLexMachineBasicBlock()
326 C.advance(); in maybeLexMachineBasicBlock()
330 Range.upto(C)) in maybeLexMachineBasicBlock()
332 .setStringValue(Range.upto(C).drop_front(StringOffset)); in maybeLexMachineBasicBlock()
333 return C; in maybeLexMachineBasicBlock()
336 static Cursor maybeLexIndex(Cursor C, MIToken &Token, StringRef Rule, in maybeLexIndex() argument
338 if (!C.remaining().starts_with(Rule) || !isdigit(C.peek(Rule.size()))) in maybeLexIndex()
340 auto Range = C; in maybeLexIndex()
341 C.advance(Rule.size()); in maybeLexIndex()
342 auto NumberRange = C; in maybeLexIndex()
343 while (isdigit(C.peek())) in maybeLexIndex()
344 C.advance(); in maybeLexIndex()
345 Token.reset(Kind, Range.upto(C)).setIntegerValue(APSInt(NumberRange.upto(C))); in maybeLexIndex()
346 return C; in maybeLexIndex()
349 static Cursor maybeLexIndexAndName(Cursor C, MIToken &Token, StringRef Rule, in maybeLexIndexAndName() argument
351 if (!C.remaining().starts_with(Rule) || !isdigit(C.peek(Rule.size()))) in maybeLexIndexAndName()
353 auto Range = C; in maybeLexIndexAndName()
354 C.advance(Rule.size()); in maybeLexIndexAndName()
355 auto NumberRange = C; in maybeLexIndexAndName()
356 while (isdigit(C.peek())) in maybeLexIndexAndName()
357 C.advance(); in maybeLexIndexAndName()
358 StringRef Number = NumberRange.upto(C); in maybeLexIndexAndName()
360 if (C.peek() == '.') { in maybeLexIndexAndName()
361 C.advance(); in maybeLexIndexAndName()
363 while (isIdentifierChar(C.peek())) in maybeLexIndexAndName()
364 C.advance(); in maybeLexIndexAndName()
366 Token.reset(Kind, Range.upto(C)) in maybeLexIndexAndName()
368 .setStringValue(Range.upto(C).drop_front(StringOffset)); in maybeLexIndexAndName()
369 return C; in maybeLexIndexAndName()
372 static Cursor maybeLexJumpTableIndex(Cursor C, MIToken &Token) { in maybeLexJumpTableIndex() argument
373 return maybeLexIndex(C, Token, "%jump-table.", MIToken::JumpTableIndex); in maybeLexJumpTableIndex()
376 static Cursor maybeLexStackObject(Cursor C, MIToken &Token) { in maybeLexStackObject() argument
377 return maybeLexIndexAndName(C, Token, "%stack.", MIToken::StackObject); in maybeLexStackObject()
380 static Cursor maybeLexFixedStackObject(Cursor C, MIToken &Token) { in maybeLexFixedStackObject() argument
381 return maybeLexIndex(C, Token, "%fixed-stack.", MIToken::FixedStackObject); in maybeLexFixedStackObject()
384 static Cursor maybeLexConstantPoolItem(Cursor C, MIToken &Token) { in maybeLexConstantPoolItem() argument
385 return maybeLexIndex(C, Token, "%const.", MIToken::ConstantPoolItem); in maybeLexConstantPoolItem()
388 static Cursor maybeLexSubRegisterIndex(Cursor C, MIToken &Token, in maybeLexSubRegisterIndex() argument
391 if (!C.remaining().starts_with(Rule)) in maybeLexSubRegisterIndex()
393 return lexName(C, Token, MIToken::SubRegisterIndex, Rule.size(), in maybeLexSubRegisterIndex()
397 static Cursor maybeLexIRBlock(Cursor C, MIToken &Token, in maybeLexIRBlock() argument
400 if (!C.remaining().starts_with(Rule)) in maybeLexIRBlock()
402 if (isdigit(C.peek(Rule.size()))) in maybeLexIRBlock()
403 return maybeLexIndex(C, Token, Rule, MIToken::IRBlock); in maybeLexIRBlock()
404 return lexName(C, Token, MIToken::NamedIRBlock, Rule.size(), ErrorCallback); in maybeLexIRBlock()
407 static Cursor maybeLexIRValue(Cursor C, MIToken &Token, in maybeLexIRValue() argument
410 if (!C.remaining().starts_with(Rule)) in maybeLexIRValue()
412 if (isdigit(C.peek(Rule.size()))) in maybeLexIRValue()
413 return maybeLexIndex(C, Token, Rule, MIToken::IRValue); in maybeLexIRValue()
414 return lexName(C, Token, MIToken::NamedIRValue, Rule.size(), ErrorCallback); in maybeLexIRValue()
417 static Cursor maybeLexStringConstant(Cursor C, MIToken &Token, in maybeLexStringConstant() argument
419 if (C.peek() != '"') in maybeLexStringConstant()
421 return lexName(C, Token, MIToken::StringConstant, /*PrefixLength=*/0, in maybeLexStringConstant()
425 static Cursor lexVirtualRegister(Cursor C, MIToken &Token) { in lexVirtualRegister() argument
426 auto Range = C; in lexVirtualRegister()
427 C.advance(); // Skip '%' in lexVirtualRegister()
428 auto NumberRange = C; in lexVirtualRegister()
429 while (isdigit(C.peek())) in lexVirtualRegister()
430 C.advance(); in lexVirtualRegister()
431 Token.reset(MIToken::VirtualRegister, Range.upto(C)) in lexVirtualRegister()
432 .setIntegerValue(APSInt(NumberRange.upto(C))); in lexVirtualRegister()
433 return C; in lexVirtualRegister()
437 static bool isRegisterChar(char C) { in isRegisterChar() argument
438 return isIdentifierChar(C) && C != '.'; in isRegisterChar()
441 static Cursor lexNamedVirtualRegister(Cursor C, MIToken &Token) { in lexNamedVirtualRegister() argument
442 Cursor Range = C; in lexNamedVirtualRegister()
443 C.advance(); // Skip '%' in lexNamedVirtualRegister()
444 while (isRegisterChar(C.peek())) in lexNamedVirtualRegister()
445 C.advance(); in lexNamedVirtualRegister()
446 Token.reset(MIToken::NamedVirtualRegister, Range.upto(C)) in lexNamedVirtualRegister()
447 .setStringValue(Range.upto(C).drop_front(1)); // Drop the '%' in lexNamedVirtualRegister()
448 return C; in lexNamedVirtualRegister()
451 static Cursor maybeLexRegister(Cursor C, MIToken &Token, in maybeLexRegister() argument
453 if (C.peek() != '%' && C.peek() != '$') in maybeLexRegister()
456 if (C.peek() == '%') { in maybeLexRegister()
457 if (isdigit(C.peek(1))) in maybeLexRegister()
458 return lexVirtualRegister(C, Token); in maybeLexRegister()
460 if (isRegisterChar(C.peek(1))) in maybeLexRegister()
461 return lexNamedVirtualRegister(C, Token); in maybeLexRegister()
466 assert(C.peek() == '$'); in maybeLexRegister()
467 auto Range = C; in maybeLexRegister()
468 C.advance(); // Skip '$' in maybeLexRegister()
469 while (isRegisterChar(C.peek())) in maybeLexRegister()
470 C.advance(); in maybeLexRegister()
471 Token.reset(MIToken::NamedRegister, Range.upto(C)) in maybeLexRegister()
472 .setStringValue(Range.upto(C).drop_front(1)); // Drop the '$' in maybeLexRegister()
473 return C; in maybeLexRegister()
476 static Cursor maybeLexGlobalValue(Cursor C, MIToken &Token, in maybeLexGlobalValue() argument
478 if (C.peek() != '@') in maybeLexGlobalValue()
480 if (!isdigit(C.peek(1))) in maybeLexGlobalValue()
481 return lexName(C, Token, MIToken::NamedGlobalValue, /*PrefixLength=*/1, in maybeLexGlobalValue()
483 auto Range = C; in maybeLexGlobalValue()
484 C.advance(1); // Skip the '@' in maybeLexGlobalValue()
485 auto NumberRange = C; in maybeLexGlobalValue()
486 while (isdigit(C.peek())) in maybeLexGlobalValue()
487 C.advance(); in maybeLexGlobalValue()
488 Token.reset(MIToken::GlobalValue, Range.upto(C)) in maybeLexGlobalValue()
489 .setIntegerValue(APSInt(NumberRange.upto(C))); in maybeLexGlobalValue()
490 return C; in maybeLexGlobalValue()
493 static Cursor maybeLexExternalSymbol(Cursor C, MIToken &Token, in maybeLexExternalSymbol() argument
495 if (C.peek() != '&') in maybeLexExternalSymbol()
497 return lexName(C, Token, MIToken::ExternalSymbol, /*PrefixLength=*/1, in maybeLexExternalSymbol()
501 static Cursor maybeLexMCSymbol(Cursor C, MIToken &Token, in maybeLexMCSymbol() argument
504 if (!C.remaining().starts_with(Rule)) in maybeLexMCSymbol()
506 auto Start = C; in maybeLexMCSymbol()
507 C.advance(Rule.size()); in maybeLexMCSymbol()
510 if (C.peek() != '"') { in maybeLexMCSymbol()
511 while (isIdentifierChar(C.peek())) in maybeLexMCSymbol()
512 C.advance(); in maybeLexMCSymbol()
513 StringRef String = Start.upto(C).drop_front(Rule.size()); in maybeLexMCSymbol()
514 if (C.peek() != '>') { in maybeLexMCSymbol()
515 ErrorCallback(C.location(), in maybeLexMCSymbol()
520 C.advance(); in maybeLexMCSymbol()
522 Token.reset(MIToken::MCSymbol, Start.upto(C)).setStringValue(String); in maybeLexMCSymbol()
523 return C; in maybeLexMCSymbol()
527 Cursor R = lexStringConstant(C, ErrorCallback); in maybeLexMCSymbol()
529 ErrorCallback(C.location(), in maybeLexMCSymbol()
548 static bool isValidHexFloatingPointPrefix(char C) { in isValidHexFloatingPointPrefix() argument
549 return C == 'H' || C == 'K' || C == 'L' || C == 'M' || C == 'R'; in isValidHexFloatingPointPrefix()
552 static Cursor lexFloatingPointLiteral(Cursor Range, Cursor C, MIToken &Token) { in lexFloatingPointLiteral() argument
553 C.advance(); in lexFloatingPointLiteral()
555 while (isdigit(C.peek())) in lexFloatingPointLiteral()
556 C.advance(); in lexFloatingPointLiteral()
557 if ((C.peek() == 'e' || C.peek() == 'E') && in lexFloatingPointLiteral()
558 (isdigit(C.peek(1)) || in lexFloatingPointLiteral()
559 ((C.peek(1) == '-' || C.peek(1) == '+') && isdigit(C.peek(2))))) { in lexFloatingPointLiteral()
560 C.advance(2); in lexFloatingPointLiteral()
561 while (isdigit(C.peek())) in lexFloatingPointLiteral()
562 C.advance(); in lexFloatingPointLiteral()
564 Token.reset(MIToken::FloatingPointLiteral, Range.upto(C)); in lexFloatingPointLiteral()
565 return C; in lexFloatingPointLiteral()
568 static Cursor maybeLexHexadecimalLiteral(Cursor C, MIToken &Token) { in maybeLexHexadecimalLiteral() argument
569 if (C.peek() != '0' || (C.peek(1) != 'x' && C.peek(1) != 'X')) in maybeLexHexadecimalLiteral()
571 Cursor Range = C; in maybeLexHexadecimalLiteral()
572 C.advance(2); in maybeLexHexadecimalLiteral()
574 if (isValidHexFloatingPointPrefix(C.peek())) { in maybeLexHexadecimalLiteral()
575 C.advance(); in maybeLexHexadecimalLiteral()
578 while (isxdigit(C.peek())) in maybeLexHexadecimalLiteral()
579 C.advance(); in maybeLexHexadecimalLiteral()
580 StringRef StrVal = Range.upto(C); in maybeLexHexadecimalLiteral()
584 Token.reset(MIToken::HexLiteral, Range.upto(C)); in maybeLexHexadecimalLiteral()
586 Token.reset(MIToken::FloatingPointLiteral, Range.upto(C)); in maybeLexHexadecimalLiteral()
587 return C; in maybeLexHexadecimalLiteral()
590 static Cursor maybeLexNumericalLiteral(Cursor C, MIToken &Token) { in maybeLexNumericalLiteral() argument
591 if (!isdigit(C.peek()) && (C.peek() != '-' || !isdigit(C.peek(1)))) in maybeLexNumericalLiteral()
593 auto Range = C; in maybeLexNumericalLiteral()
594 C.advance(); in maybeLexNumericalLiteral()
595 while (isdigit(C.peek())) in maybeLexNumericalLiteral()
596 C.advance(); in maybeLexNumericalLiteral()
597 if (C.peek() == '.') in maybeLexNumericalLiteral()
598 return lexFloatingPointLiteral(Range, C, Token); in maybeLexNumericalLiteral()
599 StringRef StrVal = Range.upto(C); in maybeLexNumericalLiteral()
601 return C; in maybeLexNumericalLiteral()
615 static Cursor maybeLexExclaim(Cursor C, MIToken &Token, in maybeLexExclaim() argument
617 if (C.peek() != '!') in maybeLexExclaim()
619 auto Range = C; in maybeLexExclaim()
620 C.advance(1); in maybeLexExclaim()
621 if (isdigit(C.peek()) || !isIdentifierChar(C.peek())) { in maybeLexExclaim()
622 Token.reset(MIToken::exclaim, Range.upto(C)); in maybeLexExclaim()
623 return C; in maybeLexExclaim()
625 while (isIdentifierChar(C.peek())) in maybeLexExclaim()
626 C.advance(); in maybeLexExclaim()
627 StringRef StrVal = Range.upto(C); in maybeLexExclaim()
632 return C; in maybeLexExclaim()
635 static MIToken::TokenKind symbolToken(char C) { in symbolToken() argument
636 switch (C) { in symbolToken()
666 static Cursor maybeLexSymbol(Cursor C, MIToken &Token) { in maybeLexSymbol() argument
669 if (C.peek() == ':' && C.peek(1) == ':') { in maybeLexSymbol()
673 Kind = symbolToken(C.peek()); in maybeLexSymbol()
676 auto Range = C; in maybeLexSymbol()
677 C.advance(Length); in maybeLexSymbol()
678 Token.reset(Kind, Range.upto(C)); in maybeLexSymbol()
679 return C; in maybeLexSymbol()
682 static Cursor maybeLexNewline(Cursor C, MIToken &Token) { in maybeLexNewline() argument
683 if (!isNewlineChar(C.peek())) in maybeLexNewline()
685 auto Range = C; in maybeLexNewline()
686 C.advance(); in maybeLexNewline()
687 Token.reset(MIToken::Newline, Range.upto(C)); in maybeLexNewline()
688 return C; in maybeLexNewline()
691 static Cursor maybeLexEscapedIRValue(Cursor C, MIToken &Token, in maybeLexEscapedIRValue() argument
693 if (C.peek() != '`') in maybeLexEscapedIRValue()
695 auto Range = C; in maybeLexEscapedIRValue()
696 C.advance(); in maybeLexEscapedIRValue()
697 auto StrRange = C; in maybeLexEscapedIRValue()
698 while (C.peek() != '`') { in maybeLexEscapedIRValue()
699 if (C.isEOF() || isNewlineChar(C.peek())) { in maybeLexEscapedIRValue()
701 C.location(), in maybeLexEscapedIRValue()
704 return C; in maybeLexEscapedIRValue()
706 C.advance(); in maybeLexEscapedIRValue()
708 StringRef Value = StrRange.upto(C); in maybeLexEscapedIRValue()
709 C.advance(); in maybeLexEscapedIRValue()
710 Token.reset(MIToken::QuotedIRValue, Range.upto(C)).setStringValue(Value); in maybeLexEscapedIRValue()
711 return C; in maybeLexEscapedIRValue()
716 auto C = skipComment(skipWhitespace(Cursor(Source))); in lexMIToken() local
717 if (C.isEOF()) { in lexMIToken()
718 Token.reset(MIToken::Eof, C.remaining()); in lexMIToken()
719 return C.remaining(); in lexMIToken()
722 C = skipMachineOperandComment(C); in lexMIToken()
724 if (Cursor R = maybeLexMachineBasicBlock(C, Token, ErrorCallback)) in lexMIToken()
726 if (Cursor R = maybeLexIdentifier(C, Token)) in lexMIToken()
728 if (Cursor R = maybeLexJumpTableIndex(C, Token)) in lexMIToken()
730 if (Cursor R = maybeLexStackObject(C, Token)) in lexMIToken()
732 if (Cursor R = maybeLexFixedStackObject(C, Token)) in lexMIToken()
734 if (Cursor R = maybeLexConstantPoolItem(C, Token)) in lexMIToken()
736 if (Cursor R = maybeLexSubRegisterIndex(C, Token, ErrorCallback)) in lexMIToken()
738 if (Cursor R = maybeLexIRBlock(C, Token, ErrorCallback)) in lexMIToken()
740 if (Cursor R = maybeLexIRValue(C, Token, ErrorCallback)) in lexMIToken()
742 if (Cursor R = maybeLexRegister(C, Token, ErrorCallback)) in lexMIToken()
744 if (Cursor R = maybeLexGlobalValue(C, Token, ErrorCallback)) in lexMIToken()
746 if (Cursor R = maybeLexExternalSymbol(C, Token, ErrorCallback)) in lexMIToken()
748 if (Cursor R = maybeLexMCSymbol(C, Token, ErrorCallback)) in lexMIToken()
750 if (Cursor R = maybeLexHexadecimalLiteral(C, Token)) in lexMIToken()
752 if (Cursor R = maybeLexNumericalLiteral(C, Token)) in lexMIToken()
754 if (Cursor R = maybeLexExclaim(C, Token, ErrorCallback)) in lexMIToken()
756 if (Cursor R = maybeLexSymbol(C, Token)) in lexMIToken()
758 if (Cursor R = maybeLexNewline(C, Token)) in lexMIToken()
760 if (Cursor R = maybeLexEscapedIRValue(C, Token, ErrorCallback)) in lexMIToken()
762 if (Cursor R = maybeLexStringConstant(C, Token, ErrorCallback)) in lexMIToken()
765 Token.reset(MIToken::Error, C.remaining()); in lexMIToken()
766 ErrorCallback(C.location(), in lexMIToken()
767 Twine("unexpected character '") + Twine(C.peek()) + "'"); in lexMIToken()
768 return C.remaining(); in lexMIToken()