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