Skip to content

Commit 4093192

Browse files
committed
Speed up directive matching by not using getSpelling(), and not copying std::strings
around. llvm-svn: 38563
1 parent c899718 commit 4093192

File tree

1 file changed

+22
-22
lines changed

1 file changed

+22
-22
lines changed

clang/Lex/Preprocessor.cpp

+22-22
Original file line numberDiff line numberDiff line change
@@ -810,40 +810,40 @@ void Preprocessor::HandleDirective(LexerToken &Result) {
810810
case tok::kw_if:
811811
return HandleIfDirective(Result);
812812
case tok::identifier:
813-
// Strip out trigraphs and embedded newlines.
814-
std::string Directive = getSpelling(Result);
813+
// Get the identifier name without trigraphs or embedded newlines.
814+
const char *Directive = Result.getIdentifierInfo()->getName();
815815
bool isExtension = false;
816-
switch (Directive.size()) {
816+
switch (Result.getIdentifierInfo()->getNameLength()) {
817817
case 4:
818-
if (Directive == "line")
818+
if (Directive[0] == 'l' && !strcmp(Directive, "line"))
819819
;
820-
if (Directive == "elif")
820+
if (Directive[0] == 'e' && !strcmp(Directive, "elif"))
821821
return HandleElifDirective(Result);
822-
if (Directive == "sccs") {
822+
if (Directive[0] == 's' && !strcmp(Directive, "sccs")) {
823823
isExtension = true;
824824
// SCCS is the same as #ident.
825825
}
826826
break;
827827
case 5:
828-
if (Directive == "endif")
828+
if (Directive[0] == 'e' && !strcmp(Directive, "endif"))
829829
return HandleEndifDirective(Result);
830-
if (Directive == "ifdef")
830+
if (Directive[0] == 'i' && !strcmp(Directive, "ifdef"))
831831
return HandleIfdefDirective(Result, false);
832-
if (Directive == "undef")
832+
if (Directive[0] == 'u' && !strcmp(Directive, "undef"))
833833
return HandleUndefDirective(Result);
834-
if (Directive == "error")
834+
if (Directive[0] == 'e' && !strcmp(Directive, "error"))
835835
return HandleUserDiagnosticDirective(Result, false);
836-
if (Directive == "ident")
836+
if (Directive[0] == 'i' && !strcmp(Directive, "ident"))
837837
isExtension = true;
838838
break;
839839
case 6:
840-
if (Directive == "define")
840+
if (Directive[0] == 'd' && !strcmp(Directive, "define"))
841841
return HandleDefineDirective(Result);
842-
if (Directive == "ifndef")
842+
if (Directive[0] == 'i' && !strcmp(Directive, "ifndef"))
843843
return HandleIfdefDirective(Result, true);
844-
if (Directive == "import")
844+
if (Directive[0] == 'i' && !strcmp(Directive, "import"))
845845
return HandleImportDirective(Result);
846-
if (Directive == "pragma") {
846+
if (Directive[0] == 'p' && !strcmp(Directive, "pragma")) {
847847
// FIXME: implement #pragma
848848
++NumPragma;
849849
#if 1
@@ -854,26 +854,26 @@ void Preprocessor::HandleDirective(LexerToken &Result) {
854854

855855
return;
856856
#endif
857-
} else if (Directive == "assert") {
857+
} else if (Directive[0] == 'a' && !strcmp(Directive, "assert")) {
858858
isExtension = true;
859859
}
860860
break;
861861
case 7:
862-
if (Directive == "include") // Handle #include.
863-
return HandleIncludeDirective(Result);
864-
if (Directive == "warning") {
862+
if (Directive[0] == 'i' && !strcmp(Directive, "include"))
863+
return HandleIncludeDirective(Result); // Handle #include.
864+
if (Directive[0] == 'w' && !strcmp(Directive, "warning")) {
865865
Diag(Result, diag::ext_pp_warning_directive);
866866
return HandleUserDiagnosticDirective(Result, true);
867867
}
868868
break;
869869
case 8:
870-
if (Directive == "unassert") {
870+
if (Directive[0] == 'u' && !strcmp(Directive, "unassert")) {
871871
isExtension = true;
872872
}
873873
break;
874874
case 12:
875-
if (Directive == "include_next") // Handle #include_next.
876-
return HandleIncludeNextDirective(Result);
875+
if (Directive[0] == 'i' && !strcmp(Directive, "include_next"))
876+
return HandleIncludeNextDirective(Result); // Handle #include_next.
877877
break;
878878
}
879879
break;

0 commit comments

Comments
 (0)