aboutsummaryrefslogtreecommitdiff
path: root/lib/Lex/HeaderSearch.cpp
diff options
context:
space:
mode:
authorDouglas Gregor <dgregor@apple.com>2011-11-12 00:22:19 +0000
committerDouglas Gregor <dgregor@apple.com>2011-11-12 00:22:19 +0000
commit26697979fb0a4e2b720a0c8d062047edca92bc92 (patch)
tree50a98d8479c77f278208e5a6196b53a822c5f94d /lib/Lex/HeaderSearch.cpp
parentcf70d7873fe3098bdac72e7628f4e832d14d5143 (diff)
Implement a minor optimization when loading module maps to satisfy a
module import: don't re-check for a loaded module unless we've actually loaded a new module map file. Already-loaded module map files aren't interesting. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@144435 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Lex/HeaderSearch.cpp')
-rw-r--r--lib/Lex/HeaderSearch.cpp36
1 files changed, 22 insertions, 14 deletions
diff --git a/lib/Lex/HeaderSearch.cpp b/lib/Lex/HeaderSearch.cpp
index 3e4a1d32a0..9d36f97335 100644
--- a/lib/Lex/HeaderSearch.cpp
+++ b/lib/Lex/HeaderSearch.cpp
@@ -137,22 +137,22 @@ const FileEntry *HeaderSearch::lookupModule(StringRef ModuleName,
if (!SearchDirs[Idx].isNormalDir())
continue;
- // Search for a module map in this directory, if we haven't already
- // looked there.
- if (!loadModuleMapFile(SearchDirs[Idx].getDir())) {
- // If we found a module map, look for the module again.
+ // Search for a module map file in this directory.
+ if (loadModuleMapFile(SearchDirs[Idx].getDir()) == LMM_NewlyLoaded) {
+ // We just loaded a module map file; check whether the module is
+ // available now.
Module = ModMap.findModule(ModuleName);
if (Module)
break;
}
-
+
// Search for a module map in a subdirectory with the same name as the
// module.
llvm::SmallString<128> NestedModuleMapDirName;
NestedModuleMapDirName = SearchDirs[Idx].getDir()->getName();
llvm::sys::path::append(NestedModuleMapDirName, ModuleName);
- if (!loadModuleMapFile(NestedModuleMapDirName)) {
- // If we found a module map, look for the module again.
+ if (loadModuleMapFile(NestedModuleMapDirName) == LMM_NewlyLoaded) {
+ // If we just loaded a module map file, look for the module again.
Module = ModMap.findModule(ModuleName);
if (Module)
break;
@@ -766,13 +766,19 @@ bool HeaderSearch::hasModuleMap(StringRef FileName,
return false;
// Try to load the module map file in this directory.
- if (!loadModuleMapFile(Dir)) {
+ switch (loadModuleMapFile(Dir)) {
+ case LMM_NewlyLoaded:
+ case LMM_AlreadyLoaded:
// Success. All of the directories we stepped through inherit this module
// map file.
for (unsigned I = 0, N = FixUpDirectories.size(); I != N; ++I)
DirectoryHasModuleMap[FixUpDirectories[I]] = true;
return true;
+
+ case LMM_NoDirectory:
+ case LMM_InvalidModuleMap:
+ break;
}
// If we hit the top of our search, we're done.
@@ -794,18 +800,20 @@ StringRef HeaderSearch::findModuleForHeader(const FileEntry *File) {
return StringRef();
}
-bool HeaderSearch::loadModuleMapFile(StringRef DirName) {
+HeaderSearch::LoadModuleMapResult
+HeaderSearch::loadModuleMapFile(StringRef DirName) {
if (const DirectoryEntry *Dir = FileMgr.getDirectory(DirName))
return loadModuleMapFile(Dir);
- return true;
+ return LMM_NoDirectory;
}
-bool HeaderSearch::loadModuleMapFile(const DirectoryEntry *Dir) {
+HeaderSearch::LoadModuleMapResult
+HeaderSearch::loadModuleMapFile(const DirectoryEntry *Dir) {
llvm::DenseMap<const DirectoryEntry *, bool>::iterator KnownDir
= DirectoryHasModuleMap.find(Dir);
if (KnownDir != DirectoryHasModuleMap.end())
- return !KnownDir->second;
+ return KnownDir->second? LMM_AlreadyLoaded : LMM_InvalidModuleMap;
llvm::SmallString<128> ModuleMapFileName;
ModuleMapFileName += Dir->getName();
@@ -816,12 +824,12 @@ bool HeaderSearch::loadModuleMapFile(const DirectoryEntry *Dir) {
// This directory has a module map.
DirectoryHasModuleMap[Dir] = true;
- return false;
+ return LMM_NewlyLoaded;
}
}
// No suitable module map.
DirectoryHasModuleMap[Dir] = false;
- return true;
+ return LMM_InvalidModuleMap;
}