clang 22.0.0git
LangOptions.h
Go to the documentation of this file.
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
19#include "clang/Basic/LLVM.h"
25#include "llvm/ADT/FloatingPointMode.h"
26#include "llvm/ADT/StringRef.h"
27#include "llvm/BinaryFormat/DXContainer.h"
28#include "llvm/Support/AllocToken.h"
29#include "llvm/TargetParser/Triple.h"
30#include <optional>
31#include <string>
32#include <vector>
33
34namespace clang {
35
36/// In the Microsoft ABI, this controls the placement of virtual displacement
37/// members used to implement virtual inheritance.
39
40/// Shader programs run in specific pipeline stages.
41/// The order of these values matters, and must be kept in sync with the
42/// Triple Environment enum in llvm::Triple. The ordering is enforced in
43/// static_asserts in Triple.cpp and in clang/Basic/HLSLRuntime.h.
62
69
70/// Bitfields of LangOptions, split out from LangOptions in order to ensure that
71/// this large collection of bitfields is a trivial class type.
73 friend class CompilerInvocation;
75
76public:
78 using RoundingMode = llvm::RoundingMode;
80
81 /// For ASTs produced with different option value, signifies their level of
82 /// compatibility.
83 enum class CompatibilityKind {
84 /// Does affect the construction of the AST in a way that does prevent
85 /// module interoperability.
87 /// Does affect the construction of the AST in a way that doesn't prevent
88 /// interoperability (that is, the value can be different between an
89 /// explicit module and the user of that module).
91 /// Does not affect the construction of the AST in any way (that is, the
92 /// value can be different between an implicit module and the user of that
93 /// module).
95 };
96
99
100 // Automatic variables live on the stack, and when trivial they're usually
101 // uninitialized because it's undefined behavior to use them without
102 // initializing them.
104
106 // Default C standard behavior.
108
109 // -fwrapv
111
112 // -ftrapv
114 };
115
116 // FIXME: Unify with TUKind.
118 /// Not compiling a module interface at all.
120
121 /// Compiling a module from a module map.
123
124 /// Compiling a module header unit.
126
127 /// Compiling a C++ modules interface unit.
129 };
130
137
139
149
151
152 // Corresponds to _MSC_VER
154 MSVC2010 = 1600,
155 MSVC2012 = 1700,
156 MSVC2013 = 1800,
157 MSVC2015 = 1900,
158 MSVC2017 = 1910,
161 MSVC2019 = 1920,
166 };
167
172 // The "default" SYCL version to be used when none is specified on the
173 // frontend command line.
175 };
176
179 HLSL_2015 = 2015,
180 HLSL_2016 = 2016,
181 HLSL_2017 = 2017,
182 HLSL_2018 = 2018,
183 HLSL_2021 = 2021,
184 HLSL_202x = 2028,
185 HLSL_202y = 2029,
186 };
187
188 /// Clang versions with different platform ABI conformance.
189 enum class ClangABI {
190#define ABI_VER_MAJOR_MINOR(Major, Minor) Ver##Major##_##Minor,
191#define ABI_VER_MAJOR(Major) Ver##Major,
192#define ABI_VER_LATEST(Latest) Latest
193#include "clang/Basic/ABIVersions.def"
194 };
195
196 enum class CoreFoundationABI {
197 /// No interoperability ABI has been specified
199 /// CoreFoundation does not have any language interoperability
201 /// Interoperability with the ObjectiveC runtime
203 /// Interoperability with the latest known version of the Swift runtime
205 /// Interoperability with the Swift 5.0 runtime
207 /// Interoperability with the Swift 4.2 runtime
209 /// Interoperability with the Swift 4.1 runtime
211 };
212
214 // Disable the floating point pragma
216
217 // Enable the floating point pragma
219
220 // Aggressively fuse FP ops (E.g. FMA) disregarding pragmas.
222
223 // Aggressively fuse FP ops and honor pragmas.
225 };
226
227 /// Possible floating point exception behavior.
229 /// Assume that floating-point exceptions are masked.
231 /// Transformations do not cause new exceptions but may hide some.
233 /// Strictly preserve the floating-point exception semantics.
235 /// Used internally to represent initial unspecified value.
237 };
238
239 /// Possible float expression evaluation method choices.
240 enum FPEvalMethodKind : unsigned {
241 /// Use the declared type for fp arithmetic.
243 /// Use the type double for fp arithmetic.
245 /// Use extended type for fp arithmetic.
247 /// Used only for FE option processing; this is only used to indicate that
248 /// the user did not specify an explicit evaluation method on the command
249 /// line and so the target should be queried for its default evaluation
250 /// method instead.
252 };
253
255
257 /// Permit no implicit vector bitcasts.
259 /// Permit vector bitcasts between integer vectors with different numbers
260 /// of elements but the same total bit-width.
262 /// Permit vector bitcasts between all vectors with the same total
263 /// bit-width.
265 };
266
268 // All vector compares produce scalars except vector pixel and vector bool.
269 // The types vector pixel and vector bool return vector results.
271 // All vector compares produce vector results as in GCC.
273 // All vector compares produce scalars as in XL.
275 // Default clang behaviour.
277 };
278
280 /// No signing for any function.
282 /// Sign the return address of functions that spill LR.
284 /// Sign the return address of all functions,
286 };
287
289 /// Return address signing uses APIA key.
291 /// Return address signing uses APIB key.
293 };
294
295 enum class ThreadModelKind {
296 /// POSIX Threads.
298 /// Single Threaded Environment.
300 };
301
302 enum class ExtendArgsKind {
303 /// Integer arguments are sign or zero extended to 32/64 bits
304 /// during default argument promotions.
307 };
308
310 /// Legacy default stream
312 /// Per-thread default stream
314 };
315
316 /// Exclude certain code patterns from being instrumented by arithmetic
317 /// overflow sanitizers
319 /// Don't exclude any overflow patterns from sanitizers
320 None = 1 << 0,
321 /// Exclude all overflow patterns (below)
322 All = 1 << 1,
323 /// if (a + b < a)
325 /// if (a + b < a)
327 /// -1UL
329 /// while (count--)
331 };
332
335 /// map only explicit default visibilities to exported
337 /// map all default visibilities to exported
339 };
340
342 /// Force hidden visibility
344 /// Force protected visibility
346 /// Force default visibility
348 /// Don't alter the visibility
350 };
351
353 /// Keep the IR-gen assigned visibility.
355 /// Override the IR-gen assigned visibility with default visibility.
357 /// Override the IR-gen assigned visibility with hidden visibility.
359 /// Override the IR-gen assigned visibility with protected visibility.
361 };
362
364 /// Any trailing array member is a FAM.
366 /// Any trailing array member of undefined, 0, or 1 size is a FAM.
368 /// Any trailing array member of undefined or 0 size is a FAM.
370 /// Any trailing array member of undefined size is a FAM.
372 };
373
374 /// Controls the various implementations for complex multiplication and
375 // division.
377 /// Implementation of complex division and multiplication using a call to
378 /// runtime library functions(generally the case, but the BE might
379 /// sometimes replace the library call if it knows enough about the
380 /// potential range of the inputs). Overflow and non-finite values are
381 /// handled by the library implementation. This is the default value.
383
384 /// Implementation of complex division offering an improved handling
385 /// for overflow in intermediate calculations with no special handling for
386 /// NaN and infinite values.
388
389 /// Implementation of complex division using algebraic formulas at
390 /// higher precision. Overflow is handled. Non-finite values are handled in
391 /// some cases. If the target hardware does not have native support for a
392 /// higher precision data type, an implementation for the complex operation
393 /// will be used to provide improved guards against intermediate overflow,
394 /// but overflow and underflow may still occur in some cases. NaN and
395 /// infinite values are not handled.
397
398 /// Implementation of complex division and multiplication using
399 /// algebraic formulas at source precision. No special handling to avoid
400 /// overflow. NaN and infinite values are not handled.
402
403 /// No range rule is enabled.
405 };
406
407 /// Controls which variables have static destructors registered.
409 /// Register static destructors for all variables.
411 /// Register static destructors only for thread-local variables.
413 /// Don't register static destructors for any variables.
415 };
416
417 // Define simple language options (with no accessors).
418#define LANGOPT(Name, Bits, Default, Compatibility, Description) \
419 unsigned Name : Bits;
420#define ENUM_LANGOPT(Name, Type, Bits, Default, Compatibility, Description)
421#include "clang/Basic/LangOptions.def"
422
423protected:
424 // Define language options of enumeration type. These are private, and will
425 // have accessors (below).
426#define LANGOPT(Name, Bits, Default, Compatibility, Description)
427#define ENUM_LANGOPT(Name, Type, Bits, Default, Compatibility, Description) \
428 LLVM_PREFERRED_TYPE(Type) \
429 unsigned Name : Bits;
430#include "clang/Basic/LangOptions.def"
431};
432
433/// Keeps track of the various options that can be
434/// enabled, which controls the dialect of C or C++ that is accepted.
436public:
437 /// The used language standard.
439
440 /// Set of enabled sanitizers.
442 /// Is at least one coverage instrumentation type enabled.
443 bool SanitizeCoverage = false;
444
445 /// Paths to files specifying which objects
446 /// (files, functions, variables) should not be instrumented.
447 std::vector<std::string> NoSanitizeFiles;
448
449 /// Paths to the XRay "always instrument" files specifying which
450 /// objects (files, functions, variables) should be imbued with the XRay
451 /// "always instrument" attribute.
452 /// WARNING: This is a deprecated field and will go away in the future.
453 std::vector<std::string> XRayAlwaysInstrumentFiles;
454
455 /// Paths to the XRay "never instrument" files specifying which
456 /// objects (files, functions, variables) should be imbued with the XRay
457 /// "never instrument" attribute.
458 /// WARNING: This is a deprecated field and will go away in the future.
459 std::vector<std::string> XRayNeverInstrumentFiles;
460
461 /// Paths to the XRay attribute list files, specifying which objects
462 /// (files, functions, variables) should be imbued with the appropriate XRay
463 /// attribute(s).
464 std::vector<std::string> XRayAttrListFiles;
465
466 /// Paths to special case list files specifying which entities
467 /// (files, functions) should or should not be instrumented.
468 std::vector<std::string> ProfileListFiles;
469
471
473
475
476 /// The name of the handler function to be called when -ftrapv is
477 /// specified.
478 ///
479 /// If none is specified, abort (GCC-compatible behaviour).
480 std::string OverflowHandler;
481
482 /// The module currently being compiled as specified by -fmodule-name.
483 std::string ModuleName;
484
485 /// The name of the current module, of which the main source file
486 /// is a part. If CompilingModule is set, we are compiling the interface
487 /// of this module, otherwise we are compiling an implementation file of
488 /// it. This starts as ModuleName in case -fmodule-name is provided and
489 /// changes during compilation to reflect the current module.
490 std::string CurrentModule;
491
492 /// The names of any features to enable in module 'requires' decls
493 /// in addition to the hard-coded list in Module.cpp and the target features.
494 ///
495 /// This list is sorted.
496 std::vector<std::string> ModuleFeatures;
497
498 /// Options for parsing comments.
500
501 /// A list of all -fno-builtin-* function names (e.g., memset).
502 std::vector<std::string> NoBuiltinFuncs;
503
504 /// A prefix map for __FILE__, __BASE_FILE__ and __builtin_FILE().
505 std::map<std::string, std::string, std::greater<std::string>> MacroPrefixMap;
506
507 /// Triples of the OpenMP targets that the host code codegen should
508 /// take into account in order to generate accurate offloading descriptors.
509 std::vector<llvm::Triple> OMPTargetTriples;
510
511 /// Name of the IR file that contains the result of the OpenMP target
512 /// host code generation.
513 std::string OMPHostIRFile;
514
515 /// The user provided compilation unit ID, if non-empty. This is used to
516 /// externalize static variables which is needed to support accessing static
517 /// device variables in host code for single source offloading languages
518 /// like CUDA/HIP.
519 std::string CUID;
520
521 /// C++ ABI to compile with, if specified by the frontend through -fc++-abi=.
522 /// This overrides the default ABI used by the target.
523 std::optional<TargetCXXABI::Kind> CXXABI;
524
525 /// Indicates whether the front-end is explicitly told that the
526 /// input is a header file (i.e. -x c-header).
527 bool IsHeaderFile = false;
528
529 /// The default stream kind used for HIP kernel launching.
531
532 /// Which overflow patterns should be excluded from sanitizer instrumentation
534
535 std::vector<std::string> OverflowPatternExclusionValues;
536
537 /// The seed used by the randomize structure layout feature.
538 std::string RandstructSeed;
539
540 /// Indicates whether to use target's platform-specific file separator when
541 /// __FILE__ macro is used and when concatenating filename with directory or
542 /// to use build environment environment's platform-specific file separator.
543 ///
544 /// The plaform-specific path separator is the backslash(\‍) for Windows and
545 /// forward slash (/) elsewhere.
547
548 // Indicates whether we should keep all nullptr checks for pointers
549 // received as a result of a standard operator new (-fcheck-new)
550 bool CheckNew = false;
551
552 /// The HLSL root signature version for dxil.
553 llvm::dxbc::RootSignatureVersion HLSLRootSigVer;
554
555 /// The HLSL root signature that will be used to overide the root signature
556 /// used for the shader entry point.
558
559 // Indicates if the wasm-opt binary must be ignored in the case of a
560 // WebAssembly target.
561 bool NoWasmOpt = false;
562
563 /// Atomic code-generation options.
564 /// These flags are set directly from the command-line options.
565 bool AtomicRemoteMemory = false;
568
569 /// Maximum number of allocation tokens (0 = no max), nullopt if none set (use
570 /// target default).
571 std::optional<uint64_t> AllocTokenMax;
572
573 /// The allocation token mode.
574 std::optional<llvm::AllocTokenMode> AllocTokenMode;
575
576 LangOptions();
577
578 /// Set language defaults for the given input language and
579 /// language standard in the given LangOptions object.
580 ///
581 /// \param Opts - The LangOptions object to set up.
582 /// \param Lang - The input language.
583 /// \param T - The target triple.
584 /// \param Includes - If the language requires extra headers to be implicitly
585 /// included, they will be appended to this list.
586 /// \param LangStd - The input language standard.
587 static void
588 setLangDefaults(LangOptions &Opts, Language Lang, const llvm::Triple &T,
589 std::vector<std::string> &Includes,
591
592 // Define accessors/mutators for language options of enumeration type.
593#define LANGOPT(Name, Bits, Default, Compatibility, Description)
594#define ENUM_LANGOPT(Name, Type, Bits, Default, Compatibility, Description) \
595 Type get##Name() const { return static_cast<Type>(Name); } \
596 void set##Name(Type Value) { \
597 assert(static_cast<unsigned>(Value) < (1u << Bits)); \
598 Name = static_cast<unsigned>(Value); \
599 }
600#include "clang/Basic/LangOptions.def"
601
602 /// Are we compiling a module?
603 bool isCompilingModule() const {
604 return getCompilingModule() != CMK_None;
605 }
606
607 /// Are we compiling a module implementation?
609 return !isCompilingModule() && !ModuleName.empty();
610 }
611
612 /// Do we need to track the owning module for a local declaration?
614 return isCompilingModule() || ModulesLocalVisibility;
615 }
616
618 return getSignedOverflowBehavior() == SOB_Defined;
619 }
620
622 return ObjCRuntime.isSubscriptPointerArithmetic() &&
623 !ObjCSubscriptingLegacyRuntime;
624 }
625
626 bool isCompatibleWithMSVC(MSVCMajorVersion MajorVersion) const {
627 return MSCompatibilityVersion >= MajorVersion * 100000U;
628 }
629
637
638 /// Reset all of the options that are not considered when building a
639 /// module.
641
642 /// Is this a libc/libm function that is no longer recognized as a
643 /// builtin because a -fno-builtin-* option has been specified?
644 bool isNoBuiltinFunc(StringRef Name) const;
645
646 /// True if any ObjC types may have non-trivial lifetime qualifiers.
648 return ObjCAutoRefCount || ObjCWeak;
649 }
650
652 return ConvergentFunctions;
653 }
654
655 /// Return true if atomicrmw operations targeting allocations in private
656 /// memory are undefined.
658 // Should be false for OpenMP.
659 // TODO: Should this be true for SYCL?
660 return OpenCL || CUDA;
661 }
662
663 /// Return the OpenCL C or C++ version as a VersionTuple.
664 VersionTuple getOpenCLVersionTuple() const;
665
666 /// Return the OpenCL version that kernel language is compatible with
667 unsigned getOpenCLCompatibleVersion() const;
668
669 /// Return the OpenCL C or C++ for OpenCL language name and version
670 /// as a string.
671 std::string getOpenCLVersionString() const;
672
673 /// Returns true if functions without prototypes or functions with an
674 /// identifier list (aka K&R C functions) are not allowed.
676 return CPlusPlus || C23 || DisableKNRFunctions;
677 }
678
679 /// Returns true if implicit function declarations are allowed in the current
680 /// language mode.
682 return !requiresStrictPrototypes() && !OpenCL;
683 }
684
685 /// Returns true if the language supports calling the 'atexit' function.
686 bool hasAtExit() const { return !(OpenMP && OpenMPIsTargetDevice); }
687
688 /// Returns true if implicit int is part of the language requirements.
689 bool isImplicitIntRequired() const { return !CPlusPlus && !C99; }
690
691 /// Returns true if implicit int is supported at all.
692 bool isImplicitIntAllowed() const { return !CPlusPlus && !C23; }
693
694 /// Check if return address signing is enabled.
695 bool hasSignReturnAddress() const {
696 return getSignReturnAddressScope() != SignReturnAddressScopeKind::None;
697 }
698
699 /// Check if return address signing uses AKey.
701 return getSignReturnAddressKey() == SignReturnAddressKeyKind::AKey;
702 }
703
704 /// Check if leaf functions are also signed.
706 return getSignReturnAddressScope() == SignReturnAddressScopeKind::All;
707 }
708
709 bool isSYCL() const { return SYCLIsDevice || SYCLIsHost; }
710
712 return getDefaultVisibilityExportMapping() !=
714 }
715
717 return getDefaultVisibilityExportMapping() ==
719 }
720
722 return getDefaultVisibilityExportMapping() ==
724 }
725
727 return getGlobalAllocationFunctionVisibility() !=
729 }
730
732 return getGlobalAllocationFunctionVisibility() ==
734 }
735
737 return getGlobalAllocationFunctionVisibility() ==
739 }
740
742 return getGlobalAllocationFunctionVisibility() ==
744 }
745
746 bool allowArrayReturnTypes() const { return HLSL; }
747
748 /// Remap path prefix according to -fmacro-prefix-path option.
749 void remapPathPrefix(SmallVectorImpl<char> &Path) const;
750
752 return RoundingMath ? RoundingMode::Dynamic
753 : RoundingMode::NearestTiesToEven;
754 }
755
757 FPExceptionModeKind EM = getFPExceptionMode();
760 return EM;
761 }
762
763 /// True when compiling for an offloading target device.
764 bool isTargetDevice() const {
765 return OpenMPIsTargetDevice || CUDAIsDevice || SYCLIsDevice;
766 }
767
768 /// Returns the most applicable C standard-compliant language version code.
769 /// If none could be determined, returns \ref std::nullopt.
770 std::optional<uint32_t> getCLangStd() const;
771
772 /// Returns the most applicable C++ standard-compliant language
773 /// version code.
774 /// If none could be determined, returns \ref std::nullopt.
775 std::optional<uint32_t> getCPlusPlusLangStd() const;
776};
777
778/// Floating point control options
779class FPOptionsOverride;
781public:
782 // We start by defining the layout.
783 using storage_type = uint32_t;
784
785 using RoundingMode = llvm::RoundingMode;
786
787 static constexpr unsigned StorageBitSize = 8 * sizeof(storage_type);
788
789 // Define a fake option named "First" so that we have a PREVIOUS even for the
790 // real first option.
791 static constexpr storage_type FirstShift = 0, FirstWidth = 0;
792#define FP_OPTION(NAME, TYPE, WIDTH, PREVIOUS) \
793 static constexpr storage_type NAME##Shift = \
794 PREVIOUS##Shift + PREVIOUS##Width; \
795 static constexpr storage_type NAME##Width = WIDTH; \
796 static constexpr storage_type NAME##Mask = ((1 << NAME##Width) - 1) \
797 << NAME##Shift;
798#include "clang/Basic/FPOptions.def"
799
800 static constexpr storage_type TotalWidth = 0
801#define FP_OPTION(NAME, TYPE, WIDTH, PREVIOUS) +WIDTH
802#include "clang/Basic/FPOptions.def"
803 ;
804 static_assert(TotalWidth <= StorageBitSize, "Too short type for FPOptions");
805
806private:
807 storage_type Value;
808
809 FPOptionsOverride getChangesSlow(const FPOptions &Base) const;
810
811public:
812 FPOptions() : Value(0) {
813 setFPContractMode(LangOptions::FPM_Off);
814 setConstRoundingMode(RoundingMode::Dynamic);
815 setSpecifiedExceptionMode(LangOptions::FPE_Default);
816 }
817 explicit FPOptions(const LangOptions &LO) {
818 Value = 0;
819 // The language fp contract option FPM_FastHonorPragmas has the same effect
820 // as FPM_Fast in frontend. For simplicity, use FPM_Fast uniformly in
821 // frontend.
822 auto LangOptContractMode = LO.getDefaultFPContractMode();
823 if (LangOptContractMode == LangOptions::FPM_FastHonorPragmas)
824 LangOptContractMode = LangOptions::FPM_Fast;
825 setFPContractMode(LangOptContractMode);
826 setRoundingMath(LO.RoundingMath);
827 setConstRoundingMode(LangOptions::RoundingMode::Dynamic);
828 setSpecifiedExceptionMode(LO.getFPExceptionMode());
829 setAllowFPReassociate(LO.AllowFPReassoc);
830 setNoHonorNaNs(LO.NoHonorNaNs);
831 setNoHonorInfs(LO.NoHonorInfs);
832 setNoSignedZero(LO.NoSignedZero);
833 setAllowReciprocal(LO.AllowRecip);
834 setAllowApproxFunc(LO.ApproxFunc);
835 if (getFPContractMode() == LangOptions::FPM_On &&
836 getRoundingMode() == llvm::RoundingMode::Dynamic &&
838 // If the FP settings are set to the "strict" model, then
839 // FENV access is set to true. (ffp-model=strict)
840 setAllowFEnvAccess(true);
841 else
842 setAllowFEnvAccess(LangOptions::FPM_Off);
843 setComplexRange(LO.getComplexRange());
844 }
845
847 return getFPContractMode() == LangOptions::FPM_On;
848 }
850 setFPContractMode(LangOptions::FPM_On);
851 }
852
854 return getFPContractMode() == LangOptions::FPM_Fast;
855 }
857 setFPContractMode(LangOptions::FPM_Fast);
858 }
859
860 bool isFPConstrained() const {
861 return getRoundingMode() != llvm::RoundingMode::NearestTiesToEven ||
863 getAllowFEnvAccess();
864 }
865
867 RoundingMode RM = getConstRoundingMode();
868 if (RM == RoundingMode::Dynamic) {
869 // C23: 7.6.2p3 If the FE_DYNAMIC mode is specified and FENV_ACCESS is
870 // "off", the translator may assume that the default rounding mode is in
871 // effect.
872 if (!getAllowFEnvAccess() && !getRoundingMath())
873 RM = RoundingMode::NearestTiesToEven;
874 }
875 return RM;
876 }
877
879 LangOptions::FPExceptionModeKind EM = getSpecifiedExceptionMode();
881 if (getAllowFEnvAccess())
883 else
885 }
886 return EM;
887 }
888
889 bool operator==(FPOptions other) const { return Value == other.Value; }
890
891 /// Return the default value of FPOptions that's used when trailing
892 /// storage isn't required.
894
895 storage_type getAsOpaqueInt() const { return Value; }
897 FPOptions Opts;
898 Opts.Value = Value;
899 return Opts;
900 }
901
902 /// Return difference with the given option set.
904
906
907 // We can define most of the accessors automatically:
908 // TODO: consider enforcing the assertion that value fits within bits
909 // statically.
910#define FP_OPTION(NAME, TYPE, WIDTH, PREVIOUS) \
911 TYPE get##NAME() const { \
912 return static_cast<TYPE>((Value & NAME##Mask) >> NAME##Shift); \
913 } \
914 void set##NAME(TYPE value) { \
915 assert(storage_type(value) < (1u << WIDTH)); \
916 Value = (Value & ~NAME##Mask) | (storage_type(value) << NAME##Shift); \
917 }
918#include "clang/Basic/FPOptions.def"
919 LLVM_DUMP_METHOD void dump();
920};
921
922/// Represents difference between two FPOptions values.
923///
924/// The effect of language constructs changing the set of floating point options
925/// is usually a change of some FP properties while leaving others intact. This
926/// class describes such changes by keeping information about what FP options
927/// are overridden.
928///
929/// The integral set of FP options, described by the class FPOptions, may be
930/// represented as a default FP option set, defined by language standard and
931/// command line options, with the overrides introduced by pragmas.
932///
933/// The is implemented as a value of the new FPOptions plus a mask showing which
934/// fields are actually set in it.
937 FPOptions::storage_type OverrideMask = 0;
938
939public:
940 using RoundingMode = llvm::RoundingMode;
941
942 /// The type suitable for storing values of FPOptionsOverride. Must be twice
943 /// as wide as bit size of FPOption.
944 using storage_type = uint64_t;
945 static_assert(sizeof(storage_type) >= 2 * sizeof(FPOptions::storage_type),
946 "Too short type for FPOptionsOverride");
947
948 /// Bit mask selecting bits of OverrideMask in serialized representation of
949 /// FPOptionsOverride.
951 (static_cast<storage_type>(1) << FPOptions::StorageBitSize) - 1;
952
955 : Options(LO), OverrideMask(OverrideMaskBits) {}
957 : Options(FPO), OverrideMask(OverrideMaskBits) {}
959 : Options(FPO), OverrideMask(Mask) {}
960
961 bool requiresTrailingStorage() const { return OverrideMask != 0; }
962
964 setFPContractModeOverride(LangOptions::FPM_On);
965 }
966
968 setFPContractModeOverride(LangOptions::FPM_Fast);
969 }
970
972 setFPContractModeOverride(LangOptions::FPM_Off);
973 }
974
976 setAllowFPReassociateOverride(!Value);
977 setNoHonorNaNsOverride(!Value);
978 setNoHonorInfsOverride(!Value);
979 setNoSignedZeroOverride(!Value);
980 setAllowReciprocalOverride(!Value);
981 setAllowApproxFuncOverride(!Value);
982 setMathErrnoOverride(Value);
983 if (Value)
984 /* Precise mode implies fp_contract=on and disables ffast-math */
986 else
987 /* Precise mode disabled sets fp_contract=fast and enables ffast-math */
989 }
990
992
994 return (static_cast<storage_type>(Options.getAsOpaqueInt())
996 OverrideMask;
997 }
1000 Opts.OverrideMask = I & OverrideMaskBits;
1002 return Opts;
1003 }
1004
1007 FPOptions::getFromOpaqueInt((Base.getAsOpaqueInt() & ~OverrideMask) |
1008 (Options.getAsOpaqueInt() & OverrideMask));
1009 return Result;
1010 }
1011
1013 return applyOverrides(FPOptions(LO));
1014 }
1015
1016 bool operator==(FPOptionsOverride other) const {
1017 return Options == other.Options && OverrideMask == other.OverrideMask;
1018 }
1019 bool operator!=(FPOptionsOverride other) const { return !(*this == other); }
1020
1021#define FP_OPTION(NAME, TYPE, WIDTH, PREVIOUS) \
1022 bool has##NAME##Override() const { \
1023 return OverrideMask & FPOptions::NAME##Mask; \
1024 } \
1025 TYPE get##NAME##Override() const { \
1026 assert(has##NAME##Override()); \
1027 return Options.get##NAME(); \
1028 } \
1029 void clear##NAME##Override() { \
1030 /* Clear the actual value so that we don't have spurious differences when \
1031 * testing equality. */ \
1032 Options.set##NAME(TYPE(0)); \
1033 OverrideMask &= ~FPOptions::NAME##Mask; \
1034 } \
1035 void set##NAME##Override(TYPE value) { \
1036 Options.set##NAME(value); \
1037 OverrideMask |= FPOptions::NAME##Mask; \
1038 }
1039#include "clang/Basic/FPOptions.def"
1040 LLVM_DUMP_METHOD void dump();
1041};
1044 if (Value == Base.Value)
1045 return FPOptionsOverride();
1046 return getChangesSlow(Base);
1047}
1050 *this = FPO.applyOverrides(*this);
1051}
1052
1053// The three atomic code-generation options.
1054// The canonical (positive) names are:
1055// "remote_memory", "fine_grained_memory", and "ignore_denormal_mode".
1056// In attribute or command-line parsing, a token prefixed with "no_" inverts its
1057// value.
1059 RemoteMemory, // enable remote memory.
1060 FineGrainedMemory, // enable fine-grained memory.
1061 IgnoreDenormalMode, // ignore floating-point denormals.
1063};
1065struct AtomicOptions {
1066 // Bitfields for each option.
1067 unsigned remote_memory : 1;
1069 unsigned ignore_denormal_mode : 1;
1074 AtomicOptions(const LangOptions &LO)
1075 : remote_memory(LO.AtomicRemoteMemory),
1076 fine_grained_memory(LO.AtomicFineGrainedMemory),
1077 ignore_denormal_mode(LO.AtomicIgnoreDenormalMode) {}
1079 bool getOption(AtomicOptionKind Kind) const {
1080 switch (Kind) {
1082 return remote_memory;
1084 return fine_grained_memory;
1086 return ignore_denormal_mode;
1087 }
1088 llvm_unreachable("Invalid AtomicOptionKind");
1089 }
1091 void setOption(AtomicOptionKind Kind, bool Value) {
1092 switch (Kind) {
1095 return;
1098 return;
1101 return;
1102 }
1103 llvm_unreachable("Invalid AtomicOptionKind");
1104 }
1106 LLVM_DUMP_METHOD void dump() const {
1107 llvm::errs() << "\n remote_memory: " << remote_memory
1108 << "\n fine_grained_memory: " << fine_grained_memory
1109 << "\n ignore_denormal_mode: " << ignore_denormal_mode << "\n";
1110 }
1111};
1112
1113/// Describes the kind of translation unit being processed.
1115 /// The translation unit is a complete translation unit.
1117
1118 /// The translation unit is a prefix to a translation unit, and is
1119 /// not complete.
1120 TU_Prefix,
1121
1122 /// The translation unit is a clang module.
1124
1125 /// The translation unit is a is a complete translation unit that we might
1126 /// incrementally extend later.
1128};
1129
1130} // namespace clang
1131
1132#endif // LLVM_CLANG_BASIC_LANGOPTIONS_H
Defines the clang::CommentOptions interface.
Forward-declares and imports various common LLVM datatypes that clang wants to use unqualified.
Defines types useful for describing an Objective-C runtime.
Defines the clang::SanitizerKind enum.
Defines the TargetCXXABI class, which abstracts details of the C++ ABI that we're targeting.
Defines the clang::Visibility enumeration and various utility functions.
Represents difference between two FPOptions values.
void setAllowFPContractAcrossStatement()
static FPOptionsOverride getFromOpaqueInt(storage_type I)
bool operator!=(FPOptionsOverride other) const
FPOptionsOverride(FPOptions FPO)
LLVM_DUMP_METHOD void dump()
void setFPPreciseEnabled(bool Value)
void setAllowFPContractWithinStatement()
FPOptionsOverride(FPOptions FPO, FPOptions::storage_type Mask)
FPOptions applyOverrides(FPOptions Base)
bool operator==(FPOptionsOverride other) const
llvm::RoundingMode RoundingMode
static constexpr storage_type OverrideMaskBits
Bit mask selecting bits of OverrideMask in serialized representation of FPOptionsOverride.
storage_type getAsOpaqueInt() const
FPOptions applyOverrides(const LangOptions &LO)
uint64_t storage_type
The type suitable for storing values of FPOptionsOverride.
FPOptionsOverride(const LangOptions &LO)
bool requiresTrailingStorage() const
void applyChanges(FPOptionsOverride FPO)
bool isFPConstrained() const
static constexpr storage_type FirstShift
FPOptionsOverride getChangesFrom(const FPOptions &Base) const
Return difference with the given option set.
storage_type getAsOpaqueInt() const
static constexpr storage_type TotalWidth
LangOptions::FPExceptionModeKind getExceptionMode() const
FPOptions(const LangOptions &LO)
static constexpr storage_type FirstWidth
void setAllowFPContractWithinStatement()
static FPOptions defaultWithoutTrailingStorage(const LangOptions &LO)
Return the default value of FPOptions that's used when trailing storage isn't required.
static FPOptions getFromOpaqueInt(storage_type Value)
bool allowFPContractAcrossStatement() const
uint32_t storage_type
bool operator==(FPOptions other) const
bool allowFPContractWithinStatement() const
LLVM_DUMP_METHOD void dump()
void setAllowFPContractAcrossStatement()
static constexpr unsigned StorageBitSize
llvm::RoundingMode RoundingMode
RoundingMode getRoundingMode() const
Bitfields of LangOptions, split out from LangOptions in order to ensure that this large collection of...
Definition LangOptions.h:72
FPEvalMethodKind
Possible float expression evaluation method choices.
@ FEM_Extended
Use extended type for fp arithmetic.
@ FEM_Double
Use the type double for fp arithmetic.
@ FEM_UnsetOnCommandLine
Used only for FE option processing; this is only used to indicate that the user did not specify an ex...
@ FEM_Source
Use the declared type for fp arithmetic.
@ NonLeaf
Sign the return address of functions that spill LR.
@ All
Sign the return address of all functions,.
@ CMK_None
Not compiling a module interface at all.
@ CMK_HeaderUnit
Compiling a module header unit.
@ CMK_ModuleMap
Compiling a module from a module map.
@ CMK_ModuleInterface
Compiling a C++ modules interface unit.
ComplexRangeKind
Controls the various implementations for complex multiplication and.
@ CX_Full
Implementation of complex division and multiplication using a call to runtime library functions(gener...
@ CX_Basic
Implementation of complex division and multiplication using algebraic formulas at source precision.
@ CX_Promoted
Implementation of complex division using algebraic formulas at higher precision.
@ CX_None
No range rule is enabled.
@ CX_Improved
Implementation of complex division offering an improved handling for overflow in intermediate calcula...
@ Swift5_0
Interoperability with the Swift 5.0 runtime.
@ ObjectiveC
Interoperability with the ObjectiveC runtime.
@ Standalone
CoreFoundation does not have any language interoperability.
@ Unspecified
No interoperability ABI has been specified.
@ Swift
Interoperability with the latest known version of the Swift runtime.
@ Swift4_2
Interoperability with the Swift 4.2 runtime.
@ Swift4_1
Interoperability with the Swift 4.1 runtime.
llvm::RoundingMode RoundingMode
Definition LangOptions.h:78
clang::MSVtorDispMode MSVtorDispMode
@ PerThread
Per-thread default stream.
@ ForceProtected
Force protected visibility.
@ BKey
Return address signing uses APIB key.
@ AKey
Return address signing uses APIA key.
@ ExtendTo32
Integer arguments are sign or zero extended to 32/64 bits during default argument promotions.
@ Single
Single Threaded Environment.
@ Integer
Permit vector bitcasts between integer vectors with different numbers of elements but the same total ...
@ ZeroOrIncomplete
Any trailing array member of undefined or 0 size is a FAM.
@ OneZeroOrIncomplete
Any trailing array member of undefined, 0, or 1 size is a FAM.
@ IncompleteOnly
Any trailing array member of undefined size is a FAM.
friend class CompilerInvocationBase
Definition LangOptions.h:74
OverflowPatternExclusionKind
Exclude certain code patterns from being instrumented by arithmetic overflow sanitizers.
@ None
Don't exclude any overflow patterns from sanitizers.
@ AddUnsignedOverflowTest
if (a + b < a)
@ All
Exclude all overflow patterns (below)
@ AddSignedOverflowTest
if (a + b < a)
@ PostDecrInWhile
while (count–)
clang::Visibility Visibility
Definition LangOptions.h:77
@ Explicit
map only explicit default visibilities to exported
@ All
map all default visibilities to exported
CompatibilityKind
For ASTs produced with different option value, signifies their level of compatibility.
Definition LangOptions.h:83
@ NotCompatible
Does affect the construction of the AST in a way that does prevent module interoperability.
Definition LangOptions.h:86
@ Compatible
Does affect the construction of the AST in a way that doesn't prevent interoperability (that is,...
Definition LangOptions.h:90
@ Benign
Does not affect the construction of the AST in any way (that is, the value can be different between a...
Definition LangOptions.h:94
FPExceptionModeKind
Possible floating point exception behavior.
@ FPE_Default
Used internally to represent initial unspecified value.
@ FPE_Strict
Strictly preserve the floating-point exception semantics.
@ FPE_MayTrap
Transformations do not cause new exceptions but may hide some.
@ FPE_Ignore
Assume that floating-point exceptions are masked.
clang::CFBranchLabelSchemeKind CFBranchLabelSchemeKind
Definition LangOptions.h:79
friend class CompilerInvocation
Definition LangOptions.h:73
@ Protected
Override the IR-gen assigned visibility with protected visibility.
@ Hidden
Override the IR-gen assigned visibility with hidden visibility.
ClangABI
Clang versions with different platform ABI conformance.
RegisterStaticDestructorsKind
Controls which variables have static destructors registered.
@ ThreadLocal
Register static destructors only for thread-local variables.
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
bool isSignReturnAddressWithAKey() const
Check if return address signing uses AKey.
void resetNonModularOptions()
Reset all of the options that are not considered when building a module.
std::vector< std::string > OverflowPatternExclusionValues
std::optional< TargetCXXABI::Kind > CXXABI
C++ ABI to compile with, if specified by the frontend through -fc++-abi=.
bool isCompatibleWithMSVC(MSVCMajorVersion MajorVersion) const
std::vector< std::string > NoBuiltinFuncs
A list of all -fno-builtin-* function names (e.g., memset).
std::string ModuleName
The module currently being compiled as specified by -fmodule-name.
std::vector< std::string > XRayNeverInstrumentFiles
Paths to the XRay "never instrument" files specifying which objects (files, functions,...
FPExceptionModeKind getDefaultExceptionMode() const
bool requiresStrictPrototypes() const
Returns true if functions without prototypes or functions with an identifier list (aka K&R C function...
bool isImplicitIntAllowed() const
Returns true if implicit int is supported at all.
bool isCompilingModuleImplementation() const
Are we compiling a module implementation?
bool isNoBuiltinFunc(StringRef Name) const
Is this a libc/libm function that is no longer recognized as a builtin because a -fno-builtin-* optio...
clang::ObjCRuntime ObjCRuntime
CoreFoundationABI CFRuntime
std::string getOpenCLVersionString() const
Return the OpenCL C or C++ for OpenCL language name and version as a string.
unsigned OverflowPatternExclusionMask
Which overflow patterns should be excluded from sanitizer instrumentation.
bool IsHeaderFile
Indicates whether the front-end is explicitly told that the input is a header file (i....
bool hasDefaultVisibilityExportMapping() const
SanitizerSet Sanitize
Set of enabled sanitizers.
std::optional< llvm::AllocTokenMode > AllocTokenMode
The allocation token mode.
CommentOptions CommentOpts
Options for parsing comments.
bool isExplicitDefaultVisibilityExportMapping() const
std::vector< std::string > XRayAlwaysInstrumentFiles
Paths to the XRay "always instrument" files specifying which objects (files, functions,...
bool hasAtExit() const
Returns true if the language supports calling the 'atexit' function.
bool trackLocalOwningModule() const
Do we need to track the owning module for a local declaration?
bool isAllDefaultVisibilityExportMapping() const
bool isSubscriptPointerArithmetic() const
bool UseTargetPathSeparator
Indicates whether to use target's platform-specific file separator when FILE macro is used and when c...
bool isSignedOverflowDefined() const
bool hasDefaultGlobalAllocationFunctionVisibility() const
bool hasGlobalAllocationFunctionVisibility() const
VersionTuple getOpenCLVersionTuple() const
Return the OpenCL C or C++ version as a VersionTuple.
bool implicitFunctionsAllowed() const
Returns true if implicit function declarations are allowed in the current language mode.
bool hasSignReturnAddress() const
Check if return address signing is enabled.
static void setLangDefaults(LangOptions &Opts, Language Lang, const llvm::Triple &T, std::vector< std::string > &Includes, LangStandard::Kind LangStd=LangStandard::lang_unspecified)
Set language defaults for the given input language and language standard in the given LangOptions obj...
bool assumeFunctionsAreConvergent() const
std::string OMPHostIRFile
Name of the IR file that contains the result of the OpenMP target host code generation.
bool allowsNonTrivialObjCLifetimeQualifiers() const
True if any ObjC types may have non-trivial lifetime qualifiers.
bool isOverflowPatternExcluded(OverflowPatternExclusionKind Kind) const
bool allowArrayReturnTypes() const
std::string OverflowHandler
The name of the handler function to be called when -ftrapv is specified.
std::string HLSLRootSigOverride
The HLSL root signature that will be used to overide the root signature used for the shader entry poi...
bool hasHiddenGlobalAllocationFunctionVisibility() const
std::string RandstructSeed
The seed used by the randomize structure layout feature.
std::map< std::string, std::string, std::greater< std::string > > MacroPrefixMap
A prefix map for FILE, BASE_FILE and __builtin_FILE().
std::vector< std::string > ProfileListFiles
Paths to special case list files specifying which entities (files, functions) should or should not be...
void remapPathPrefix(SmallVectorImpl< char > &Path) const
Remap path prefix according to -fmacro-prefix-path option.
bool isTargetDevice() const
True when compiling for an offloading target device.
std::optional< uint64_t > AllocTokenMax
Maximum number of allocation tokens (0 = no max), nullopt if none set (use target default).
bool hasProtectedGlobalAllocationFunctionVisibility() const
std::optional< uint32_t > getCPlusPlusLangStd() const
Returns the most applicable C++ standard-compliant language version code.
LangStandard::Kind LangStd
The used language standard.
llvm::dxbc::RootSignatureVersion HLSLRootSigVer
The HLSL root signature version for dxil.
std::optional< uint32_t > getCLangStd() const
Returns the most applicable C standard-compliant language version code.
RoundingMode getDefaultRoundingMode() const
bool isCompilingModule() const
Are we compiling a module?
bool isImplicitIntRequired() const
Returns true if implicit int is part of the language requirements.
bool isSignReturnAddressScopeAll() const
Check if leaf functions are also signed.
bool isSYCL() const
std::string ObjCConstantStringClass
std::string CUID
The user provided compilation unit ID, if non-empty.
unsigned getOpenCLCompatibleVersion() const
Return the OpenCL version that kernel language is compatible with.
GPUDefaultStreamKind GPUDefaultStream
The default stream kind used for HIP kernel launching.
bool AtomicRemoteMemory
Atomic code-generation options.
bool threadPrivateMemoryAtomicsAreUndefined() const
Return true if atomicrmw operations targeting allocations in private memory are undefined.
std::vector< std::string > XRayAttrListFiles
Paths to the XRay attribute list files, specifying which objects (files, functions,...
bool SanitizeCoverage
Is at least one coverage instrumentation type enabled.
std::vector< llvm::Triple > OMPTargetTriples
Triples of the OpenMP targets that the host code codegen should take into account in order to generat...
std::vector< std::string > NoSanitizeFiles
Paths to files specifying which objects (files, functions, variables) should not be instrumented.
std::string CurrentModule
The name of the current module, of which the main source file is a part.
std::vector< std::string > ModuleFeatures
The names of any features to enable in module 'requires' decls in addition to the hard-coded list in ...
The basic abstraction for the target Objective-C runtime.
Definition ObjCRuntime.h:28
The JSON file list parser is used to communicate input to InstallAPI.
@ CPlusPlus
Language
The language for the input, used to select and validate the language standard and possible actions.
@ Result
The result type of a method or function.
Definition TypeBase.h:905
const FunctionProtoType * T
MSVtorDispMode
In the Microsoft ABI, this controls the placement of virtual displacement members used to implement v...
Definition LangOptions.h:38
ShaderStage
Shader programs run in specific pipeline stages.
Definition LangOptions.h:44
TranslationUnitKind
Describes the kind of translation unit being processed.
@ TU_Incremental
The translation unit is a is a complete translation unit that we might incrementally extend later.
@ TU_Complete
The translation unit is a complete translation unit.
@ TU_ClangModule
The translation unit is a clang module.
@ TU_Prefix
The translation unit is a prefix to a translation unit, and is not complete.
PointerAuthenticationMode
Definition LangOptions.h:63
@ None
The alignment was not explicit in code.
Definition ASTContext.h:178
Visibility
Describes the different kinds of visibility that a declaration may have.
Definition Visibility.h:34
void setOption(AtomicOptionKind Kind, bool Value)
LLVM_DUMP_METHOD void dump() const
unsigned ignore_denormal_mode
bool getOption(AtomicOptionKind Kind) const
Options for controlling comment parsing.