Lines Matching refs:First

57   LLVM_NODISCARD IdInfo lexIdentifier(const char *First, const char *const End);
58 LLVM_NODISCARD bool isNextIdentifier(StringRef Id, const char *&First,
60 LLVM_NODISCARD bool minimizeImpl(const char *First, const char *const End);
61 LLVM_NODISCARD bool lexPPLine(const char *&First, const char *const End);
62 LLVM_NODISCARD bool lexAt(const char *&First, const char *const End);
63 LLVM_NODISCARD bool lexModule(const char *&First, const char *const End);
64 LLVM_NODISCARD bool lexDefine(const char *&First, const char *const End);
65 LLVM_NODISCARD bool lexPragma(const char *&First, const char *const End);
66 LLVM_NODISCARD bool lexEndif(const char *&First, const char *const End);
68 const char *&First, const char *const End);
84 Minimizer &append(const char *First, const char *Last) { in append()
85 Out.append(First, Last); in append()
89 void printToNewline(const char *&First, const char *const End);
90 void printAdjacentModuleNameParts(const char *&First, const char *const End);
91 LLVM_NODISCARD bool printAtImportBody(const char *&First,
93 void printDirectiveBody(const char *&First, const char *const End);
94 void printAdjacentMacroArgs(const char *&First, const char *const End);
95 LLVM_NODISCARD bool printMacroArgs(const char *&First, const char *const End);
117 static void skipOverSpaces(const char *&First, const char *const End) { in skipOverSpaces() argument
118 while (First != End && isHorizontalWhitespace(*First)) in skipOverSpaces()
119 ++First; in skipOverSpaces()
122 LLVM_NODISCARD static bool isRawStringLiteral(const char *First, in isRawStringLiteral() argument
124 assert(First <= Current); in isRawStringLiteral()
127 if (*Current != '"' || First == Current) in isRawStringLiteral()
134 if (First == Current || !isIdentifierBody(*--Current)) in isRawStringLiteral()
139 return First == Current || !isIdentifierBody(*--Current); in isRawStringLiteral()
142 if (*Current != '8' || First == Current || *Current-- != 'u') in isRawStringLiteral()
144 return First == Current || !isIdentifierBody(*--Current); in isRawStringLiteral()
147 static void skipRawString(const char *&First, const char *const End) { in skipRawString() argument
148 assert(First[0] == '"'); in skipRawString()
149 assert(First[-1] == 'R'); in skipRawString()
151 const char *Last = ++First; in skipRawString()
155 First = Last; // Hit the end... just give up. in skipRawString()
159 StringRef Terminator(First, Last - First); in skipRawString()
162 First = Last; in skipRawString()
163 while (First != End && *First != ')') in skipRawString()
164 ++First; in skipRawString()
165 if (First == End) in skipRawString()
167 ++First; in skipRawString()
170 Last = First; in skipRawString()
171 while (Last != End && size_t(Last - First) < Terminator.size() && in skipRawString()
172 Terminator[Last - First] == *Last) in skipRawString()
177 First = Last; in skipRawString()
180 if (size_t(Last - First) < Terminator.size()) in skipRawString()
184 First = Last + 1; in skipRawString()
190 static unsigned isEOL(const char *First, const char *const End) { in isEOL() argument
191 if (First == End) in isEOL()
193 if (End - First > 1 && isVerticalWhitespace(First[0]) && in isEOL()
194 isVerticalWhitespace(First[1]) && First[0] != First[1]) in isEOL()
196 return !!isVerticalWhitespace(First[0]); in isEOL()
199 static void skipString(const char *&First, const char *const End) { in skipString() argument
200 assert(*First == '\'' || *First == '"' || *First == '<'); in skipString()
201 const char Terminator = *First == '<' ? '>' : *First; in skipString()
202 for (++First; First != End && *First != Terminator; ++First) { in skipString()
204 if (isVerticalWhitespace(*First)) in skipString()
206 if (*First != '\\') in skipString()
211 if (++First == End) in skipString()
213 if (!isWhitespace(*First)) in skipString()
216 const char *FirstAfterBackslashPastSpace = First; in skipString()
221 First = FirstAfterBackslashPastSpace + NLSize - 1; in skipString()
224 if (First != End) in skipString()
225 ++First; // Finish off the string. in skipString()
229 static unsigned skipNewline(const char *&First, const char *End) { in skipNewline() argument
230 if (First == End) in skipNewline()
232 assert(isVerticalWhitespace(*First)); in skipNewline()
233 unsigned Len = isEOL(First, End); in skipNewline()
235 First += Len; in skipNewline()
239 static bool wasLineContinuation(const char *First, unsigned EOLLen) { in wasLineContinuation() argument
240 return *(First - (int)EOLLen - 1) == '\\'; in wasLineContinuation()
243 static void skipToNewlineRaw(const char *&First, const char *const End) { in skipToNewlineRaw() argument
245 if (First == End) in skipToNewlineRaw()
248 unsigned Len = isEOL(First, End); in skipToNewlineRaw()
253 if (++First == End) in skipToNewlineRaw()
255 Len = isEOL(First, End); in skipToNewlineRaw()
258 if (First[-1] != '\\') in skipToNewlineRaw()
261 First += Len; in skipToNewlineRaw()
266 static const char *findLastNonSpace(const char *First, const char *Last) { in findLastNonSpace() argument
267 assert(First <= Last); in findLastNonSpace()
268 while (First != Last && isHorizontalWhitespace(Last[-1])) in findLastNonSpace()
273 static const char *findFirstTrailingSpace(const char *First, in findFirstTrailingSpace() argument
275 const char *LastNonSpace = findLastNonSpace(First, Last); in findFirstTrailingSpace()
282 static void skipLineComment(const char *&First, const char *const End) { in skipLineComment() argument
283 assert(First[0] == '/' && First[1] == '/'); in skipLineComment()
284 First += 2; in skipLineComment()
285 skipToNewlineRaw(First, End); in skipLineComment()
288 static void skipBlockComment(const char *&First, const char *const End) { in skipBlockComment() argument
289 assert(First[0] == '/' && First[1] == '*'); in skipBlockComment()
290 if (End - First < 4) { in skipBlockComment()
291 First = End; in skipBlockComment()
294 for (First += 3; First != End; ++First) in skipBlockComment()
295 if (First[-1] == '*' && First[0] == '/') { in skipBlockComment()
296 ++First; in skipBlockComment()
325 static void skipLine(const char *&First, const char *const End) { in skipLine() argument
327 assert(First <= End); in skipLine()
328 if (First == End) in skipLine()
331 if (isVerticalWhitespace(*First)) { in skipLine()
332 skipNewline(First, End); in skipLine()
335 const char *Start = First; in skipLine()
336 while (First != End && !isVerticalWhitespace(*First)) { in skipLine()
338 if (*First == '"' || in skipLine()
339 (*First == '\'' && !isQuoteCppDigitSeparator(Start, First, End))) { in skipLine()
340 if (isRawStringLiteral(Start, First)) in skipLine()
341 skipRawString(First, End); in skipLine()
343 skipString(First, End); in skipLine()
348 if (*First != '/' || End - First < 2) { in skipLine()
349 ++First; in skipLine()
353 if (First[1] == '/') { in skipLine()
355 skipLineComment(First, End); in skipLine()
359 if (First[1] != '*') { in skipLine()
360 ++First; in skipLine()
365 skipBlockComment(First, End); in skipLine()
367 if (First == End) in skipLine()
371 unsigned Len = skipNewline(First, End); in skipLine()
372 if (!wasLineContinuation(First, Len)) // Continue past line-continuations. in skipLine()
377 static void skipDirective(StringRef Name, const char *&First, in skipDirective() argument
384 skipToNewlineRaw(First, End); in skipDirective()
386 skipLine(First, End); in skipDirective()
389 void Minimizer::printToNewline(const char *&First, const char *const End) { in printToNewline() argument
390 while (First != End && !isVerticalWhitespace(*First)) { in printToNewline()
391 const char *Last = First; in printToNewline()
396 if (LLVM_UNLIKELY(isRawStringLiteral(First, Last))) in printToNewline()
413 append(First, findFirstTrailingSpace(First, Last)); in printToNewline()
414 First = Last; in printToNewline()
417 skipLineComment(First, End); in printToNewline()
422 skipBlockComment(First, End); in printToNewline()
423 skipOverSpaces(First, End); in printToNewline()
424 Last = First; in printToNewline()
428 const char *LastBeforeTrailingSpace = findLastNonSpace(First, Last); in printToNewline()
429 if (Last == End || LastBeforeTrailingSpace == First || in printToNewline()
431 append(First, LastBeforeTrailingSpace); in printToNewline()
432 First = Last; in printToNewline()
433 skipNewline(First, End); in printToNewline()
440 append(First, findFirstTrailingSpace( in printToNewline()
441 First, LastBeforeTrailingSpace - 1)); in printToNewline()
443 First = Last; in printToNewline()
444 skipNewline(First, End); in printToNewline()
445 skipOverSpaces(First, End); in printToNewline()
449 static void skipWhitespace(const char *&First, const char *const End) { in skipWhitespace() argument
451 assert(First <= End); in skipWhitespace()
452 skipOverSpaces(First, End); in skipWhitespace()
454 if (End - First < 2) in skipWhitespace()
457 if (First[0] == '\\' && isVerticalWhitespace(First[1])) { in skipWhitespace()
458 skipNewline(++First, End); in skipWhitespace()
463 if (First[0] != '/') in skipWhitespace()
467 if (First[1] == '/') { in skipWhitespace()
468 skipLineComment(First, End); in skipWhitespace()
473 if (First[1] != '*') in skipWhitespace()
477 skipBlockComment(First, End); in skipWhitespace()
481 void Minimizer::printAdjacentModuleNameParts(const char *&First, in printAdjacentModuleNameParts() argument
484 const char *Last = First; in printAdjacentModuleNameParts()
488 append(First, Last); in printAdjacentModuleNameParts()
489 First = Last; in printAdjacentModuleNameParts()
492 bool Minimizer::printAtImportBody(const char *&First, const char *const End) { in printAtImportBody() argument
494 skipWhitespace(First, End); in printAtImportBody()
495 if (First == End) in printAtImportBody()
498 if (isVerticalWhitespace(*First)) { in printAtImportBody()
499 skipNewline(First, End); in printAtImportBody()
504 if (*First == ';') { in printAtImportBody()
505 put(*First++).put('\n'); in printAtImportBody()
510 if (!isIdentifierBody(*First) && *First != '.') in printAtImportBody()
513 printAdjacentModuleNameParts(First, End); in printAtImportBody()
517 void Minimizer::printDirectiveBody(const char *&First, const char *const End) { in printDirectiveBody() argument
518 skipWhitespace(First, End); // Skip initial whitespace. in printDirectiveBody()
519 printToNewline(First, End); in printDirectiveBody()
525 LLVM_NODISCARD static const char *lexRawIdentifier(const char *First, in lexRawIdentifier() argument
527 assert(isIdentifierBody(*First) && "invalid identifer"); in lexRawIdentifier()
528 const char *Last = First + 1; in lexRawIdentifier()
535 getIdentifierContinuation(const char *First, const char *const End) { in getIdentifierContinuation() argument
536 if (End - First < 3 || First[0] != '\\' || !isVerticalWhitespace(First[1])) in getIdentifierContinuation()
539 ++First; in getIdentifierContinuation()
540 skipNewline(First, End); in getIdentifierContinuation()
541 if (First == End) in getIdentifierContinuation()
543 return isIdentifierBody(First[0]) ? First : nullptr; in getIdentifierContinuation()
546 Minimizer::IdInfo Minimizer::lexIdentifier(const char *First, in lexIdentifier() argument
548 const char *Last = lexRawIdentifier(First, End); in lexIdentifier()
551 return IdInfo{Last, StringRef(First, Last - First)}; in lexIdentifier()
554 SmallVector<char, 64> Id(First, Last); in lexIdentifier()
565 void Minimizer::printAdjacentMacroArgs(const char *&First, in printAdjacentMacroArgs() argument
568 const char *Last = First; in printAdjacentMacroArgs()
573 append(First, Last); in printAdjacentMacroArgs()
574 First = Last; in printAdjacentMacroArgs()
577 bool Minimizer::printMacroArgs(const char *&First, const char *const End) { in printMacroArgs() argument
578 assert(*First == '('); in printMacroArgs()
579 put(*First++); in printMacroArgs()
581 skipWhitespace(First, End); in printMacroArgs()
582 if (First == End) in printMacroArgs()
585 if (*First == ')') { in printMacroArgs()
586 put(*First++); in printMacroArgs()
591 if (!(isIdentifierBody(*First) || *First == '.' || *First == ',')) in printMacroArgs()
594 printAdjacentMacroArgs(First, End); in printMacroArgs()
602 bool Minimizer::isNextIdentifier(StringRef Id, const char *&First, in isNextIdentifier() argument
604 skipWhitespace(First, End); in isNextIdentifier()
605 if (First == End || !isIdentifierHead(*First)) in isNextIdentifier()
608 IdInfo FoundId = lexIdentifier(First, End); in isNextIdentifier()
609 First = FoundId.Last; in isNextIdentifier()
613 bool Minimizer::lexAt(const char *&First, const char *const End) { in lexAt() argument
615 const char *ImportLoc = First++; in lexAt()
616 if (!isNextIdentifier("import", First, End)) { in lexAt()
617 skipLine(First, End); in lexAt()
622 if (printAtImportBody(First, End)) in lexAt()
625 skipWhitespace(First, End); in lexAt()
626 if (First == End) in lexAt()
628 if (!isVerticalWhitespace(*First)) in lexAt()
631 skipNewline(First, End); in lexAt()
635 bool Minimizer::lexModule(const char *&First, const char *const End) { in lexModule() argument
636 IdInfo Id = lexIdentifier(First, End); in lexModule()
637 First = Id.Last; in lexModule()
641 skipWhitespace(First, End); in lexModule()
642 if (!isIdentifierBody(*First)) { in lexModule()
643 skipLine(First, End); in lexModule()
646 Id = lexIdentifier(First, End); in lexModule()
647 First = Id.Last; in lexModule()
651 skipLine(First, End); in lexModule()
655 skipWhitespace(First, End); in lexModule()
660 switch (*First) { in lexModule()
666 if (!isIdentifierBody(*First)) { in lexModule()
667 skipLine(First, End); in lexModule()
683 printToNewline(First, End); in lexModule()
688 bool Minimizer::lexDefine(const char *&First, const char *const End) { in lexDefine() argument
691 skipWhitespace(First, End); in lexDefine()
693 if (!isIdentifierHead(*First)) in lexDefine()
694 return reportError(First, diag::err_pp_macro_not_identifier); in lexDefine()
696 IdInfo Id = lexIdentifier(First, End); in lexDefine()
718 First = Last; in lexDefine()
722 bool Minimizer::lexPragma(const char *&First, const char *const End) { in lexPragma() argument
724 skipWhitespace(First, End); in lexPragma()
725 if (First == End || !isIdentifierHead(*First)) in lexPragma()
728 IdInfo FoundId = lexIdentifier(First, End); in lexPragma()
729 First = FoundId.Last; in lexPragma()
732 skipLine(First, End); in lexPragma()
739 skipLine(First, End); in lexPragma()
744 if (!isNextIdentifier("module", First, End)) { in lexPragma()
745 skipLine(First, End); in lexPragma()
750 if (!isNextIdentifier("import", First, End)) { in lexPragma()
751 skipLine(First, End); in lexPragma()
758 printDirectiveBody(First, End); in lexPragma()
762 bool Minimizer::lexEndif(const char *&First, const char *const End) { in lexEndif() argument
775 skipLine(First, End); in lexEndif()
779 return lexDefault(pp_endif, "endif", First, End); in lexEndif()
783 const char *&First, const char *const End) { in lexDefault() argument
786 printDirectiveBody(First, End); in lexDefault()
790 static bool isStartOfRelevantLine(char First) { in isStartOfRelevantLine() argument
791 switch (First) { in isStartOfRelevantLine()
802 bool Minimizer::lexPPLine(const char *&First, const char *const End) { in lexPPLine() argument
803 assert(First != End); in lexPPLine()
805 skipWhitespace(First, End); in lexPPLine()
806 assert(First <= End); in lexPPLine()
807 if (First == End) in lexPPLine()
810 if (!isStartOfRelevantLine(*First)) { in lexPPLine()
811 skipLine(First, End); in lexPPLine()
812 assert(First <= End); in lexPPLine()
817 if (*First == '@') in lexPPLine()
818 return lexAt(First, End); in lexPPLine()
820 if (*First == 'i' || *First == 'e' || *First == 'm') in lexPPLine()
821 return lexModule(First, End); in lexPPLine()
824 ++First; // Skip over '#'. in lexPPLine()
825 skipWhitespace(First, End); in lexPPLine()
827 if (First == End) in lexPPLine()
828 return reportError(First, diag::err_pp_expected_eol); in lexPPLine()
830 if (!isIdentifierHead(*First)) { in lexPPLine()
831 skipLine(First, End); in lexPPLine()
836 IdInfo Id = lexIdentifier(First, End); in lexPPLine()
837 First = Id.Last; in lexPPLine()
854 skipDirective(Id.Name, First, End); in lexPPLine()
859 return lexEndif(First, End); in lexPPLine()
862 return lexDefine(First, End); in lexPPLine()
865 return lexPragma(First, End); in lexPPLine()
868 return lexDefault(Kind, Id.Name, First, End); in lexPPLine()
871 static void skipUTF8ByteOrderMark(const char *&First, const char *const End) { in skipUTF8ByteOrderMark() argument
872 if ((End - First) >= 3 && First[0] == '\xef' && First[1] == '\xbb' && in skipUTF8ByteOrderMark()
873 First[2] == '\xbf') in skipUTF8ByteOrderMark()
874 First += 3; in skipUTF8ByteOrderMark()
877 bool Minimizer::minimizeImpl(const char *First, const char *const End) { in minimizeImpl() argument
878 skipUTF8ByteOrderMark(First, End); in minimizeImpl()
879 while (First != End) in minimizeImpl()
880 if (lexPPLine(First, End)) in minimizeImpl()