diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2017-06-01 20:58:49 +0000 | 
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2017-06-01 20:58:49 +0000 | 
| commit | 416ada0f75bab22b084a1776deb229cd4a669c4d (patch) | |
| tree | 6eb65f3790434471361628af6199b07a4de92de7 /lib/Lex/HeaderSearch.cpp | |
| parent | 550ae89a710bf458d47e5b1d183f5e7039c2b384 (diff) | |
Diffstat (limited to 'lib/Lex/HeaderSearch.cpp')
| -rw-r--r-- | lib/Lex/HeaderSearch.cpp | 17 | 
1 files changed, 15 insertions, 2 deletions
| diff --git a/lib/Lex/HeaderSearch.cpp b/lib/Lex/HeaderSearch.cpp index f5b7c59e446f..9084bc352f76 100644 --- a/lib/Lex/HeaderSearch.cpp +++ b/lib/Lex/HeaderSearch.cpp @@ -1326,14 +1326,27 @@ static const FileEntry *getPrivateModuleMap(const FileEntry *File,  }  bool HeaderSearch::loadModuleMapFile(const FileEntry *File, bool IsSystem, -                                     FileID ID, unsigned *Offset) { +                                     FileID ID, unsigned *Offset, +                                     StringRef OriginalModuleMapFile) {    // Find the directory for the module. For frameworks, that may require going    // up from the 'Modules' directory.    const DirectoryEntry *Dir = nullptr;    if (getHeaderSearchOpts().ModuleMapFileHomeIsCwd)      Dir = FileMgr.getDirectory(".");    else { -    Dir = File->getDir(); +    if (!OriginalModuleMapFile.empty()) { +      // We're building a preprocessed module map. Find or invent the directory +      // that it originally occupied. +      Dir = FileMgr.getDirectory( +          llvm::sys::path::parent_path(OriginalModuleMapFile)); +      if (!Dir) { +        auto *FakeFile = FileMgr.getVirtualFile(OriginalModuleMapFile, 0, 0); +        Dir = FakeFile->getDir(); +      } +    } else { +      Dir = File->getDir(); +    } +      StringRef DirName(Dir->getName());      if (llvm::sys::path::filename(DirName) == "Modules") {        DirName = llvm::sys::path::parent_path(DirName); | 
