1 //===--- LangOptions.h - C Language Family Language Options -----*- C++ -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 /// 10 /// \file 11 /// \brief Defines the clang::LangOptions interface. 12 /// 13 //===----------------------------------------------------------------------===// 14 15 #ifndef LLVM_CLANG_BASIC_LANGOPTIONS_H 16 #define LLVM_CLANG_BASIC_LANGOPTIONS_H 17 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" 23 #include <string> 24 #include <vector> 25 26 namespace clang { 27 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 { 31 public: 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" 36 37 protected: 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) \ 42 unsigned Name : Bits; 43 #include "clang/Basic/LangOptions.def" 44 }; 45 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 { 49 public: 50 typedef clang::Visibility Visibility; 51 52 enum GCMode { NonGC, GCOnly, HybridGC }; 53 enum StackProtectorMode { SSPOff, SSPOn, SSPStrong, SSPReq }; 54 55 enum SignedOverflowBehaviorTy { 56 SOB_Undefined, // Default C standard behavior. 57 SOB_Defined, // -fwrapv 58 SOB_Trapping // -ftrapv 59 }; 60 61 enum PragmaMSPointersToMembersKind { 62 PPTMK_BestCase, 63 PPTMK_FullGeneralitySingleInheritance, 64 PPTMK_FullGeneralityMultipleInheritance, 65 PPTMK_FullGeneralityVirtualInheritance 66 }; 67 68 enum DefaultCallingConvention { 69 DCC_None, 70 DCC_CDecl, 71 DCC_FastCall, 72 DCC_StdCall, 73 DCC_VectorCall 74 }; 75 76 enum AddrSpaceMapMangling { ASMM_Target, ASMM_On, ASMM_Off }; 77 78 enum MSVCMajorVersion { 79 MSVC2010 = 16, 80 MSVC2012 = 17, 81 MSVC2013 = 18, 82 MSVC2015 = 19 83 }; 84 85 public: 86 /// \brief Set of enabled sanitizers. 87 SanitizerSet Sanitize; 88 89 /// \brief Paths to blacklist files specifying which objects 90 /// (files, functions, variables) should not be instrumented. 91 std::vector<std::string> SanitizerBlacklistFiles; 92 93 clang::ObjCRuntime ObjCRuntime; 94 95 std::string ObjCConstantStringClass; 96 97 /// \brief The name of the handler function to be called when -ftrapv is 98 /// specified. 99 /// 100 /// If none is specified, abort (GCC-compatible behaviour). 101 std::string OverflowHandler; 102 103 /// \brief The name of the current module, of which the main source file 104 /// is a part. If CompilingModule is set, we are compiling the interface 105 /// of this module, otherwise we are compiling an implementation file of 106 /// it. 107 std::string CurrentModule; 108 109 /// \brief The names of any features to enable in module 'requires' decls 110 /// in addition to the hard-coded list in Module.cpp and the target features. 111 /// 112 /// This list is sorted. 113 std::vector<std::string> ModuleFeatures; 114 115 /// \brief Options for parsing comments. 116 CommentOptions CommentOpts; 117 118 /// \brief A list of all -fno-builtin-* function names (e.g., memset). 119 std::vector<std::string> NoBuiltinFuncs; 120 121 /// \brief Triples of the OpenMP targets that the host code codegen should 122 /// take into account in order to generate accurate offloading descriptors. 123 std::vector<llvm::Triple> OMPTargetTriples; 124 125 /// \brief Name of the IR file that contains the result of the OpenMP target 126 /// host code generation. 127 std::string OMPHostIRFile; 128 129 LangOptions(); 130 131 // Define accessors/mutators for language options of enumeration type. 132 #define LANGOPT(Name, Bits, Default, Description) 133 #define ENUM_LANGOPT(Name, Type, Bits, Default, Description) \ 134 Type get##Name() const { return static_cast<Type>(Name); } \ 135 void set##Name(Type Value) { Name = static_cast<unsigned>(Value); } 136 #include "clang/Basic/LangOptions.def" 137 isSignedOverflowDefined()138 bool isSignedOverflowDefined() const { 139 return getSignedOverflowBehavior() == SOB_Defined; 140 } 141 isSubscriptPointerArithmetic()142 bool isSubscriptPointerArithmetic() const { 143 return ObjCRuntime.isSubscriptPointerArithmetic() && 144 !ObjCSubscriptingLegacyRuntime; 145 } 146 isCompatibleWithMSVC(MSVCMajorVersion MajorVersion)147 bool isCompatibleWithMSVC(MSVCMajorVersion MajorVersion) const { 148 return MSCompatibilityVersion >= MajorVersion * 10000000U; 149 } 150 151 /// \brief Reset all of the options that are not considered when building a 152 /// module. 153 void resetNonModularOptions(); 154 155 /// \brief Is this a libc/libm function that is no longer recognized as a 156 /// builtin because a -fno-builtin-* option has been specified? 157 bool isNoBuiltinFunc(const char *Name) const; 158 }; 159 160 /// \brief Floating point control options 161 class FPOptions { 162 public: 163 unsigned fp_contract : 1; 164 FPOptions()165 FPOptions() : fp_contract(0) {} 166 FPOptions(const LangOptions & LangOpts)167 FPOptions(const LangOptions &LangOpts) : 168 fp_contract(LangOpts.DefaultFPContract) {} 169 }; 170 171 /// \brief Describes the kind of translation unit being processed. 172 enum TranslationUnitKind { 173 /// \brief The translation unit is a complete translation unit. 174 TU_Complete, 175 /// \brief The translation unit is a prefix to a translation unit, and is 176 /// not complete. 177 TU_Prefix, 178 /// \brief The translation unit is a module. 179 TU_Module 180 }; 181 182 } // end namespace clang 183 184 #endif 185