xref: /trueos/contrib/llvm/tools/clang/include/clang/Basic/LangOptions.h (revision 9cedb8bb69b89b0f0c529937247a6a80cabdbaec)
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_LANGOPTIONS_H
16 #define LLVM_CLANG_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/Visibility.h"
22 #include "llvm/ADT/IntrusiveRefCntPtr.h"
23 #include <string>
24 
25 namespace clang {
26 
27 struct SanitizerOptions {
28 #define SANITIZER(NAME, ID) unsigned ID : 1;
29 #include "clang/Basic/Sanitizers.def"
30 
31   /// \brief Cached set of sanitizer options with all sanitizers disabled.
32   static const SanitizerOptions Disabled;
33 };
34 
35 /// Bitfields of LangOptions, split out from LangOptions in order to ensure that
36 /// this large collection of bitfields is a trivial class type.
37 class LangOptionsBase {
38 public:
39   // Define simple language options (with no accessors).
40 #define LANGOPT(Name, Bits, Default, Description) unsigned Name : Bits;
41 #define ENUM_LANGOPT(Name, Type, Bits, Default, Description)
42 #include "clang/Basic/LangOptions.def"
43 
44   SanitizerOptions Sanitize;
45 protected:
46   // Define language options of enumeration type. These are private, and will
47   // have accessors (below).
48 #define LANGOPT(Name, Bits, Default, Description)
49 #define ENUM_LANGOPT(Name, Type, Bits, Default, Description) \
50   unsigned Name : Bits;
51 #include "clang/Basic/LangOptions.def"
52 };
53 
54 /// \brief Keeps track of the various options that can be
55 /// enabled, which controls the dialect of C or C++ that is accepted.
56 class LangOptions : public RefCountedBase<LangOptions>, public LangOptionsBase {
57 public:
58   typedef clang::Visibility Visibility;
59 
60   enum GCMode { NonGC, GCOnly, HybridGC };
61   enum StackProtectorMode { SSPOff, SSPOn, SSPReq };
62 
63   enum SignedOverflowBehaviorTy {
64     SOB_Undefined,  // Default C standard behavior.
65     SOB_Defined,    // -fwrapv
66     SOB_Trapping    // -ftrapv
67   };
68 
69   enum AddrSpaceMapMangling { ASMM_Target, ASMM_On, ASMM_Off };
70 
71 public:
72   clang::ObjCRuntime ObjCRuntime;
73 
74   std::string ObjCConstantStringClass;
75 
76   /// \brief The name of the handler function to be called when -ftrapv is
77   /// specified.
78   ///
79   /// If none is specified, abort (GCC-compatible behaviour).
80   std::string OverflowHandler;
81 
82   /// \brief The name of the current module.
83   std::string CurrentModule;
84 
85   /// \brief Options for parsing comments.
86   CommentOptions CommentOpts;
87 
88   LangOptions();
89 
90   // Define accessors/mutators for language options of enumeration type.
91 #define LANGOPT(Name, Bits, Default, Description)
92 #define ENUM_LANGOPT(Name, Type, Bits, Default, Description) \
93   Type get##Name() const { return static_cast<Type>(Name); } \
94   void set##Name(Type Value) { Name = static_cast<unsigned>(Value); }
95 #include "clang/Basic/LangOptions.def"
96 
isSignedOverflowDefined()97   bool isSignedOverflowDefined() const {
98     return getSignedOverflowBehavior() == SOB_Defined;
99   }
100 
isSubscriptPointerArithmetic()101   bool isSubscriptPointerArithmetic() const {
102     return ObjCRuntime.isSubscriptPointerArithmetic() &&
103            !ObjCSubscriptingLegacyRuntime;
104   }
105 
106   /// \brief Reset all of the options that are not considered when building a
107   /// module.
108   void resetNonModularOptions();
109 };
110 
111 /// \brief Floating point control options
112 class FPOptions {
113 public:
114   unsigned fp_contract : 1;
115 
FPOptions()116   FPOptions() : fp_contract(0) {}
117 
FPOptions(const LangOptions & LangOpts)118   FPOptions(const LangOptions &LangOpts) :
119     fp_contract(LangOpts.DefaultFPContract) {}
120 };
121 
122 /// \brief OpenCL volatile options
123 class OpenCLOptions {
124 public:
125 #define OPENCLEXT(nm)  unsigned nm : 1;
126 #include "clang/Basic/OpenCLExtensions.def"
127 
OpenCLOptions()128   OpenCLOptions() {
129 #define OPENCLEXT(nm)   nm = 0;
130 #include "clang/Basic/OpenCLExtensions.def"
131   }
132 };
133 
134 /// \brief Describes the kind of translation unit being processed.
135 enum TranslationUnitKind {
136   /// \brief The translation unit is a complete translation unit.
137   TU_Complete,
138   /// \brief The translation unit is a prefix to a translation unit, and is
139   /// not complete.
140   TU_Prefix,
141   /// \brief The translation unit is a module.
142   TU_Module
143 };
144 
145 }  // end namespace clang
146 
147 #endif
148