forked from OSchip/llvm-project
[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. llvm-svn: 241135
This commit is contained in:
parent
2374a7cba8
commit
035f6dc9d1
|
@ -421,7 +421,7 @@ public:
|
||||||
/// \return false if \#including the file will have no effect or true
|
/// \return false if \#including the file will have no effect or true
|
||||||
/// if we should include it.
|
/// if we should include it.
|
||||||
bool ShouldEnterIncludeFile(Preprocessor &PP, const FileEntry *File,
|
bool ShouldEnterIncludeFile(Preprocessor &PP, const FileEntry *File,
|
||||||
bool isImport);
|
bool isImport, Module *CorrespondingModule);
|
||||||
|
|
||||||
/// \brief Return whether the specified file is a normal header,
|
/// \brief Return whether the specified file is a normal header,
|
||||||
/// a system header, or a C++ friendly system header.
|
/// a system header, or a C++ friendly system header.
|
||||||
|
|
|
@ -1025,7 +1025,7 @@ void HeaderSearch::MarkFileModuleHeader(const FileEntry *FE,
|
||||||
|
|
||||||
bool HeaderSearch::ShouldEnterIncludeFile(Preprocessor &PP,
|
bool HeaderSearch::ShouldEnterIncludeFile(Preprocessor &PP,
|
||||||
const FileEntry *File,
|
const FileEntry *File,
|
||||||
bool isImport) {
|
bool isImport, Module *M) {
|
||||||
++NumIncluded; // Count # of attempted #includes.
|
++NumIncluded; // Count # of attempted #includes.
|
||||||
|
|
||||||
// Get information about this file.
|
// Get information about this file.
|
||||||
|
@ -1050,7 +1050,11 @@ bool HeaderSearch::ShouldEnterIncludeFile(Preprocessor &PP,
|
||||||
// if the macro that guards it is defined, we know the #include has no effect.
|
// if the macro that guards it is defined, we know the #include has no effect.
|
||||||
if (const IdentifierInfo *ControllingMacro
|
if (const IdentifierInfo *ControllingMacro
|
||||||
= FileInfo.getControllingMacro(ExternalLookup))
|
= 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;
|
++NumMultiIncludeFileOptzn;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1749,7 +1749,8 @@ void Preprocessor::HandleIncludeDirective(SourceLocation HashLoc,
|
||||||
// Ask HeaderInfo if we should enter this #include file. If not, #including
|
// Ask HeaderInfo if we should enter this #include file. If not, #including
|
||||||
// this file will have no effect.
|
// this file will have no effect.
|
||||||
if (ShouldEnter &&
|
if (ShouldEnter &&
|
||||||
!HeaderInfo.ShouldEnterIncludeFile(*this, File, isImport)) {
|
!HeaderInfo.ShouldEnterIncludeFile(*this, File, isImport,
|
||||||
|
SuggestedModule.getModule())) {
|
||||||
ShouldEnter = false;
|
ShouldEnter = false;
|
||||||
if (Callbacks)
|
if (Callbacks)
|
||||||
Callbacks->FileSkipped(*File, FilenameTok, FileCharacter);
|
Callbacks->FileSkipped(*File, FilenameTok, FileCharacter);
|
||||||
|
|
Loading…
Reference in New Issue