Author: rsmith Date: Tue Jun 30 20:51:38 2015 New Revision: 241135 URL: http://llvm.org/viewvc/llvm-project?rev=241135&view=rev Log: [modules] Make the include guard optimization fire a bit more when considering re-entering a modular header.
When we do the include guard check, we're in the visibility state for the file with the #include; the include guard may not be visible there, but we don't actually need it to be: if we've already parsed the submodule we're considering entering, it's always safe to skip it. Modified: cfe/trunk/include/clang/Lex/HeaderSearch.h cfe/trunk/lib/Lex/HeaderSearch.cpp cfe/trunk/lib/Lex/PPDirectives.cpp Modified: cfe/trunk/include/clang/Lex/HeaderSearch.h URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Lex/HeaderSearch.h?rev=241135&r1=241134&r2=241135&view=diff ============================================================================== --- cfe/trunk/include/clang/Lex/HeaderSearch.h (original) +++ cfe/trunk/include/clang/Lex/HeaderSearch.h Tue Jun 30 20:51:38 2015 @@ -421,7 +421,7 @@ public: /// \return false if \#including the file will have no effect or true /// if we should include it. bool ShouldEnterIncludeFile(Preprocessor &PP, const FileEntry *File, - bool isImport); + bool isImport, Module *CorrespondingModule); /// \brief Return whether the specified file is a normal header, /// a system header, or a C++ friendly system header. Modified: cfe/trunk/lib/Lex/HeaderSearch.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Lex/HeaderSearch.cpp?rev=241135&r1=241134&r2=241135&view=diff ============================================================================== --- cfe/trunk/lib/Lex/HeaderSearch.cpp (original) +++ cfe/trunk/lib/Lex/HeaderSearch.cpp Tue Jun 30 20:51:38 2015 @@ -1025,7 +1025,7 @@ void HeaderSearch::MarkFileModuleHeader( bool HeaderSearch::ShouldEnterIncludeFile(Preprocessor &PP, const FileEntry *File, - bool isImport) { + bool isImport, Module *M) { ++NumIncluded; // Count # of attempted #includes. // Get information about this file. @@ -1050,7 +1050,11 @@ bool HeaderSearch::ShouldEnterIncludeFil // if the macro that guards it is defined, we know the #include has no effect. if (const IdentifierInfo *ControllingMacro = FileInfo.getControllingMacro(ExternalLookup)) - if (PP.isMacroDefined(ControllingMacro)) { + // If the include file is part of a module, and we already know what its + // controlling macro is, then we've already parsed it and can safely just + // make it visible. This saves us needing to switch into the visibility + // state of the module just to check whether the macro is defined within it. + if (M || PP.isMacroDefined(ControllingMacro)) { ++NumMultiIncludeFileOptzn; return false; } Modified: cfe/trunk/lib/Lex/PPDirectives.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Lex/PPDirectives.cpp?rev=241135&r1=241134&r2=241135&view=diff ============================================================================== --- cfe/trunk/lib/Lex/PPDirectives.cpp (original) +++ cfe/trunk/lib/Lex/PPDirectives.cpp Tue Jun 30 20:51:38 2015 @@ -1749,7 +1749,8 @@ void Preprocessor::HandleIncludeDirectiv // Ask HeaderInfo if we should enter this #include file. If not, #including // this file will have no effect. if (ShouldEnter && - !HeaderInfo.ShouldEnterIncludeFile(*this, File, isImport)) { + !HeaderInfo.ShouldEnterIncludeFile(*this, File, isImport, + SuggestedModule.getModule())) { ShouldEnter = false; if (Callbacks) Callbacks->FileSkipped(*File, FilenameTok, FileCharacter); _______________________________________________ cfe-commits mailing list cfe-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits