diff options
author | Douglas Gregor <dgregor@apple.com> | 2011-11-16 00:09:06 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2011-11-16 00:09:06 +0000 |
commit | db1cde7dc7bb3aaf48118bd9605192ab94a93635 (patch) | |
tree | 3d3ba9f78d5221bc5e8da06a5799137192bf8c1d /lib/Lex/HeaderSearch.cpp | |
parent | e614d6c6b12f20f0072c20eb312db2e80d1cb051 (diff) |
Add support for building a module from a module map to the -cc1
interface. This is currently limited to modules with umbrella
headers.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@144736 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Lex/HeaderSearch.cpp')
-rw-r--r-- | lib/Lex/HeaderSearch.cpp | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/lib/Lex/HeaderSearch.cpp b/lib/Lex/HeaderSearch.cpp index 9d36f97335..161c4b6d14 100644 --- a/lib/Lex/HeaderSearch.cpp +++ b/lib/Lex/HeaderSearch.cpp @@ -800,6 +800,46 @@ StringRef HeaderSearch::findModuleForHeader(const FileEntry *File) { return StringRef(); } +bool HeaderSearch::loadModuleMapFile(const FileEntry *File) { + const DirectoryEntry *Dir = File->getDir(); + + llvm::DenseMap<const DirectoryEntry *, bool>::iterator KnownDir + = DirectoryHasModuleMap.find(Dir); + if (KnownDir != DirectoryHasModuleMap.end()) + return !KnownDir->second; + + bool Result = ModMap.parseModuleMapFile(File); + DirectoryHasModuleMap[Dir] = !Result; + return Result; +} + +ModuleMap::Module *HeaderSearch::getModule(StringRef Name, bool AllowSearch) { + if (ModuleMap::Module *Module = ModMap.findModule(Name)) + return Module; + + if (!AllowSearch) + return 0; + + for (unsigned I = 0, N = SearchDirs.size(); I != N; ++I) { + if (!SearchDirs[I].isNormalDir()) + continue; + + switch (loadModuleMapFile(SearchDirs[I].getDir())) { + case LMM_AlreadyLoaded: + case LMM_InvalidModuleMap: + case LMM_NoDirectory: + break; + + case LMM_NewlyLoaded: + if (ModuleMap::Module *Module = ModMap.findModule(Name)) + return Module; + break; + } + } + + return 0; +} + HeaderSearch::LoadModuleMapResult HeaderSearch::loadModuleMapFile(StringRef DirName) { if (const DirectoryEntry *Dir = FileMgr.getDirectory(DirName)) |