Lines Matching refs:C

51   StringRef upto(Cursor C) const {  in upto()
52 assert(C.Ptr >= Ptr && C.Ptr <= End); in upto()
53 return StringRef(Ptr, C.Ptr - Ptr); in upto()
86 static Cursor skipWhitespace(Cursor C) { in skipWhitespace() argument
87 while (isblank(C.peek())) in skipWhitespace()
88 C.advance(); in skipWhitespace()
89 return C; in skipWhitespace()
92 static bool isNewlineChar(char C) { return C == '\n' || C == '\r'; } in isNewlineChar() argument
95 static Cursor skipComment(Cursor C) { in skipComment() argument
96 if (C.peek() != ';') in skipComment()
97 return C; in skipComment()
98 while (!isNewlineChar(C.peek()) && !C.isEOF()) in skipComment()
99 C.advance(); in skipComment()
100 return C; in skipComment()
105 static Cursor skipMachineOperandComment(Cursor C) { in skipMachineOperandComment() argument
106 if (C.peek() != '/' || C.peek(1) != '*') in skipMachineOperandComment()
107 return C; in skipMachineOperandComment()
109 while (C.peek() != '*' || C.peek(1) != '/') in skipMachineOperandComment()
110 C.advance(); in skipMachineOperandComment()
112 C.advance(); in skipMachineOperandComment()
113 C.advance(); in skipMachineOperandComment()
114 return C; in skipMachineOperandComment()
119 static bool isIdentifierChar(char C) { in isIdentifierChar() argument
120 return isalpha(C) || isdigit(C) || C == '_' || C == '-' || C == '.' || in isIdentifierChar()
121 C == '$'; in isIdentifierChar()
129 Cursor C = Cursor(Value.substr(1, Value.size() - 2)); in unescapeQuotedString() local
132 Str.reserve(C.remaining().size()); in unescapeQuotedString()
133 while (!C.isEOF()) { in unescapeQuotedString()
134 char Char = C.peek(); in unescapeQuotedString()
136 if (C.peek(1) == '\\') { in unescapeQuotedString()
139 C.advance(2); in unescapeQuotedString()
142 if (isxdigit(C.peek(1)) && isxdigit(C.peek(2))) { in unescapeQuotedString()
143 Str += hexDigitValue(C.peek(1)) * 16 + hexDigitValue(C.peek(2)); in unescapeQuotedString()
144 C.advance(3); in unescapeQuotedString()
149 C.advance(); in unescapeQuotedString()
155 static Cursor lexStringConstant(Cursor C, ErrorCallbackType ErrorCallback) { in lexStringConstant() argument
156 assert(C.peek() == '"'); in lexStringConstant()
157 for (C.advance(); C.peek() != '"'; C.advance()) { in lexStringConstant()
158 if (C.isEOF() || isNewlineChar(C.peek())) { in lexStringConstant()
160 C.location(), in lexStringConstant()
165 C.advance(); in lexStringConstant()
166 return C; in lexStringConstant()
169 static Cursor lexName(Cursor C, MIToken &Token, MIToken::TokenKind Type, in lexName() argument
171 auto Range = C; in lexName()
172 C.advance(PrefixLength); in lexName()
173 if (C.peek() == '"') { in lexName()
174 if (Cursor R = lexStringConstant(C, ErrorCallback)) { in lexName()
184 while (isIdentifierChar(C.peek())) in lexName()
185 C.advance(); in lexName()
186 Token.reset(Type, Range.upto(C)) in lexName()
187 .setStringValue(Range.upto(C).drop_front(PrefixLength)); in lexName()
188 return C; in lexName()
281 static Cursor maybeLexIdentifier(Cursor C, MIToken &Token) { in maybeLexIdentifier() argument
282 if (!isalpha(C.peek()) && C.peek() != '_') in maybeLexIdentifier()
284 auto Range = C; in maybeLexIdentifier()
285 while (isIdentifierChar(C.peek())) in maybeLexIdentifier()
286 C.advance(); in maybeLexIdentifier()
287 auto Identifier = Range.upto(C); in maybeLexIdentifier()
290 return C; in maybeLexIdentifier()
293 static Cursor maybeLexMachineBasicBlock(Cursor C, MIToken &Token, in maybeLexMachineBasicBlock() argument
295 bool IsReference = C.remaining().startswith("%bb."); in maybeLexMachineBasicBlock()
296 if (!IsReference && !C.remaining().startswith("bb.")) in maybeLexMachineBasicBlock()
298 auto Range = C; in maybeLexMachineBasicBlock()
300 C.advance(PrefixLength); // Skip '%bb.' or 'bb.' in maybeLexMachineBasicBlock()
301 if (!isdigit(C.peek())) { in maybeLexMachineBasicBlock()
302 Token.reset(MIToken::Error, C.remaining()); in maybeLexMachineBasicBlock()
303 ErrorCallback(C.location(), "expected a number after '%bb.'"); in maybeLexMachineBasicBlock()
304 return C; in maybeLexMachineBasicBlock()
306 auto NumberRange = C; in maybeLexMachineBasicBlock()
307 while (isdigit(C.peek())) in maybeLexMachineBasicBlock()
308 C.advance(); in maybeLexMachineBasicBlock()
309 StringRef Number = NumberRange.upto(C); in maybeLexMachineBasicBlock()
314 if (C.peek() == '.') { in maybeLexMachineBasicBlock()
315 C.advance(); // Skip '.' in maybeLexMachineBasicBlock()
317 while (isIdentifierChar(C.peek())) in maybeLexMachineBasicBlock()
318 C.advance(); in maybeLexMachineBasicBlock()
322 Range.upto(C)) in maybeLexMachineBasicBlock()
324 .setStringValue(Range.upto(C).drop_front(StringOffset)); in maybeLexMachineBasicBlock()
325 return C; in maybeLexMachineBasicBlock()
328 static Cursor maybeLexIndex(Cursor C, MIToken &Token, StringRef Rule, in maybeLexIndex() argument
330 if (!C.remaining().startswith(Rule) || !isdigit(C.peek(Rule.size()))) in maybeLexIndex()
332 auto Range = C; in maybeLexIndex()
333 C.advance(Rule.size()); in maybeLexIndex()
334 auto NumberRange = C; in maybeLexIndex()
335 while (isdigit(C.peek())) in maybeLexIndex()
336 C.advance(); in maybeLexIndex()
337 Token.reset(Kind, Range.upto(C)).setIntegerValue(APSInt(NumberRange.upto(C))); in maybeLexIndex()
338 return C; in maybeLexIndex()
341 static Cursor maybeLexIndexAndName(Cursor C, MIToken &Token, StringRef Rule, in maybeLexIndexAndName() argument
343 if (!C.remaining().startswith(Rule) || !isdigit(C.peek(Rule.size()))) in maybeLexIndexAndName()
345 auto Range = C; in maybeLexIndexAndName()
346 C.advance(Rule.size()); in maybeLexIndexAndName()
347 auto NumberRange = C; in maybeLexIndexAndName()
348 while (isdigit(C.peek())) in maybeLexIndexAndName()
349 C.advance(); in maybeLexIndexAndName()
350 StringRef Number = NumberRange.upto(C); in maybeLexIndexAndName()
352 if (C.peek() == '.') { in maybeLexIndexAndName()
353 C.advance(); in maybeLexIndexAndName()
355 while (isIdentifierChar(C.peek())) in maybeLexIndexAndName()
356 C.advance(); in maybeLexIndexAndName()
358 Token.reset(Kind, Range.upto(C)) in maybeLexIndexAndName()
360 .setStringValue(Range.upto(C).drop_front(StringOffset)); in maybeLexIndexAndName()
361 return C; in maybeLexIndexAndName()
364 static Cursor maybeLexJumpTableIndex(Cursor C, MIToken &Token) { in maybeLexJumpTableIndex() argument
365 return maybeLexIndex(C, Token, "%jump-table.", MIToken::JumpTableIndex); in maybeLexJumpTableIndex()
368 static Cursor maybeLexStackObject(Cursor C, MIToken &Token) { in maybeLexStackObject() argument
369 return maybeLexIndexAndName(C, Token, "%stack.", MIToken::StackObject); in maybeLexStackObject()
372 static Cursor maybeLexFixedStackObject(Cursor C, MIToken &Token) { in maybeLexFixedStackObject() argument
373 return maybeLexIndex(C, Token, "%fixed-stack.", MIToken::FixedStackObject); in maybeLexFixedStackObject()
376 static Cursor maybeLexConstantPoolItem(Cursor C, MIToken &Token) { in maybeLexConstantPoolItem() argument
377 return maybeLexIndex(C, Token, "%const.", MIToken::ConstantPoolItem); in maybeLexConstantPoolItem()
380 static Cursor maybeLexSubRegisterIndex(Cursor C, MIToken &Token, in maybeLexSubRegisterIndex() argument
383 if (!C.remaining().startswith(Rule)) in maybeLexSubRegisterIndex()
385 return lexName(C, Token, MIToken::SubRegisterIndex, Rule.size(), in maybeLexSubRegisterIndex()
389 static Cursor maybeLexIRBlock(Cursor C, MIToken &Token, in maybeLexIRBlock() argument
392 if (!C.remaining().startswith(Rule)) in maybeLexIRBlock()
394 if (isdigit(C.peek(Rule.size()))) in maybeLexIRBlock()
395 return maybeLexIndex(C, Token, Rule, MIToken::IRBlock); in maybeLexIRBlock()
396 return lexName(C, Token, MIToken::NamedIRBlock, Rule.size(), ErrorCallback); in maybeLexIRBlock()
399 static Cursor maybeLexIRValue(Cursor C, MIToken &Token, in maybeLexIRValue() argument
402 if (!C.remaining().startswith(Rule)) in maybeLexIRValue()
404 if (isdigit(C.peek(Rule.size()))) in maybeLexIRValue()
405 return maybeLexIndex(C, Token, Rule, MIToken::IRValue); in maybeLexIRValue()
406 return lexName(C, Token, MIToken::NamedIRValue, Rule.size(), ErrorCallback); in maybeLexIRValue()
409 static Cursor maybeLexStringConstant(Cursor C, MIToken &Token, in maybeLexStringConstant() argument
411 if (C.peek() != '"') in maybeLexStringConstant()
413 return lexName(C, Token, MIToken::StringConstant, /*PrefixLength=*/0, in maybeLexStringConstant()
417 static Cursor lexVirtualRegister(Cursor C, MIToken &Token) { in lexVirtualRegister() argument
418 auto Range = C; in lexVirtualRegister()
419 C.advance(); // Skip '%' in lexVirtualRegister()
420 auto NumberRange = C; in lexVirtualRegister()
421 while (isdigit(C.peek())) in lexVirtualRegister()
422 C.advance(); in lexVirtualRegister()
423 Token.reset(MIToken::VirtualRegister, Range.upto(C)) in lexVirtualRegister()
424 .setIntegerValue(APSInt(NumberRange.upto(C))); in lexVirtualRegister()
425 return C; in lexVirtualRegister()
429 static bool isRegisterChar(char C) { in isRegisterChar() argument
430 return isIdentifierChar(C) && C != '.'; in isRegisterChar()
433 static Cursor lexNamedVirtualRegister(Cursor C, MIToken &Token) { in lexNamedVirtualRegister() argument
434 Cursor Range = C; in lexNamedVirtualRegister()
435 C.advance(); // Skip '%' in lexNamedVirtualRegister()
436 while (isRegisterChar(C.peek())) in lexNamedVirtualRegister()
437 C.advance(); in lexNamedVirtualRegister()
438 Token.reset(MIToken::NamedVirtualRegister, Range.upto(C)) in lexNamedVirtualRegister()
439 .setStringValue(Range.upto(C).drop_front(1)); // Drop the '%' in lexNamedVirtualRegister()
440 return C; in lexNamedVirtualRegister()
443 static Cursor maybeLexRegister(Cursor C, MIToken &Token, in maybeLexRegister() argument
445 if (C.peek() != '%' && C.peek() != '$') in maybeLexRegister()
448 if (C.peek() == '%') { in maybeLexRegister()
449 if (isdigit(C.peek(1))) in maybeLexRegister()
450 return lexVirtualRegister(C, Token); in maybeLexRegister()
452 if (isRegisterChar(C.peek(1))) in maybeLexRegister()
453 return lexNamedVirtualRegister(C, Token); in maybeLexRegister()
458 assert(C.peek() == '$'); in maybeLexRegister()
459 auto Range = C; in maybeLexRegister()
460 C.advance(); // Skip '$' in maybeLexRegister()
461 while (isRegisterChar(C.peek())) in maybeLexRegister()
462 C.advance(); in maybeLexRegister()
463 Token.reset(MIToken::NamedRegister, Range.upto(C)) in maybeLexRegister()
464 .setStringValue(Range.upto(C).drop_front(1)); // Drop the '$' in maybeLexRegister()
465 return C; in maybeLexRegister()
468 static Cursor maybeLexGlobalValue(Cursor C, MIToken &Token, in maybeLexGlobalValue() argument
470 if (C.peek() != '@') in maybeLexGlobalValue()
472 if (!isdigit(C.peek(1))) in maybeLexGlobalValue()
473 return lexName(C, Token, MIToken::NamedGlobalValue, /*PrefixLength=*/1, in maybeLexGlobalValue()
475 auto Range = C; in maybeLexGlobalValue()
476 C.advance(1); // Skip the '@' in maybeLexGlobalValue()
477 auto NumberRange = C; in maybeLexGlobalValue()
478 while (isdigit(C.peek())) in maybeLexGlobalValue()
479 C.advance(); in maybeLexGlobalValue()
480 Token.reset(MIToken::GlobalValue, Range.upto(C)) in maybeLexGlobalValue()
481 .setIntegerValue(APSInt(NumberRange.upto(C))); in maybeLexGlobalValue()
482 return C; in maybeLexGlobalValue()
485 static Cursor maybeLexExternalSymbol(Cursor C, MIToken &Token, in maybeLexExternalSymbol() argument
487 if (C.peek() != '&') in maybeLexExternalSymbol()
489 return lexName(C, Token, MIToken::ExternalSymbol, /*PrefixLength=*/1, in maybeLexExternalSymbol()
493 static Cursor maybeLexMCSymbol(Cursor C, MIToken &Token, in maybeLexMCSymbol() argument
496 if (!C.remaining().startswith(Rule)) in maybeLexMCSymbol()
498 auto Start = C; in maybeLexMCSymbol()
499 C.advance(Rule.size()); in maybeLexMCSymbol()
502 if (C.peek() != '"') { in maybeLexMCSymbol()
503 while (isIdentifierChar(C.peek())) in maybeLexMCSymbol()
504 C.advance(); in maybeLexMCSymbol()
505 StringRef String = Start.upto(C).drop_front(Rule.size()); in maybeLexMCSymbol()
506 if (C.peek() != '>') { in maybeLexMCSymbol()
507 ErrorCallback(C.location(), in maybeLexMCSymbol()
512 C.advance(); in maybeLexMCSymbol()
514 Token.reset(MIToken::MCSymbol, Start.upto(C)).setStringValue(String); in maybeLexMCSymbol()
515 return C; in maybeLexMCSymbol()
519 Cursor R = lexStringConstant(C, ErrorCallback); in maybeLexMCSymbol()
521 ErrorCallback(C.location(), in maybeLexMCSymbol()
540 static bool isValidHexFloatingPointPrefix(char C) { in isValidHexFloatingPointPrefix() argument
541 return C == 'H' || C == 'K' || C == 'L' || C == 'M' || C == 'R'; in isValidHexFloatingPointPrefix()
544 static Cursor lexFloatingPointLiteral(Cursor Range, Cursor C, MIToken &Token) { in lexFloatingPointLiteral() argument
545 C.advance(); in lexFloatingPointLiteral()
547 while (isdigit(C.peek())) in lexFloatingPointLiteral()
548 C.advance(); in lexFloatingPointLiteral()
549 if ((C.peek() == 'e' || C.peek() == 'E') && in lexFloatingPointLiteral()
550 (isdigit(C.peek(1)) || in lexFloatingPointLiteral()
551 ((C.peek(1) == '-' || C.peek(1) == '+') && isdigit(C.peek(2))))) { in lexFloatingPointLiteral()
552 C.advance(2); in lexFloatingPointLiteral()
553 while (isdigit(C.peek())) in lexFloatingPointLiteral()
554 C.advance(); in lexFloatingPointLiteral()
556 Token.reset(MIToken::FloatingPointLiteral, Range.upto(C)); in lexFloatingPointLiteral()
557 return C; in lexFloatingPointLiteral()
560 static Cursor maybeLexHexadecimalLiteral(Cursor C, MIToken &Token) { in maybeLexHexadecimalLiteral() argument
561 if (C.peek() != '0' || (C.peek(1) != 'x' && C.peek(1) != 'X')) in maybeLexHexadecimalLiteral()
563 Cursor Range = C; in maybeLexHexadecimalLiteral()
564 C.advance(2); in maybeLexHexadecimalLiteral()
566 if (isValidHexFloatingPointPrefix(C.peek())) { in maybeLexHexadecimalLiteral()
567 C.advance(); in maybeLexHexadecimalLiteral()
570 while (isxdigit(C.peek())) in maybeLexHexadecimalLiteral()
571 C.advance(); in maybeLexHexadecimalLiteral()
572 StringRef StrVal = Range.upto(C); in maybeLexHexadecimalLiteral()
576 Token.reset(MIToken::HexLiteral, Range.upto(C)); in maybeLexHexadecimalLiteral()
578 Token.reset(MIToken::FloatingPointLiteral, Range.upto(C)); in maybeLexHexadecimalLiteral()
579 return C; in maybeLexHexadecimalLiteral()
582 static Cursor maybeLexNumericalLiteral(Cursor C, MIToken &Token) { in maybeLexNumericalLiteral() argument
583 if (!isdigit(C.peek()) && (C.peek() != '-' || !isdigit(C.peek(1)))) in maybeLexNumericalLiteral()
585 auto Range = C; in maybeLexNumericalLiteral()
586 C.advance(); in maybeLexNumericalLiteral()
587 while (isdigit(C.peek())) in maybeLexNumericalLiteral()
588 C.advance(); in maybeLexNumericalLiteral()
589 if (C.peek() == '.') in maybeLexNumericalLiteral()
590 return lexFloatingPointLiteral(Range, C, Token); in maybeLexNumericalLiteral()
591 StringRef StrVal = Range.upto(C); in maybeLexNumericalLiteral()
593 return C; in maybeLexNumericalLiteral()
607 static Cursor maybeLexExclaim(Cursor C, MIToken &Token, in maybeLexExclaim() argument
609 if (C.peek() != '!') in maybeLexExclaim()
611 auto Range = C; in maybeLexExclaim()
612 C.advance(1); in maybeLexExclaim()
613 if (isdigit(C.peek()) || !isIdentifierChar(C.peek())) { in maybeLexExclaim()
614 Token.reset(MIToken::exclaim, Range.upto(C)); in maybeLexExclaim()
615 return C; in maybeLexExclaim()
617 while (isIdentifierChar(C.peek())) in maybeLexExclaim()
618 C.advance(); in maybeLexExclaim()
619 StringRef StrVal = Range.upto(C); in maybeLexExclaim()
624 return C; in maybeLexExclaim()
627 static MIToken::TokenKind symbolToken(char C) { in symbolToken() argument
628 switch (C) { in symbolToken()
658 static Cursor maybeLexSymbol(Cursor C, MIToken &Token) { in maybeLexSymbol() argument
661 if (C.peek() == ':' && C.peek(1) == ':') { in maybeLexSymbol()
665 Kind = symbolToken(C.peek()); in maybeLexSymbol()
668 auto Range = C; in maybeLexSymbol()
669 C.advance(Length); in maybeLexSymbol()
670 Token.reset(Kind, Range.upto(C)); in maybeLexSymbol()
671 return C; in maybeLexSymbol()
674 static Cursor maybeLexNewline(Cursor C, MIToken &Token) { in maybeLexNewline() argument
675 if (!isNewlineChar(C.peek())) in maybeLexNewline()
677 auto Range = C; in maybeLexNewline()
678 C.advance(); in maybeLexNewline()
679 Token.reset(MIToken::Newline, Range.upto(C)); in maybeLexNewline()
680 return C; in maybeLexNewline()
683 static Cursor maybeLexEscapedIRValue(Cursor C, MIToken &Token, in maybeLexEscapedIRValue() argument
685 if (C.peek() != '`') in maybeLexEscapedIRValue()
687 auto Range = C; in maybeLexEscapedIRValue()
688 C.advance(); in maybeLexEscapedIRValue()
689 auto StrRange = C; in maybeLexEscapedIRValue()
690 while (C.peek() != '`') { in maybeLexEscapedIRValue()
691 if (C.isEOF() || isNewlineChar(C.peek())) { in maybeLexEscapedIRValue()
693 C.location(), in maybeLexEscapedIRValue()
696 return C; in maybeLexEscapedIRValue()
698 C.advance(); in maybeLexEscapedIRValue()
700 StringRef Value = StrRange.upto(C); in maybeLexEscapedIRValue()
701 C.advance(); in maybeLexEscapedIRValue()
702 Token.reset(MIToken::QuotedIRValue, Range.upto(C)).setStringValue(Value); in maybeLexEscapedIRValue()
703 return C; in maybeLexEscapedIRValue()
708 auto C = skipComment(skipWhitespace(Cursor(Source))); in lexMIToken() local
709 if (C.isEOF()) { in lexMIToken()
710 Token.reset(MIToken::Eof, C.remaining()); in lexMIToken()
711 return C.remaining(); in lexMIToken()
714 C = skipMachineOperandComment(C); in lexMIToken()
716 if (Cursor R = maybeLexMachineBasicBlock(C, Token, ErrorCallback)) in lexMIToken()
718 if (Cursor R = maybeLexIdentifier(C, Token)) in lexMIToken()
720 if (Cursor R = maybeLexJumpTableIndex(C, Token)) in lexMIToken()
722 if (Cursor R = maybeLexStackObject(C, Token)) in lexMIToken()
724 if (Cursor R = maybeLexFixedStackObject(C, Token)) in lexMIToken()
726 if (Cursor R = maybeLexConstantPoolItem(C, Token)) in lexMIToken()
728 if (Cursor R = maybeLexSubRegisterIndex(C, Token, ErrorCallback)) in lexMIToken()
730 if (Cursor R = maybeLexIRBlock(C, Token, ErrorCallback)) in lexMIToken()
732 if (Cursor R = maybeLexIRValue(C, Token, ErrorCallback)) in lexMIToken()
734 if (Cursor R = maybeLexRegister(C, Token, ErrorCallback)) in lexMIToken()
736 if (Cursor R = maybeLexGlobalValue(C, Token, ErrorCallback)) in lexMIToken()
738 if (Cursor R = maybeLexExternalSymbol(C, Token, ErrorCallback)) in lexMIToken()
740 if (Cursor R = maybeLexMCSymbol(C, Token, ErrorCallback)) in lexMIToken()
742 if (Cursor R = maybeLexHexadecimalLiteral(C, Token)) in lexMIToken()
744 if (Cursor R = maybeLexNumericalLiteral(C, Token)) in lexMIToken()
746 if (Cursor R = maybeLexExclaim(C, Token, ErrorCallback)) in lexMIToken()
748 if (Cursor R = maybeLexSymbol(C, Token)) in lexMIToken()
750 if (Cursor R = maybeLexNewline(C, Token)) in lexMIToken()
752 if (Cursor R = maybeLexEscapedIRValue(C, Token, ErrorCallback)) in lexMIToken()
754 if (Cursor R = maybeLexStringConstant(C, Token, ErrorCallback)) in lexMIToken()
757 Token.reset(MIToken::Error, C.remaining()); in lexMIToken()
758 ErrorCallback(C.location(), in lexMIToken()
759 Twine("unexpected character '") + Twine(C.peek()) + "'"); in lexMIToken()
760 return C.remaining(); in lexMIToken()