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
25namespace clang {
26
27struct 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.
37class LangOptionsBase {
38public:
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;
45protected:
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.
56class LangOptions : public RefCountedBase<LangOptions>, public LangOptionsBase {
57public:
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
69public:
70  clang::ObjCRuntime ObjCRuntime;
71
72  std::string ObjCConstantStringClass;
73
74  /// \brief The name of the handler function to be called when -ftrapv is
75  /// specified.
76  ///
77  /// If none is specified, abort (GCC-compatible behaviour).
78  std::string OverflowHandler;
79
80  /// \brief The name of the current module.
81  std::string CurrentModule;
82
83  /// \brief Options for parsing comments.
84  CommentOptions CommentOpts;
85
86  LangOptions();
87
88  // Define accessors/mutators for language options of enumeration type.
89#define LANGOPT(Name, Bits, Default, Description)
90#define ENUM_LANGOPT(Name, Type, Bits, Default, Description) \
91  Type get##Name() const { return static_cast<Type>(Name); } \
92  void set##Name(Type Value) { Name = static_cast<unsigned>(Value); }
93#include "clang/Basic/LangOptions.def"
94
95  bool isSignedOverflowDefined() const {
96    return getSignedOverflowBehavior() == SOB_Defined;
97  }
98
99  /// \brief Reset all of the options that are not considered when building a
100  /// module.
101  void resetNonModularOptions();
102};
103
104/// \brief Floating point control options
105class FPOptions {
106public:
107  unsigned fp_contract : 1;
108
109  FPOptions() : fp_contract(0) {}
110
111  FPOptions(const LangOptions &LangOpts) :
112    fp_contract(LangOpts.DefaultFPContract) {}
113};
114
115/// \brief OpenCL volatile options
116class OpenCLOptions {
117public:
118#define OPENCLEXT(nm)  unsigned nm : 1;
119#include "clang/Basic/OpenCLExtensions.def"
120
121  OpenCLOptions() {
122#define OPENCLEXT(nm)   nm = 0;
123#include "clang/Basic/OpenCLExtensions.def"
124  }
125};
126
127/// \brief Describes the kind of translation unit being processed.
128enum TranslationUnitKind {
129  /// \brief The translation unit is a complete translation unit.
130  TU_Complete,
131  /// \brief The translation unit is a prefix to a translation unit, and is
132  /// not complete.
133  TU_Prefix,
134  /// \brief The translation unit is a module.
135  TU_Module
136};
137
138}  // end namespace clang
139
140#endif
141