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