1 //===--- LangOptions.h - C Language Family Language Options -----*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
11 /// \brief Defines the clang::LangOptions interface.
13 //===----------------------------------------------------------------------===//
15 #ifndef LLVM_CLANG_BASIC_LANGOPTIONS_H
16 #define LLVM_CLANG_BASIC_LANGOPTIONS_H
18 #include "clang/Basic/CommentOptions.h"
19 #include "clang/Basic/LLVM.h"
20 #include "clang/Basic/ObjCRuntime.h"
21 #include "clang/Basic/Sanitizers.h"
22 #include "clang/Basic/Visibility.h"
28 /// Bitfields of LangOptions, split out from LangOptions in order to ensure that
29 /// this large collection of bitfields is a trivial class type.
30 class LangOptionsBase {
32 // Define simple language options (with no accessors).
33 #define LANGOPT(Name, Bits, Default, Description) unsigned Name : Bits;
34 #define ENUM_LANGOPT(Name, Type, Bits, Default, Description)
35 #include "clang/Basic/LangOptions.def"
38 // Define language options of enumeration type. These are private, and will
39 // have accessors (below).
40 #define LANGOPT(Name, Bits, Default, Description)
41 #define ENUM_LANGOPT(Name, Type, Bits, Default, Description) \
43 #include "clang/Basic/LangOptions.def"
46 /// \brief Keeps track of the various options that can be
47 /// enabled, which controls the dialect of C or C++ that is accepted.
48 class LangOptions : public LangOptionsBase {
50 typedef clang::Visibility Visibility;
52 enum GCMode { NonGC, GCOnly, HybridGC };
53 enum StackProtectorMode { SSPOff, SSPOn, SSPStrong, SSPReq };
55 enum SignedOverflowBehaviorTy {
56 SOB_Undefined, // Default C standard behavior.
57 SOB_Defined, // -fwrapv
58 SOB_Trapping // -ftrapv
61 // FIXME: Unify with TUKind.
62 enum CompilingModuleKind {
63 CMK_None, ///< Not compiling a module interface at all.
64 CMK_ModuleMap, ///< Compiling a module from a module map.
65 CMK_ModuleInterface ///< Compiling a C++ modules TS module interface unit.
68 enum PragmaMSPointersToMembersKind {
70 PPTMK_FullGeneralitySingleInheritance,
71 PPTMK_FullGeneralityMultipleInheritance,
72 PPTMK_FullGeneralityVirtualInheritance
75 enum DefaultCallingConvention {
84 enum AddrSpaceMapMangling { ASMM_Target, ASMM_On, ASMM_Off };
86 enum MSVCMajorVersion {
93 enum FPContractModeKind {
94 FPC_Off, // Form fused FP ops only where result will not be affected.
95 FPC_On, // Form fused FP ops according to FP_CONTRACT rules.
96 FPC_Fast // Aggressively fuse FP ops (E.g. FMA).
100 /// \brief Set of enabled sanitizers.
101 SanitizerSet Sanitize;
103 /// \brief Paths to blacklist files specifying which objects
104 /// (files, functions, variables) should not be instrumented.
105 std::vector<std::string> SanitizerBlacklistFiles;
107 /// \brief Paths to the XRay "always instrument" files specifying which
108 /// objects (files, functions, variables) should be imbued with the XRay
109 /// "always instrument" attribute.
110 std::vector<std::string> XRayAlwaysInstrumentFiles;
112 /// \brief Paths to the XRay "never instrument" files specifying which
113 /// objects (files, functions, variables) should be imbued with the XRay
114 /// "never instrument" attribute.
115 std::vector<std::string> XRayNeverInstrumentFiles;
117 clang::ObjCRuntime ObjCRuntime;
119 std::string ObjCConstantStringClass;
121 /// \brief The name of the handler function to be called when -ftrapv is
124 /// If none is specified, abort (GCC-compatible behaviour).
125 std::string OverflowHandler;
127 /// \brief The name of the current module, of which the main source file
128 /// is a part. If CompilingModule is set, we are compiling the interface
129 /// of this module, otherwise we are compiling an implementation file of
131 std::string CurrentModule;
133 /// \brief The names of any features to enable in module 'requires' decls
134 /// in addition to the hard-coded list in Module.cpp and the target features.
136 /// This list is sorted.
137 std::vector<std::string> ModuleFeatures;
139 /// \brief Options for parsing comments.
140 CommentOptions CommentOpts;
142 /// \brief A list of all -fno-builtin-* function names (e.g., memset).
143 std::vector<std::string> NoBuiltinFuncs;
145 /// \brief Triples of the OpenMP targets that the host code codegen should
146 /// take into account in order to generate accurate offloading descriptors.
147 std::vector<llvm::Triple> OMPTargetTriples;
149 /// \brief Name of the IR file that contains the result of the OpenMP target
150 /// host code generation.
151 std::string OMPHostIRFile;
153 /// \brief Indicates whether the front-end is explicitly told that the
154 /// input is a header file (i.e. -x c-header).
159 // Define accessors/mutators for language options of enumeration type.
160 #define LANGOPT(Name, Bits, Default, Description)
161 #define ENUM_LANGOPT(Name, Type, Bits, Default, Description) \
162 Type get##Name() const { return static_cast<Type>(Name); } \
163 void set##Name(Type Value) { Name = static_cast<unsigned>(Value); }
164 #include "clang/Basic/LangOptions.def"
166 /// Are we compiling a module interface (.cppm or module map)?
167 bool isCompilingModule() const {
168 return getCompilingModule() != CMK_None;
171 /// Do we need to track the owning module for a local declaration?
172 bool trackLocalOwningModule() const {
173 return isCompilingModule() || ModulesLocalVisibility || ModulesTS;
176 bool isSignedOverflowDefined() const {
177 return getSignedOverflowBehavior() == SOB_Defined;
180 bool isSubscriptPointerArithmetic() const {
181 return ObjCRuntime.isSubscriptPointerArithmetic() &&
182 !ObjCSubscriptingLegacyRuntime;
185 bool isCompatibleWithMSVC(MSVCMajorVersion MajorVersion) const {
186 return MSCompatibilityVersion >= MajorVersion * 10000000U;
189 /// \brief Reset all of the options that are not considered when building a
191 void resetNonModularOptions();
193 /// \brief Is this a libc/libm function that is no longer recognized as a
194 /// builtin because a -fno-builtin-* option has been specified?
195 bool isNoBuiltinFunc(StringRef Name) const;
197 /// \brief True if any ObjC types may have non-trivial lifetime qualifiers.
198 bool allowsNonTrivialObjCLifetimeQualifiers() const {
199 return ObjCAutoRefCount || ObjCWeak;
202 bool assumeFunctionsAreConvergent() const {
203 return (CUDA && CUDAIsDevice) || OpenCL;
207 /// \brief Floating point control options
210 FPOptions() : fp_contract(LangOptions::FPC_Off) {}
212 // Used for serializing.
213 explicit FPOptions(unsigned I)
214 : fp_contract(static_cast<LangOptions::FPContractModeKind>(I)) {}
216 explicit FPOptions(const LangOptions &LangOpts)
217 : fp_contract(LangOpts.getDefaultFPContractMode()) {}
219 bool allowFPContractWithinStatement() const {
220 return fp_contract == LangOptions::FPC_On;
222 bool allowFPContractAcrossStatement() const {
223 return fp_contract == LangOptions::FPC_Fast;
225 void setAllowFPContractWithinStatement() {
226 fp_contract = LangOptions::FPC_On;
228 void setAllowFPContractAcrossStatement() {
229 fp_contract = LangOptions::FPC_Fast;
231 void setDisallowFPContract() { fp_contract = LangOptions::FPC_Off; }
233 /// Used to serialize this.
234 unsigned getInt() const { return fp_contract; }
237 /// Adjust BinaryOperator::FPFeatures to match the bit-field size of this.
238 unsigned fp_contract : 2;
241 /// \brief Describes the kind of translation unit being processed.
242 enum TranslationUnitKind {
243 /// \brief The translation unit is a complete translation unit.
245 /// \brief The translation unit is a prefix to a translation unit, and is
248 /// \brief The translation unit is a module.
252 } // end namespace clang