diff options
Diffstat (limited to 'clang/lib')
-rw-r--r-- | clang/lib/Frontend/CompilerInvocation.cpp | 3 | ||||
-rw-r--r-- | clang/lib/Lex/HeaderSearch.cpp | 36 |
2 files changed, 32 insertions, 7 deletions
diff --git a/clang/lib/Frontend/CompilerInvocation.cpp b/clang/lib/Frontend/CompilerInvocation.cpp index c8c676899c5..afba109453d 100644 --- a/clang/lib/Frontend/CompilerInvocation.cpp +++ b/clang/lib/Frontend/CompilerInvocation.cpp @@ -896,6 +896,9 @@ static void ParseHeaderSearchArgs(HeaderSearchOptions &Opts, ArgList &Args) { StringRef MacroDef = (*it)->getValue(); Opts.ModulesIgnoreMacros.insert(MacroDef.split('=').first); } + std::vector<std::string> ModuleMapFiles = + Args.getAllArgValues(OPT_fmodule_map_file); + Opts.ModuleMapFiles.insert(ModuleMapFiles.begin(), ModuleMapFiles.end()); // Add -I..., -F..., and -index-header-map options in order. bool IsIndexHeaderMap = false; diff --git a/clang/lib/Lex/HeaderSearch.cpp b/clang/lib/Lex/HeaderSearch.cpp index ec84bb16d60..5bcc4ea0441 100644 --- a/clang/lib/Lex/HeaderSearch.cpp +++ b/clang/lib/Lex/HeaderSearch.cpp @@ -941,26 +941,48 @@ bool HeaderSearch::hasModuleMap(StringRef FileName, DirName = llvm::sys::path::parent_path(DirName); if (DirName.empty()) return false; - + // Determine whether this directory exists. const DirectoryEntry *Dir = FileMgr.getDirectory(DirName); if (!Dir) return false; - // Try to load the module map file in this directory. + // Load user-specified module map files in 'Dir'. + bool ModuleMapFound = false; + for (llvm::SetVector<std::string>::iterator + I = HSOpts->ModuleMapFiles.begin(), + E = HSOpts->ModuleMapFiles.end(); + I != E; ++I) { + StringRef ModuleMapFileDir = llvm::sys::path::parent_path(*I); + if (!llvm::sys::fs::equivalent(ModuleMapFileDir, DirName)) + continue; + + const FileEntry *File = FileMgr.getFile(*I); + if (!File) + continue; + + loadModuleMapFile(File, /*IsSystem=*/false); + ModuleMapFound = true; + } + + // Try to load the "module.map" file in this directory. switch (loadModuleMapFile(Dir, IsSystem)) { case LMM_NewlyLoaded: case LMM_AlreadyLoaded: + ModuleMapFound = true; + break; + + case LMM_NoDirectory: + case LMM_InvalidModuleMap: + break; + } + + if (ModuleMapFound) { // 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. |