Home | History | Annotate | Download | only in Basic
      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 CompilingModuleKind {
     62     CMK_None,           ///< Not compiling a module interface at all.
     63     CMK_ModuleMap,      ///< Compiling a module from a module map.
     64     CMK_ModuleInterface ///< Compiling a C++ modules TS module interface unit.
     65   };
     66 
     67   enum PragmaMSPointersToMembersKind {
     68     PPTMK_BestCase,
     69     PPTMK_FullGeneralitySingleInheritance,
     70     PPTMK_FullGeneralityMultipleInheritance,
     71     PPTMK_FullGeneralityVirtualInheritance
     72   };
     73 
     74   enum DefaultCallingConvention {
     75     DCC_None,
     76     DCC_CDecl,
     77     DCC_FastCall,
     78     DCC_StdCall,
     79     DCC_VectorCall
     80   };
     81 
     82   enum AddrSpaceMapMangling { ASMM_Target, ASMM_On, ASMM_Off };
     83 
     84   enum MSVCMajorVersion {
     85     MSVC2010 = 16,
     86     MSVC2012 = 17,
     87     MSVC2013 = 18,
     88     MSVC2015 = 19
     89   };
     90 
     91   enum FPContractModeKind {
     92     FPC_Off,        // Form fused FP ops only where result will not be affected.
     93     FPC_On,         // Form fused FP ops according to FP_CONTRACT rules.
     94     FPC_Fast        // Aggressively fuse FP ops (E.g. FMA).
     95   };
     96 
     97 public:
     98   /// \brief Set of enabled sanitizers.
     99   SanitizerSet Sanitize;
    100 
    101   /// \brief Paths to blacklist files specifying which objects
    102   /// (files, functions, variables) should not be instrumented.
    103   std::vector<std::string> SanitizerBlacklistFiles;
    104 
    105   /// \brief Paths to the XRay "always instrument" files specifying which
    106   /// objects (files, functions, variables) should be imbued with the XRay
    107   /// "always instrument" attribute.
    108   std::vector<std::string> XRayAlwaysInstrumentFiles;
    109 
    110   /// \brief Paths to the XRay "never instrument" files specifying which
    111   /// objects (files, functions, variables) should be imbued with the XRay
    112   /// "never instrument" attribute.
    113   std::vector<std::string> XRayNeverInstrumentFiles;
    114 
    115   clang::ObjCRuntime ObjCRuntime;
    116 
    117   std::string ObjCConstantStringClass;
    118 
    119   /// \brief The name of the handler function to be called when -ftrapv is
    120   /// specified.
    121   ///
    122   /// If none is specified, abort (GCC-compatible behaviour).
    123   std::string OverflowHandler;
    124 
    125   /// \brief The name of the current module, of which the main source file
    126   /// is a part. If CompilingModule is set, we are compiling the interface
    127   /// of this module, otherwise we are compiling an implementation file of
    128   /// it.
    129   std::string CurrentModule;
    130 
    131   /// \brief The names of any features to enable in module 'requires' decls
    132   /// in addition to the hard-coded list in Module.cpp and the target features.
    133   ///
    134   /// This list is sorted.
    135   std::vector<std::string> ModuleFeatures;
    136 
    137   /// \brief Options for parsing comments.
    138   CommentOptions CommentOpts;
    139 
    140   /// \brief A list of all -fno-builtin-* function names (e.g., memset).
    141   std::vector<std::string> NoBuiltinFuncs;
    142 
    143   /// \brief Triples of the OpenMP targets that the host code codegen should
    144   /// take into account in order to generate accurate offloading descriptors.
    145   std::vector<llvm::Triple> OMPTargetTriples;
    146 
    147   /// \brief Name of the IR file that contains the result of the OpenMP target
    148   /// host code generation.
    149   std::string OMPHostIRFile;
    150 
    151   /// \brief Indicates whether the front-end is explicitly told that the
    152   /// input is a header file (i.e. -x c-header).
    153   bool IsHeaderFile;
    154 
    155   LangOptions();
    156 
    157   // Define accessors/mutators for language options of enumeration type.
    158 #define LANGOPT(Name, Bits, Default, Description)
    159 #define ENUM_LANGOPT(Name, Type, Bits, Default, Description) \
    160   Type get##Name() const { return static_cast<Type>(Name); } \
    161   void set##Name(Type Value) { Name = static_cast<unsigned>(Value); }
    162 #include "clang/Basic/LangOptions.def"
    163 
    164   /// Are we compiling a module interface (.cppm or module map)?
    165   bool isCompilingModule() const {
    166     return getCompilingModule() != CMK_None;
    167   }
    168 
    169   bool isSignedOverflowDefined() const {
    170     return getSignedOverflowBehavior() == SOB_Defined;
    171   }
    172 
    173   bool isSubscriptPointerArithmetic() const {
    174     return ObjCRuntime.isSubscriptPointerArithmetic() &&
    175            !ObjCSubscriptingLegacyRuntime;
    176   }
    177 
    178   bool isCompatibleWithMSVC(MSVCMajorVersion MajorVersion) const {
    179     return MSCompatibilityVersion >= MajorVersion * 10000000U;
    180   }
    181 
    182   /// \brief Reset all of the options that are not considered when building a
    183   /// module.
    184   void resetNonModularOptions();
    185 
    186   /// \brief Is this a libc/libm function that is no longer recognized as a
    187   /// builtin because a -fno-builtin-* option has been specified?
    188   bool isNoBuiltinFunc(StringRef Name) const;
    189 
    190   /// \brief True if any ObjC types may have non-trivial lifetime qualifiers.
    191   bool allowsNonTrivialObjCLifetimeQualifiers() const {
    192     return ObjCAutoRefCount || ObjCWeak;
    193   }
    194 };
    195 
    196 /// \brief Floating point control options
    197 class FPOptions {
    198 public:
    199   FPOptions() : fp_contract(LangOptions::FPC_Off) {}
    200 
    201   // Used for serializing.
    202   explicit FPOptions(unsigned I)
    203       : fp_contract(static_cast<LangOptions::FPContractModeKind>(I)) {}
    204 
    205   explicit FPOptions(const LangOptions &LangOpts)
    206       : fp_contract(LangOpts.getDefaultFPContractMode()) {}
    207 
    208   bool allowFPContractWithinStatement() const {
    209     return fp_contract == LangOptions::FPC_On;
    210   }
    211   bool allowFPContractAcrossStatement() const {
    212     return fp_contract == LangOptions::FPC_Fast;
    213   }
    214   void setAllowFPContractWithinStatement() {
    215     fp_contract = LangOptions::FPC_On;
    216   }
    217   void setAllowFPContractAcrossStatement() {
    218     fp_contract = LangOptions::FPC_Fast;
    219   }
    220   void setDisallowFPContract() { fp_contract = LangOptions::FPC_Off; }
    221 
    222   /// Used to serialize this.
    223   unsigned getInt() const { return fp_contract; }
    224 
    225 private:
    226   /// Adjust BinaryOperator::FPFeatures to match the bit-field size of this.
    227   unsigned fp_contract : 2;
    228 };
    229 
    230 /// \brief Describes the kind of translation unit being processed.
    231 enum TranslationUnitKind {
    232   /// \brief The translation unit is a complete translation unit.
    233   TU_Complete,
    234   /// \brief The translation unit is a prefix to a translation unit, and is
    235   /// not complete.
    236   TU_Prefix,
    237   /// \brief The translation unit is a module.
    238   TU_Module
    239 };
    240 
    241 }  // end namespace clang
    242 
    243 #endif
    244