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 | 2b20cb87f5b6b48ca8d32f99a0ef5472605afefd (patch) | |
tree | 2d4f1581a1685a26bdf04bb954c6b1c823c04c25 /clang/lib/Lex/HeaderSearch.cpp | |
parent | 653183fd5cf7ec703f62b4a87b706f35c6b31dd6 (diff) | |
download | bcm5719-llvm-2b20cb87f5b6b48ca8d32f99a0ef5472605afefd.tar.gz bcm5719-llvm-2b20cb87f5b6b48ca8d32f99a0ef5472605afefd.zip |
Add support for building a module from a module map to the -cc1
interface. This is currently limited to modules with umbrella
headers.
llvm-svn: 144736
Diffstat (limited to 'clang/lib/Lex/HeaderSearch.cpp')
-rw-r--r-- | clang/lib/Lex/HeaderSearch.cpp | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/clang/lib/Lex/HeaderSearch.cpp b/clang/lib/Lex/HeaderSearch.cpp index 9d36f973353..161c4b6d14b 100644 --- a/clang/lib/Lex/HeaderSearch.cpp +++ b/clang/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)) |