clang 18.0.0git
PreprocessorOptions.h
Go to the documentation of this file.
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
14#include "clang/Basic/LLVM.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
38
39 /// libc++
41
42 /// libstdc++
44};
45
46/// Whether to disable the normal validation performed on precompiled
47/// headers and module files when they are loaded.
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().
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.
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.
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.
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.
110
111 /// When true, a PCH with compiler errors will not be rejected.
113
114 /// When true, a PCH with modules cache path different to the current
115 /// compilation will not be rejected.
117
118 /// Dump declarations that are deserialized from PCH, for testing.
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.
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.
151
152 /// When enabled, the preprocessor will construct editor placeholder tokens.
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.
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.
177
178 /// When enabled, excluded conditional blocks retain in the main file.
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.
185
186 /// Records the set of modules
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>>(
220
221 /// Set up preprocessor for RunAnalysis action.
223
224 /// Prevents intended crashes when using #pragma clang __debug. For testing.
226
227 /// If set, the UNIX timestamp specified by SOURCE_DATE_EPOCH.
228 std::optional<uint64_t> SourceDateEpoch;
229
230public:
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
249 RemappedFiles.clear();
250 RemappedFileBuffers.clear();
251 }
252
253 /// Reset any options that are not considered when building a
254 /// module.
256 Includes.clear();
257 MacroIncludes.clear();
258 ChainedIncludes.clear();
260 ImplicitPCHInclude.clear();
261 SingleFileParseMode = false;
264 PrecompiledPreambleBytes.first = 0;
265 PrecompiledPreambleBytes.second = false;
267 }
268};
269
270} // namespace clang
271
272#endif // LLVM_CLANG_LEX_PREPROCESSOROPTIONS_H_
Provides LLVM's BitmaskEnum facility to enumeration types declared in namespace clang.
This is the interface for scanning header and source files to get the minimum necessary preprocessor ...
Defines interfaces for clang::FileEntry and clang::FileEntryRef.
Forward-declares and imports various common LLVM datatypes that clang wants to use unqualified.
A reference to a FileEntry that includes the name of the file as it was accessed by the FileManager's...
Definition: FileEntry.h:57
Describes a module or submodule.
Definition: Module.h:104
PreprocessorOptions - This class is used for passing the various options used in preprocessor initial...
std::vector< std::pair< std::string, std::string > > RemappedFiles
The set of file remappings, which take existing files on the system (the first part of each pair) and...
bool PCHWithHdrStopCreate
When true, we are creating a PCH or creating the PCH object while expecting a #pragma hdrstop to sepa...
bool DisablePragmaDebugCrash
Prevents intended crashes when using #pragma clang __debug. For testing.
std::vector< std::string > MacroIncludes
std::vector< std::string > Includes
std::pair< unsigned, bool > PrecompiledPreambleBytes
If non-zero, the implicit PCH include is actually a precompiled preamble that covers this number of b...
bool WriteCommentListToPCH
Whether to write comment locations into the PCH when building it.
bool RemappedFilesKeepOriginalName
True if the SourceManager should report the original file name for contents of files that were remapp...
bool LexEditorPlaceholders
When enabled, the preprocessor will construct editor placeholder tokens.
void resetNonModularOptions()
Reset any options that are not considered when building a module.
bool RetainRemappedFileBuffers
Whether the compiler instance should retain (i.e., not free) the buffers associated with remapped fil...
ObjCXXARCStandardLibraryKind ObjCXXARCStandardLibrary
The Objective-C++ ARC standard library that we should support, by providing appropriate definitions t...
bool ModulesCheckRelocated
Perform extra checks when loading PCM files for mutable file systems.
void addMacroUndef(StringRef Name)
std::string PCHThroughHeader
If non-empty, the filename used in an #include directive in the primary source file (or command-line ...
std::set< std::string > DeserializedPCHDeclsToErrorOn
This is a set of names for decls that we do not want to be deserialized, and we emit an error if they...
bool SingleFileParseMode
When enabled, preprocessor is in a mode for parsing a single file only.
void addMacroDef(StringRef Name)
bool DetailedRecord
Whether we should maintain a detailed record of all macro definitions and expansions.
void addRemappedFile(StringRef From, llvm::MemoryBuffer *To)
std::vector< std::string > ChainedIncludes
Headers that will be converted to chained PCHs in memory.
bool RetainExcludedConditionalBlocks
When enabled, excluded conditional blocks retain in the main file.
bool PCHWithHdrStop
When true, we are creating or using a PCH where a #pragma hdrstop is expected to indicate the beginni...
std::string ImplicitPCHInclude
The implicit PCH included at the start of the translation unit, or empty.
DisableValidationForModuleKind DisablePCHOrModuleValidation
Whether to disable most of the normal validation performed on precompiled headers and module files.
bool AllowPCHWithDifferentModulesCachePath
When true, a PCH with modules cache path different to the current compilation will not be rejected.
bool DumpDeserializedPCHDecls
Dump declarations that are deserialized from PCH, for testing.
std::optional< uint64_t > SourceDateEpoch
If set, the UNIX timestamp specified by SOURCE_DATE_EPOCH.
bool UsePredefines
Initialize the preprocessor with the compiler and target specific predefines.
void addRemappedFile(StringRef From, StringRef To)
bool SetUpStaticAnalyzer
Set up preprocessor for RunAnalysis action.
std::vector< std::pair< std::string, bool > > Macros
std::function< std::optional< ArrayRef< dependency_directives_scan::Directive > >(FileEntryRef)> DependencyDirectivesForFile
Function for getting the dependency preprocessor directives of a file.
bool GeneratePreamble
True indicates that a preamble is being generated.
bool AllowPCHWithCompilerErrors
When true, a PCH with compiler errors will not be rejected.
std::shared_ptr< FailedModulesSet > FailedModules
The set of modules that failed to build.
std::vector< std::pair< std::string, llvm::MemoryBuffer * > > RemappedFileBuffers
The set of file-to-buffer remappings, which take existing files on the system (the first part of each...
ObjCXXARCStandardLibraryKind
Enumerate the kinds of standard library that.
@ ARCXX_libcxx
libc++
@ ARCXX_libstdcxx
libstdc++
DisableValidationForModuleKind
Whether to disable the normal validation performed on precompiled headers and module files when they ...
@ None
Perform validation, don't disable it.
@ PCH
Disable validation for a precompiled header and the modules it depends on.
@ None
The alignment was not explicit in code.
YAML serialization mapping.
Definition: Dominators.h:30
#define false
Definition: stdbool.h:22