Details | Last modification | View Log | RSS feed
| Rev | Author | Line No. | Line | 
|---|---|---|---|
| 14 | pmbaty | 1 | //===- LangOptions.h - C Language Family Language Options -------*- 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 | /// \file | ||
| 10 | /// Defines the clang::LangOptions interface. | ||
| 11 | // | ||
| 12 | //===----------------------------------------------------------------------===// | ||
| 13 | |||
| 14 | #ifndef LLVM_CLANG_BASIC_LANGOPTIONS_H | ||
| 15 | #define LLVM_CLANG_BASIC_LANGOPTIONS_H | ||
| 16 | |||
| 17 | #include "clang/Basic/CommentOptions.h" | ||
| 18 | #include "clang/Basic/LLVM.h" | ||
| 19 | #include "clang/Basic/LangStandard.h" | ||
| 20 | #include "clang/Basic/ObjCRuntime.h" | ||
| 21 | #include "clang/Basic/Sanitizers.h" | ||
| 22 | #include "clang/Basic/TargetCXXABI.h" | ||
| 23 | #include "clang/Basic/Visibility.h" | ||
| 24 | #include "llvm/ADT/FloatingPointMode.h" | ||
| 25 | #include "llvm/ADT/StringRef.h" | ||
| 26 | #include "llvm/ADT/Triple.h" | ||
| 27 | #include <optional> | ||
| 28 | #include <string> | ||
| 29 | #include <vector> | ||
| 30 | |||
| 31 | namespace clang { | ||
| 32 | |||
| 33 | /// Bitfields of LangOptions, split out from LangOptions in order to ensure that | ||
| 34 | /// this large collection of bitfields is a trivial class type. | ||
| 35 | class LangOptionsBase { | ||
| 36 | friend class CompilerInvocation; | ||
| 37 | |||
| 38 | public: | ||
| 39 |   // Define simple language options (with no accessors). | ||
| 40 | #define LANGOPT(Name, Bits, Default, Description) unsigned Name : Bits; | ||
| 41 | #define ENUM_LANGOPT(Name, Type, Bits, Default, Description) | ||
| 42 | #include "clang/Basic/LangOptions.def" | ||
| 43 | |||
| 44 | protected: | ||
| 45 |   // Define language options of enumeration type. These are private, and will | ||
| 46 |   // have accessors (below). | ||
| 47 | #define LANGOPT(Name, Bits, Default, Description) | ||
| 48 | #define ENUM_LANGOPT(Name, Type, Bits, Default, Description) \ | ||
| 49 |   unsigned Name : Bits; | ||
| 50 | #include "clang/Basic/LangOptions.def" | ||
| 51 | }; | ||
| 52 | |||
| 53 | /// In the Microsoft ABI, this controls the placement of virtual displacement | ||
| 54 | /// members used to implement virtual inheritance. | ||
| 55 | enum class MSVtorDispMode { Never, ForVBaseOverride, ForVFTable }; | ||
| 56 | |||
| 57 | /// Shader programs run in specific pipeline stages. | ||
| 58 | /// The order of these values matters, and must be kept in sync with the | ||
| 59 | /// Triple Environment enum in llvm::Triple. The ordering is enforced in | ||
| 60 | ///  static_asserts in Triple.cpp and in clang/Basic/HLSLRuntime.h. | ||
| 61 | enum class ShaderStage { | ||
| 62 | Pixel = 0, | ||
| 63 | Vertex, | ||
| 64 | Geometry, | ||
| 65 | Hull, | ||
| 66 | Domain, | ||
| 67 | Compute, | ||
| 68 | Library, | ||
| 69 | RayGeneration, | ||
| 70 | Intersection, | ||
| 71 | AnyHit, | ||
| 72 | ClosestHit, | ||
| 73 | Miss, | ||
| 74 | Callable, | ||
| 75 | Mesh, | ||
| 76 | Amplification, | ||
| 77 | Invalid, | ||
| 78 | }; | ||
| 79 | |||
| 80 | /// Keeps track of the various options that can be | ||
| 81 | /// enabled, which controls the dialect of C or C++ that is accepted. | ||
| 82 | class LangOptions : public LangOptionsBase { | ||
| 83 | public: | ||
| 84 | using Visibility = clang::Visibility; | ||
| 85 | using RoundingMode = llvm::RoundingMode; | ||
| 86 | |||
| 87 | enum GCMode { NonGC, GCOnly, HybridGC }; | ||
| 88 | enum StackProtectorMode { SSPOff, SSPOn, SSPStrong, SSPReq }; | ||
| 89 | |||
| 90 |   // Automatic variables live on the stack, and when trivial they're usually | ||
| 91 |   // uninitialized because it's undefined behavior to use them without | ||
| 92 |   // initializing them. | ||
| 93 | enum class TrivialAutoVarInitKind { Uninitialized, Zero, Pattern }; | ||
| 94 | |||
| 95 | enum SignedOverflowBehaviorTy { | ||
| 96 |     // Default C standard behavior. | ||
| 97 | SOB_Undefined, | ||
| 98 | |||
| 99 |     // -fwrapv | ||
| 100 | SOB_Defined, | ||
| 101 | |||
| 102 |     // -ftrapv | ||
| 103 | SOB_Trapping | ||
| 104 | }; | ||
| 105 | |||
| 106 |   // FIXME: Unify with TUKind. | ||
| 107 | enum CompilingModuleKind { | ||
| 108 |     /// Not compiling a module interface at all. | ||
| 109 | CMK_None, | ||
| 110 | |||
| 111 |     /// Compiling a module from a module map. | ||
| 112 | CMK_ModuleMap, | ||
| 113 | |||
| 114 |     /// Compiling a module header unit. | ||
| 115 | CMK_HeaderUnit, | ||
| 116 | |||
| 117 |     /// Compiling a C++ modules interface unit. | ||
| 118 | CMK_ModuleInterface, | ||
| 119 | }; | ||
| 120 | |||
| 121 | enum PragmaMSPointersToMembersKind { | ||
| 122 | PPTMK_BestCase, | ||
| 123 | PPTMK_FullGeneralitySingleInheritance, | ||
| 124 | PPTMK_FullGeneralityMultipleInheritance, | ||
| 125 | PPTMK_FullGeneralityVirtualInheritance | ||
| 126 | }; | ||
| 127 | |||
| 128 | using MSVtorDispMode = clang::MSVtorDispMode; | ||
| 129 | |||
| 130 | enum DefaultCallingConvention { | ||
| 131 | DCC_None, | ||
| 132 | DCC_CDecl, | ||
| 133 | DCC_FastCall, | ||
| 134 | DCC_StdCall, | ||
| 135 | DCC_VectorCall, | ||
| 136 | DCC_RegCall | ||
| 137 | }; | ||
| 138 | |||
| 139 | enum AddrSpaceMapMangling { ASMM_Target, ASMM_On, ASMM_Off }; | ||
| 140 | |||
| 141 |   // Corresponds to _MSC_VER | ||
| 142 | enum MSVCMajorVersion { | ||
| 143 | MSVC2010 = 1600, | ||
| 144 | MSVC2012 = 1700, | ||
| 145 | MSVC2013 = 1800, | ||
| 146 | MSVC2015 = 1900, | ||
| 147 | MSVC2017 = 1910, | ||
| 148 | MSVC2017_5 = 1912, | ||
| 149 | MSVC2017_7 = 1914, | ||
| 150 | MSVC2019 = 1920, | ||
| 151 | MSVC2019_5 = 1925, | ||
| 152 | MSVC2019_8 = 1928, | ||
| 153 | }; | ||
| 154 | |||
| 155 | enum SYCLMajorVersion { | ||
| 156 | SYCL_None, | ||
| 157 | SYCL_2017, | ||
| 158 | SYCL_2020, | ||
| 159 |     // The "default" SYCL version to be used when none is specified on the | ||
| 160 |     // frontend command line. | ||
| 161 |     SYCL_Default = SYCL_2020 | ||
| 162 | }; | ||
| 163 | |||
| 164 | enum HLSLLangStd { | ||
| 165 | HLSL_Unset = 0, | ||
| 166 | HLSL_2015 = 2015, | ||
| 167 | HLSL_2016 = 2016, | ||
| 168 | HLSL_2017 = 2017, | ||
| 169 | HLSL_2018 = 2018, | ||
| 170 | HLSL_2021 = 2021, | ||
| 171 | HLSL_202x = 2029, | ||
| 172 | }; | ||
| 173 | |||
| 174 |   /// Clang versions with different platform ABI conformance. | ||
| 175 | enum class ClangABI { | ||
| 176 |     /// Attempt to be ABI-compatible with code generated by Clang 3.8.x | ||
| 177 |     /// (SVN r257626). This causes <1 x long long> to be passed in an | ||
| 178 |     /// integer register instead of an SSE register on x64_64. | ||
| 179 | Ver3_8, | ||
| 180 | |||
| 181 |     /// Attempt to be ABI-compatible with code generated by Clang 4.0.x | ||
| 182 |     /// (SVN r291814). This causes move operations to be ignored when | ||
| 183 |     /// determining whether a class type can be passed or returned directly. | ||
| 184 | Ver4, | ||
| 185 | |||
| 186 |     /// Attempt to be ABI-compatible with code generated by Clang 6.0.x | ||
| 187 |     /// (SVN r321711). This causes determination of whether a type is | ||
| 188 |     /// standard-layout to ignore collisions between empty base classes | ||
| 189 |     /// and between base classes and member subobjects, which affects | ||
| 190 |     /// whether we reuse base class tail padding in some ABIs. | ||
| 191 | Ver6, | ||
| 192 | |||
| 193 |     /// Attempt to be ABI-compatible with code generated by Clang 7.0.x | ||
| 194 |     /// (SVN r338536). This causes alignof (C++) and _Alignof (C11) to be | ||
| 195 |     /// compatible with __alignof (i.e., return the preferred alignment) | ||
| 196 |     /// rather than returning the required alignment. | ||
| 197 | Ver7, | ||
| 198 | |||
| 199 |     /// Attempt to be ABI-compatible with code generated by Clang 9.0.x | ||
| 200 |     /// (SVN r351319). This causes vectors of __int128 to be passed in memory | ||
| 201 |     /// instead of passing in multiple scalar registers on x86_64 on Linux and | ||
| 202 |     /// NetBSD. | ||
| 203 | Ver9, | ||
| 204 | |||
| 205 |     /// Attempt to be ABI-compatible with code generated by Clang 11.0.x | ||
| 206 |     /// (git 2e10b7a39b93). This causes clang to pass unions with a 256-bit | ||
| 207 |     /// vector member on the stack instead of using registers, to not properly | ||
| 208 |     /// mangle substitutions for template names in some cases, and to mangle | ||
| 209 |     /// declaration template arguments without a cast to the parameter type | ||
| 210 |     /// even when that can lead to mangling collisions. | ||
| 211 | Ver11, | ||
| 212 | |||
| 213 |     /// Attempt to be ABI-compatible with code generated by Clang 12.0.x | ||
| 214 |     /// (git 8e464dd76bef). This causes clang to mangle lambdas within | ||
| 215 |     /// global-scope inline variables incorrectly. | ||
| 216 | Ver12, | ||
| 217 | |||
| 218 |     /// Attempt to be ABI-compatible with code generated by Clang 14.0.x. | ||
| 219 |     /// This causes clang to: | ||
| 220 |     ///   - mangle dependent nested names incorrectly. | ||
| 221 |     ///   - make trivial only those defaulted copy constructors with a | ||
| 222 |     ///     parameter-type-list equivalent to the parameter-type-list of an | ||
| 223 |     ///     implicit declaration. | ||
| 224 | Ver14, | ||
| 225 | |||
| 226 |     /// Attempt to be ABI-compatible with code generated by Clang 15.0.x. | ||
| 227 |     /// This causes clang to: | ||
| 228 |     ///   - Reverse the implementation for DR692, DR1395 and DR1432. | ||
| 229 |     ///   - pack non-POD members of packed structs. | ||
| 230 |     ///   - consider classes with defaulted special member functions non-pod. | ||
| 231 | Ver15, | ||
| 232 | |||
| 233 |     /// Conform to the underlying platform's C and C++ ABIs as closely | ||
| 234 |     /// as we can. | ||
| 235 | Latest | ||
| 236 | }; | ||
| 237 | |||
| 238 | enum class CoreFoundationABI { | ||
| 239 |     /// No interoperability ABI has been specified | ||
| 240 | Unspecified, | ||
| 241 |     /// CoreFoundation does not have any language interoperability | ||
| 242 | Standalone, | ||
| 243 |     /// Interoperability with the ObjectiveC runtime | ||
| 244 | ObjectiveC, | ||
| 245 |     /// Interoperability with the latest known version of the Swift runtime | ||
| 246 | Swift, | ||
| 247 |     /// Interoperability with the Swift 5.0 runtime | ||
| 248 | Swift5_0, | ||
| 249 |     /// Interoperability with the Swift 4.2 runtime | ||
| 250 | Swift4_2, | ||
| 251 |     /// Interoperability with the Swift 4.1 runtime | ||
| 252 | Swift4_1, | ||
| 253 | }; | ||
| 254 | |||
| 255 | enum FPModeKind { | ||
| 256 |     // Disable the floating point pragma | ||
| 257 | FPM_Off, | ||
| 258 | |||
| 259 |     // Enable the floating point pragma | ||
| 260 | FPM_On, | ||
| 261 | |||
| 262 |     // Aggressively fuse FP ops (E.g. FMA) disregarding pragmas. | ||
| 263 | FPM_Fast, | ||
| 264 | |||
| 265 |     // Aggressively fuse FP ops and honor pragmas. | ||
| 266 | FPM_FastHonorPragmas | ||
| 267 | }; | ||
| 268 | |||
| 269 |   /// Possible floating point exception behavior. | ||
| 270 | enum FPExceptionModeKind { | ||
| 271 |     /// Assume that floating-point exceptions are masked. | ||
| 272 | FPE_Ignore, | ||
| 273 |     /// Transformations do not cause new exceptions but may hide some. | ||
| 274 | FPE_MayTrap, | ||
| 275 |     /// Strictly preserve the floating-point exception semantics. | ||
| 276 | FPE_Strict, | ||
| 277 |     /// Used internally to represent initial unspecified value. | ||
| 278 | FPE_Default | ||
| 279 | }; | ||
| 280 | |||
| 281 |   /// Possible float expression evaluation method choices. | ||
| 282 | enum FPEvalMethodKind { | ||
| 283 |     /// The evaluation method cannot be determined or is inconsistent for this | ||
| 284 |     /// target. | ||
| 285 | FEM_Indeterminable = -1, | ||
| 286 |     /// Use the declared type for fp arithmetic. | ||
| 287 | FEM_Source = 0, | ||
| 288 |     /// Use the type double for fp arithmetic. | ||
| 289 | FEM_Double = 1, | ||
| 290 |     /// Use extended type for fp arithmetic. | ||
| 291 | FEM_Extended = 2, | ||
| 292 |     /// Used only for FE option processing; this is only used to indicate that | ||
| 293 |     /// the user did not specify an explicit evaluation method on the command | ||
| 294 |     /// line and so the target should be queried for its default evaluation | ||
| 295 |     /// method instead. | ||
| 296 | FEM_UnsetOnCommandLine = 3 | ||
| 297 | }; | ||
| 298 | |||
| 299 | enum ExcessPrecisionKind { FPP_Standard, FPP_Fast, FPP_None }; | ||
| 300 | |||
| 301 |   /// Possible exception handling behavior. | ||
| 302 | enum class ExceptionHandlingKind { None, SjLj, WinEH, DwarfCFI, Wasm }; | ||
| 303 | |||
| 304 | enum class LaxVectorConversionKind { | ||
| 305 |     /// Permit no implicit vector bitcasts. | ||
| 306 | None, | ||
| 307 |     /// Permit vector bitcasts between integer vectors with different numbers | ||
| 308 |     /// of elements but the same total bit-width. | ||
| 309 | Integer, | ||
| 310 |     /// Permit vector bitcasts between all vectors with the same total | ||
| 311 |     /// bit-width. | ||
| 312 | All, | ||
| 313 | }; | ||
| 314 | |||
| 315 | enum class AltivecSrcCompatKind { | ||
| 316 |     // All vector compares produce scalars except vector pixel and vector bool. | ||
| 317 |     // The types vector pixel and vector bool return vector results. | ||
| 318 | Mixed, | ||
| 319 |     // All vector compares produce vector results as in GCC. | ||
| 320 | GCC, | ||
| 321 |     // All vector compares produce scalars as in XL. | ||
| 322 | XL, | ||
| 323 |     // Default clang behaviour. | ||
| 324 |     Default = Mixed, | ||
| 325 | }; | ||
| 326 | |||
| 327 | enum class SignReturnAddressScopeKind { | ||
| 328 |     /// No signing for any function. | ||
| 329 | None, | ||
| 330 |     /// Sign the return address of functions that spill LR. | ||
| 331 | NonLeaf, | ||
| 332 |     /// Sign the return address of all functions, | ||
| 333 | All | ||
| 334 | }; | ||
| 335 | |||
| 336 | enum class SignReturnAddressKeyKind { | ||
| 337 |     /// Return address signing uses APIA key. | ||
| 338 | AKey, | ||
| 339 |     /// Return address signing uses APIB key. | ||
| 340 | BKey | ||
| 341 | }; | ||
| 342 | |||
| 343 | enum class ThreadModelKind { | ||
| 344 |     /// POSIX Threads. | ||
| 345 | POSIX, | ||
| 346 |     /// Single Threaded Environment. | ||
| 347 | Single | ||
| 348 | }; | ||
| 349 | |||
| 350 | enum class ExtendArgsKind { | ||
| 351 |     /// Integer arguments are sign or zero extended to 32/64 bits | ||
| 352 |     /// during default argument promotions. | ||
| 353 | ExtendTo32, | ||
| 354 | ExtendTo64 | ||
| 355 | }; | ||
| 356 | |||
| 357 | enum class GPUDefaultStreamKind { | ||
| 358 |     /// Legacy default stream | ||
| 359 | Legacy, | ||
| 360 |     /// Per-thread default stream | ||
| 361 | PerThread, | ||
| 362 | }; | ||
| 363 | |||
| 364 | enum class DefaultVisiblityExportMapping { | ||
| 365 | None, | ||
| 366 |     /// map only explicit default visibilities to exported | ||
| 367 | Explicit, | ||
| 368 |     /// map all default visibilities to exported | ||
| 369 | All, | ||
| 370 | }; | ||
| 371 | |||
| 372 | enum class StrictFlexArraysLevelKind { | ||
| 373 |     /// Any trailing array member is a FAM. | ||
| 374 | Default = 0, | ||
| 375 |     /// Any trailing array member of undefined, 0, or 1 size is a FAM. | ||
| 376 | OneZeroOrIncomplete = 1, | ||
| 377 |     /// Any trailing array member of undefined or 0 size is a FAM. | ||
| 378 | ZeroOrIncomplete = 2, | ||
| 379 |     /// Any trailing array member of undefined size is a FAM. | ||
| 380 | IncompleteOnly = 3, | ||
| 381 | }; | ||
| 382 | |||
| 383 | public: | ||
| 384 |   /// The used language standard. | ||
| 385 | LangStandard::Kind LangStd; | ||
| 386 | |||
| 387 |   /// Set of enabled sanitizers. | ||
| 388 |   SanitizerSet Sanitize; | ||
| 389 |   /// Is at least one coverage instrumentation type enabled. | ||
| 390 | bool SanitizeCoverage = false; | ||
| 391 | |||
| 392 |   /// Paths to files specifying which objects | ||
| 393 |   /// (files, functions, variables) should not be instrumented. | ||
| 394 | std::vector<std::string> NoSanitizeFiles; | ||
| 395 | |||
| 396 |   /// Paths to the XRay "always instrument" files specifying which | ||
| 397 |   /// objects (files, functions, variables) should be imbued with the XRay | ||
| 398 |   /// "always instrument" attribute. | ||
| 399 |   /// WARNING: This is a deprecated field and will go away in the future. | ||
| 400 | std::vector<std::string> XRayAlwaysInstrumentFiles; | ||
| 401 | |||
| 402 |   /// Paths to the XRay "never instrument" files specifying which | ||
| 403 |   /// objects (files, functions, variables) should be imbued with the XRay | ||
| 404 |   /// "never instrument" attribute. | ||
| 405 |   /// WARNING: This is a deprecated field and will go away in the future. | ||
| 406 | std::vector<std::string> XRayNeverInstrumentFiles; | ||
| 407 | |||
| 408 |   /// Paths to the XRay attribute list files, specifying which objects | ||
| 409 |   /// (files, functions, variables) should be imbued with the appropriate XRay | ||
| 410 |   /// attribute(s). | ||
| 411 | std::vector<std::string> XRayAttrListFiles; | ||
| 412 | |||
| 413 |   /// Paths to special case list files specifying which entities | ||
| 414 |   /// (files, functions) should or should not be instrumented. | ||
| 415 | std::vector<std::string> ProfileListFiles; | ||
| 416 | |||
| 417 | clang::ObjCRuntime ObjCRuntime; | ||
| 418 | |||
| 419 | CoreFoundationABI CFRuntime = CoreFoundationABI::Unspecified; | ||
| 420 | |||
| 421 | std::string ObjCConstantStringClass; | ||
| 422 | |||
| 423 |   /// The name of the handler function to be called when -ftrapv is | ||
| 424 |   /// specified. | ||
| 425 |   /// | ||
| 426 |   /// If none is specified, abort (GCC-compatible behaviour). | ||
| 427 | std::string OverflowHandler; | ||
| 428 | |||
| 429 |   /// The module currently being compiled as specified by -fmodule-name. | ||
| 430 | std::string ModuleName; | ||
| 431 | |||
| 432 |   /// The name of the current module, of which the main source file | ||
| 433 |   /// is a part. If CompilingModule is set, we are compiling the interface | ||
| 434 |   /// of this module, otherwise we are compiling an implementation file of | ||
| 435 |   /// it. This starts as ModuleName in case -fmodule-name is provided and | ||
| 436 |   /// changes during compilation to reflect the current module. | ||
| 437 | std::string CurrentModule; | ||
| 438 | |||
| 439 |   /// The names of any features to enable in module 'requires' decls | ||
| 440 |   /// in addition to the hard-coded list in Module.cpp and the target features. | ||
| 441 |   /// | ||
| 442 |   /// This list is sorted. | ||
| 443 | std::vector<std::string> ModuleFeatures; | ||
| 444 | |||
| 445 |   /// Options for parsing comments. | ||
| 446 |   CommentOptions CommentOpts; | ||
| 447 | |||
| 448 |   /// A list of all -fno-builtin-* function names (e.g., memset). | ||
| 449 | std::vector<std::string> NoBuiltinFuncs; | ||
| 450 | |||
| 451 |   /// A prefix map for __FILE__, __BASE_FILE__ and __builtin_FILE(). | ||
| 452 | std::map<std::string, std::string, std::greater<std::string>> MacroPrefixMap; | ||
| 453 | |||
| 454 |   /// Triples of the OpenMP targets that the host code codegen should | ||
| 455 |   /// take into account in order to generate accurate offloading descriptors. | ||
| 456 | std::vector<llvm::Triple> OMPTargetTriples; | ||
| 457 | |||
| 458 |   /// Name of the IR file that contains the result of the OpenMP target | ||
| 459 |   /// host code generation. | ||
| 460 | std::string OMPHostIRFile; | ||
| 461 | |||
| 462 |   /// The user provided compilation unit ID, if non-empty. This is used to | ||
| 463 |   /// externalize static variables which is needed to support accessing static | ||
| 464 |   /// device variables in host code for single source offloading languages | ||
| 465 |   /// like CUDA/HIP. | ||
| 466 | std::string CUID; | ||
| 467 | |||
| 468 |   /// C++ ABI to compile with, if specified by the frontend through -fc++-abi=. | ||
| 469 |   /// This overrides the default ABI used by the target. | ||
| 470 | std::optional<TargetCXXABI::Kind> CXXABI; | ||
| 471 | |||
| 472 |   /// Indicates whether the front-end is explicitly told that the | ||
| 473 |   /// input is a header file (i.e. -x c-header). | ||
| 474 | bool IsHeaderFile = false; | ||
| 475 | |||
| 476 |   /// The default stream kind used for HIP kernel launching. | ||
| 477 |   GPUDefaultStreamKind GPUDefaultStream; | ||
| 478 | |||
| 479 |   /// The seed used by the randomize structure layout feature. | ||
| 480 | std::string RandstructSeed; | ||
| 481 | |||
| 482 |   /// Indicates whether the __FILE__ macro should use the target's | ||
| 483 |   /// platform-specific file separator or whether it should use the build | ||
| 484 |   /// environment's platform-specific file separator. | ||
| 485 |   /// | ||
| 486 |   /// The plaform-specific path separator is the backslash(\) for Windows and | ||
| 487 |   /// forward slash (/) elsewhere. | ||
| 488 | bool UseTargetPathSeparator = false; | ||
| 489 | |||
| 490 | LangOptions(); | ||
| 491 | |||
| 492 |   /// Set language defaults for the given input language and | ||
| 493 |   /// language standard in the given LangOptions object. | ||
| 494 |   /// | ||
| 495 |   /// \param Opts - The LangOptions object to set up. | ||
| 496 |   /// \param Lang - The input language. | ||
| 497 |   /// \param T - The target triple. | ||
| 498 |   /// \param Includes - If the language requires extra headers to be implicitly | ||
| 499 |   ///                   included, they will be appended to this list. | ||
| 500 |   /// \param LangStd - The input language standard. | ||
| 501 | static void | ||
| 502 | setLangDefaults(LangOptions &Opts, Language Lang, const llvm::Triple &T, | ||
| 503 | std::vector<std::string> &Includes, | ||
| 504 | LangStandard::Kind LangStd = LangStandard::lang_unspecified); | ||
| 505 | |||
| 506 |   // Define accessors/mutators for language options of enumeration type. | ||
| 507 | #define LANGOPT(Name, Bits, Default, Description) | ||
| 508 | #define ENUM_LANGOPT(Name, Type, Bits, Default, Description) \ | ||
| 509 |   Type get##Name() const { return static_cast<Type>(Name); } \ | ||
| 510 |   void set##Name(Type Value) { Name = static_cast<unsigned>(Value); } | ||
| 511 | #include "clang/Basic/LangOptions.def" | ||
| 512 | |||
| 513 |   /// Are we compiling a module? | ||
| 514 | bool isCompilingModule() const { | ||
| 515 | return getCompilingModule() != CMK_None; | ||
| 516 |   } | ||
| 517 | |||
| 518 |   /// Are we compiling a standard c++ module interface? | ||
| 519 | bool isCompilingModuleInterface() const { | ||
| 520 | return getCompilingModule() == CMK_ModuleInterface; | ||
| 521 |   } | ||
| 522 | |||
| 523 |   /// Are we compiling a module implementation? | ||
| 524 | bool isCompilingModuleImplementation() const { | ||
| 525 | return !isCompilingModule() && !ModuleName.empty(); | ||
| 526 |   } | ||
| 527 | |||
| 528 |   /// Do we need to track the owning module for a local declaration? | ||
| 529 | bool trackLocalOwningModule() const { | ||
| 530 | return isCompilingModule() || ModulesLocalVisibility; | ||
| 531 |   } | ||
| 532 | |||
| 533 | bool isSignedOverflowDefined() const { | ||
| 534 | return getSignedOverflowBehavior() == SOB_Defined; | ||
| 535 |   } | ||
| 536 | |||
| 537 | bool isSubscriptPointerArithmetic() const { | ||
| 538 | return ObjCRuntime.isSubscriptPointerArithmetic() && | ||
| 539 | !ObjCSubscriptingLegacyRuntime; | ||
| 540 |   } | ||
| 541 | |||
| 542 | bool isCompatibleWithMSVC(MSVCMajorVersion MajorVersion) const { | ||
| 543 | return MSCompatibilityVersion >= MajorVersion * 100000U; | ||
| 544 |   } | ||
| 545 | |||
| 546 |   /// Reset all of the options that are not considered when building a | ||
| 547 |   /// module. | ||
| 548 | void resetNonModularOptions(); | ||
| 549 | |||
| 550 |   /// Is this a libc/libm function that is no longer recognized as a | ||
| 551 |   /// builtin because a -fno-builtin-* option has been specified? | ||
| 552 | bool isNoBuiltinFunc(StringRef Name) const; | ||
| 553 | |||
| 554 |   /// True if any ObjC types may have non-trivial lifetime qualifiers. | ||
| 555 | bool allowsNonTrivialObjCLifetimeQualifiers() const { | ||
| 556 | return ObjCAutoRefCount || ObjCWeak; | ||
| 557 |   } | ||
| 558 | |||
| 559 | bool assumeFunctionsAreConvergent() const { | ||
| 560 | return ConvergentFunctions; | ||
| 561 |   } | ||
| 562 | |||
| 563 |   /// Return the OpenCL C or C++ version as a VersionTuple. | ||
| 564 | VersionTuple getOpenCLVersionTuple() const; | ||
| 565 | |||
| 566 |   /// Return the OpenCL version that kernel language is compatible with | ||
| 567 | unsigned getOpenCLCompatibleVersion() const; | ||
| 568 | |||
| 569 |   /// Return the OpenCL C or C++ for OpenCL language name and version | ||
| 570 |   /// as a string. | ||
| 571 | std::string getOpenCLVersionString() const; | ||
| 572 | |||
| 573 |   /// Returns true if functions without prototypes or functions with an | ||
| 574 |   /// identifier list (aka K&R C functions) are not allowed. | ||
| 575 | bool requiresStrictPrototypes() const { | ||
| 576 | return CPlusPlus || C2x || DisableKNRFunctions; | ||
| 577 |   } | ||
| 578 | |||
| 579 |   /// Returns true if implicit function declarations are allowed in the current | ||
| 580 |   /// language mode. | ||
| 581 | bool implicitFunctionsAllowed() const { | ||
| 582 | return !requiresStrictPrototypes() && !OpenCL; | ||
| 583 |   } | ||
| 584 | |||
| 585 |   /// Returns true if implicit int is part of the language requirements. | ||
| 586 | bool isImplicitIntRequired() const { return !CPlusPlus && !C99; } | ||
| 587 | |||
| 588 |   /// Returns true if implicit int is supported at all. | ||
| 589 | bool isImplicitIntAllowed() const { return !CPlusPlus && !C2x; } | ||
| 590 | |||
| 591 |   /// Check if return address signing is enabled. | ||
| 592 | bool hasSignReturnAddress() const { | ||
| 593 | return getSignReturnAddressScope() != SignReturnAddressScopeKind::None; | ||
| 594 |   } | ||
| 595 | |||
| 596 |   /// Check if return address signing uses AKey. | ||
| 597 | bool isSignReturnAddressWithAKey() const { | ||
| 598 | return getSignReturnAddressKey() == SignReturnAddressKeyKind::AKey; | ||
| 599 |   } | ||
| 600 | |||
| 601 |   /// Check if leaf functions are also signed. | ||
| 602 | bool isSignReturnAddressScopeAll() const { | ||
| 603 | return getSignReturnAddressScope() == SignReturnAddressScopeKind::All; | ||
| 604 |   } | ||
| 605 | |||
| 606 | bool hasSjLjExceptions() const { | ||
| 607 | return getExceptionHandling() == ExceptionHandlingKind::SjLj; | ||
| 608 |   } | ||
| 609 | |||
| 610 | bool hasSEHExceptions() const { | ||
| 611 | return getExceptionHandling() == ExceptionHandlingKind::WinEH; | ||
| 612 |   } | ||
| 613 | |||
| 614 | bool hasDWARFExceptions() const { | ||
| 615 | return getExceptionHandling() == ExceptionHandlingKind::DwarfCFI; | ||
| 616 |   } | ||
| 617 | |||
| 618 | bool hasWasmExceptions() const { | ||
| 619 | return getExceptionHandling() == ExceptionHandlingKind::Wasm; | ||
| 620 |   } | ||
| 621 | |||
| 622 | bool isSYCL() const { return SYCLIsDevice || SYCLIsHost; } | ||
| 623 | |||
| 624 | bool hasDefaultVisibilityExportMapping() const { | ||
| 625 | return getDefaultVisibilityExportMapping() != | ||
| 626 | DefaultVisiblityExportMapping::None; | ||
| 627 |   } | ||
| 628 | |||
| 629 | bool isExplicitDefaultVisibilityExportMapping() const { | ||
| 630 | return getDefaultVisibilityExportMapping() == | ||
| 631 | DefaultVisiblityExportMapping::Explicit; | ||
| 632 |   } | ||
| 633 | |||
| 634 | bool isAllDefaultVisibilityExportMapping() const { | ||
| 635 | return getDefaultVisibilityExportMapping() == | ||
| 636 | DefaultVisiblityExportMapping::All; | ||
| 637 |   } | ||
| 638 | |||
| 639 |   /// Remap path prefix according to -fmacro-prefix-path option. | ||
| 640 | void remapPathPrefix(SmallVectorImpl<char> &Path) const; | ||
| 641 | |||
| 642 | RoundingMode getDefaultRoundingMode() const { | ||
| 643 | return RoundingMath ? RoundingMode::Dynamic | ||
| 644 | : RoundingMode::NearestTiesToEven; | ||
| 645 |   } | ||
| 646 | |||
| 647 | FPExceptionModeKind getDefaultExceptionMode() const { | ||
| 648 | FPExceptionModeKind EM = getFPExceptionMode(); | ||
| 649 | if (EM == FPExceptionModeKind::FPE_Default) | ||
| 650 | return FPExceptionModeKind::FPE_Ignore; | ||
| 651 | return EM; | ||
| 652 |   } | ||
| 653 | }; | ||
| 654 | |||
| 655 | /// Floating point control options | ||
| 656 | class FPOptionsOverride; | ||
| 657 | class FPOptions { | ||
| 658 | public: | ||
| 659 |   // We start by defining the layout. | ||
| 660 | using storage_type = uint32_t; | ||
| 661 | |||
| 662 | using RoundingMode = llvm::RoundingMode; | ||
| 663 | |||
| 664 | static constexpr unsigned StorageBitSize = 8 * sizeof(storage_type); | ||
| 665 | |||
| 666 |   // Define a fake option named "First" so that we have a PREVIOUS even for the | ||
| 667 |   // real first option. | ||
| 668 | static constexpr storage_type FirstShift = 0, FirstWidth = 0; | ||
| 669 | #define OPTION(NAME, TYPE, WIDTH, PREVIOUS)                                    \ | ||
| 670 |   static constexpr storage_type NAME##Shift =                                  \ | ||
| 671 |       PREVIOUS##Shift + PREVIOUS##Width;                                       \ | ||
| 672 |   static constexpr storage_type NAME##Width = WIDTH;                           \ | ||
| 673 |   static constexpr storage_type NAME##Mask = ((1 << NAME##Width) - 1)          \ | ||
| 674 |                                              << NAME##Shift; | ||
| 675 | #include "clang/Basic/FPOptions.def" | ||
| 676 | |||
| 677 | static constexpr storage_type TotalWidth = 0 | ||
| 678 | #define OPTION(NAME, TYPE, WIDTH, PREVIOUS) +WIDTH | ||
| 679 | #include "clang/Basic/FPOptions.def" | ||
| 680 |       ; | ||
| 681 | static_assert(TotalWidth <= StorageBitSize, "Too short type for FPOptions"); | ||
| 682 | |||
| 683 | private: | ||
| 684 |   storage_type Value; | ||
| 685 | |||
| 686 | FPOptionsOverride getChangesSlow(const FPOptions &Base) const; | ||
| 687 | |||
| 688 | public: | ||
| 689 | FPOptions() : Value(0) { | ||
| 690 | setFPContractMode(LangOptions::FPM_Off); | ||
| 691 | setConstRoundingMode(RoundingMode::Dynamic); | ||
| 692 | setSpecifiedExceptionMode(LangOptions::FPE_Default); | ||
| 693 |   } | ||
| 694 | explicit FPOptions(const LangOptions &LO) { | ||
| 695 | Value = 0; | ||
| 696 |     // The language fp contract option FPM_FastHonorPragmas has the same effect | ||
| 697 |     // as FPM_Fast in frontend. For simplicity, use FPM_Fast uniformly in | ||
| 698 |     // frontend. | ||
| 699 | auto LangOptContractMode = LO.getDefaultFPContractMode(); | ||
| 700 | if (LangOptContractMode == LangOptions::FPM_FastHonorPragmas) | ||
| 701 | LangOptContractMode = LangOptions::FPM_Fast; | ||
| 702 | setFPContractMode(LangOptContractMode); | ||
| 703 | setRoundingMath(LO.RoundingMath); | ||
| 704 | setConstRoundingMode(LangOptions::RoundingMode::Dynamic); | ||
| 705 | setSpecifiedExceptionMode(LO.getFPExceptionMode()); | ||
| 706 | setAllowFPReassociate(LO.AllowFPReassoc); | ||
| 707 | setNoHonorNaNs(LO.NoHonorNaNs); | ||
| 708 | setNoHonorInfs(LO.NoHonorInfs); | ||
| 709 | setNoSignedZero(LO.NoSignedZero); | ||
| 710 | setAllowReciprocal(LO.AllowRecip); | ||
| 711 | setAllowApproxFunc(LO.ApproxFunc); | ||
| 712 | if (getFPContractMode() == LangOptions::FPM_On && | ||
| 713 | getRoundingMode() == llvm::RoundingMode::Dynamic && | ||
| 714 | getExceptionMode() == LangOptions::FPE_Strict) | ||
| 715 |       // If the FP settings are set to the "strict" model, then | ||
| 716 |       // FENV access is set to true. (ffp-model=strict) | ||
| 717 | setAllowFEnvAccess(true); | ||
| 718 |     else | ||
| 719 | setAllowFEnvAccess(LangOptions::FPM_Off); | ||
| 720 |   } | ||
| 721 | |||
| 722 | bool allowFPContractWithinStatement() const { | ||
| 723 | return getFPContractMode() == LangOptions::FPM_On; | ||
| 724 |   } | ||
| 725 | void setAllowFPContractWithinStatement() { | ||
| 726 | setFPContractMode(LangOptions::FPM_On); | ||
| 727 |   } | ||
| 728 | |||
| 729 | bool allowFPContractAcrossStatement() const { | ||
| 730 | return getFPContractMode() == LangOptions::FPM_Fast; | ||
| 731 |   } | ||
| 732 | void setAllowFPContractAcrossStatement() { | ||
| 733 | setFPContractMode(LangOptions::FPM_Fast); | ||
| 734 |   } | ||
| 735 | |||
| 736 | bool isFPConstrained() const { | ||
| 737 | return getRoundingMode() != llvm::RoundingMode::NearestTiesToEven || | ||
| 738 | getExceptionMode() != LangOptions::FPE_Ignore || | ||
| 739 | getAllowFEnvAccess(); | ||
| 740 |   } | ||
| 741 | |||
| 742 | RoundingMode getRoundingMode() const { | ||
| 743 | RoundingMode RM = getConstRoundingMode(); | ||
| 744 | if (RM == RoundingMode::Dynamic) { | ||
| 745 |       // C2x: 7.6.2p3  If the FE_DYNAMIC mode is specified and FENV_ACCESS is | ||
| 746 |       // "off", the translator may assume that the default rounding mode is in | ||
| 747 |       // effect. | ||
| 748 | if (!getAllowFEnvAccess() && !getRoundingMath()) | ||
| 749 | RM = RoundingMode::NearestTiesToEven; | ||
| 750 |     } | ||
| 751 | return RM; | ||
| 752 |   } | ||
| 753 | |||
| 754 | LangOptions::FPExceptionModeKind getExceptionMode() const { | ||
| 755 | LangOptions::FPExceptionModeKind EM = getSpecifiedExceptionMode(); | ||
| 756 | if (EM == LangOptions::FPExceptionModeKind::FPE_Default) { | ||
| 757 | if (getAllowFEnvAccess()) | ||
| 758 | return LangOptions::FPExceptionModeKind::FPE_Strict; | ||
| 759 |       else | ||
| 760 | return LangOptions::FPExceptionModeKind::FPE_Ignore; | ||
| 761 |     } | ||
| 762 | return EM; | ||
| 763 |   } | ||
| 764 | |||
| 765 | bool operator==(FPOptions other) const { return Value == other.Value; } | ||
| 766 | |||
| 767 |   /// Return the default value of FPOptions that's used when trailing | ||
| 768 |   /// storage isn't required. | ||
| 769 | static FPOptions defaultWithoutTrailingStorage(const LangOptions &LO); | ||
| 770 | |||
| 771 | storage_type getAsOpaqueInt() const { return Value; } | ||
| 772 | static FPOptions getFromOpaqueInt(storage_type Value) { | ||
| 773 |     FPOptions Opts; | ||
| 774 | Opts.Value = Value; | ||
| 775 | return Opts; | ||
| 776 |   } | ||
| 777 | |||
| 778 |   /// Return difference with the given option set. | ||
| 779 | FPOptionsOverride getChangesFrom(const FPOptions &Base) const; | ||
| 780 | |||
| 781 |   // We can define most of the accessors automatically: | ||
| 782 | #define OPTION(NAME, TYPE, WIDTH, PREVIOUS)                                    \ | ||
| 783 |   TYPE get##NAME() const {                                                     \ | ||
| 784 |     return static_cast<TYPE>((Value & NAME##Mask) >> NAME##Shift);             \ | ||
| 785 |   }                                                                            \ | ||
| 786 |   void set##NAME(TYPE value) {                                                 \ | ||
| 787 |     Value = (Value & ~NAME##Mask) | (storage_type(value) << NAME##Shift);      \ | ||
| 788 |   } | ||
| 789 | #include "clang/Basic/FPOptions.def" | ||
| 790 | LLVM_DUMP_METHOD void dump(); | ||
| 791 | }; | ||
| 792 | |||
| 793 | /// Represents difference between two FPOptions values. | ||
| 794 | /// | ||
| 795 | /// The effect of language constructs changing the set of floating point options | ||
| 796 | /// is usually a change of some FP properties while leaving others intact. This | ||
| 797 | /// class describes such changes by keeping information about what FP options | ||
| 798 | /// are overridden. | ||
| 799 | /// | ||
| 800 | /// The integral set of FP options, described by the class FPOptions, may be | ||
| 801 | /// represented as a default FP option set, defined by language standard and | ||
| 802 | /// command line options, with the overrides introduced by pragmas. | ||
| 803 | /// | ||
| 804 | /// The is implemented as a value of the new FPOptions plus a mask showing which | ||
| 805 | /// fields are actually set in it. | ||
| 806 | class FPOptionsOverride { | ||
| 807 | FPOptions Options = FPOptions::getFromOpaqueInt(0); | ||
| 808 | FPOptions::storage_type OverrideMask = 0; | ||
| 809 | |||
| 810 | public: | ||
| 811 | using RoundingMode = llvm::RoundingMode; | ||
| 812 | |||
| 813 |   /// The type suitable for storing values of FPOptionsOverride. Must be twice | ||
| 814 |   /// as wide as bit size of FPOption. | ||
| 815 | using storage_type = uint64_t; | ||
| 816 | static_assert(sizeof(storage_type) >= 2 * sizeof(FPOptions::storage_type), | ||
| 817 | "Too short type for FPOptionsOverride"); | ||
| 818 | |||
| 819 |   /// Bit mask selecting bits of OverrideMask in serialized representation of | ||
| 820 |   /// FPOptionsOverride. | ||
| 821 | static constexpr storage_type OverrideMaskBits = | ||
| 822 | (static_cast<storage_type>(1) << FPOptions::StorageBitSize) - 1; | ||
| 823 | |||
| 824 | FPOptionsOverride() {} | ||
| 825 | FPOptionsOverride(const LangOptions &LO) | ||
| 826 | : Options(LO), OverrideMask(OverrideMaskBits) {} | ||
| 827 | FPOptionsOverride(FPOptions FPO) | ||
| 828 | : Options(FPO), OverrideMask(OverrideMaskBits) {} | ||
| 829 | FPOptionsOverride(FPOptions FPO, FPOptions::storage_type Mask) | ||
| 830 | : Options(FPO), OverrideMask(Mask) {} | ||
| 831 | |||
| 832 | bool requiresTrailingStorage() const { return OverrideMask != 0; } | ||
| 833 | |||
| 834 | void setAllowFPContractWithinStatement() { | ||
| 835 | setFPContractModeOverride(LangOptions::FPM_On); | ||
| 836 |   } | ||
| 837 | |||
| 838 | void setAllowFPContractAcrossStatement() { | ||
| 839 | setFPContractModeOverride(LangOptions::FPM_Fast); | ||
| 840 |   } | ||
| 841 | |||
| 842 | void setDisallowFPContract() { | ||
| 843 | setFPContractModeOverride(LangOptions::FPM_Off); | ||
| 844 |   } | ||
| 845 | |||
| 846 | void setFPPreciseEnabled(bool Value) { | ||
| 847 | setAllowFPReassociateOverride(!Value); | ||
| 848 | setNoHonorNaNsOverride(!Value); | ||
| 849 | setNoHonorInfsOverride(!Value); | ||
| 850 | setNoSignedZeroOverride(!Value); | ||
| 851 | setAllowReciprocalOverride(!Value); | ||
| 852 | setAllowApproxFuncOverride(!Value); | ||
| 853 | if (Value) | ||
| 854 |       /* Precise mode implies fp_contract=on and disables ffast-math */ | ||
| 855 | setAllowFPContractWithinStatement(); | ||
| 856 |     else | ||
| 857 |       /* Precise mode disabled sets fp_contract=fast and enables ffast-math */ | ||
| 858 | setAllowFPContractAcrossStatement(); | ||
| 859 |   } | ||
| 860 | |||
| 861 | storage_type getAsOpaqueInt() const { | ||
| 862 | return (static_cast<storage_type>(Options.getAsOpaqueInt()) | ||
| 863 | << FPOptions::StorageBitSize) | | ||
| 864 |            OverrideMask; | ||
| 865 |   } | ||
| 866 | static FPOptionsOverride getFromOpaqueInt(storage_type I) { | ||
| 867 |     FPOptionsOverride Opts; | ||
| 868 | Opts.OverrideMask = I & OverrideMaskBits; | ||
| 869 | Opts.Options = FPOptions::getFromOpaqueInt(I >> FPOptions::StorageBitSize); | ||
| 870 | return Opts; | ||
| 871 |   } | ||
| 872 | |||
| 873 | FPOptions applyOverrides(FPOptions Base) { | ||
| 874 |     FPOptions Result = | ||
| 875 | FPOptions::getFromOpaqueInt((Base.getAsOpaqueInt() & ~OverrideMask) | | ||
| 876 | (Options.getAsOpaqueInt() & OverrideMask)); | ||
| 877 | return Result; | ||
| 878 |   } | ||
| 879 | |||
| 880 | FPOptions applyOverrides(const LangOptions &LO) { | ||
| 881 | return applyOverrides(FPOptions(LO)); | ||
| 882 |   } | ||
| 883 | |||
| 884 | bool operator==(FPOptionsOverride other) const { | ||
| 885 | return Options == other.Options && OverrideMask == other.OverrideMask; | ||
| 886 |   } | ||
| 887 | bool operator!=(FPOptionsOverride other) const { return !(*this == other); } | ||
| 888 | |||
| 889 | #define OPTION(NAME, TYPE, WIDTH, PREVIOUS)                                    \ | ||
| 890 |   bool has##NAME##Override() const {                                           \ | ||
| 891 |     return OverrideMask & FPOptions::NAME##Mask;                               \ | ||
| 892 |   }                                                                            \ | ||
| 893 |   TYPE get##NAME##Override() const {                                           \ | ||
| 894 |     assert(has##NAME##Override());                                             \ | ||
| 895 |     return Options.get##NAME();                                                \ | ||
| 896 |   }                                                                            \ | ||
| 897 |   void clear##NAME##Override() {                                               \ | ||
| 898 |     /* Clear the actual value so that we don't have spurious differences when  \ | ||
| 899 |      * testing equality. */                                                    \ | ||
| 900 |     Options.set##NAME(TYPE(0));                                                \ | ||
| 901 |     OverrideMask &= ~FPOptions::NAME##Mask;                                    \ | ||
| 902 |   }                                                                            \ | ||
| 903 |   void set##NAME##Override(TYPE value) {                                       \ | ||
| 904 |     Options.set##NAME(value);                                                  \ | ||
| 905 |     OverrideMask |= FPOptions::NAME##Mask;                                     \ | ||
| 906 |   } | ||
| 907 | #include "clang/Basic/FPOptions.def" | ||
| 908 | LLVM_DUMP_METHOD void dump(); | ||
| 909 | }; | ||
| 910 | |||
| 911 | inline FPOptionsOverride FPOptions::getChangesFrom(const FPOptions &Base) const { | ||
| 912 | if (Value == Base.Value) | ||
| 913 | return FPOptionsOverride(); | ||
| 914 | return getChangesSlow(Base); | ||
| 915 | } | ||
| 916 | |||
| 917 | /// Describes the kind of translation unit being processed. | ||
| 918 | enum TranslationUnitKind { | ||
| 919 |   /// The translation unit is a complete translation unit. | ||
| 920 | TU_Complete, | ||
| 921 | |||
| 922 |   /// The translation unit is a prefix to a translation unit, and is | ||
| 923 |   /// not complete. | ||
| 924 | TU_Prefix, | ||
| 925 | |||
| 926 |   /// The translation unit is a module. | ||
| 927 | TU_Module, | ||
| 928 | |||
| 929 |   /// The translation unit is a is a complete translation unit that we might | ||
| 930 |   /// incrementally extend later. | ||
| 931 | TU_Incremental | ||
| 932 | }; | ||
| 933 | |||
| 934 | } // namespace clang | ||
| 935 | |||
| 936 | #endif // LLVM_CLANG_BASIC_LANGOPTIONS_H |