Coverage Report

Created: 2025-09-18 21:20

/home/runner/work/DirectXShaderCompiler/DirectXShaderCompiler/tools/clang/include/clang/Lex/HeaderSearchOptions.h
Line
Count
Source (jump to first uncovered line)
1
//===--- HeaderSearchOptions.h ----------------------------------*- C++ -*-===//
2
//
3
//                     The LLVM Compiler Infrastructure
4
//
5
// This file is distributed under the University of Illinois Open Source
6
// License. See LICENSE.TXT for details.
7
//
8
//===----------------------------------------------------------------------===//
9
10
#ifndef LLVM_CLANG_LEX_HEADERSEARCHOPTIONS_H
11
#define LLVM_CLANG_LEX_HEADERSEARCHOPTIONS_H
12
13
#include "clang/Basic/LLVM.h"
14
#include "llvm/ADT/IntrusiveRefCntPtr.h"
15
#include "llvm/ADT/SetVector.h"
16
#include "llvm/ADT/StringRef.h"
17
#include <string>
18
#include <vector>
19
20
namespace clang {
21
22
namespace frontend {
23
  /// IncludeDirGroup - Identifiers the group a include entry belongs to, which
24
  /// represents its relative positive in the search list.  A \#include of a ""
25
  /// path starts at the -iquote group, then searches the Angled group, then
26
  /// searches the system group, etc.
27
  enum IncludeDirGroup {
28
    Quoted = 0,     ///< '\#include ""' paths, added by 'gcc -iquote'.
29
    Angled,         ///< Paths for '\#include <>' added by '-I'.
30
    IndexHeaderMap, ///< Like Angled, but marks header maps used when
31
                       ///  building frameworks.
32
    System,         ///< Like Angled, but marks system directories.
33
    ExternCSystem,  ///< Like System, but headers are implicitly wrapped in
34
                    ///  extern "C".
35
    CSystem,        ///< Like System, but only used for C.
36
    CXXSystem,      ///< Like System, but only used for C++.
37
    ObjCSystem,     ///< Like System, but only used for ObjC.
38
    ObjCXXSystem,   ///< Like System, but only used for ObjC++.
39
    After           ///< Like System, but searched after the system directories.
40
  };
41
}
42
43
/// HeaderSearchOptions - Helper class for storing options related to the
44
/// initialization of the HeaderSearch object.
45
class HeaderSearchOptions : public RefCountedBase<HeaderSearchOptions> {
46
public:
47
  struct Entry {
48
    std::string Path;
49
    frontend::IncludeDirGroup Group;
50
    unsigned IsFramework : 1;
51
    
52
    /// IgnoreSysRoot - This is false if an absolute path should be treated
53
    /// relative to the sysroot, or true if it should always be the absolute
54
    /// path.
55
    unsigned IgnoreSysRoot : 1;
56
57
    Entry(StringRef path, frontend::IncludeDirGroup group, bool isFramework,
58
          bool ignoreSysRoot)
59
256
      : Path(path), Group(group), IsFramework(isFramework),
60
256
        IgnoreSysRoot(ignoreSysRoot) {}
61
  };
62
63
  struct SystemHeaderPrefix {
64
    /// A prefix to be matched against paths in \#include directives.
65
    std::string Prefix;
66
67
    /// True if paths beginning with this prefix should be treated as system
68
    /// headers.
69
    bool IsSystemHeader;
70
71
    SystemHeaderPrefix(StringRef Prefix, bool IsSystemHeader)
72
0
      : Prefix(Prefix), IsSystemHeader(IsSystemHeader) {}
73
  };
74
75
  /// If non-empty, the directory to use as a "virtual system root" for include
76
  /// paths.
77
  std::string Sysroot;
78
79
  /// User specified include entries.
80
  std::vector<Entry> UserEntries;
81
82
  /// User-specified system header prefixes.
83
  std::vector<SystemHeaderPrefix> SystemHeaderPrefixes;
84
85
  /// The directory which holds the compiler resource files (builtin includes,
86
  /// etc.).
87
  std::string ResourceDir;
88
89
  /// \brief The directory used for the module cache.
90
  std::string ModuleCachePath;
91
92
  /// \brief The directory used for a user build.
93
  std::string ModuleUserBuildPath;
94
95
  /// The module/pch container format.
96
  std::string ModuleFormat;
97
98
  /// \brief Whether we should disable the use of the hash string within the
99
  /// module cache.
100
  ///
101
  /// Note: Only used for testing!
102
  unsigned DisableModuleHash : 1;
103
104
  /// \brief Implicit module maps.  This option is enabld by default when
105
  /// modules is enabled.
106
  unsigned ImplicitModuleMaps : 1;
107
108
  /// \brief Set the 'home directory' of a module map file to the current
109
  /// working directory (or the home directory of the module map file that
110
  /// contained the 'extern module' directive importing this module map file
111
  /// if any) rather than the directory containing the module map file.
112
  //
113
  /// The home directory is where we look for files named in the module map
114
  /// file.
115
  unsigned ModuleMapFileHomeIsCwd : 1;
116
117
  /// \brief The interval (in seconds) between pruning operations.
118
  ///
119
  /// This operation is expensive, because it requires Clang to walk through
120
  /// the directory structure of the module cache, stat()'ing and removing
121
  /// files.
122
  ///
123
  /// The default value is large, e.g., the operation runs once a week.
124
  unsigned ModuleCachePruneInterval;
125
126
  /// \brief The time (in seconds) after which an unused module file will be
127
  /// considered unused and will, therefore, be pruned.
128
  ///
129
  /// When the module cache is pruned, any module file that has not been
130
  /// accessed in this many seconds will be removed. The default value is
131
  /// large, e.g., a month, to avoid forcing infrequently-used modules to be
132
  /// regenerated often.
133
  unsigned ModuleCachePruneAfter;
134
135
  /// \brief The time in seconds when the build session started.
136
  ///
137
  /// This time is used by other optimizations in header search and module
138
  /// loading.
139
  uint64_t BuildSessionTimestamp;
140
141
  /// \brief The set of macro names that should be ignored for the purposes
142
  /// of computing the module hash.
143
  llvm::SetVector<std::string> ModulesIgnoreMacros;
144
145
  /// \brief The set of user-provided virtual filesystem overlay files.
146
  std::vector<std::string> VFSOverlayFiles;
147
148
  /// Include the compiler builtin includes.
149
  unsigned UseBuiltinIncludes : 1;
150
151
  /// Include the system standard include search directories.
152
  unsigned UseStandardSystemIncludes : 1;
153
154
  /// Include the system standard C++ library include search directories.
155
  unsigned UseStandardCXXIncludes : 1;
156
157
  /// Use libc++ instead of the default libstdc++.
158
  unsigned UseLibcxx : 1;
159
160
  /// Whether header search information should be output as for -v.
161
  unsigned Verbose : 1;
162
163
  /// \brief If true, skip verifying input files used by modules if the
164
  /// module was already verified during this build session (see
165
  /// \c BuildSessionTimestamp).
166
  unsigned ModulesValidateOncePerBuildSession : 1;
167
168
  /// \brief Whether to validate system input files when a module is loaded.
169
  unsigned ModulesValidateSystemHeaders : 1;
170
171
public:
172
  HeaderSearchOptions(StringRef _Sysroot = "/")
173
26.4k
      : Sysroot(_Sysroot), ModuleFormat("raw"), DisableModuleHash(0),
174
26.4k
        ImplicitModuleMaps(0), ModuleMapFileHomeIsCwd(0),
175
26.4k
        ModuleCachePruneInterval(7 * 24 * 60 * 60),
176
26.4k
        ModuleCachePruneAfter(31 * 24 * 60 * 60), BuildSessionTimestamp(0),
177
26.4k
        UseBuiltinIncludes(true), UseStandardSystemIncludes(true),
178
26.4k
        UseStandardCXXIncludes(true), UseLibcxx(false), Verbose(false),
179
26.4k
        ModulesValidateOncePerBuildSession(false),
180
26.4k
        ModulesValidateSystemHeaders(false) {}
181
182
  /// AddPath - Add the \p Path path to the specified \p Group list.
183
  void AddPath(StringRef Path, frontend::IncludeDirGroup Group,
184
256
               bool IsFramework, bool IgnoreSysRoot) {
185
256
    UserEntries.emplace_back(Path, Group, IsFramework, IgnoreSysRoot);
186
256
  }
187
188
  /// AddSystemHeaderPrefix - Override whether \#include directives naming a
189
  /// path starting with \p Prefix should be considered as naming a system
190
  /// header.
191
0
  void AddSystemHeaderPrefix(StringRef Prefix, bool IsSystemHeader) {
192
0
    SystemHeaderPrefixes.emplace_back(Prefix, IsSystemHeader);
193
0
  }
194
195
0
  void AddVFSOverlayFile(StringRef Name) {
196
0
    VFSOverlayFiles.push_back(Name);
197
0
  }
198
};
199
200
} // end namespace clang
201
202
#endif