13#ifndef LLVM_CLANG_LEX_HEADERSEARCH_H
14#define LLVM_CLANG_LEX_HEADERSEARCH_H
22#include "llvm/ADT/ArrayRef.h"
23#include "llvm/ADT/DenseMap.h"
24#include "llvm/ADT/SmallString.h"
25#include "llvm/ADT/StringMap.h"
26#include "llvm/ADT/StringRef.h"
27#include "llvm/ADT/StringSet.h"
28#include "llvm/Support/Allocator.h"
44class DiagnosticsEngine;
46class ExternalPreprocessorSource;
50class HeaderSearchOptions;
63 LLVM_PREFERRED_TYPE(
bool)
69 LLVM_PREFERRED_TYPE(
bool)
73 LLVM_PREFERRED_TYPE(
bool)
80 LLVM_PREFERRED_TYPE(SrcMgr::CharacteristicKind)
85 LLVM_PREFERRED_TYPE(
bool)
91 LLVM_PREFERRED_TYPE(
bool)
97 LLVM_PREFERRED_TYPE(
bool)
103 LLVM_PREFERRED_TYPE(
bool)
108 LLVM_PREFERRED_TYPE(
bool)
118 LLVM_PREFERRED_TYPE(
bool)
122 LLVM_PREFERRED_TYPE(
bool)
183template <
bool Const,
typename T>
187template <
bool IsConst>
189 : llvm::iterator_facade_base<SearchDirIteratorImpl<IsConst>,
190 std::forward_iterator_tag,
191 Qualified<IsConst, DirectoryLookup>> {
193 template <
typename Enable = std::enable_if<IsConst,
bool>>
202 return HS == RHS.HS && Idx == RHS.Idx;
206 assert(*
this &&
"Invalid iterator.");
212 assert(*
this &&
"Invalid iterator.");
213 return HS->SearchDirs[Idx];
220 explicit operator bool()
const {
return HS !=
nullptr; }
231 : HS(&HS), Idx(Idx) {}
237 friend SearchDirIteratorImpl<!IsConst>;
256 std::shared_ptr<HeaderSearchOptions> HSOpts;
259 llvm::DenseMap<unsigned, unsigned> SearchDirToHSEntry;
268 std::vector<DirectoryLookup> SearchDirs;
271 std::vector<bool> SearchDirsUsage;
272 unsigned AngledDirIdx = 0;
273 unsigned SystemDirIdx = 0;
278 llvm::StringMap<unsigned, llvm::BumpPtrAllocator> SearchDirHeaderMapIndex;
281 unsigned FirstNonHeaderMapSearchDirIdx = 0;
289 std::vector<std::pair<std::string, bool>> SystemHeaderPrefixes;
292 std::string ModuleHash;
295 std::string ModuleCachePath;
299 mutable std::vector<HeaderFileInfo> FileInfo;
302 struct LookupFileCacheInfo {
304 const Module *RequestingModule =
nullptr;
316 const char *MappedName =
nullptr;
319 LookupFileCacheInfo() =
default;
321 void reset(
const Module *NewRequestingModule,
323 RequestingModule = NewRequestingModule;
324 StartIt = NewStartIt;
325 MappedName =
nullptr;
328 llvm::StringMap<LookupFileCacheInfo, llvm::BumpPtrAllocator> LookupFileCache;
332 llvm::StringMap<FrameworkCacheEntry, llvm::BumpPtrAllocator> FrameworkMap;
337 using IncludeAliasMap =
338 llvm::StringMap<std::string, llvm::BumpPtrAllocator>;
339 std::unique_ptr<IncludeAliasMap> IncludeAliases;
342 std::vector<std::pair<FileEntryRef, std::unique_ptr<HeaderMap>>> HeaderMaps;
345 mutable ModuleMap ModMap;
348 llvm::DenseMap<const DirectoryEntry *, bool> DirectoryHasModuleMap;
352 llvm::DenseMap<const FileEntry *, bool> LoadedModuleMaps;
355 llvm::DenseMap<const FileEntry *, llvm::SmallString<64>> IncludeNames;
359 llvm::StringSet<llvm::BumpPtrAllocator> FrameworkNames;
364 ExternalPreprocessorSource *ExternalLookup =
nullptr;
367 ExternalHeaderFileInfoSource *ExternalSource =
nullptr;
371 void indexInitialHeaderMaps();
374 HeaderSearch(std::shared_ptr<HeaderSearchOptions> HSOpts,
375 SourceManager &SourceMgr, DiagnosticsEngine &Diags,
376 const LangOptions &LangOpts,
const TargetInfo *
Target);
389 void SetSearchPaths(std::vector<DirectoryLookup> dirs,
unsigned angledDirIdx,
390 unsigned systemDirIdx,
391 llvm::DenseMap<unsigned, unsigned> searchDirToHSEntry);
398 SearchDirs.push_back(dir);
399 SearchDirsUsage.push_back(
false);
404 SystemHeaderPrefixes.assign(
P.begin(),
P.end());
416 IncludeAliases.reset(
new IncludeAliasMap);
417 (*IncludeAliases)[Source] = std::string(Dest);
425 assert(IncludeAliases &&
"Trying to map headers when there's no map");
428 IncludeAliasMap::const_iterator
Iter = IncludeAliases->find(Source);
429 if (
Iter != IncludeAliases->end())
439 ModuleCachePath = std::string(CachePath);
450 DirectoryHasModuleMap[Dir] =
true;
459 ExternalLookup = EPS;
463 return ExternalLookup;
513 ArrayRef<std::pair<OptionalFileEntryRef, DirectoryEntryRef>> Includers,
516 bool *IsMapped,
bool *IsFrameworkFound,
bool SkipCache =
false,
517 bool BuildSystemModule =
false,
bool OpenFile =
true,
518 bool CacheFailures =
true);
534 return FrameworkMap[FWName];
546 bool isImport,
bool ModulesEnabled,
Module *M,
547 bool &IsFirstIncludeOfFile);
571 bool isCompilingModuleHeader);
634 bool FileMapOnly =
false);
656 StringRef ModuleMapPath);
674 bool AllowSearch =
true,
675 bool AllowExtraModuleMapSearch =
false);
701 bool AllowTextual =
false,
702 bool AllowExcluded =
false)
const;
729 unsigned *Offset =
nullptr,
730 StringRef OriginalModuleMapFile = StringRef());
758 bool AllowExtraModuleMapSearch =
false);
772 std::string getCachedModuleFileNameImpl(StringRef ModuleName,
773 StringRef ModuleMapPath,
774 StringRef CachePath);
801 bool IsSystemHeaderDir);
808 bool findUsableModuleForFrameworkHeader(
819 bool OpenFile =
true,
bool CacheFailures =
true);
823 void cacheLookupSuccess(LookupFileCacheInfo &CacheLookup,
860 assert(n < SearchDirs.size());
874 return {*
this, AngledDirIdx};
879 return {*
this, SystemDirIdx};
882 return {*
this, SearchDirs.size()};
908 llvm::StringRef MainFile,
909 bool *IsAngled =
nullptr)
const;
921 llvm::StringRef WorkingDir,
922 llvm::StringRef MainFile,
923 bool *IsAngled =
nullptr)
const;
931 enum LoadModuleMapResult {
946 LoadModuleMapResult loadModuleMapFileImpl(FileEntryRef
File,
bool IsSystem,
947 DirectoryEntryRef Dir,
948 FileID
ID = FileID(),
949 unsigned *Offset =
nullptr);
977 const HeaderSearchOptions &HSOpts,
978 const LangOptions &Lang,
979 const llvm::Triple &triple);
llvm::MachO::Target Target
Defines the clang::SourceLocation class and associated facilities.
Defines the SourceManager interface.
Concrete class used by the front-end to report problems and issues.
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).
DirectoryLookup - This class represents one entry in the search list that specifies the search order ...
Abstract interface for external sources of preprocessor information.
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).
An opaque identifier used by SourceManager which refers to a source file (MemoryBuffer) along with it...
Implements support for file system lookup, file system caching, and directory search management.
One of these records is kept for each identifier that is lexed.
ModuleHeaderRole
Flags describing the role of a module header.
Describes a module or submodule.
Engages in a tight little dance with the lexer to efficiently preprocess tokens.
Encodes a location in the source.
Exposes information about the current target.
CharacteristicKind
Indicates whether a file or directory holds normal user code, system code, or system code which is im...
std::conditional_t< Const, const T, T > Qualified
The JSON file list parser is used to communicate input to InstallAPI.
void ApplyHeaderSearchOptions(HeaderSearch &HS, const HeaderSearchOptions &HSOpts, const LangOptions &Lang, const llvm::Triple &triple)
Apply the header search options to get given HeaderSearch object.
llvm::iterator_range< SearchDirIterator > SearchDirRange
@ Module
Module linkage, which indicates that the entity can be referred to from other translation units withi...
@ Other
Other implicit parameter.
llvm::iterator_range< ConstSearchDirIterator > ConstSearchDirRange
Diagnostic wrappers for TextAPI types for error reporting.
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.
Forward iterator over the search directories of HeaderSearch.
SearchDirIteratorImpl(std::nullptr_t)
Creates an invalid iterator.
Qualified< IsConst, DirectoryLookup > & operator*() const
bool operator==(const SearchDirIteratorImpl &RHS) const
SearchDirIteratorImpl(const SearchDirIteratorImpl< false > &Other)
Const -> non-const iterator conversion.
SearchDirIteratorImpl & operator++()
SearchDirIteratorImpl & operator=(const SearchDirIteratorImpl &)=default
SearchDirIteratorImpl(const SearchDirIteratorImpl &)=default