240 friend ConstSearchDirIterator;
241 friend SearchDirIterator;
247 llvm::DenseMap<unsigned, unsigned> SearchDirToHSEntry;
256 std::vector<DirectoryLookup> SearchDirs;
259 std::vector<bool> SearchDirsUsage;
260 unsigned AngledDirIdx = 0;
261 unsigned SystemDirIdx = 0;
266 llvm::StringMap<unsigned, llvm::BumpPtrAllocator> SearchDirHeaderMapIndex;
269 unsigned FirstNonHeaderMapSearchDirIdx = 0;
277 std::vector<std::pair<std::string, bool>> SystemHeaderPrefixes;
280 std::string ModuleHash;
283 std::string ModuleCachePath;
287 mutable std::vector<HeaderFileInfo> FileInfo;
290 struct LookupFileCacheInfo {
292 const Module *RequestingModule =
nullptr;
297 ConstSearchDirIterator StartIt =
nullptr;
300 ConstSearchDirIterator HitIt =
nullptr;
304 const char *MappedName =
nullptr;
307 LookupFileCacheInfo() =
default;
309 void reset(
const Module *NewRequestingModule,
310 ConstSearchDirIterator NewStartIt) {
311 RequestingModule = NewRequestingModule;
312 StartIt = NewStartIt;
313 MappedName =
nullptr;
316 llvm::StringMap<LookupFileCacheInfo, llvm::BumpPtrAllocator> LookupFileCache;
320 llvm::StringMap<FrameworkCacheEntry, llvm::BumpPtrAllocator> FrameworkMap;
325 using IncludeAliasMap =
326 llvm::StringMap<std::string, llvm::BumpPtrAllocator>;
327 std::unique_ptr<IncludeAliasMap> IncludeAliases;
330 std::vector<std::pair<FileEntryRef, std::unique_ptr<HeaderMap>>> HeaderMaps;
333 mutable ModuleMap ModMap;
335 struct ModuleMapDirectoryState {
345 llvm::DenseMap<const DirectoryEntry *, ModuleMapDirectoryState>
350 llvm::DenseMap<const FileEntry *, bool> LoadedModuleMaps;
354 llvm::DenseMap<const FileEntry *, bool> ParsedModuleMaps;
357 llvm::DenseMap<const FileEntry *, llvm::SmallString<64>> IncludeNames;
361 llvm::StringSet<llvm::BumpPtrAllocator> FrameworkNames;
366 ExternalPreprocessorSource *ExternalLookup =
nullptr;
369 ExternalHeaderFileInfoSource *ExternalSource =
nullptr;
373 void indexInitialHeaderMaps();
376 HeaderSearch(
const HeaderSearchOptions &HSOpts, SourceManager &SourceMgr,
377 DiagnosticsEngine &Diags,
const LangOptions &LangOpts,
378 const TargetInfo *
Target);
391 void SetSearchPaths(std::vector<DirectoryLookup> dirs,
unsigned angledDirIdx,
392 unsigned systemDirIdx,
393 llvm::DenseMap<unsigned, unsigned> searchDirToHSEntry);
400 SearchDirs.push_back(dir);
401 SearchDirsUsage.push_back(
false);
406 SystemHeaderPrefixes.assign(P.begin(), P.end());
418 IncludeAliases.reset(
new IncludeAliasMap);
419 (*IncludeAliases)[Source] = std::string(Dest);
427 assert(IncludeAliases &&
"Trying to map headers when there's no map");
430 IncludeAliasMap::const_iterator Iter = IncludeAliases->find(Source);
431 if (Iter != IncludeAliases->end())
441 ModuleCachePath = std::string(CachePath);
456 ExternalLookup = EPS;
460 return ExternalLookup;
471 ArrayRef<std::pair<OptionalFileEntryRef, DirectoryEntryRef>> Includers,
516 ArrayRef<std::pair<OptionalFileEntryRef, DirectoryEntryRef>> Includers,
519 bool *IsMapped,
bool *IsFrameworkFound,
bool SkipCache =
false,
520 bool BuildSystemModule =
false,
bool OpenFile =
true,
521 bool CacheFailures =
true);
537 return FrameworkMap[FWName];
549 bool isImport,
bool ModulesEnabled,
Module *M,
550 bool &IsFirstIncludeOfFile);
574 bool isCompilingModuleHeader);
637 bool FileMapOnly =
false);
659 StringRef ModuleMapPath);
677 bool AllowSearch =
true,
678 bool AllowExtraModuleMapSearch =
false);
704 bool AllowTextual =
false,
705 bool AllowExcluded =
false)
const;
733 unsigned *Offset =
nullptr,
734 StringRef OriginalModuleMapFile = StringRef());
762 bool AllowExtraModuleMapSearch =
false);
776 std::string getCachedModuleFileNameImpl(StringRef ModuleName,
777 StringRef ModuleMapPath,
778 StringRef CachePath);
805 bool IsSystemHeaderDir);
812 bool findUsableModuleForFrameworkHeader(
823 bool OpenFile =
true,
bool CacheFailures =
true);
827 void cacheLookupSuccess(LookupFileCacheInfo &CacheLookup,
864 assert(n < SearchDirs.size());
878 return {*
this, AngledDirIdx};
883 return {*
this, SystemDirIdx};
886 return {*
this, SearchDirs.size()};
912 llvm::StringRef MainFile,
913 bool *IsAngled =
nullptr)
const;
925 llvm::StringRef WorkingDir,
926 llvm::StringRef MainFile,
927 bool *IsAngled =
nullptr)
const;
935 enum ModuleMapResult {
937 MMR_AlreadyProcessed,
950 ModuleMapResult parseAndLoadModuleMapFileImpl(FileEntryRef
File,
952 DirectoryEntryRef Dir,
953 FileID ID = FileID(),
954 unsigned *Offset =
nullptr);
956 ModuleMapResult parseModuleMapFileImpl(FileEntryRef
File,
bool IsSystem,
957 DirectoryEntryRef Dir,
958 FileID ID = FileID());
981 bool IsSystem,
bool IsFramework);
983 ModuleMapResult parseModuleMapFile(StringRef DirName,
bool IsSystem,
985 ModuleMapResult parseModuleMapFile(DirectoryEntryRef Dir,
bool IsSystem,
A reference to a DirectoryEntry that includes the name of the directory as it was accessed by the Fil...
Cached information about one directory (either on disk or in the virtual file system).
A reference to a FileEntry that includes the name of the file as it was accessed by the FileManager's...
Cached information about one file (either on disk or in the virtual file system).
This structure is used to record entries in our framework cache.
bool IsUserSpecifiedSystemFramework
Whether this framework has been "user-specified" to be treated as if it were a system framework (even...
OptionalDirectoryEntryRef Directory
The directory entry which should be used for the cached framework.