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"
2230a2e16f6c27f888dd11eba6bbbae1e980078fcbChandler Carruth#include <string>
231b0969590e712d7d52fc9c0d43d3ab85c36d07a6Daniel Dunbar
245f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencernamespace clang {
255f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
264f45bc099f2665bc6e4bcbb169aa452390dbf3feWill Dietzstruct SanitizerOptions {
274f45bc099f2665bc6e4bcbb169aa452390dbf3feWill Dietz#define SANITIZER(NAME, ID) unsigned ID : 1;
284f45bc099f2665bc6e4bcbb169aa452390dbf3feWill Dietz#include "clang/Basic/Sanitizers.def"
294f45bc099f2665bc6e4bcbb169aa452390dbf3feWill Dietz
304f45bc099f2665bc6e4bcbb169aa452390dbf3feWill Dietz  /// \brief Cached set of sanitizer options with all sanitizers disabled.
314f45bc099f2665bc6e4bcbb169aa452390dbf3feWill Dietz  static const SanitizerOptions Disabled;
324f45bc099f2665bc6e4bcbb169aa452390dbf3feWill Dietz};
334f45bc099f2665bc6e4bcbb169aa452390dbf3feWill Dietz
341f73ae227b18073a5d1792b41094e61329179acfRichard Smith/// Bitfields of LangOptions, split out from LangOptions in order to ensure that
351f73ae227b18073a5d1792b41094e61329179acfRichard Smith/// this large collection of bitfields is a trivial class type.
361f73ae227b18073a5d1792b41094e61329179acfRichard Smithclass LangOptionsBase {
371f73ae227b18073a5d1792b41094e61329179acfRichard Smithpublic:
381f73ae227b18073a5d1792b41094e61329179acfRichard Smith  // Define simple language options (with no accessors).
391f73ae227b18073a5d1792b41094e61329179acfRichard Smith#define LANGOPT(Name, Bits, Default, Description) unsigned Name : Bits;
401f73ae227b18073a5d1792b41094e61329179acfRichard Smith#define ENUM_LANGOPT(Name, Type, Bits, Default, Description)
411f73ae227b18073a5d1792b41094e61329179acfRichard Smith#include "clang/Basic/LangOptions.def"
421f73ae227b18073a5d1792b41094e61329179acfRichard Smith
434f45bc099f2665bc6e4bcbb169aa452390dbf3feWill Dietz  SanitizerOptions Sanitize;
441f73ae227b18073a5d1792b41094e61329179acfRichard Smithprotected:
451f73ae227b18073a5d1792b41094e61329179acfRichard Smith  // Define language options of enumeration type. These are private, and will
461f73ae227b18073a5d1792b41094e61329179acfRichard Smith  // have accessors (below).
471f73ae227b18073a5d1792b41094e61329179acfRichard Smith#define LANGOPT(Name, Bits, Default, Description)
481f73ae227b18073a5d1792b41094e61329179acfRichard Smith#define ENUM_LANGOPT(Name, Type, Bits, Default, Description) \
491f73ae227b18073a5d1792b41094e61329179acfRichard Smith  unsigned Name : Bits;
501f73ae227b18073a5d1792b41094e61329179acfRichard Smith#include "clang/Basic/LangOptions.def"
511f73ae227b18073a5d1792b41094e61329179acfRichard Smith};
521f73ae227b18073a5d1792b41094e61329179acfRichard Smith
53af50aab0c317462129d73ae8000c6394c718598dJames Dennett/// \brief Keeps track of the various options that can be
54af50aab0c317462129d73ae8000c6394c718598dJames Dennett/// enabled, which controls the dialect of C or C++ that is accepted.
55ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesclass LangOptions : public LangOptionsBase {
56ea684e699ea84e61711e279f5fa7a1b9f3d46bc2Cedric Venetpublic:
577d5e81bf24dbfd334a7c62a7ae51043c79a69aa9Douglas Gregor  typedef clang::Visibility Visibility;
587d5e81bf24dbfd334a7c62a7ae51043c79a69aa9Douglas Gregor
5901d9dbf4ae627e2ba42fc23485789a33fa296516Ted Kremenek  enum GCMode { NonGC, GCOnly, HybridGC };
60651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  enum StackProtectorMode { SSPOff, SSPOn, SSPStrong, SSPReq };
61e289d81369914678db386f6aa86faf8f178e245dDouglas Gregor
62a4d71455f0d418e16cc0c5c5aa55a3bad3494aeeChris Lattner  enum SignedOverflowBehaviorTy {
63a4d71455f0d418e16cc0c5c5aa55a3bad3494aeeChris Lattner    SOB_Undefined,  // Default C standard behavior.
64a4d71455f0d418e16cc0c5c5aa55a3bad3494aeeChris Lattner    SOB_Defined,    // -fwrapv
65a4d71455f0d418e16cc0c5c5aa55a3bad3494aeeChris Lattner    SOB_Trapping    // -ftrapv
66a4d71455f0d418e16cc0c5c5aa55a3bad3494aeeChris Lattner  };
67e289d81369914678db386f6aa86faf8f178e245dDouglas Gregor
68651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  enum PragmaMSPointersToMembersKind {
69651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    PPTMK_BestCase,
70651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    PPTMK_FullGeneralitySingleInheritance,
71651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    PPTMK_FullGeneralityMultipleInheritance,
72651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    PPTMK_FullGeneralityVirtualInheritance
73651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  };
74651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
751eef85246b411b55c493098266746d0d83c241eaDavid Tweed  enum AddrSpaceMapMangling { ASMM_Target, ASMM_On, ASMM_Off };
761eef85246b411b55c493098266746d0d83c241eaDavid Tweed
77e289d81369914678db386f6aa86faf8f178e245dDouglas Gregorpublic:
78260611a32535c851237926bfcf78869b13c07d5bJohn McCall  clang::ObjCRuntime ObjCRuntime;
79260611a32535c851237926bfcf78869b13c07d5bJohn McCall
80e289d81369914678db386f6aa86faf8f178e245dDouglas Gregor  std::string ObjCConstantStringClass;
81e289d81369914678db386f6aa86faf8f178e245dDouglas Gregor
82af50aab0c317462129d73ae8000c6394c718598dJames Dennett  /// \brief The name of the handler function to be called when -ftrapv is
83af50aab0c317462129d73ae8000c6394c718598dJames Dennett  /// specified.
84af50aab0c317462129d73ae8000c6394c718598dJames Dennett  ///
857f18e67e1b577a50402e8b43508ab2311a5c45b5David Chisnall  /// If none is specified, abort (GCC-compatible behaviour).
867f18e67e1b577a50402e8b43508ab2311a5c45b5David Chisnall  std::string OverflowHandler;
871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
88b86b8dc7ef89405205f94635c1073cdb1a7093ebDouglas Gregor  /// \brief The name of the current module.
89b86b8dc7ef89405205f94635c1073cdb1a7093ebDouglas Gregor  std::string CurrentModule;
906ebf09130479bc7605aa09a3e6c4dc2ba3513495Dmitri Gribenko
916ebf09130479bc7605aa09a3e6c4dc2ba3513495Dmitri Gribenko  /// \brief Options for parsing comments.
926ebf09130479bc7605aa09a3e6c4dc2ba3513495Dmitri Gribenko  CommentOptions CommentOpts;
93b86b8dc7ef89405205f94635c1073cdb1a7093ebDouglas Gregor
94e289d81369914678db386f6aa86faf8f178e245dDouglas Gregor  LangOptions();
952cb4222338669a3e70b546ef264fbd5d3f96aef5Chris Lattner
96e289d81369914678db386f6aa86faf8f178e245dDouglas Gregor  // Define accessors/mutators for language options of enumeration type.
97e289d81369914678db386f6aa86faf8f178e245dDouglas Gregor#define LANGOPT(Name, Bits, Default, Description)
98e289d81369914678db386f6aa86faf8f178e245dDouglas Gregor#define ENUM_LANGOPT(Name, Type, Bits, Default, Description) \
99e289d81369914678db386f6aa86faf8f178e245dDouglas Gregor  Type get##Name() const { return static_cast<Type>(Name); } \
100e289d81369914678db386f6aa86faf8f178e245dDouglas Gregor  void set##Name(Type Value) { Name = static_cast<unsigned>(Value); }
101e289d81369914678db386f6aa86faf8f178e245dDouglas Gregor#include "clang/Basic/LangOptions.def"
102e289d81369914678db386f6aa86faf8f178e245dDouglas Gregor
1032cb4222338669a3e70b546ef264fbd5d3f96aef5Chris Lattner  bool isSignedOverflowDefined() const {
1042cb4222338669a3e70b546ef264fbd5d3f96aef5Chris Lattner    return getSignedOverflowBehavior() == SOB_Defined;
1052cb4222338669a3e70b546ef264fbd5d3f96aef5Chris Lattner  }
106d9553e35e1e3af6fc4ca817b169dc796a5b54bcdFariborz Jahanian
107d9553e35e1e3af6fc4ca817b169dc796a5b54bcdFariborz Jahanian  bool isSubscriptPointerArithmetic() const {
108d9553e35e1e3af6fc4ca817b169dc796a5b54bcdFariborz Jahanian    return ObjCRuntime.isSubscriptPointerArithmetic() &&
109d9553e35e1e3af6fc4ca817b169dc796a5b54bcdFariborz Jahanian           !ObjCSubscriptingLegacyRuntime;
110d9553e35e1e3af6fc4ca817b169dc796a5b54bcdFariborz Jahanian  }
1111c7e0472f5683a8ade62285f366637050cf113e5Douglas Gregor
1121c7e0472f5683a8ade62285f366637050cf113e5Douglas Gregor  /// \brief Reset all of the options that are not considered when building a
1131c7e0472f5683a8ade62285f366637050cf113e5Douglas Gregor  /// module.
1141c7e0472f5683a8ade62285f366637050cf113e5Douglas Gregor  void resetNonModularOptions();
1155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer};
1165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
117af50aab0c317462129d73ae8000c6394c718598dJames Dennett/// \brief Floating point control options
118321b8179afaf803dcc56b2a19f7b0891a03c92c8Peter Collingbourneclass FPOptions {
119321b8179afaf803dcc56b2a19f7b0891a03c92c8Peter Collingbournepublic:
120321b8179afaf803dcc56b2a19f7b0891a03c92c8Peter Collingbourne  unsigned fp_contract : 1;
121321b8179afaf803dcc56b2a19f7b0891a03c92c8Peter Collingbourne
122321b8179afaf803dcc56b2a19f7b0891a03c92c8Peter Collingbourne  FPOptions() : fp_contract(0) {}
123321b8179afaf803dcc56b2a19f7b0891a03c92c8Peter Collingbourne
124321b8179afaf803dcc56b2a19f7b0891a03c92c8Peter Collingbourne  FPOptions(const LangOptions &LangOpts) :
125321b8179afaf803dcc56b2a19f7b0891a03c92c8Peter Collingbourne    fp_contract(LangOpts.DefaultFPContract) {}
126321b8179afaf803dcc56b2a19f7b0891a03c92c8Peter Collingbourne};
127321b8179afaf803dcc56b2a19f7b0891a03c92c8Peter Collingbourne
128af50aab0c317462129d73ae8000c6394c718598dJames Dennett/// \brief OpenCL volatile options
129f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourneclass OpenCLOptions {
130f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbournepublic:
131f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne#define OPENCLEXT(nm)  unsigned nm : 1;
132f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne#include "clang/Basic/OpenCLExtensions.def"
133f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne
134f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne  OpenCLOptions() {
135f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne#define OPENCLEXT(nm)   nm = 0;
136f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne#include "clang/Basic/OpenCLExtensions.def"
137f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne  }
138f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne};
139f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne
140467dc88512b4ba4bb16e274ea3771dc1415d31daDouglas Gregor/// \brief Describes the kind of translation unit being processed.
141467dc88512b4ba4bb16e274ea3771dc1415d31daDouglas Gregorenum TranslationUnitKind {
142467dc88512b4ba4bb16e274ea3771dc1415d31daDouglas Gregor  /// \brief The translation unit is a complete translation unit.
143467dc88512b4ba4bb16e274ea3771dc1415d31daDouglas Gregor  TU_Complete,
144467dc88512b4ba4bb16e274ea3771dc1415d31daDouglas Gregor  /// \brief The translation unit is a prefix to a translation unit, and is
145467dc88512b4ba4bb16e274ea3771dc1415d31daDouglas Gregor  /// not complete.
146467dc88512b4ba4bb16e274ea3771dc1415d31daDouglas Gregor  TU_Prefix,
147467dc88512b4ba4bb16e274ea3771dc1415d31daDouglas Gregor  /// \brief The translation unit is a module.
148467dc88512b4ba4bb16e274ea3771dc1415d31daDouglas Gregor  TU_Module
149467dc88512b4ba4bb16e274ea3771dc1415d31daDouglas Gregor};
150467dc88512b4ba4bb16e274ea3771dc1415d31daDouglas Gregor
1515f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}  // end namespace clang
1525f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1535f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#endif
154