Lines Matching refs:C

52   StringRef upto(Cursor C) const {  in upto()
53 assert(C.Ptr >= Ptr && C.Ptr <= End); in upto()
54 return StringRef(Ptr, C.Ptr - Ptr); in upto()
87 static Cursor skipWhitespace(Cursor C) { in skipWhitespace() argument
88 while (isblank(C.peek())) in skipWhitespace()
89 C.advance(); in skipWhitespace()
90 return C; in skipWhitespace()
93 static bool isNewlineChar(char C) { return C == '\n' || C == '\r'; } in isNewlineChar() argument
96 static Cursor skipComment(Cursor C) { in skipComment() argument
97 if (C.peek() != ';') in skipComment()
98 return C; in skipComment()
99 while (!isNewlineChar(C.peek()) && !C.isEOF()) in skipComment()
100 C.advance(); in skipComment()
101 return C; in skipComment()
106 static Cursor skipMachineOperandComment(Cursor C) { in skipMachineOperandComment() argument
107 if (C.peek() != '/' || C.peek(1) != '*') in skipMachineOperandComment()
108 return C; in skipMachineOperandComment()
110 while (C.peek() != '*' || C.peek(1) != '/') in skipMachineOperandComment()
111 C.advance(); in skipMachineOperandComment()
113 C.advance(); in skipMachineOperandComment()
114 C.advance(); in skipMachineOperandComment()
115 return C; in skipMachineOperandComment()
120 static bool isIdentifierChar(char C) { in isIdentifierChar() argument
121 return isalpha(C) || isdigit(C) || C == '_' || C == '-' || C == '.' || in isIdentifierChar()
122 C == '$'; in isIdentifierChar()
130 Cursor C = Cursor(Value.substr(1, Value.size() - 2)); in unescapeQuotedString() local
133 Str.reserve(C.remaining().size()); in unescapeQuotedString()
134 while (!C.isEOF()) { in unescapeQuotedString()
135 char Char = C.peek(); in unescapeQuotedString()
137 if (C.peek(1) == '\\') { in unescapeQuotedString()
140 C.advance(2); in unescapeQuotedString()
143 if (isxdigit(C.peek(1)) && isxdigit(C.peek(2))) { in unescapeQuotedString()
144 Str += hexDigitValue(C.peek(1)) * 16 + hexDigitValue(C.peek(2)); in unescapeQuotedString()
145 C.advance(3); in unescapeQuotedString()
150 C.advance(); in unescapeQuotedString()
156 static Cursor lexStringConstant(Cursor C, ErrorCallbackType ErrorCallback) { in lexStringConstant() argument
157 assert(C.peek() == '"'); in lexStringConstant()
158 for (C.advance(); C.peek() != '"'; C.advance()) { in lexStringConstant()
159 if (C.isEOF() || isNewlineChar(C.peek())) { in lexStringConstant()
161 C.location(), in lexStringConstant()
166 C.advance(); in lexStringConstant()
167 return C; in lexStringConstant()
170 static Cursor lexName(Cursor C, MIToken &Token, MIToken::TokenKind Type, in lexName() argument
172 auto Range = C; in lexName()
173 C.advance(PrefixLength); in lexName()
174 if (C.peek() == '"') { in lexName()
175 if (Cursor R = lexStringConstant(C, ErrorCallback)) { in lexName()
185 while (isIdentifierChar(C.peek())) in lexName()
186 C.advance(); in lexName()
187 Token.reset(Type, Range.upto(C)) in lexName()
188 .setStringValue(Range.upto(C).drop_front(PrefixLength)); in lexName()
189 return C; in lexName()
280 static Cursor maybeLexIdentifier(Cursor C, MIToken &Token) { in maybeLexIdentifier() argument
281 if (!isalpha(C.peek()) && C.peek() != '_') in maybeLexIdentifier()
283 auto Range = C; in maybeLexIdentifier()
284 while (isIdentifierChar(C.peek())) in maybeLexIdentifier()
285 C.advance(); in maybeLexIdentifier()
286 auto Identifier = Range.upto(C); in maybeLexIdentifier()
289 return C; in maybeLexIdentifier()
292 static Cursor maybeLexMachineBasicBlock(Cursor C, MIToken &Token, in maybeLexMachineBasicBlock() argument
294 bool IsReference = C.remaining().startswith("%bb."); in maybeLexMachineBasicBlock()
295 if (!IsReference && !C.remaining().startswith("bb.")) in maybeLexMachineBasicBlock()
297 auto Range = C; in maybeLexMachineBasicBlock()
299 C.advance(PrefixLength); // Skip '%bb.' or 'bb.' in maybeLexMachineBasicBlock()
300 if (!isdigit(C.peek())) { in maybeLexMachineBasicBlock()
301 Token.reset(MIToken::Error, C.remaining()); in maybeLexMachineBasicBlock()
302 ErrorCallback(C.location(), "expected a number after '%bb.'"); in maybeLexMachineBasicBlock()
303 return C; in maybeLexMachineBasicBlock()
305 auto NumberRange = C; in maybeLexMachineBasicBlock()
306 while (isdigit(C.peek())) in maybeLexMachineBasicBlock()
307 C.advance(); in maybeLexMachineBasicBlock()
308 StringRef Number = NumberRange.upto(C); in maybeLexMachineBasicBlock()
313 if (C.peek() == '.') { in maybeLexMachineBasicBlock()
314 C.advance(); // Skip '.' in maybeLexMachineBasicBlock()
316 while (isIdentifierChar(C.peek())) in maybeLexMachineBasicBlock()
317 C.advance(); in maybeLexMachineBasicBlock()
321 Range.upto(C)) in maybeLexMachineBasicBlock()
323 .setStringValue(Range.upto(C).drop_front(StringOffset)); in maybeLexMachineBasicBlock()
324 return C; in maybeLexMachineBasicBlock()
327 static Cursor maybeLexIndex(Cursor C, MIToken &Token, StringRef Rule, in maybeLexIndex() argument
329 if (!C.remaining().startswith(Rule) || !isdigit(C.peek(Rule.size()))) in maybeLexIndex()
331 auto Range = C; in maybeLexIndex()
332 C.advance(Rule.size()); in maybeLexIndex()
333 auto NumberRange = C; in maybeLexIndex()
334 while (isdigit(C.peek())) in maybeLexIndex()
335 C.advance(); in maybeLexIndex()
336 Token.reset(Kind, Range.upto(C)).setIntegerValue(APSInt(NumberRange.upto(C))); in maybeLexIndex()
337 return C; in maybeLexIndex()
340 static Cursor maybeLexIndexAndName(Cursor C, MIToken &Token, StringRef Rule, in maybeLexIndexAndName() argument
342 if (!C.remaining().startswith(Rule) || !isdigit(C.peek(Rule.size()))) in maybeLexIndexAndName()
344 auto Range = C; in maybeLexIndexAndName()
345 C.advance(Rule.size()); in maybeLexIndexAndName()
346 auto NumberRange = C; in maybeLexIndexAndName()
347 while (isdigit(C.peek())) in maybeLexIndexAndName()
348 C.advance(); in maybeLexIndexAndName()
349 StringRef Number = NumberRange.upto(C); in maybeLexIndexAndName()
351 if (C.peek() == '.') { in maybeLexIndexAndName()
352 C.advance(); in maybeLexIndexAndName()
354 while (isIdentifierChar(C.peek())) in maybeLexIndexAndName()
355 C.advance(); in maybeLexIndexAndName()
357 Token.reset(Kind, Range.upto(C)) in maybeLexIndexAndName()
359 .setStringValue(Range.upto(C).drop_front(StringOffset)); in maybeLexIndexAndName()
360 return C; in maybeLexIndexAndName()
363 static Cursor maybeLexJumpTableIndex(Cursor C, MIToken &Token) { in maybeLexJumpTableIndex() argument
364 return maybeLexIndex(C, Token, "%jump-table.", MIToken::JumpTableIndex); in maybeLexJumpTableIndex()
367 static Cursor maybeLexStackObject(Cursor C, MIToken &Token) { in maybeLexStackObject() argument
368 return maybeLexIndexAndName(C, Token, "%stack.", MIToken::StackObject); in maybeLexStackObject()
371 static Cursor maybeLexFixedStackObject(Cursor C, MIToken &Token) { in maybeLexFixedStackObject() argument
372 return maybeLexIndex(C, Token, "%fixed-stack.", MIToken::FixedStackObject); in maybeLexFixedStackObject()
375 static Cursor maybeLexConstantPoolItem(Cursor C, MIToken &Token) { in maybeLexConstantPoolItem() argument
376 return maybeLexIndex(C, Token, "%const.", MIToken::ConstantPoolItem); in maybeLexConstantPoolItem()
379 static Cursor maybeLexSubRegisterIndex(Cursor C, MIToken &Token, in maybeLexSubRegisterIndex() argument
382 if (!C.remaining().startswith(Rule)) in maybeLexSubRegisterIndex()
384 return lexName(C, Token, MIToken::SubRegisterIndex, Rule.size(), in maybeLexSubRegisterIndex()
388 static Cursor maybeLexIRBlock(Cursor C, MIToken &Token, in maybeLexIRBlock() argument
391 if (!C.remaining().startswith(Rule)) in maybeLexIRBlock()
393 if (isdigit(C.peek(Rule.size()))) in maybeLexIRBlock()
394 return maybeLexIndex(C, Token, Rule, MIToken::IRBlock); in maybeLexIRBlock()
395 return lexName(C, Token, MIToken::NamedIRBlock, Rule.size(), ErrorCallback); in maybeLexIRBlock()
398 static Cursor maybeLexIRValue(Cursor C, MIToken &Token, in maybeLexIRValue() argument
401 if (!C.remaining().startswith(Rule)) in maybeLexIRValue()
403 if (isdigit(C.peek(Rule.size()))) in maybeLexIRValue()
404 return maybeLexIndex(C, Token, Rule, MIToken::IRValue); in maybeLexIRValue()
405 return lexName(C, Token, MIToken::NamedIRValue, Rule.size(), ErrorCallback); in maybeLexIRValue()
408 static Cursor maybeLexStringConstant(Cursor C, MIToken &Token, in maybeLexStringConstant() argument
410 if (C.peek() != '"') in maybeLexStringConstant()
412 return lexName(C, Token, MIToken::StringConstant, /*PrefixLength=*/0, in maybeLexStringConstant()
416 static Cursor lexVirtualRegister(Cursor C, MIToken &Token) { in lexVirtualRegister() argument
417 auto Range = C; in lexVirtualRegister()
418 C.advance(); // Skip '%' in lexVirtualRegister()
419 auto NumberRange = C; in lexVirtualRegister()
420 while (isdigit(C.peek())) in lexVirtualRegister()
421 C.advance(); in lexVirtualRegister()
422 Token.reset(MIToken::VirtualRegister, Range.upto(C)) in lexVirtualRegister()
423 .setIntegerValue(APSInt(NumberRange.upto(C))); in lexVirtualRegister()
424 return C; in lexVirtualRegister()
428 static bool isRegisterChar(char C) { in isRegisterChar() argument
429 return isIdentifierChar(C) && C != '.'; in isRegisterChar()
432 static Cursor lexNamedVirtualRegister(Cursor C, MIToken &Token) { in lexNamedVirtualRegister() argument
433 Cursor Range = C; in lexNamedVirtualRegister()
434 C.advance(); // Skip '%' in lexNamedVirtualRegister()
435 while (isRegisterChar(C.peek())) in lexNamedVirtualRegister()
436 C.advance(); in lexNamedVirtualRegister()
437 Token.reset(MIToken::NamedVirtualRegister, Range.upto(C)) in lexNamedVirtualRegister()
438 .setStringValue(Range.upto(C).drop_front(1)); // Drop the '%' in lexNamedVirtualRegister()
439 return C; in lexNamedVirtualRegister()
442 static Cursor maybeLexRegister(Cursor C, MIToken &Token, in maybeLexRegister() argument
444 if (C.peek() != '%' && C.peek() != '$') in maybeLexRegister()
447 if (C.peek() == '%') { in maybeLexRegister()
448 if (isdigit(C.peek(1))) in maybeLexRegister()
449 return lexVirtualRegister(C, Token); in maybeLexRegister()
451 if (isRegisterChar(C.peek(1))) in maybeLexRegister()
452 return lexNamedVirtualRegister(C, Token); in maybeLexRegister()
457 assert(C.peek() == '$'); in maybeLexRegister()
458 auto Range = C; in maybeLexRegister()
459 C.advance(); // Skip '$' in maybeLexRegister()
460 while (isRegisterChar(C.peek())) in maybeLexRegister()
461 C.advance(); in maybeLexRegister()
462 Token.reset(MIToken::NamedRegister, Range.upto(C)) in maybeLexRegister()
463 .setStringValue(Range.upto(C).drop_front(1)); // Drop the '$' in maybeLexRegister()
464 return C; in maybeLexRegister()
467 static Cursor maybeLexGlobalValue(Cursor C, MIToken &Token, in maybeLexGlobalValue() argument
469 if (C.peek() != '@') in maybeLexGlobalValue()
471 if (!isdigit(C.peek(1))) in maybeLexGlobalValue()
472 return lexName(C, Token, MIToken::NamedGlobalValue, /*PrefixLength=*/1, in maybeLexGlobalValue()
474 auto Range = C; in maybeLexGlobalValue()
475 C.advance(1); // Skip the '@' in maybeLexGlobalValue()
476 auto NumberRange = C; in maybeLexGlobalValue()
477 while (isdigit(C.peek())) in maybeLexGlobalValue()
478 C.advance(); in maybeLexGlobalValue()
479 Token.reset(MIToken::GlobalValue, Range.upto(C)) in maybeLexGlobalValue()
480 .setIntegerValue(APSInt(NumberRange.upto(C))); in maybeLexGlobalValue()
481 return C; in maybeLexGlobalValue()
484 static Cursor maybeLexExternalSymbol(Cursor C, MIToken &Token, in maybeLexExternalSymbol() argument
486 if (C.peek() != '&') in maybeLexExternalSymbol()
488 return lexName(C, Token, MIToken::ExternalSymbol, /*PrefixLength=*/1, in maybeLexExternalSymbol()
492 static Cursor maybeLexMCSymbol(Cursor C, MIToken &Token, in maybeLexMCSymbol() argument
495 if (!C.remaining().startswith(Rule)) in maybeLexMCSymbol()
497 auto Start = C; in maybeLexMCSymbol()
498 C.advance(Rule.size()); in maybeLexMCSymbol()
501 if (C.peek() != '"') { in maybeLexMCSymbol()
502 while (isIdentifierChar(C.peek())) in maybeLexMCSymbol()
503 C.advance(); in maybeLexMCSymbol()
504 StringRef String = Start.upto(C).drop_front(Rule.size()); in maybeLexMCSymbol()
505 if (C.peek() != '>') { in maybeLexMCSymbol()
506 ErrorCallback(C.location(), in maybeLexMCSymbol()
511 C.advance(); in maybeLexMCSymbol()
513 Token.reset(MIToken::MCSymbol, Start.upto(C)).setStringValue(String); in maybeLexMCSymbol()
514 return C; in maybeLexMCSymbol()
518 Cursor R = lexStringConstant(C, ErrorCallback); in maybeLexMCSymbol()
520 ErrorCallback(C.location(), in maybeLexMCSymbol()
539 static bool isValidHexFloatingPointPrefix(char C) { in isValidHexFloatingPointPrefix() argument
540 return C == 'H' || C == 'K' || C == 'L' || C == 'M' || C == 'R'; in isValidHexFloatingPointPrefix()
543 static Cursor lexFloatingPointLiteral(Cursor Range, Cursor C, MIToken &Token) { in lexFloatingPointLiteral() argument
544 C.advance(); in lexFloatingPointLiteral()
546 while (isdigit(C.peek())) in lexFloatingPointLiteral()
547 C.advance(); in lexFloatingPointLiteral()
548 if ((C.peek() == 'e' || C.peek() == 'E') && in lexFloatingPointLiteral()
549 (isdigit(C.peek(1)) || in lexFloatingPointLiteral()
550 ((C.peek(1) == '-' || C.peek(1) == '+') && isdigit(C.peek(2))))) { in lexFloatingPointLiteral()
551 C.advance(2); in lexFloatingPointLiteral()
552 while (isdigit(C.peek())) in lexFloatingPointLiteral()
553 C.advance(); in lexFloatingPointLiteral()
555 Token.reset(MIToken::FloatingPointLiteral, Range.upto(C)); in lexFloatingPointLiteral()
556 return C; in lexFloatingPointLiteral()
559 static Cursor maybeLexHexadecimalLiteral(Cursor C, MIToken &Token) { in maybeLexHexadecimalLiteral() argument
560 if (C.peek() != '0' || (C.peek(1) != 'x' && C.peek(1) != 'X')) in maybeLexHexadecimalLiteral()
562 Cursor Range = C; in maybeLexHexadecimalLiteral()
563 C.advance(2); in maybeLexHexadecimalLiteral()
565 if (isValidHexFloatingPointPrefix(C.peek())) { in maybeLexHexadecimalLiteral()
566 C.advance(); in maybeLexHexadecimalLiteral()
569 while (isxdigit(C.peek())) in maybeLexHexadecimalLiteral()
570 C.advance(); in maybeLexHexadecimalLiteral()
571 StringRef StrVal = Range.upto(C); in maybeLexHexadecimalLiteral()
575 Token.reset(MIToken::HexLiteral, Range.upto(C)); in maybeLexHexadecimalLiteral()
577 Token.reset(MIToken::FloatingPointLiteral, Range.upto(C)); in maybeLexHexadecimalLiteral()
578 return C; in maybeLexHexadecimalLiteral()
581 static Cursor maybeLexNumericalLiteral(Cursor C, MIToken &Token) { in maybeLexNumericalLiteral() argument
582 if (!isdigit(C.peek()) && (C.peek() != '-' || !isdigit(C.peek(1)))) in maybeLexNumericalLiteral()
584 auto Range = C; in maybeLexNumericalLiteral()
585 C.advance(); in maybeLexNumericalLiteral()
586 while (isdigit(C.peek())) in maybeLexNumericalLiteral()
587 C.advance(); in maybeLexNumericalLiteral()
588 if (C.peek() == '.') in maybeLexNumericalLiteral()
589 return lexFloatingPointLiteral(Range, C, Token); in maybeLexNumericalLiteral()
590 StringRef StrVal = Range.upto(C); in maybeLexNumericalLiteral()
592 return C; in maybeLexNumericalLiteral()
606 static Cursor maybeLexExclaim(Cursor C, MIToken &Token, in maybeLexExclaim() argument
608 if (C.peek() != '!') in maybeLexExclaim()
610 auto Range = C; in maybeLexExclaim()
611 C.advance(1); in maybeLexExclaim()
612 if (isdigit(C.peek()) || !isIdentifierChar(C.peek())) { in maybeLexExclaim()
613 Token.reset(MIToken::exclaim, Range.upto(C)); in maybeLexExclaim()
614 return C; in maybeLexExclaim()
616 while (isIdentifierChar(C.peek())) in maybeLexExclaim()
617 C.advance(); in maybeLexExclaim()
618 StringRef StrVal = Range.upto(C); in maybeLexExclaim()
623 return C; in maybeLexExclaim()
626 static MIToken::TokenKind symbolToken(char C) { in symbolToken() argument
627 switch (C) { in symbolToken()
657 static Cursor maybeLexSymbol(Cursor C, MIToken &Token) { in maybeLexSymbol() argument
660 if (C.peek() == ':' && C.peek(1) == ':') { in maybeLexSymbol()
664 Kind = symbolToken(C.peek()); in maybeLexSymbol()
667 auto Range = C; in maybeLexSymbol()
668 C.advance(Length); in maybeLexSymbol()
669 Token.reset(Kind, Range.upto(C)); in maybeLexSymbol()
670 return C; in maybeLexSymbol()
673 static Cursor maybeLexNewline(Cursor C, MIToken &Token) { in maybeLexNewline() argument
674 if (!isNewlineChar(C.peek())) in maybeLexNewline()
676 auto Range = C; in maybeLexNewline()
677 C.advance(); in maybeLexNewline()
678 Token.reset(MIToken::Newline, Range.upto(C)); in maybeLexNewline()
679 return C; in maybeLexNewline()
682 static Cursor maybeLexEscapedIRValue(Cursor C, MIToken &Token, in maybeLexEscapedIRValue() argument
684 if (C.peek() != '`') in maybeLexEscapedIRValue()
686 auto Range = C; in maybeLexEscapedIRValue()
687 C.advance(); in maybeLexEscapedIRValue()
688 auto StrRange = C; in maybeLexEscapedIRValue()
689 while (C.peek() != '`') { in maybeLexEscapedIRValue()
690 if (C.isEOF() || isNewlineChar(C.peek())) { in maybeLexEscapedIRValue()
692 C.location(), in maybeLexEscapedIRValue()
695 return C; in maybeLexEscapedIRValue()
697 C.advance(); in maybeLexEscapedIRValue()
699 StringRef Value = StrRange.upto(C); in maybeLexEscapedIRValue()
700 C.advance(); in maybeLexEscapedIRValue()
701 Token.reset(MIToken::QuotedIRValue, Range.upto(C)).setStringValue(Value); in maybeLexEscapedIRValue()
702 return C; in maybeLexEscapedIRValue()
707 auto C = skipComment(skipWhitespace(Cursor(Source))); in lexMIToken() local
708 if (C.isEOF()) { in lexMIToken()
709 Token.reset(MIToken::Eof, C.remaining()); in lexMIToken()
710 return C.remaining(); in lexMIToken()
713 C = skipMachineOperandComment(C); in lexMIToken()
715 if (Cursor R = maybeLexMachineBasicBlock(C, Token, ErrorCallback)) in lexMIToken()
717 if (Cursor R = maybeLexIdentifier(C, Token)) in lexMIToken()
719 if (Cursor R = maybeLexJumpTableIndex(C, Token)) in lexMIToken()
721 if (Cursor R = maybeLexStackObject(C, Token)) in lexMIToken()
723 if (Cursor R = maybeLexFixedStackObject(C, Token)) in lexMIToken()
725 if (Cursor R = maybeLexConstantPoolItem(C, Token)) in lexMIToken()
727 if (Cursor R = maybeLexSubRegisterIndex(C, Token, ErrorCallback)) in lexMIToken()
729 if (Cursor R = maybeLexIRBlock(C, Token, ErrorCallback)) in lexMIToken()
731 if (Cursor R = maybeLexIRValue(C, Token, ErrorCallback)) in lexMIToken()
733 if (Cursor R = maybeLexRegister(C, Token, ErrorCallback)) in lexMIToken()
735 if (Cursor R = maybeLexGlobalValue(C, Token, ErrorCallback)) in lexMIToken()
737 if (Cursor R = maybeLexExternalSymbol(C, Token, ErrorCallback)) in lexMIToken()
739 if (Cursor R = maybeLexMCSymbol(C, Token, ErrorCallback)) in lexMIToken()
741 if (Cursor R = maybeLexHexadecimalLiteral(C, Token)) in lexMIToken()
743 if (Cursor R = maybeLexNumericalLiteral(C, Token)) in lexMIToken()
745 if (Cursor R = maybeLexExclaim(C, Token, ErrorCallback)) in lexMIToken()
747 if (Cursor R = maybeLexSymbol(C, Token)) in lexMIToken()
749 if (Cursor R = maybeLexNewline(C, Token)) in lexMIToken()
751 if (Cursor R = maybeLexEscapedIRValue(C, Token, ErrorCallback)) in lexMIToken()
753 if (Cursor R = maybeLexStringConstant(C, Token, ErrorCallback)) in lexMIToken()
756 Token.reset(MIToken::Error, C.remaining()); in lexMIToken()
757 ErrorCallback(C.location(), in lexMIToken()
758 Twine("unexpected character '") + Twine(C.peek()) + "'"); in lexMIToken()
759 return C.remaining(); in lexMIToken()