1//===- PreprocessorOptions.h ------------------------------------*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9#ifndef LLVM_CLANG_LEX_PREPROCESSOROPTIONS_H_
10#define LLVM_CLANG_LEX_PREPROCESSOROPTIONS_H_
11
12#include "clang/Basic/BitmaskEnum.h"
13#include "clang/Basic/FileEntry.h"
14#include "clang/Basic/LLVM.h"
15#include "clang/Lex/DependencyDirectivesScanner.h"
16#include "llvm/ADT/StringRef.h"
17#include "llvm/ADT/StringSet.h"
18#include <functional>
19#include <map>
20#include <memory>
21#include <optional>
22#include <set>
23#include <string>
24#include <utility>
25#include <vector>
26
27namespace llvm {
28
29class MemoryBuffer;
30
31} // namespace llvm
32
33namespace clang {
34
35/// Enumerate the kinds of standard library that
36enum ObjCXXARCStandardLibraryKind {
37 ARCXX_nolib,
38
39 /// libc++
40 ARCXX_libcxx,
41
42 /// libstdc++
43 ARCXX_libstdcxx
44};
45
46/// Whether to disable the normal validation performed on precompiled
47/// headers and module files when they are loaded.
48enum class DisableValidationForModuleKind {
49 /// Perform validation, don't disable it.
50 None = 0,
51
52 /// Disable validation for a precompiled header and the modules it depends on.
53 PCH = 0x1,
54
55 /// Disable validation for module files.
56 Module = 0x2,
57
58 /// Disable validation for all kinds.
59 All = PCH | Module,
60
61 LLVM_MARK_AS_BITMASK_ENUM(Module)
62};
63
64/// PreprocessorOptions - This class is used for passing the various options
65/// used in preprocessor initialization to InitializePreprocessor().
66class PreprocessorOptions {
67public:
68 std::vector<std::pair<std::string, bool/*isUndef*/>> Macros;
69 std::vector<std::string> Includes;
70 std::vector<std::string> MacroIncludes;
71
72 /// Perform extra checks when loading PCM files for mutable file systems.
73 bool ModulesCheckRelocated = true;
74
75 /// Initialize the preprocessor with the compiler and target specific
76 /// predefines.
77 bool UsePredefines = true;
78
79 /// Whether we should maintain a detailed record of all macro
80 /// definitions and expansions.
81 bool DetailedRecord = false;
82
83 /// When true, we are creating or using a PCH where a #pragma hdrstop is
84 /// expected to indicate the beginning or end of the PCH.
85 bool PCHWithHdrStop = false;
86
87 /// When true, we are creating a PCH or creating the PCH object while
88 /// expecting a #pragma hdrstop to separate the two. Allow for a
89 /// missing #pragma hdrstop, which generates a PCH for the whole file,
90 /// and creates an empty PCH object.
91 bool PCHWithHdrStopCreate = false;
92
93 /// If non-empty, the filename used in an #include directive in the primary
94 /// source file (or command-line preinclude) that is used to implement
95 /// MSVC-style precompiled headers. When creating a PCH, after the #include
96 /// of this header, the PCH generation stops. When using a PCH, tokens are
97 /// skipped until after an #include of this header is seen.
98 std::string PCHThroughHeader;
99
100 /// The implicit PCH included at the start of the translation unit, or empty.
101 std::string ImplicitPCHInclude;
102
103 /// Headers that will be converted to chained PCHs in memory.
104 std::vector<std::string> ChainedIncludes;
105
106 /// Whether to disable most of the normal validation performed on
107 /// precompiled headers and module files.
108 DisableValidationForModuleKind DisablePCHOrModuleValidation =
109 DisableValidationForModuleKind::None;
110
111 /// When true, a PCH with compiler errors will not be rejected.
112 bool AllowPCHWithCompilerErrors = false;
113
114 /// When true, a PCH with modules cache path different to the current
115 /// compilation will not be rejected.
116 bool AllowPCHWithDifferentModulesCachePath = false;
117
118 /// Dump declarations that are deserialized from PCH, for testing.
119 bool DumpDeserializedPCHDecls = false;
120
121 /// This is a set of names for decls that we do not want to be
122 /// deserialized, and we emit an error if they are; for testing purposes.
123 std::set<std::string> DeserializedPCHDeclsToErrorOn;
124
125 /// If non-zero, the implicit PCH include is actually a precompiled
126 /// preamble that covers this number of bytes in the main source file.
127 ///
128 /// The boolean indicates whether the preamble ends at the start of a new
129 /// line.
130 std::pair<unsigned, bool> PrecompiledPreambleBytes;
131
132 /// True indicates that a preamble is being generated.
133 ///
134 /// When the lexer is done, one of the things that need to be preserved is the
135 /// conditional #if stack, so the ASTWriter/ASTReader can save/restore it when
136 /// processing the rest of the file. Similarly, we track an unterminated
137 /// #pragma assume_nonnull.
138 bool GeneratePreamble = false;
139
140 /// Whether to write comment locations into the PCH when building it.
141 /// Reading the comments from the PCH can be a performance hit even if the
142 /// clients don't use them.
143 bool WriteCommentListToPCH = true;
144
145 /// When enabled, preprocessor is in a mode for parsing a single file only.
146 ///
147 /// Disables #includes of other files and if there are unresolved identifiers
148 /// in preprocessor directive conditions it causes all blocks to be parsed so
149 /// that the client can get the maximum amount of information from the parser.
150 bool SingleFileParseMode = false;
151
152 /// When enabled, the preprocessor will construct editor placeholder tokens.
153 bool LexEditorPlaceholders = true;
154
155 /// True if the SourceManager should report the original file name for
156 /// contents of files that were remapped to other files. Defaults to true.
157 bool RemappedFilesKeepOriginalName = true;
158
159 /// The set of file remappings, which take existing files on
160 /// the system (the first part of each pair) and gives them the
161 /// contents of other files on the system (the second part of each
162 /// pair).
163 std::vector<std::pair<std::string, std::string>> RemappedFiles;
164
165 /// The set of file-to-buffer remappings, which take existing files
166 /// on the system (the first part of each pair) and gives them the contents
167 /// of the specified memory buffer (the second part of each pair).
168 std::vector<std::pair<std::string, llvm::MemoryBuffer *>> RemappedFileBuffers;
169
170 /// Whether the compiler instance should retain (i.e., not free)
171 /// the buffers associated with remapped files.
172 ///
173 /// This flag defaults to false; it can be set true only through direct
174 /// manipulation of the compiler invocation object, in cases where the
175 /// compiler invocation and its buffers will be reused.
176 bool RetainRemappedFileBuffers = false;
177
178 /// When enabled, excluded conditional blocks retain in the main file.
179 bool RetainExcludedConditionalBlocks = false;
180
181 /// The Objective-C++ ARC standard library that we should support,
182 /// by providing appropriate definitions to retrofit the standard library
183 /// with support for lifetime-qualified pointers.
184 ObjCXXARCStandardLibraryKind ObjCXXARCStandardLibrary = ARCXX_nolib;
185
186 /// Records the set of modules
187 class FailedModulesSet {
188 llvm::StringSet<> Failed;
189
190 public:
191 bool hasAlreadyFailed(StringRef module) {
192 return Failed.count(module) > 0;
193 }
194
195 void addFailed(StringRef module) {
196 Failed.insert(module);
197 }
198 };
199
200 /// The set of modules that failed to build.
201 ///
202 /// This pointer will be shared among all of the compiler instances created
203 /// to (re)build modules, so that once a module fails to build anywhere,
204 /// other instances will see that the module has failed and won't try to
205 /// build it again.
206 std::shared_ptr<FailedModulesSet> FailedModules;
207
208 /// Function for getting the dependency preprocessor directives of a file.
209 ///
210 /// These are directives derived from a special form of lexing where the
211 /// source input is scanned for the preprocessor directives that might have an
212 /// effect on the dependencies for a compilation unit.
213 ///
214 /// Enables a client to cache the directives for a file and provide them
215 /// across multiple compiler invocations.
216 /// FIXME: Allow returning an error.
217 std::function<std::optional<ArrayRef<dependency_directives_scan::Directive>>(
218 FileEntryRef)>
219 DependencyDirectivesForFile;
220
221 /// Set up preprocessor for RunAnalysis action.
222 bool SetUpStaticAnalyzer = false;
223
224 /// Prevents intended crashes when using #pragma clang __debug. For testing.
225 bool DisablePragmaDebugCrash = false;
226
227 /// If set, the UNIX timestamp specified by SOURCE_DATE_EPOCH.
228 std::optional<uint64_t> SourceDateEpoch;
229
230public:
231 PreprocessorOptions() : PrecompiledPreambleBytes(0, false) {}
232
233 void addMacroDef(StringRef Name) {
234 Macros.emplace_back(std::string(Name), false);
235 }
236 void addMacroUndef(StringRef Name) {
237 Macros.emplace_back(std::string(Name), true);
238 }
239
240 void addRemappedFile(StringRef From, StringRef To) {
241 RemappedFiles.emplace_back(std::string(From), std::string(To));
242 }
243
244 void addRemappedFile(StringRef From, llvm::MemoryBuffer *To) {
245 RemappedFileBuffers.emplace_back(std::string(From), To);
246 }
247
248 void clearRemappedFiles() {
249 RemappedFiles.clear();
250 RemappedFileBuffers.clear();
251 }
252
253 /// Reset any options that are not considered when building a
254 /// module.
255 void resetNonModularOptions() {
256 Includes.clear();
257 MacroIncludes.clear();
258 ChainedIncludes.clear();
259 DumpDeserializedPCHDecls = false;
260 ImplicitPCHInclude.clear();
261 SingleFileParseMode = false;
262 LexEditorPlaceholders = true;
263 RetainRemappedFileBuffers = true;
264 PrecompiledPreambleBytes.first = 0;
265 PrecompiledPreambleBytes.second = false;
266 RetainExcludedConditionalBlocks = false;
267 }
268};
269
270} // namespace clang
271
272#endif // LLVM_CLANG_LEX_PREPROCESSOROPTIONS_H_
273