15f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===--- LangOptions.h - C Language Family Language Options -----*- C++ -*-===//
25f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//
35f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//                     The LLVM Compiler Infrastructure
45f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//
50bc735ffcfb223c0186419547abaa5c84482663eChris Lattner// This file is distributed under the University of Illinois Open Source
60bc735ffcfb223c0186419547abaa5c84482663eChris Lattner// License. See LICENSE.TXT for details.
75f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//
85f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===//
92f7f5b1f5ff023cb8c4008ae53a12b09e3ea2622James Dennett///
102f7f5b1f5ff023cb8c4008ae53a12b09e3ea2622James Dennett/// \file
112f7f5b1f5ff023cb8c4008ae53a12b09e3ea2622James Dennett/// \brief Defines the clang::LangOptions interface.
122f7f5b1f5ff023cb8c4008ae53a12b09e3ea2622James Dennett///
135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===//
145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#ifndef LLVM_CLANG_LANGOPTIONS_H
165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#define LLVM_CLANG_LANGOPTIONS_H
175f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
186ebf09130479bc7605aa09a3e6c4dc2ba3513495Dmitri Gribenko#include "clang/Basic/CommentOptions.h"
19c93dc7889644293e318e19d82830ea2acc45b678Dylan Noblesmith#include "clang/Basic/LLVM.h"
20260611a32535c851237926bfcf78869b13c07d5bJohn McCall#include "clang/Basic/ObjCRuntime.h"
211fb0caaa7bef765b85972274e3b434af2572c141John McCall#include "clang/Basic/Visibility.h"
22d3b74d9ca4f239a7a90ad193378c494306c57352Ted Kremenek#include "llvm/ADT/IntrusiveRefCntPtr.h"
2330a2e16f6c27f888dd11eba6bbbae1e980078fcbChandler Carruth#include <string>
241b0969590e712d7d52fc9c0d43d3ab85c36d07a6Daniel Dunbar
255f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencernamespace clang {
265f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
274f45bc099f2665bc6e4bcbb169aa452390dbf3feWill Dietzstruct SanitizerOptions {
284f45bc099f2665bc6e4bcbb169aa452390dbf3feWill Dietz#define SANITIZER(NAME, ID) unsigned ID : 1;
294f45bc099f2665bc6e4bcbb169aa452390dbf3feWill Dietz#include "clang/Basic/Sanitizers.def"
304f45bc099f2665bc6e4bcbb169aa452390dbf3feWill Dietz
314f45bc099f2665bc6e4bcbb169aa452390dbf3feWill Dietz  /// \brief Cached set of sanitizer options with all sanitizers disabled.
324f45bc099f2665bc6e4bcbb169aa452390dbf3feWill Dietz  static const SanitizerOptions Disabled;
334f45bc099f2665bc6e4bcbb169aa452390dbf3feWill Dietz};
344f45bc099f2665bc6e4bcbb169aa452390dbf3feWill Dietz
351f73ae227b18073a5d1792b41094e61329179acfRichard Smith/// Bitfields of LangOptions, split out from LangOptions in order to ensure that
361f73ae227b18073a5d1792b41094e61329179acfRichard Smith/// this large collection of bitfields is a trivial class type.
371f73ae227b18073a5d1792b41094e61329179acfRichard Smithclass LangOptionsBase {
381f73ae227b18073a5d1792b41094e61329179acfRichard Smithpublic:
391f73ae227b18073a5d1792b41094e61329179acfRichard Smith  // Define simple language options (with no accessors).
401f73ae227b18073a5d1792b41094e61329179acfRichard Smith#define LANGOPT(Name, Bits, Default, Description) unsigned Name : Bits;
411f73ae227b18073a5d1792b41094e61329179acfRichard Smith#define ENUM_LANGOPT(Name, Type, Bits, Default, Description)
421f73ae227b18073a5d1792b41094e61329179acfRichard Smith#include "clang/Basic/LangOptions.def"
431f73ae227b18073a5d1792b41094e61329179acfRichard Smith
444f45bc099f2665bc6e4bcbb169aa452390dbf3feWill Dietz  SanitizerOptions Sanitize;
451f73ae227b18073a5d1792b41094e61329179acfRichard Smithprotected:
461f73ae227b18073a5d1792b41094e61329179acfRichard Smith  // Define language options of enumeration type. These are private, and will
471f73ae227b18073a5d1792b41094e61329179acfRichard Smith  // have accessors (below).
481f73ae227b18073a5d1792b41094e61329179acfRichard Smith#define LANGOPT(Name, Bits, Default, Description)
491f73ae227b18073a5d1792b41094e61329179acfRichard Smith#define ENUM_LANGOPT(Name, Type, Bits, Default, Description) \
501f73ae227b18073a5d1792b41094e61329179acfRichard Smith  unsigned Name : Bits;
511f73ae227b18073a5d1792b41094e61329179acfRichard Smith#include "clang/Basic/LangOptions.def"
521f73ae227b18073a5d1792b41094e61329179acfRichard Smith};
531f73ae227b18073a5d1792b41094e61329179acfRichard Smith
54af50aab0c317462129d73ae8000c6394c718598dJames Dennett/// \brief Keeps track of the various options that can be
55af50aab0c317462129d73ae8000c6394c718598dJames Dennett/// enabled, which controls the dialect of C or C++ that is accepted.
561f73ae227b18073a5d1792b41094e61329179acfRichard Smithclass LangOptions : public RefCountedBase<LangOptions>, public LangOptionsBase {
57ea684e699ea84e61711e279f5fa7a1b9f3d46bc2Cedric Venetpublic:
587d5e81bf24dbfd334a7c62a7ae51043c79a69aa9Douglas Gregor  typedef clang::Visibility Visibility;
597d5e81bf24dbfd334a7c62a7ae51043c79a69aa9Douglas Gregor
6001d9dbf4ae627e2ba42fc23485789a33fa296516Ted Kremenek  enum GCMode { NonGC, GCOnly, HybridGC };
614ebe3e4c811a376c423a544f5e76ee2e96533324Bill Wendling  enum StackProtectorMode { SSPOff, SSPOn, SSPReq };
62e289d81369914678db386f6aa86faf8f178e245dDouglas Gregor
63a4d71455f0d418e16cc0c5c5aa55a3bad3494aeeChris Lattner  enum SignedOverflowBehaviorTy {
64a4d71455f0d418e16cc0c5c5aa55a3bad3494aeeChris Lattner    SOB_Undefined,  // Default C standard behavior.
65a4d71455f0d418e16cc0c5c5aa55a3bad3494aeeChris Lattner    SOB_Defined,    // -fwrapv
66a4d71455f0d418e16cc0c5c5aa55a3bad3494aeeChris Lattner    SOB_Trapping    // -ftrapv
67a4d71455f0d418e16cc0c5c5aa55a3bad3494aeeChris Lattner  };
68e289d81369914678db386f6aa86faf8f178e245dDouglas Gregor
69e289d81369914678db386f6aa86faf8f178e245dDouglas Gregorpublic:
70260611a32535c851237926bfcf78869b13c07d5bJohn McCall  clang::ObjCRuntime ObjCRuntime;
71260611a32535c851237926bfcf78869b13c07d5bJohn McCall
72e289d81369914678db386f6aa86faf8f178e245dDouglas Gregor  std::string ObjCConstantStringClass;
73e289d81369914678db386f6aa86faf8f178e245dDouglas Gregor
74af50aab0c317462129d73ae8000c6394c718598dJames Dennett  /// \brief The name of the handler function to be called when -ftrapv is
75af50aab0c317462129d73ae8000c6394c718598dJames Dennett  /// specified.
76af50aab0c317462129d73ae8000c6394c718598dJames Dennett  ///
777f18e67e1b577a50402e8b43508ab2311a5c45b5David Chisnall  /// If none is specified, abort (GCC-compatible behaviour).
787f18e67e1b577a50402e8b43508ab2311a5c45b5David Chisnall  std::string OverflowHandler;
791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
80b86b8dc7ef89405205f94635c1073cdb1a7093ebDouglas Gregor  /// \brief The name of the current module.
81b86b8dc7ef89405205f94635c1073cdb1a7093ebDouglas Gregor  std::string CurrentModule;
826ebf09130479bc7605aa09a3e6c4dc2ba3513495Dmitri Gribenko
836ebf09130479bc7605aa09a3e6c4dc2ba3513495Dmitri Gribenko  /// \brief Options for parsing comments.
846ebf09130479bc7605aa09a3e6c4dc2ba3513495Dmitri Gribenko  CommentOptions CommentOpts;
85b86b8dc7ef89405205f94635c1073cdb1a7093ebDouglas Gregor
86e289d81369914678db386f6aa86faf8f178e245dDouglas Gregor  LangOptions();
872cb4222338669a3e70b546ef264fbd5d3f96aef5Chris Lattner
88e289d81369914678db386f6aa86faf8f178e245dDouglas Gregor  // Define accessors/mutators for language options of enumeration type.
89e289d81369914678db386f6aa86faf8f178e245dDouglas Gregor#define LANGOPT(Name, Bits, Default, Description)
90e289d81369914678db386f6aa86faf8f178e245dDouglas Gregor#define ENUM_LANGOPT(Name, Type, Bits, Default, Description) \
91e289d81369914678db386f6aa86faf8f178e245dDouglas Gregor  Type get##Name() const { return static_cast<Type>(Name); } \
92e289d81369914678db386f6aa86faf8f178e245dDouglas Gregor  void set##Name(Type Value) { Name = static_cast<unsigned>(Value); }
93e289d81369914678db386f6aa86faf8f178e245dDouglas Gregor#include "clang/Basic/LangOptions.def"
94e289d81369914678db386f6aa86faf8f178e245dDouglas Gregor
952cb4222338669a3e70b546ef264fbd5d3f96aef5Chris Lattner  bool isSignedOverflowDefined() const {
962cb4222338669a3e70b546ef264fbd5d3f96aef5Chris Lattner    return getSignedOverflowBehavior() == SOB_Defined;
972cb4222338669a3e70b546ef264fbd5d3f96aef5Chris Lattner  }
981c7e0472f5683a8ade62285f366637050cf113e5Douglas Gregor
991c7e0472f5683a8ade62285f366637050cf113e5Douglas Gregor  /// \brief Reset all of the options that are not considered when building a
1001c7e0472f5683a8ade62285f366637050cf113e5Douglas Gregor  /// module.
1011c7e0472f5683a8ade62285f366637050cf113e5Douglas Gregor  void resetNonModularOptions();
1025f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer};
1035f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
104af50aab0c317462129d73ae8000c6394c718598dJames Dennett/// \brief Floating point control options
105321b8179afaf803dcc56b2a19f7b0891a03c92c8Peter Collingbourneclass FPOptions {
106321b8179afaf803dcc56b2a19f7b0891a03c92c8Peter Collingbournepublic:
107321b8179afaf803dcc56b2a19f7b0891a03c92c8Peter Collingbourne  unsigned fp_contract : 1;
108321b8179afaf803dcc56b2a19f7b0891a03c92c8Peter Collingbourne
109321b8179afaf803dcc56b2a19f7b0891a03c92c8Peter Collingbourne  FPOptions() : fp_contract(0) {}
110321b8179afaf803dcc56b2a19f7b0891a03c92c8Peter Collingbourne
111321b8179afaf803dcc56b2a19f7b0891a03c92c8Peter Collingbourne  FPOptions(const LangOptions &LangOpts) :
112321b8179afaf803dcc56b2a19f7b0891a03c92c8Peter Collingbourne    fp_contract(LangOpts.DefaultFPContract) {}
113321b8179afaf803dcc56b2a19f7b0891a03c92c8Peter Collingbourne};
114321b8179afaf803dcc56b2a19f7b0891a03c92c8Peter Collingbourne
115af50aab0c317462129d73ae8000c6394c718598dJames Dennett/// \brief OpenCL volatile options
116f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourneclass OpenCLOptions {
117f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbournepublic:
118f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne#define OPENCLEXT(nm)  unsigned nm : 1;
119f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne#include "clang/Basic/OpenCLExtensions.def"
120f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne
121f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne  OpenCLOptions() {
122f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne#define OPENCLEXT(nm)   nm = 0;
123f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne#include "clang/Basic/OpenCLExtensions.def"
124f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne  }
125f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne};
126f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne
127467dc88512b4ba4bb16e274ea3771dc1415d31daDouglas Gregor/// \brief Describes the kind of translation unit being processed.
128467dc88512b4ba4bb16e274ea3771dc1415d31daDouglas Gregorenum TranslationUnitKind {
129467dc88512b4ba4bb16e274ea3771dc1415d31daDouglas Gregor  /// \brief The translation unit is a complete translation unit.
130467dc88512b4ba4bb16e274ea3771dc1415d31daDouglas Gregor  TU_Complete,
131467dc88512b4ba4bb16e274ea3771dc1415d31daDouglas Gregor  /// \brief The translation unit is a prefix to a translation unit, and is
132467dc88512b4ba4bb16e274ea3771dc1415d31daDouglas Gregor  /// not complete.
133467dc88512b4ba4bb16e274ea3771dc1415d31daDouglas Gregor  TU_Prefix,
134467dc88512b4ba4bb16e274ea3771dc1415d31daDouglas Gregor  /// \brief The translation unit is a module.
135467dc88512b4ba4bb16e274ea3771dc1415d31daDouglas Gregor  TU_Module
136467dc88512b4ba4bb16e274ea3771dc1415d31daDouglas Gregor};
137467dc88512b4ba4bb16e274ea3771dc1415d31daDouglas Gregor
1385f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}  // end namespace clang
1395f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1405f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#endif
141