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_ |