| //===- HeaderSearchOptions.h ------------------------------------*- C++ -*-===// | |
| // | |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | |
| // See https://llvm.org/LICENSE.txt for license information. | |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | |
| // | |
| //===----------------------------------------------------------------------===// | |
| #ifndef LLVM_CLANG_LEX_HEADERSEARCHOPTIONS_H | |
| #define LLVM_CLANG_LEX_HEADERSEARCHOPTIONS_H | |
| #include "clang/Basic/LLVM.h" | |
| #include "llvm/ADT/CachedHashString.h" | |
| #include "llvm/ADT/Hashing.h" | |
| #include "llvm/ADT/SetVector.h" | |
| #include "llvm/ADT/StringRef.h" | |
| #include "llvm/Support/HashBuilder.h" | |
| #include <cstdint> | |
| #include <map> | |
| #include <string> | |
| #include <vector> | |
| namespace clang { | |
| namespace frontend { | |
| /// IncludeDirGroup - Identifies the group an include Entry belongs to, | |
| /// representing its relative positive in the search list. | |
| /// \#include directives whose paths are enclosed by string quotes ("") | |
| /// start searching at the Quoted group (specified by '-iquote'), | |
| /// then search the Angled group, then the System group, etc. | |
| enum IncludeDirGroup { | |
| /// '\#include ""' paths, added by 'gcc -iquote'. | |
| Quoted = 0, | |
| /// Paths for '\#include <>' added by '-I'. | |
| Angled, | |
| /// Like Angled, but marks header maps used when building frameworks. | |
| IndexHeaderMap, | |
| /// Like Angled, but marks system directories. | |
| System, | |
| /// Like System, but headers are implicitly wrapped in extern "C". | |
| ExternCSystem, | |
| /// Like System, but only used for C. | |
| CSystem, | |
| /// Like System, but only used for C++. | |
| CXXSystem, | |
| /// Like System, but only used for ObjC. | |
| ObjCSystem, | |
| /// Like System, but only used for ObjC++. | |
| ObjCXXSystem, | |
| /// Like System, but searched after the system directories. | |
| After | |
| }; | |
| } // namespace frontend | |
| /// HeaderSearchOptions - Helper class for storing options related to the | |
| /// initialization of the HeaderSearch object. | |
| class HeaderSearchOptions { | |
| public: | |
| struct Entry { | |
| std::string Path; | |
| frontend::IncludeDirGroup Group; | |
| unsigned IsFramework : 1; | |
| /// IgnoreSysRoot - This is false if an absolute path should be treated | |
| /// relative to the sysroot, or true if it should always be the absolute | |
| /// path. | |
| unsigned IgnoreSysRoot : 1; | |
| Entry(StringRef path, frontend::IncludeDirGroup group, bool isFramework, | |
| bool ignoreSysRoot) | |
| : Path(path), Group(group), IsFramework(isFramework), | |
| IgnoreSysRoot(ignoreSysRoot) {} | |
| }; | |
| struct SystemHeaderPrefix { | |
| /// A prefix to be matched against paths in \#include directives. | |
| std::string Prefix; | |
| /// True if paths beginning with this prefix should be treated as system | |
| /// headers. | |
| bool IsSystemHeader; | |
| SystemHeaderPrefix(StringRef Prefix, bool IsSystemHeader) | |
| : Prefix(Prefix), IsSystemHeader(IsSystemHeader) {} | |
| }; | |
| /// If non-empty, the directory to use as a "virtual system root" for include | |
| /// paths. | |
| std::string Sysroot; | |
| /// User specified include entries. | |
| std::vector<Entry> UserEntries; | |
| /// User-specified system header prefixes. | |
| std::vector<SystemHeaderPrefix> SystemHeaderPrefixes; | |
| /// The directory which holds the compiler resource files (builtin includes, | |
| /// etc.). | |
| std::string ResourceDir; | |
| /// The directory used for the module cache. | |
| std::string ModuleCachePath; | |
| /// The directory used for a user build. | |
| std::string ModuleUserBuildPath; | |
| /// The mapping of module names to prebuilt module files. | |
| std::map<std::string, std::string, std::less<>> PrebuiltModuleFiles; | |
| /// The directories used to load prebuilt module files. | |
| std::vector<std::string> PrebuiltModulePaths; | |
| /// The module/pch container format. | |
| std::string ModuleFormat; | |
| /// Whether we should disable the use of the hash string within the | |
| /// module cache. | |
| /// | |
| /// Note: Only used for testing! | |
| unsigned DisableModuleHash : 1; | |
| /// Implicit module maps. This option is enabld by default when | |
| /// modules is enabled. | |
| unsigned ImplicitModuleMaps : 1; | |
| /// Set the 'home directory' of a module map file to the current | |
| /// working directory (or the home directory of the module map file that | |
| /// contained the 'extern module' directive importing this module map file | |
| /// if any) rather than the directory containing the module map file. | |
| // | |
| /// The home directory is where we look for files named in the module map | |
| /// file. | |
| unsigned ModuleMapFileHomeIsCwd : 1; | |
| /// Set the base path of a built module file to be the current working | |
| /// directory. This is useful for sharing module files across machines | |
| /// that build with different paths without having to rewrite all | |
| /// modulemap files to have working directory relative paths. | |
| unsigned ModuleFileHomeIsCwd : 1; | |
| /// Also search for prebuilt implicit modules in the prebuilt module cache | |
| /// path. | |
| unsigned EnablePrebuiltImplicitModules : 1; | |
| /// The interval (in seconds) between pruning operations. | |
| /// | |
| /// This operation is expensive, because it requires Clang to walk through | |
| /// the directory structure of the module cache, stat()'ing and removing | |
| /// files. | |
| /// | |
| /// The default value is large, e.g., the operation runs once a week. | |
| unsigned ModuleCachePruneInterval = 7 * 24 * 60 * 60; | |
| /// The time (in seconds) after which an unused module file will be | |
| /// considered unused and will, therefore, be pruned. | |
| /// | |
| /// When the module cache is pruned, any module file that has not been | |
| /// accessed in this many seconds will be removed. The default value is | |
| /// large, e.g., a month, to avoid forcing infrequently-used modules to be | |
| /// regenerated often. | |
| unsigned ModuleCachePruneAfter = 31 * 24 * 60 * 60; | |
| /// The time in seconds when the build session started. | |
| /// | |
| /// This time is used by other optimizations in header search and module | |
| /// loading. | |
| uint64_t BuildSessionTimestamp = 0; | |
| /// The set of macro names that should be ignored for the purposes | |
| /// of computing the module hash. | |
| llvm::SmallSetVector<llvm::CachedHashString, 16> ModulesIgnoreMacros; | |
| /// The set of user-provided virtual filesystem overlay files. | |
| std::vector<std::string> VFSOverlayFiles; | |
| /// Include the compiler builtin includes. | |
| unsigned UseBuiltinIncludes : 1; | |
| /// Include the system standard include search directories. | |
| unsigned UseStandardSystemIncludes : 1; | |
| /// Include the system standard C++ library include search directories. | |
| unsigned UseStandardCXXIncludes : 1; | |
| /// Use libc++ instead of the default libstdc++. | |
| unsigned UseLibcxx : 1; | |
| /// Whether header search information should be output as for -v. | |
| unsigned Verbose : 1; | |
| /// If true, skip verifying input files used by modules if the | |
| /// module was already verified during this build session (see | |
| /// \c BuildSessionTimestamp). | |
| unsigned ModulesValidateOncePerBuildSession : 1; | |
| /// Whether to validate system input files when a module is loaded. | |
| unsigned ModulesValidateSystemHeaders : 1; | |
| // Whether the content of input files should be hashed and used to | |
| // validate consistency. | |
| unsigned ValidateASTInputFilesContent : 1; | |
| /// Whether the module includes debug information (-gmodules). | |
| unsigned UseDebugInfo : 1; | |
| unsigned ModulesValidateDiagnosticOptions : 1; | |
| unsigned ModulesHashContent : 1; | |
| /// Whether we should include all things that could impact the module in the | |
| /// hash. | |
| /// | |
| /// This includes things like the full header search path, and enabled | |
| /// diagnostics. | |
| unsigned ModulesStrictContextHash : 1; | |
| HeaderSearchOptions(StringRef _Sysroot = "/") | |
| : Sysroot(_Sysroot), ModuleFormat("raw"), DisableModuleHash(false), | |
| ImplicitModuleMaps(false), ModuleMapFileHomeIsCwd(false), | |
| ModuleFileHomeIsCwd(false), EnablePrebuiltImplicitModules(false), | |
| UseBuiltinIncludes(true), UseStandardSystemIncludes(true), | |
| UseStandardCXXIncludes(true), UseLibcxx(false), Verbose(false), | |
| ModulesValidateOncePerBuildSession(false), | |
| ModulesValidateSystemHeaders(false), | |
| ValidateASTInputFilesContent(false), UseDebugInfo(false), | |
| ModulesValidateDiagnosticOptions(true), ModulesHashContent(false), | |
| ModulesStrictContextHash(false) {} | |
| /// AddPath - Add the \p Path path to the specified \p Group list. | |
| void AddPath(StringRef Path, frontend::IncludeDirGroup Group, | |
| bool IsFramework, bool IgnoreSysRoot) { | |
| UserEntries.emplace_back(Path, Group, IsFramework, IgnoreSysRoot); | |
| } | |
| /// AddSystemHeaderPrefix - Override whether \#include directives naming a | |
| /// path starting with \p Prefix should be considered as naming a system | |
| /// header. | |
| void AddSystemHeaderPrefix(StringRef Prefix, bool IsSystemHeader) { | |
| SystemHeaderPrefixes.emplace_back(Prefix, IsSystemHeader); | |
| } | |
| void AddVFSOverlayFile(StringRef Name) { | |
| VFSOverlayFiles.push_back(std::string(Name)); | |
| } | |
| void AddPrebuiltModulePath(StringRef Name) { | |
| PrebuiltModulePaths.push_back(std::string(Name)); | |
| } | |
| }; | |
| inline llvm::hash_code hash_value(const HeaderSearchOptions::Entry &E) { | |
| return llvm::hash_combine(E.Path, E.Group, E.IsFramework, E.IgnoreSysRoot); | |
| } | |
| template <typename HasherT, llvm::support::endianness Endianness> | |
| inline void addHash(llvm::HashBuilderImpl<HasherT, Endianness> &HBuilder, | |
| const HeaderSearchOptions::Entry &E) { | |
| HBuilder.add(E.Path, E.Group, E.IsFramework, E.IgnoreSysRoot); | |
| } | |
| inline llvm::hash_code | |
| hash_value(const HeaderSearchOptions::SystemHeaderPrefix &SHP) { | |
| return llvm::hash_combine(SHP.Prefix, SHP.IsSystemHeader); | |
| } | |
| template <typename HasherT, llvm::support::endianness Endianness> | |
| inline void addHash(llvm::HashBuilderImpl<HasherT, Endianness> &HBuilder, | |
| const HeaderSearchOptions::SystemHeaderPrefix &SHP) { | |
| HBuilder.add(SHP.Prefix, SHP.IsSystemHeader); | |
| } | |
| } // namespace clang | |
| #endif // LLVM_CLANG_LEX_HEADERSEARCHOPTIONS_H |