Subversion Repositories QNX 8.QNX8 LLVM/Clang compiler suite

Rev

Details | Last modification | View Log | RSS feed

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