[Modules] Make r180934 more efficient by only loading top-level module maps in system header directories.

llvm-svn: 181643
This commit is contained in:
Douglas Gregor 2013-05-10 22:52:27 +00:00
parent 783c79446b
commit 64a1fa5cda
3 changed files with 19 additions and 3 deletions

View File

@ -492,7 +492,10 @@ public:
///
/// \param Modules Will be filled with the set of known, top-level modules.
void collectAllModules(SmallVectorImpl<Module *> &Modules);
/// \brief Load all known, top-level system modules.
void loadTopLevelSystemModules();
private:
/// \brief Retrieve a module with the given name, which may be part of the
/// given framework.

View File

@ -1146,6 +1146,20 @@ void HeaderSearch::collectAllModules(SmallVectorImpl<Module *> &Modules) {
}
}
void HeaderSearch::loadTopLevelSystemModules() {
// Load module maps for each of the header search directories.
for (unsigned Idx = 0, N = SearchDirs.size(); Idx != N; ++Idx) {
// We only care about normal system header directories.
if (!SearchDirs[Idx].isNormalDir() ||
SearchDirs[Idx].getDirCharacteristic() != SrcMgr::C_System) {
continue;
}
// Try to load a module map file for the search directory.
loadModuleMapFile(SearchDirs[Idx].getDir());
}
}
void HeaderSearch::loadSubdirectoryModuleMaps(DirectoryLookup &SearchDir) {
if (SearchDir.haveSearchedAllModuleMaps())
return;

View File

@ -183,8 +183,7 @@ Module *ModuleMap::findModuleForHeader(const FileEntry *File) {
// specific module (e.g., in /usr/include).
if (File->getDir() == BuiltinIncludeDir &&
isBuiltinHeader(llvm::sys::path::filename(File->getName()))) {
SmallVector<Module *, 4> AllModules;
HeaderInfo.collectAllModules(AllModules);
HeaderInfo.loadTopLevelSystemModules();
// Check again.
Known = Headers.find(File);