diff options
| author | Bruno Cardoso Lopes <bruno.cardoso@gmail.com> | 2018-01-04 02:17:40 +0000 |
|---|---|---|
| committer | Bruno Cardoso Lopes <bruno.cardoso@gmail.com> | 2018-01-04 02:17:40 +0000 |
| commit | b6ec4a33fb2b6e9ea9bb5ace211504113fbe64a1 (patch) | |
| tree | ba6f9d5c770113b4aaeca3eba333ea6f763c7e60 /clang/lib/Lex/HeaderSearch.cpp | |
| parent | a3ce1fdababaa507313477379d45a40b81d92f55 (diff) | |
| download | bcm5719-llvm-b6ec4a33fb2b6e9ea9bb5ace211504113fbe64a1.tar.gz bcm5719-llvm-b6ec4a33fb2b6e9ea9bb5ace211504113fbe64a1.zip | |
[Modules] Allow modules specified by -fmodule-map-file to shadow implicitly found ones
When modules come from module map files explicitly specified by
-fmodule-map-file= arguments, allow those to override/shadow modules
with the same name that are found implicitly by header search. If such a
module is looked up by name (e.g. @import), we will always find the one
from -fmodule-map-file. If we try to use a shadowed module by including
one of its headers report an error.
This enables developers to force use of a specific copy of their module
to be used if there are multiple copies that would otherwise be visible,
for example if they develop modules that are installed in the default
search paths.
Patch originally by Ben Langmuir,
http://lists.llvm.org/pipermail/cfe-commits/Week-of-Mon-20151116/143425.html
Based on cfe-dev discussion:
http://lists.llvm.org/pipermail/cfe-dev/2015-November/046164.html
Differential Revision: https://reviews.llvm.org/D31269
rdar://problem/23612102
llvm-svn: 321781
Diffstat (limited to 'clang/lib/Lex/HeaderSearch.cpp')
| -rw-r--r-- | clang/lib/Lex/HeaderSearch.cpp | 20 |
1 files changed, 11 insertions, 9 deletions
diff --git a/clang/lib/Lex/HeaderSearch.cpp b/clang/lib/Lex/HeaderSearch.cpp index 6976294a2ea..ec817547063 100644 --- a/clang/lib/Lex/HeaderSearch.cpp +++ b/clang/lib/Lex/HeaderSearch.cpp @@ -1367,7 +1367,8 @@ bool HeaderSearch::loadModuleMapFile(const FileEntry *File, bool IsSystem, } } - switch (loadModuleMapFileImpl(File, IsSystem, Dir, ID, Offset)) { + switch (loadModuleMapFileImpl(File, IsSystem, Dir, + /*IsExplictlyProvided=*/true, ID, Offset)) { case LMM_AlreadyLoaded: case LMM_NewlyLoaded: return false; @@ -1378,10 +1379,9 @@ bool HeaderSearch::loadModuleMapFile(const FileEntry *File, bool IsSystem, llvm_unreachable("Unknown load module map result"); } -HeaderSearch::LoadModuleMapResult -HeaderSearch::loadModuleMapFileImpl(const FileEntry *File, bool IsSystem, - const DirectoryEntry *Dir, FileID ID, - unsigned *Offset) { +HeaderSearch::LoadModuleMapResult HeaderSearch::loadModuleMapFileImpl( + const FileEntry *File, bool IsSystem, const DirectoryEntry *Dir, + bool IsExplicitlyProvided, FileID ID, unsigned *Offset) { assert(File && "expected FileEntry"); // Check whether we've already loaded this module map, and mark it as being @@ -1390,14 +1390,16 @@ HeaderSearch::loadModuleMapFileImpl(const FileEntry *File, bool IsSystem, if (!AddResult.second) return AddResult.first->second ? LMM_AlreadyLoaded : LMM_InvalidModuleMap; - if (ModMap.parseModuleMapFile(File, IsSystem, Dir, ID, Offset)) { + if (ModMap.parseModuleMapFile(File, IsSystem, Dir, IsExplicitlyProvided, ID, + Offset)) { LoadedModuleMaps[File] = false; return LMM_InvalidModuleMap; } // Try to load a corresponding private module map. if (const FileEntry *PMMFile = getPrivateModuleMap(File, FileMgr)) { - if (ModMap.parseModuleMapFile(PMMFile, IsSystem, Dir)) { + if (ModMap.parseModuleMapFile(PMMFile, IsSystem, Dir, + IsExplicitlyProvided)) { LoadedModuleMaps[File] = false; return LMM_InvalidModuleMap; } @@ -1468,8 +1470,8 @@ HeaderSearch::loadModuleMapFile(const DirectoryEntry *Dir, bool IsSystem, return KnownDir->second ? LMM_AlreadyLoaded : LMM_InvalidModuleMap; if (const FileEntry *ModuleMapFile = lookupModuleMapFile(Dir, IsFramework)) { - LoadModuleMapResult Result = - loadModuleMapFileImpl(ModuleMapFile, IsSystem, Dir); + LoadModuleMapResult Result = loadModuleMapFileImpl( + ModuleMapFile, IsSystem, Dir, /*IsExplicitlyProvided=*/false); // Add Dir explicitly in case ModuleMapFile is in a subdirectory. // E.g. Foo.framework/Modules/module.modulemap // ^Dir ^ModuleMapFile |

