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
24namespace clang {
25
26struct 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.
36class LangOptionsBase {
37public:
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;
44protected:
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.
55class LangOptions : public LangOptionsBase {
56public:
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
77public:
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
103  bool isSignedOverflowDefined() const {
104    return getSignedOverflowBehavior() == SOB_Defined;
105  }
106
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
118class FPOptions {
119public:
120  unsigned fp_contract : 1;
121
122  FPOptions() : fp_contract(0) {}
123
124  FPOptions(const LangOptions &LangOpts) :
125    fp_contract(LangOpts.DefaultFPContract) {}
126};
127
128/// \brief OpenCL volatile options
129class OpenCLOptions {
130public:
131#define OPENCLEXT(nm)  unsigned nm : 1;
132#include "clang/Basic/OpenCLExtensions.def"
133
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.
141enum 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