summaryrefslogtreecommitdiffstats
path: root/clang/lib/Lex/HeaderSearch.cpp
diff options
context:
space:
mode:
authorDouglas Gregor <dgregor@apple.com>2011-11-16 00:09:06 +0000
committerDouglas Gregor <dgregor@apple.com>2011-11-16 00:09:06 +0000
commit2b20cb87f5b6b48ca8d32f99a0ef5472605afefd (patch)
tree2d4f1581a1685a26bdf04bb954c6b1c823c04c25 /clang/lib/Lex/HeaderSearch.cpp
parent653183fd5cf7ec703f62b4a87b706f35c6b31dd6 (diff)
downloadbcm5719-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.cpp40
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))
OpenPOWER on IntegriCloud