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