diff options
author | Richard Smith <richard-llvm@metafoo.co.uk> | 2015-10-16 21:42:56 +0000 |
---|---|---|
committer | Richard Smith <richard-llvm@metafoo.co.uk> | 2015-10-16 21:42:56 +0000 |
commit | 3d5b48c4804f2442ed42e1e93f226f08abd7b14e (patch) | |
tree | 5499239d34064b67079cdc15e73ab5df37f6bab0 /clang/lib/Lex/HeaderSearch.cpp | |
parent | 83a131fa73f38dff92648775bc70989332768e93 (diff) | |
download | llvm-3d5b48c4804f2442ed42e1e93f226f08abd7b14e.zip llvm-3d5b48c4804f2442ed42e1e93f226f08abd7b14e.tar.gz llvm-3d5b48c4804f2442ed42e1e93f226f08abd7b14e.tar.bz2 |
Refactor module lookup when looking up a header file, and wire through the requesting module. No functionality change.
llvm-svn: 250554
Diffstat (limited to 'clang/lib/Lex/HeaderSearch.cpp')
-rw-r--r-- | clang/lib/Lex/HeaderSearch.cpp | 168 |
1 files changed, 83 insertions, 85 deletions
diff --git a/clang/lib/Lex/HeaderSearch.cpp b/clang/lib/Lex/HeaderSearch.cpp index 97e9795..469d782d 100644 --- a/clang/lib/Lex/HeaderSearch.cpp +++ b/clang/lib/Lex/HeaderSearch.cpp @@ -250,31 +250,20 @@ const char *DirectoryLookup::getName() const { return getHeaderMap()->getFileName(); } -static const FileEntry * -getFileAndSuggestModule(HeaderSearch &HS, StringRef FileName, - const DirectoryEntry *Dir, bool IsSystemHeaderDir, - ModuleMap::KnownHeader *SuggestedModule) { +const FileEntry *HeaderSearch::getFileAndSuggestModule( + StringRef FileName, const DirectoryEntry *Dir, bool IsSystemHeaderDir, + Module *RequestingModule, ModuleMap::KnownHeader *SuggestedModule) { // If we have a module map that might map this header, load it and // check whether we'll have a suggestion for a module. - HS.hasModuleMap(FileName, Dir, IsSystemHeaderDir); - if (SuggestedModule) { - const FileEntry *File = HS.getFileMgr().getFile(FileName, - /*OpenFile=*/false); - if (File) { - // If there is a module that corresponds to this header, suggest it. - *SuggestedModule = HS.findModuleForHeader(File); - - // FIXME: This appears to be a no-op. We loaded the module map for this - // directory at the start of this function. - if (!SuggestedModule->getModule() && - HS.hasModuleMap(FileName, Dir, IsSystemHeaderDir)) - *SuggestedModule = HS.findModuleForHeader(File); - } + const FileEntry *File = getFileMgr().getFile(FileName, /*OpenFile=*/true); - return File; - } + // If there is a module that corresponds to this header, suggest it. + if (!findUsableModuleForHeader(File, Dir ? Dir : File->getDir(), + RequestingModule, SuggestedModule, + IsSystemHeaderDir)) + return nullptr; - return HS.getFileMgr().getFile(FileName, /*openFile=*/true); + return File; } /// LookupFile - Lookup the specified file in this search path, returning it @@ -284,6 +273,7 @@ const FileEntry *DirectoryLookup::LookupFile( HeaderSearch &HS, SmallVectorImpl<char> *SearchPath, SmallVectorImpl<char> *RelativePath, + Module *RequestingModule, ModuleMap::KnownHeader *SuggestedModule, bool &InUserSpecifiedSystemFramework, bool &HasBeenMapped, @@ -306,14 +296,15 @@ const FileEntry *DirectoryLookup::LookupFile( RelativePath->append(Filename.begin(), Filename.end()); } - return getFileAndSuggestModule(HS, TmpDir, getDir(), - isSystemHeaderDirectory(), - SuggestedModule); + return HS.getFileAndSuggestModule(TmpDir, getDir(), + isSystemHeaderDirectory(), + RequestingModule, SuggestedModule); } if (isFramework()) return DoFrameworkLookup(Filename, HS, SearchPath, RelativePath, - SuggestedModule, InUserSpecifiedSystemFramework); + RequestingModule, SuggestedModule, + InUserSpecifiedSystemFramework); assert(isHeaderMap() && "Unknown directory lookup"); const HeaderMap *HM = getHeaderMap(); @@ -405,13 +396,10 @@ getTopFrameworkDir(FileManager &FileMgr, StringRef DirName, /// DoFrameworkLookup - Do a lookup of the specified file in the current /// DirectoryLookup, which is a framework directory. const FileEntry *DirectoryLookup::DoFrameworkLookup( - StringRef Filename, - HeaderSearch &HS, - SmallVectorImpl<char> *SearchPath, - SmallVectorImpl<char> *RelativePath, + StringRef Filename, HeaderSearch &HS, SmallVectorImpl<char> *SearchPath, + SmallVectorImpl<char> *RelativePath, Module *RequestingModule, ModuleMap::KnownHeader *SuggestedModule, - bool &InUserSpecifiedSystemFramework) const -{ + bool &InUserSpecifiedSystemFramework) const { FileManager &FileMgr = HS.getFileMgr(); // Framework names must have a '/' in the filename. @@ -523,27 +511,15 @@ const FileEntry *DirectoryLookup::DoFrameworkLookup( break; } while (true); + bool IsSystem = getDirCharacteristic() != SrcMgr::C_User; if (FoundFramework) { - // Find the top-level framework based on this framework. - SmallVector<std::string, 4> SubmodulePath; - const DirectoryEntry *TopFrameworkDir - = ::getTopFrameworkDir(FileMgr, FrameworkPath, SubmodulePath); - - // Determine the name of the top-level framework. - StringRef ModuleName = llvm::sys::path::stem(TopFrameworkDir->getName()); - - // Load this framework module. If that succeeds, find the suggested module - // for this header, if any. - bool IsSystem = getDirCharacteristic() != SrcMgr::C_User; - HS.loadFrameworkModule(ModuleName, TopFrameworkDir, IsSystem); - - // FIXME: This can find a module not part of ModuleName, which is - // important so that we're consistent about whether this header - // corresponds to a module. Possibly we should lock down framework modules - // so that this is not possible. - *SuggestedModule = HS.findModuleForHeader(FE); + if (!HS.findUsableModuleForFrameworkHeader( + FE, FrameworkPath, RequestingModule, SuggestedModule, IsSystem)) + return nullptr; } else { - *SuggestedModule = HS.findModuleForHeader(FE); + if (!HS.findUsableModuleForHeader(FE, getDir(), RequestingModule, + SuggestedModule, IsSystem)) + return nullptr; } } return FE; @@ -589,7 +565,8 @@ const FileEntry *HeaderSearch::LookupFile( const DirectoryLookup *FromDir, const DirectoryLookup *&CurDir, ArrayRef<std::pair<const FileEntry *, const DirectoryEntry *>> Includers, SmallVectorImpl<char> *SearchPath, SmallVectorImpl<char> *RelativePath, - ModuleMap::KnownHeader *SuggestedModule, bool SkipCache) { + Module *RequestingModule, ModuleMap::KnownHeader *SuggestedModule, + bool SkipCache) { if (SuggestedModule) *SuggestedModule = ModuleMap::KnownHeader(); @@ -607,13 +584,9 @@ const FileEntry *HeaderSearch::LookupFile( RelativePath->append(Filename.begin(), Filename.end()); } // Otherwise, just return the file. - const FileEntry *File = FileMgr.getFile(Filename, /*openFile=*/true); - if (File && SuggestedModule) { - // If there is a module that corresponds to this header, suggest it. - hasModuleMap(Filename, File->getDir(), /*SystemHeaderDir*/false); - *SuggestedModule = findModuleForHeader(File); - } - return File; + return getFileAndSuggestModule(Filename, nullptr, + /*IsSystemHeaderDir*/false, + RequestingModule, SuggestedModule); } // This is the header that MSVC's header search would have found. @@ -647,8 +620,8 @@ const FileEntry *HeaderSearch::LookupFile( bool IncluderIsSystemHeader = Includer && getFileInfo(Includer).DirInfo != SrcMgr::C_User; if (const FileEntry *FE = getFileAndSuggestModule( - *this, TmpDir, IncluderAndDir.second, - IncluderIsSystemHeader, SuggestedModule)) { + TmpDir, IncluderAndDir.second, IncluderIsSystemHeader, + RequestingModule, SuggestedModule)) { if (!Includer) { assert(First && "only first includer can have no file"); return FE; @@ -737,10 +710,10 @@ const FileEntry *HeaderSearch::LookupFile( for (; i != SearchDirs.size(); ++i) { bool InUserSpecifiedSystemFramework = false; bool HasBeenMapped = false; - const FileEntry *FE = - SearchDirs[i].LookupFile(Filename, *this, SearchPath, RelativePath, - SuggestedModule, InUserSpecifiedSystemFramework, - HasBeenMapped, MappedName); + const FileEntry *FE = SearchDirs[i].LookupFile( + Filename, *this, SearchPath, RelativePath, RequestingModule, + SuggestedModule, InUserSpecifiedSystemFramework, HasBeenMapped, + MappedName); if (HasBeenMapped) { CacheLookup.MappedName = copyString(Filename, LookupFileCache.getAllocator()); @@ -804,9 +777,10 @@ const FileEntry *HeaderSearch::LookupFile( ScratchFilename += '/'; ScratchFilename += Filename; - const FileEntry *FE = LookupFile( - ScratchFilename, IncludeLoc, /*isAngled=*/true, FromDir, CurDir, - Includers.front(), SearchPath, RelativePath, SuggestedModule); + const FileEntry *FE = + LookupFile(ScratchFilename, IncludeLoc, /*isAngled=*/true, FromDir, + CurDir, Includers.front(), SearchPath, RelativePath, + RequestingModule, SuggestedModule); if (checkMSVCHeaderSearch(Diags, MSFE, FE, IncludeLoc)) { if (SuggestedModule) @@ -842,6 +816,7 @@ LookupSubframeworkHeader(StringRef Filename, const FileEntry *ContextFileEnt, SmallVectorImpl<char> *SearchPath, SmallVectorImpl<char> *RelativePath, + Module *RequestingModule, ModuleMap::KnownHeader *SuggestedModule) { assert(ContextFileEnt && "No context file?"); @@ -933,24 +908,10 @@ LookupSubframeworkHeader(StringRef Filename, unsigned DirInfo = getFileInfo(ContextFileEnt).DirInfo; getFileInfo(FE).DirInfo = DirInfo; - // If we're supposed to suggest a module, look for one now. - if (SuggestedModule) { - // Find the top-level framework based on this framework. - FrameworkName.pop_back(); // remove the trailing '/' - SmallVector<std::string, 4> SubmodulePath; - const DirectoryEntry *TopFrameworkDir - = ::getTopFrameworkDir(FileMgr, FrameworkName, SubmodulePath); - - // Determine the name of the top-level framework. - StringRef ModuleName = llvm::sys::path::stem(TopFrameworkDir->getName()); - - // Load this framework module. If that succeeds, find the suggested module - // for this header, if any. - bool IsSystem = false; - if (loadFrameworkModule(ModuleName, TopFrameworkDir, IsSystem)) { - *SuggestedModule = findModuleForHeader(FE); - } - } + FrameworkName.pop_back(); // remove the trailing '/' + if (!findUsableModuleForFrameworkHeader(FE, FrameworkName, RequestingModule, + SuggestedModule, /*IsSystem*/ false)) + return nullptr; return FE; } @@ -1183,6 +1144,43 @@ HeaderSearch::findModuleForHeader(const FileEntry *File) const { return ModMap.findModuleForHeader(File); } +bool HeaderSearch::findUsableModuleForHeader( + const FileEntry *File, const DirectoryEntry *Root, Module *RequestingModule, + ModuleMap::KnownHeader *SuggestedModule, bool IsSystemHeaderDir) { + if (File && SuggestedModule) { + // If there is a module that corresponds to this header, suggest it. + hasModuleMap(File->getName(), Root, IsSystemHeaderDir); + *SuggestedModule = findModuleForHeader(File); + } + return true; +} + +bool HeaderSearch::findUsableModuleForFrameworkHeader( + const FileEntry *File, StringRef FrameworkName, Module *RequestingModule, + ModuleMap::KnownHeader *SuggestedModule, bool IsSystemFramework) { + // If we're supposed to suggest a module, look for one now. + if (SuggestedModule) { + // Find the top-level framework based on this framework. + SmallVector<std::string, 4> SubmodulePath; + const DirectoryEntry *TopFrameworkDir + = ::getTopFrameworkDir(FileMgr, FrameworkName, SubmodulePath); + + // Determine the name of the top-level framework. + StringRef ModuleName = llvm::sys::path::stem(TopFrameworkDir->getName()); + + // Load this framework module. If that succeeds, find the suggested module + // for this header, if any. + loadFrameworkModule(ModuleName, TopFrameworkDir, IsSystemFramework); + + // FIXME: This can find a module not part of ModuleName, which is + // important so that we're consistent about whether this header + // corresponds to a module. Possibly we should lock down framework modules + // so that this is not possible. + *SuggestedModule = findModuleForHeader(File); + } + return true; +} + static const FileEntry *getPrivateModuleMap(const FileEntry *File, FileManager &FileMgr) { StringRef Filename = llvm::sys::path::filename(File->getName()); |