clang 23.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 // Used by __attribute__((overflow_behavior())) to describe overflow behavior
117 // on a per-type basis.
119 // Default C standard behavior (type dependent).
121
122 // __attribute__((overflow_behavior("wrap")))
124
125 // __attribute__((overflow_behavior("trap")))
127
128 // Signed types defined as wrapping via -fwrapv can still be instrumented
129 // by sanitizers (PR82432). This field is needed to disambiguate canonical
130 // wrapping type behaviors from -fwrapv behaviors.
131 // -fwrapv
133 };
134
135 // FIXME: Unify with TUKind.
137 /// Not compiling a module interface at all.
139
140 /// Compiling a module from a module map.
142
143 /// Compiling a module header unit.
145
146 /// Compiling a C++ modules interface unit.
148 };
149
156
158
168
170
171 // Corresponds to _MSC_VER
173 MSVC2010 = 1600,
174 MSVC2012 = 1700,
175 MSVC2013 = 1800,
176 MSVC2015 = 1900,
177 MSVC2017 = 1910,
181 MSVC2019 = 1920,
186 };
187
192 // The "default" SYCL version to be used when none is specified on the
193 // frontend command line.
195 };
196
199 HLSL_2015 = 2015,
200 HLSL_2016 = 2016,
201 HLSL_2017 = 2017,
202 HLSL_2018 = 2018,
203 HLSL_2021 = 2021,
204 HLSL_202x = 2028,
205 HLSL_202y = 2029,
206 };
207
208 /// Clang versions with different platform ABI conformance.
209 enum class ClangABI {
210#define ABI_VER_MAJOR_MINOR(Major, Minor) Ver##Major##_##Minor,
211#define ABI_VER_MAJOR(Major) Ver##Major,
212#define ABI_VER_LATEST(Latest) Latest
213#include "clang/Basic/ABIVersions.def"
214 };
215
216 enum class CoreFoundationABI {
217 /// No interoperability ABI has been specified
219 /// CoreFoundation does not have any language interoperability
221 /// Interoperability with the ObjectiveC runtime
223 /// Interoperability with the latest known version of the Swift runtime
225 /// Interoperability with the Swift 5.0 runtime
227 /// Interoperability with the Swift 4.2 runtime
229 /// Interoperability with the Swift 4.1 runtime
231 };
232
234 // Disable the floating point pragma
236
237 // Enable the floating point pragma
239
240 // Aggressively fuse FP ops (E.g. FMA) disregarding pragmas.
242
243 // Aggressively fuse FP ops and honor pragmas.
245 };
246
247 /// Possible floating point exception behavior.
249 /// Assume that floating-point exceptions are masked.
251 /// Transformations do not cause new exceptions but may hide some.
253 /// Strictly preserve the floating-point exception semantics.
255 /// Used internally to represent initial unspecified value.
257 };
258
259 /// Possible float expression evaluation method choices.
260 enum FPEvalMethodKind : unsigned {
261 /// Use the declared type for fp arithmetic.
263 /// Use the type double for fp arithmetic.
265 /// Use extended type for fp arithmetic.
267 /// Used only for FE option processing; this is only used to indicate that
268 /// the user did not specify an explicit evaluation method on the command
269 /// line and so the target should be queried for its default evaluation
270 /// method instead.
272 };
273
274 enum class MatrixMemoryLayout : unsigned {
275 // Use column-major layout for matrices
277 // Use row-major layout for matrices
279 };
280
282
284 /// Permit no implicit vector bitcasts.
286 /// Permit vector bitcasts between integer vectors with different numbers
287 /// of elements but the same total bit-width.
289 /// Permit vector bitcasts between all vectors with the same total
290 /// bit-width.
292 };
293
295 // All vector compares produce scalars except vector pixel and vector bool.
296 // The types vector pixel and vector bool return vector results.
298 // All vector compares produce vector results as in GCC.
300 // All vector compares produce scalars as in XL.
302 // Default clang behaviour.
304 };
305
307 /// No signing for any function.
309 /// Sign the return address of functions that spill LR.
311 /// Sign the return address of all functions,
313 };
314
316 /// Return address signing uses APIA key.
318 /// Return address signing uses APIB key.
320 };
321
322 enum class ThreadModelKind {
323 /// POSIX Threads.
325 /// Single Threaded Environment.
327 };
328
329 enum class ExtendArgsKind {
330 /// Integer arguments are sign or zero extended to 32/64 bits
331 /// during default argument promotions.
334 };
335
337 /// Legacy default stream
339 /// Per-thread default stream
341 };
342
343 /// Exclude certain code patterns from being instrumented by arithmetic
344 /// overflow sanitizers
346 /// Don't exclude any overflow patterns from sanitizers
347 None = 1 << 0,
348 /// Exclude all overflow patterns (below)
349 All = 1 << 1,
350 /// if (a + b < a)
352 /// if (a + b < a)
354 /// -1UL
356 /// while (count--)
358 };
359
362 /// map only explicit default visibilities to exported
364 /// map all default visibilities to exported
366 };
367
369 /// Force hidden visibility
371 /// Force protected visibility
373 /// Force default visibility
375 /// Don't alter the visibility
377 };
378
380 /// Keep the IR-gen assigned visibility.
382 /// Override the IR-gen assigned visibility with default visibility.
384 /// Override the IR-gen assigned visibility with hidden visibility.
386 /// Override the IR-gen assigned visibility with protected visibility.
388 };
389
391 /// Any trailing array member is a FAM.
393 /// Any trailing array member of undefined, 0, or 1 size is a FAM.
395 /// Any trailing array member of undefined or 0 size is a FAM.
397 /// Any trailing array member of undefined size is a FAM.
399 };
400
401 /// Controls the various implementations for complex multiplication and
402 // division.
404 /// Implementation of complex division and multiplication using a call to
405 /// runtime library functions(generally the case, but the BE might
406 /// sometimes replace the library call if it knows enough about the
407 /// potential range of the inputs). Overflow and non-finite values are
408 /// handled by the library implementation. This is the default value.
410
411 /// Implementation of complex division offering an improved handling
412 /// for overflow in intermediate calculations with no special handling for
413 /// NaN and infinite values.
415
416 /// Implementation of complex division using algebraic formulas at
417 /// higher precision. Overflow is handled. Non-finite values are handled in
418 /// some cases. If the target hardware does not have native support for a
419 /// higher precision data type, an implementation for the complex operation
420 /// will be used to provide improved guards against intermediate overflow,
421 /// but overflow and underflow may still occur in some cases. NaN and
422 /// infinite values are not handled.
424
425 /// Implementation of complex division and multiplication using
426 /// algebraic formulas at source precision. No special handling to avoid
427 /// overflow. NaN and infinite values are not handled.
429
430 /// No range rule is enabled.
432 };
433
434 /// Controls which variables have static destructors registered.
436 /// Register static destructors for all variables.
438 /// Register static destructors only for thread-local variables.
440 /// Don't register static destructors for any variables.
442 };
443
445 /// Use default layout rules of the target.
447 /// Use Itanium rules for bit-field layout and fundamental types alignment.
449 /// Use Microsoft C++ ABI rules for bit-field layout and fundamental types
450 /// alignment.
452 };
453
454 // Define simple language options (with no accessors).
455#define LANGOPT(Name, Bits, Default, Compatibility, Description) \
456 unsigned Name : Bits;
457#define ENUM_LANGOPT(Name, Type, Bits, Default, Compatibility, Description)
458#include "clang/Basic/LangOptions.def"
459
460protected:
461 // Define language options of enumeration type. These are private, and will
462 // have accessors (below).
463#define LANGOPT(Name, Bits, Default, Compatibility, Description)
464#define ENUM_LANGOPT(Name, Type, Bits, Default, Compatibility, Description) \
465 LLVM_PREFERRED_TYPE(Type) \
466 unsigned Name : Bits;
467#include "clang/Basic/LangOptions.def"
468};
469
470/// Keeps track of the various options that can be
471/// enabled, which controls the dialect of C or C++ that is accepted.
473public:
474 /// The used language standard.
476
477 /// Set of enabled sanitizers.
479 /// Is at least one coverage instrumentation type enabled.
480 bool SanitizeCoverage = false;
481 /// Set of (UBSan) sanitizers that when enabled do not cause
482 /// `__has_feature(undefined_behavior_sanitizer)` to evaluate true.
484
485 /// Paths to files specifying which objects
486 /// (files, functions, variables) should not be instrumented.
487 std::vector<std::string> NoSanitizeFiles;
488
489 /// Paths to the XRay "always instrument" files specifying which
490 /// objects (files, functions, variables) should be imbued with the XRay
491 /// "always instrument" attribute.
492 /// WARNING: This is a deprecated field and will go away in the future.
493 std::vector<std::string> XRayAlwaysInstrumentFiles;
494
495 /// Paths to the XRay "never instrument" files specifying which
496 /// objects (files, functions, variables) should be imbued with the XRay
497 /// "never instrument" attribute.
498 /// WARNING: This is a deprecated field and will go away in the future.
499 std::vector<std::string> XRayNeverInstrumentFiles;
500
501 /// Paths to the XRay attribute list files, specifying which objects
502 /// (files, functions, variables) should be imbued with the appropriate XRay
503 /// attribute(s).
504 std::vector<std::string> XRayAttrListFiles;
505
506 /// Paths to special case list files specifying which entities
507 /// (files, functions) should or should not be instrumented.
508 std::vector<std::string> ProfileListFiles;
509
511
513
520
521 /// The name of the handler function to be called when -ftrapv is
522 /// specified.
523 ///
524 /// If none is specified, abort (GCC-compatible behaviour).
525 std::string OverflowHandler;
526
527 /// The module currently being compiled as specified by -fmodule-name.
528 std::string ModuleName;
529
530 /// The name of the current module, of which the main source file
531 /// is a part. If CompilingModule is set, we are compiling the interface
532 /// of this module, otherwise we are compiling an implementation file of
533 /// it. This starts as ModuleName in case -fmodule-name is provided and
534 /// changes during compilation to reflect the current module.
535 std::string CurrentModule;
536
537 /// The names of any features to enable in module 'requires' decls
538 /// in addition to the hard-coded list in Module.cpp and the target features.
539 ///
540 /// This list is sorted.
541 std::vector<std::string> ModuleFeatures;
542
543 /// Options for parsing comments.
545
546 /// A list of all -fno-builtin-* function names (e.g., memset).
547 std::vector<std::string> NoBuiltinFuncs;
548
549 /// A prefix map for __FILE__, __BASE_FILE__ and __builtin_FILE().
550 std::map<std::string, std::string, std::greater<std::string>> MacroPrefixMap;
551
552 /// Macro name to use in lifetimebound fix-it suggestions.
554
555 /// Triples of the OpenMP targets that the host code codegen should
556 /// take into account in order to generate accurate offloading descriptors.
557 std::vector<llvm::Triple> OMPTargetTriples;
558
559 /// Name of the IR file that contains the result of the OpenMP target
560 /// host code generation.
561 std::string OMPHostIRFile;
562
563 /// The user provided compilation unit ID, if non-empty. This is used to
564 /// externalize static variables which is needed to support accessing static
565 /// device variables in host code for single source offloading languages
566 /// like CUDA/HIP.
567 std::string CUID;
568
569 /// C++ ABI to compile with, if specified by the frontend through -fc++-abi=.
570 /// This overrides the default ABI used by the target.
571 std::optional<TargetCXXABI::Kind> CXXABI;
572
573 /// Indicates whether the front-end is explicitly told that the
574 /// input is a header file (i.e. -x c-header).
575 bool IsHeaderFile = false;
576
577 /// The default stream kind used for HIP kernel launching.
579
580 /// Which overflow patterns should be excluded from sanitizer instrumentation
582
583 std::vector<std::string> OverflowPatternExclusionValues;
584
585 /// The seed used by the randomize structure layout feature.
586 std::string RandstructSeed;
587
588 /// Indicates whether to use target's platform-specific file separator when
589 /// __FILE__ macro is used and when concatenating filename with directory or
590 /// to use build environment environment's platform-specific file separator.
591 ///
592 /// The plaform-specific path separator is the backslash(\‍) for Windows and
593 /// forward slash (/) elsewhere.
595
596 // Indicates whether we should keep all nullptr checks for pointers
597 // received as a result of a standard operator new (-fcheck-new)
598 bool CheckNew = false;
599
600 /// The HLSL root signature version for dxil.
601 llvm::dxbc::RootSignatureVersion HLSLRootSigVer;
602
603 /// The HLSL root signature that will be used to overide the root signature
604 /// used for the shader entry point.
606
607 // Indicates if the wasm-opt binary must be ignored in the case of a
608 // WebAssembly target.
609 bool NoWasmOpt = false;
610
611 /// Atomic code-generation options.
612 /// These flags are set directly from the command-line options.
613 bool AtomicRemoteMemory = false;
616
617 /// Maximum number of allocation tokens (0 = target SIZE_MAX), nullopt if none
618 /// set (use target SIZE_MAX).
619 std::optional<uint64_t> AllocTokenMax;
620
621 /// The allocation token mode.
622 std::optional<llvm::AllocTokenMode> AllocTokenMode;
623
624 /// Name of the literal encoding to convert the internal encoding to.
625 std::string LiteralEncoding;
626
627 LangOptions();
628
629 /// Set language defaults for the given input language and
630 /// language standard in the given LangOptions object.
631 ///
632 /// \param Opts - The LangOptions object to set up.
633 /// \param Lang - The input language.
634 /// \param T - The target triple.
635 /// \param Includes - If the language requires extra headers to be implicitly
636 /// included, they will be appended to this list.
637 /// \param LangStd - The input language standard.
638 static void
639 setLangDefaults(LangOptions &Opts, Language Lang, const llvm::Triple &T,
640 std::vector<std::string> &Includes,
642
643 // Define accessors/mutators for language options of enumeration type.
644#define LANGOPT(Name, Bits, Default, Compatibility, Description)
645#define ENUM_LANGOPT(Name, Type, Bits, Default, Compatibility, Description) \
646 Type get##Name() const { return static_cast<Type>(Name); } \
647 void set##Name(Type Value) { \
648 assert(static_cast<unsigned>(Value) < (1u << Bits)); \
649 Name = static_cast<unsigned>(Value); \
650 }
651#include "clang/Basic/LangOptions.def"
652
653 /// Are we compiling a module?
654 bool isCompilingModule() const {
655 return getCompilingModule() != CMK_None;
656 }
657
658 /// Are we compiling a module implementation?
660 return !isCompilingModule() && !ModuleName.empty();
661 }
662
663 /// Do we need to track the owning module for a local declaration?
665 return isCompilingModule() || ModulesLocalVisibility;
666 }
667
669 return getSignedOverflowBehavior() == SOB_Defined;
670 }
671
673 return ObjCRuntime.isSubscriptPointerArithmetic() &&
674 !ObjCSubscriptingLegacyRuntime;
675 }
676
677 bool isCompatibleWith(ClangABI Version) const {
678 return getClangABICompat() <= Version;
679 }
680
681 bool isCompatibleWithMSVC() const { return MSCompatibilityVersion > 0; }
682
683 bool isCompatibleWithMSVC(MSVCMajorVersion MajorVersion) const {
684 return MSCompatibilityVersion >= MajorVersion * 100000U;
685 }
686
694
695 /// Reset all of the options that are not considered when building a
696 /// module.
698
699 /// Is this a libc/libm function that is no longer recognized as a
700 /// builtin because a -fno-builtin-* option has been specified?
701 bool isNoBuiltinFunc(StringRef Name) const;
702
703 /// True if any ObjC types may have non-trivial lifetime qualifiers.
705 return ObjCAutoRefCount || ObjCWeak;
706 }
707
709 return ConvergentFunctions;
710 }
711
712 /// Return true if atomicrmw operations targeting allocations in private
713 /// memory are undefined.
715 // Should be false for OpenMP.
716 // TODO: Should this be true for SYCL?
717 return OpenCL || CUDA;
718 }
719
720 /// Return the OpenCL C or C++ version as a VersionTuple.
721 VersionTuple getOpenCLVersionTuple() const;
722
723 /// Return the OpenCL version that kernel language is compatible with
724 unsigned getOpenCLCompatibleVersion() const;
725
726 /// Return the OpenCL C or C++ for OpenCL language name and version
727 /// as a string.
728 std::string getOpenCLVersionString() const;
729
730 /// Returns true if functions without prototypes or functions with an
731 /// identifier list (aka K&R C functions) are not allowed.
733 return CPlusPlus || C23 || DisableKNRFunctions;
734 }
735
736 /// Returns true if implicit function declarations are allowed in the current
737 /// language mode.
739 return !requiresStrictPrototypes() && !OpenCL;
740 }
741
742 /// Returns true if the language supports calling the 'atexit' function.
743 bool hasAtExit() const { return !(OpenMP && OpenMPIsTargetDevice); }
744
745 /// Returns true if implicit int is part of the language requirements.
746 bool isImplicitIntRequired() const { return !CPlusPlus && !C99; }
747
748 /// Returns true if implicit int is supported at all.
749 bool isImplicitIntAllowed() const { return !CPlusPlus && !C23; }
750
751 /// Check if return address signing is enabled.
752 bool hasSignReturnAddress() const {
753 return getSignReturnAddressScope() != SignReturnAddressScopeKind::None;
754 }
755
756 /// Check if return address signing uses AKey.
758 return getSignReturnAddressKey() == SignReturnAddressKeyKind::AKey;
759 }
760
761 /// Check if leaf functions are also signed.
763 return getSignReturnAddressScope() == SignReturnAddressScopeKind::All;
764 }
765
766 bool isSYCL() const { return SYCLIsDevice || SYCLIsHost; }
767
769 return getDefaultVisibilityExportMapping() !=
771 }
772
774 return getDefaultVisibilityExportMapping() ==
776 }
777
779 return getDefaultVisibilityExportMapping() ==
781 }
782
784 return getGlobalAllocationFunctionVisibility() !=
786 }
787
789 return getGlobalAllocationFunctionVisibility() ==
791 }
792
794 return getGlobalAllocationFunctionVisibility() ==
796 }
797
799 return getGlobalAllocationFunctionVisibility() ==
801 }
802
803 bool allowArrayReturnTypes() const { return HLSL; }
804
805 /// Remap path prefix according to -fmacro-prefix-path option.
806 void remapPathPrefix(SmallVectorImpl<char> &Path) const;
807
809 return RoundingMath ? RoundingMode::Dynamic
810 : RoundingMode::NearestTiesToEven;
811 }
812
814 FPExceptionModeKind EM = getFPExceptionMode();
817 return EM;
818 }
819
820 /// True when compiling for an offloading target device.
821 bool isTargetDevice() const {
822 return OpenMPIsTargetDevice || CUDAIsDevice || SYCLIsDevice;
823 }
824
825 /// Returns the most applicable C standard-compliant language version code.
826 /// If none could be determined, returns \ref std::nullopt.
827 std::optional<uint32_t> getCLangStd() const;
828
829 /// Returns the most applicable C++ standard-compliant language
830 /// version code.
831 /// If none could be determined, returns \ref std::nullopt.
832 std::optional<uint32_t> getCPlusPlusLangStd() const;
833};
834
835/// Floating point control options
836class FPOptionsOverride;
838public:
839 // We start by defining the layout.
841
842 using RoundingMode = llvm::RoundingMode;
843
844 static constexpr unsigned StorageBitSize = 8 * sizeof(storage_type);
845
846 // Define a fake option named "First" so that we have a PREVIOUS even for the
847 // real first option.
848 static constexpr storage_type FirstShift = 0, FirstWidth = 0;
849#define FP_OPTION(NAME, TYPE, WIDTH, PREVIOUS) \
850 static constexpr storage_type NAME##Shift = \
851 PREVIOUS##Shift + PREVIOUS##Width; \
852 static constexpr storage_type NAME##Width = WIDTH; \
853 static constexpr storage_type NAME##Mask = ((1 << NAME##Width) - 1) \
854 << NAME##Shift;
855#include "clang/Basic/FPOptions.def"
856
857 static constexpr storage_type TotalWidth = 0
858#define FP_OPTION(NAME, TYPE, WIDTH, PREVIOUS) +WIDTH
859#include "clang/Basic/FPOptions.def"
860 ;
861 static_assert(TotalWidth <= StorageBitSize, "Too short type for FPOptions");
862
863private:
864 storage_type Value;
865
866 FPOptionsOverride getChangesSlow(const FPOptions &Base) const;
867
868public:
869 FPOptions() : Value(0) {
870 setFPContractMode(LangOptions::FPM_Off);
871 setConstRoundingMode(RoundingMode::Dynamic);
872 setSpecifiedExceptionMode(LangOptions::FPE_Default);
873 }
874 explicit FPOptions(const LangOptions &LO) {
875 Value = 0;
876 // The language fp contract option FPM_FastHonorPragmas has the same effect
877 // as FPM_Fast in frontend. For simplicity, use FPM_Fast uniformly in
878 // frontend.
879 auto LangOptContractMode = LO.getDefaultFPContractMode();
880 if (LangOptContractMode == LangOptions::FPM_FastHonorPragmas)
881 LangOptContractMode = LangOptions::FPM_Fast;
882 setFPContractMode(LangOptContractMode);
883 setRoundingMath(LO.RoundingMath);
884 setConstRoundingMode(LangOptions::RoundingMode::Dynamic);
885 setSpecifiedExceptionMode(LO.getFPExceptionMode());
886 setAllowFPReassociate(LO.AllowFPReassoc);
887 setNoHonorNaNs(LO.NoHonorNaNs);
888 setNoHonorInfs(LO.NoHonorInfs);
889 setNoSignedZero(LO.NoSignedZero);
890 setAllowReciprocal(LO.AllowRecip);
891 setAllowApproxFunc(LO.ApproxFunc);
892 if (getFPContractMode() == LangOptions::FPM_On &&
893 getRoundingMode() == llvm::RoundingMode::Dynamic &&
895 // If the FP settings are set to the "strict" model, then
896 // FENV access is set to true. (ffp-model=strict)
897 setAllowFEnvAccess(true);
898 else
899 setAllowFEnvAccess(LangOptions::FPM_Off);
900 setComplexRange(LO.getComplexRange());
901 }
902
904 return getFPContractMode() == LangOptions::FPM_On;
905 }
907 setFPContractMode(LangOptions::FPM_On);
908 }
909
911 return getFPContractMode() == LangOptions::FPM_Fast;
912 }
914 setFPContractMode(LangOptions::FPM_Fast);
915 }
916
917 bool isFPConstrained() const {
918 return getRoundingMode() != llvm::RoundingMode::NearestTiesToEven ||
920 getAllowFEnvAccess();
921 }
922
924 RoundingMode RM = getConstRoundingMode();
925 if (RM == RoundingMode::Dynamic) {
926 // C23: 7.6.2p3 If the FE_DYNAMIC mode is specified and FENV_ACCESS is
927 // "off", the translator may assume that the default rounding mode is in
928 // effect.
929 if (!getAllowFEnvAccess() && !getRoundingMath())
930 RM = RoundingMode::NearestTiesToEven;
931 }
932 return RM;
933 }
934
936 LangOptions::FPExceptionModeKind EM = getSpecifiedExceptionMode();
938 if (getAllowFEnvAccess())
940 else
942 }
943 return EM;
944 }
945
946 bool operator==(FPOptions other) const { return Value == other.Value; }
947
948 /// Return the default value of FPOptions that's used when trailing
949 /// storage isn't required.
951
952 storage_type getAsOpaqueInt() const { return Value; }
954 FPOptions Opts;
955 Opts.Value = Value;
956 return Opts;
957 }
958
959 /// Return difference with the given option set.
961
963
964 // We can define most of the accessors automatically:
965 // TODO: consider enforcing the assertion that value fits within bits
966 // statically.
967#define FP_OPTION(NAME, TYPE, WIDTH, PREVIOUS) \
968 TYPE get##NAME() const { \
969 return static_cast<TYPE>((Value & NAME##Mask) >> NAME##Shift); \
970 } \
971 void set##NAME(TYPE value) { \
972 assert(storage_type(value) < (1u << WIDTH)); \
973 Value = (Value & ~NAME##Mask) | (storage_type(value) << NAME##Shift); \
974 }
975#include "clang/Basic/FPOptions.def"
976 LLVM_DUMP_METHOD void dump();
977};
978
979/// Represents difference between two FPOptions values.
980///
981/// The effect of language constructs changing the set of floating point options
982/// is usually a change of some FP properties while leaving others intact. This
983/// class describes such changes by keeping information about what FP options
984/// are overridden.
985///
986/// The integral set of FP options, described by the class FPOptions, may be
987/// represented as a default FP option set, defined by language standard and
988/// command line options, with the overrides introduced by pragmas.
989///
990/// The is implemented as a value of the new FPOptions plus a mask showing which
991/// fields are actually set in it.
992///
993/// NOTE: This type is serialized into the AST format (e.g. for defaulted
994/// functions). When adding a new field here or in FPOptions, ensure that the
995/// AST VERSION_MAJOR is bumped if it changes the layout or size.
998 FPOptions::storage_type OverrideMask = 0;
999
1000public:
1001 using RoundingMode = llvm::RoundingMode;
1002
1003 /// The type suitable for storing values of FPOptionsOverride. Must be twice
1004 /// as wide as bit size of FPOption.
1005 using storage_type = uint64_t;
1006 static_assert(sizeof(storage_type) >= 2 * sizeof(FPOptions::storage_type),
1007 "Too short type for FPOptionsOverride");
1008
1009 /// Bit mask selecting bits of OverrideMask in serialized representation of
1010 /// FPOptionsOverride.
1012 (static_cast<storage_type>(1) << FPOptions::StorageBitSize) - 1;
1013
1016 : Options(LO), OverrideMask(OverrideMaskBits) {}
1018 : Options(FPO), OverrideMask(OverrideMaskBits) {}
1020 : Options(FPO), OverrideMask(Mask) {}
1021
1022 bool requiresTrailingStorage() const { return OverrideMask != 0; }
1023
1025 setFPContractModeOverride(LangOptions::FPM_On);
1026 }
1027
1029 setFPContractModeOverride(LangOptions::FPM_Fast);
1030 }
1031
1033 setFPContractModeOverride(LangOptions::FPM_Off);
1034 }
1035
1037 setAllowFPReassociateOverride(!Value);
1038 setNoHonorNaNsOverride(!Value);
1039 setNoHonorInfsOverride(!Value);
1040 setNoSignedZeroOverride(!Value);
1041 setAllowReciprocalOverride(!Value);
1042 setAllowApproxFuncOverride(!Value);
1043 setMathErrnoOverride(Value);
1044 if (Value)
1045 /* Precise mode implies fp_contract=on and disables ffast-math */
1047 else
1048 /* Precise mode disabled sets fp_contract=fast and enables ffast-math */
1050 }
1051
1053
1055 return (static_cast<storage_type>(Options.getAsOpaqueInt())
1057 OverrideMask;
1058 }
1060 FPOptionsOverride Opts;
1061 Opts.OverrideMask = I & OverrideMaskBits;
1063 return Opts;
1064 }
1065
1068 FPOptions::getFromOpaqueInt((Base.getAsOpaqueInt() & ~OverrideMask) |
1069 (Options.getAsOpaqueInt() & OverrideMask));
1070 return Result;
1071 }
1072
1074 return applyOverrides(FPOptions(LO));
1075 }
1076
1077 bool operator==(FPOptionsOverride other) const {
1078 return Options == other.Options && OverrideMask == other.OverrideMask;
1079 }
1080 bool operator!=(FPOptionsOverride other) const { return !(*this == other); }
1081
1082#define FP_OPTION(NAME, TYPE, WIDTH, PREVIOUS) \
1083 bool has##NAME##Override() const { \
1084 return OverrideMask & FPOptions::NAME##Mask; \
1085 } \
1086 TYPE get##NAME##Override() const { \
1087 assert(has##NAME##Override()); \
1088 return Options.get##NAME(); \
1089 } \
1090 void clear##NAME##Override() { \
1091 /* Clear the actual value so that we don't have spurious differences when \
1092 * testing equality. */ \
1093 Options.set##NAME(TYPE(0)); \
1094 OverrideMask &= ~FPOptions::NAME##Mask; \
1095 } \
1096 void set##NAME##Override(TYPE value) { \
1097 Options.set##NAME(value); \
1098 OverrideMask |= FPOptions::NAME##Mask; \
1099 }
1100#include "clang/Basic/FPOptions.def"
1101 LLVM_DUMP_METHOD void dump();
1102};
1105 if (Value == Base.Value)
1106 return FPOptionsOverride();
1107 return getChangesSlow(Base);
1108}
1111 *this = FPO.applyOverrides(*this);
1112}
1113
1114// The three atomic code-generation options.
1115// The canonical (positive) names are:
1116// "remote_memory", "fine_grained_memory", and "ignore_denormal_mode".
1117// In attribute or command-line parsing, a token prefixed with "no_" inverts its
1118// value.
1120 RemoteMemory, // enable remote memory.
1121 FineGrainedMemory, // enable fine-grained memory.
1122 IgnoreDenormalMode, // ignore floating-point denormals.
1124};
1126struct AtomicOptions {
1127 // Bitfields for each option.
1128 unsigned remote_memory : 1;
1130 unsigned ignore_denormal_mode : 1;
1135 AtomicOptions(const LangOptions &LO)
1136 : remote_memory(LO.AtomicRemoteMemory),
1137 fine_grained_memory(LO.AtomicFineGrainedMemory),
1138 ignore_denormal_mode(LO.AtomicIgnoreDenormalMode) {}
1140 bool getOption(AtomicOptionKind Kind) const {
1141 switch (Kind) {
1143 return remote_memory;
1145 return fine_grained_memory;
1147 return ignore_denormal_mode;
1148 }
1149 llvm_unreachable("Invalid AtomicOptionKind");
1150 }
1152 void setOption(AtomicOptionKind Kind, bool Value) {
1153 switch (Kind) {
1156 return;
1159 return;
1162 return;
1163 }
1164 llvm_unreachable("Invalid AtomicOptionKind");
1165 }
1167 LLVM_DUMP_METHOD void dump() const {
1168 llvm::errs() << "\n remote_memory: " << remote_memory
1169 << "\n fine_grained_memory: " << fine_grained_memory
1170 << "\n ignore_denormal_mode: " << ignore_denormal_mode << "\n";
1171 }
1172};
1173
1174/// Describes the kind of translation unit being processed.
1176 /// The translation unit is a complete translation unit.
1178
1179 /// The translation unit is a prefix to a translation unit, and is
1180 /// not complete.
1181 TU_Prefix,
1182
1183 /// The translation unit is a clang module.
1185
1186 /// The translation unit is a is a complete translation unit that we might
1187 /// incrementally extend later.
1189};
1190
1191} // namespace clang
1192
1193#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.
static FPOptionsOverride getFromOpaqueInt(storage_type I)
bool operator!=(FPOptionsOverride other) const
FPOptionsOverride(FPOptions FPO)
LLVM_DUMP_METHOD void dump()
void setFPPreciseEnabled(bool Value)
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.
@ Microsoft
Use Microsoft C++ ABI rules for bit-field layout and fundamental types alignment.
@ Itanium
Use Itanium rules for bit-field layout and fundamental types alignment.
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...
SanitizerSet UBSanFeatureIgnoredSanitize
Set of (UBSan) sanitizers that when enabled do not cause __has_feature(undefined_behavior_sanitizer) ...
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::string LiteralEncoding
Name of the literal encoding to convert the internal encoding to.
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...
std::string ObjCConstantIntegerNumberClass
bool isSignedOverflowDefined() const
bool hasDefaultGlobalAllocationFunctionVisibility() const
bool hasGlobalAllocationFunctionVisibility() const
VersionTuple getOpenCLVersionTuple() const
Return the OpenCL C or C++ version as a VersionTuple.
std::string ObjCConstantDoubleNumberClass
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.
std::string LifetimeSafetyLifetimeBoundMacro
Macro name to use in lifetimebound fix-it suggestions.
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 isCompatibleWith(ClangABI Version) const
bool isCompatibleWithMSVC() const
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 = target SIZE_MAX), nullopt if none set (use target SIZE_MAX).
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 ObjCConstantArrayClass
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.
std::string ObjCConstantDictionaryClass
std::string ObjCConstantFloatNumberClass
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
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:176
Visibility
Describes the different kinds of visibility that a declaration may have.
Definition Visibility.h:34
__packed_splat4 __packed_splat2 __packed_splat8 __packed_splat4 __packed_splat2 __packed_splat4 __packed_splat2 __packed_splat8 __packed_splat4 uint32_t
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.