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;
510 ArrayRef<std::pair<OptionalFileEntryRef, DirectoryEntryRef>> Includers,
513 bool *IsMapped,
bool *IsFrameworkFound,
bool SkipCache =
false,
514 bool BuildSystemModule =
false,
bool OpenFile =
true,
515 bool CacheFailures =
true);
531 return FrameworkMap[FWName];
543 bool isImport,
bool ModulesEnabled,
Module *M,
544 bool &IsFirstIncludeOfFile);
568 bool isCompilingModuleHeader);
631 bool FileMapOnly =
false);
653 StringRef ModuleMapPath);
671 bool AllowSearch =
true,
672 bool AllowExtraModuleMapSearch =
false);
698 bool AllowTextual =
false,
699 bool AllowExcluded =
false)
const;
727 unsigned *Offset =
nullptr,
728 StringRef OriginalModuleMapFile = StringRef());
756 bool AllowExtraModuleMapSearch =
false);
770 std::string getCachedModuleFileNameImpl(StringRef ModuleName,
771 StringRef ModuleMapPath,
772 StringRef CachePath);
799 bool IsSystemHeaderDir);
806 bool findUsableModuleForFrameworkHeader(
817 bool OpenFile =
true,
bool CacheFailures =
true);
821 void cacheLookupSuccess(LookupFileCacheInfo &CacheLookup,
858 assert(n < SearchDirs.size());
872 return {*
this, AngledDirIdx};
877 return {*
this, SystemDirIdx};
880 return {*
this, SearchDirs.size()};
906 llvm::StringRef MainFile,
907 bool *IsAngled =
nullptr)
const;
919 llvm::StringRef WorkingDir,
920 llvm::StringRef MainFile,
921 bool *IsAngled =
nullptr)
const;
929 enum ModuleMapResult {
931 MMR_AlreadyProcessed,
944 ModuleMapResult parseAndLoadModuleMapFileImpl(FileEntryRef
File,
946 DirectoryEntryRef Dir,
947 FileID ID = FileID(),
948 unsigned *Offset =
nullptr);
950 ModuleMapResult parseModuleMapFileImpl(FileEntryRef
File,
bool IsSystem,
951 DirectoryEntryRef Dir,
952 FileID ID = FileID());
975 bool IsSystem,
bool IsFramework);
977 ModuleMapResult parseModuleMapFile(StringRef DirName,
bool IsSystem,
979 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.