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