//===--- LangOptions.def - Language option database -------------*- C++ -*-===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// This file defines the language options. Users of this file must
// define the LANGOPT macro to make use of this information.
// Optionally, the user may also define BENIGN_LANGOPT
// (for options that don't affect the construction of the AST in an
// incompatible way), ENUM_LANGOPT (for options that have enumeration,
// rather than unsigned, type), BENIGN_ENUM_LANGOPT (for benign
// options that have enumeration type), and VALUE_LANGOPT is a language option
// that describes a value rather than a flag.
//
//===----------------------------------------------------------------------===//
#ifndef LANGOPT
#  error Define the LANGOPT macro to handle language options
#endif

#ifndef VALUE_LANGOPT
#  define VALUE_LANGOPT(Name, Bits, Default, Description) \
     LANGOPT(Name, Bits, Default, Description)
#endif

#ifndef BENIGN_LANGOPT
#  define BENIGN_LANGOPT(Name, Bits, Default, Description) \
     LANGOPT(Name, Bits, Default, Description)
#endif

#ifndef ENUM_LANGOPT
#  define ENUM_LANGOPT(Name, Type, Bits, Default, Description) \
     LANGOPT(Name, Bits, Default, Description)
#endif

#ifndef BENIGN_ENUM_LANGOPT
#  define BENIGN_ENUM_LANGOPT(Name, Type, Bits, Default, Description) \
     ENUM_LANGOPT(Name, Type, Bits, Default, Description)
#endif

LANGOPT(C99               , 1, 0, "C99")
LANGOPT(C11               , 1, 0, "C11")
LANGOPT(MSVCCompat        , 1, 0, "Microsoft Visual C++ full compatibility mode")
LANGOPT(MicrosoftExt      , 1, 0, "Microsoft C++ extensions")
LANGOPT(AsmBlocks         , 1, 0, "Microsoft inline asm blocks")
LANGOPT(Borland           , 1, 0, "Borland extensions")
LANGOPT(CPlusPlus         , 1, 0, "C++")
LANGOPT(CPlusPlus11       , 1, 0, "C++11")
LANGOPT(CPlusPlus1y       , 1, 0, "C++1y")
LANGOPT(CPlusPlus1z       , 1, 0, "C++1z")
LANGOPT(ObjC1             , 1, 0, "Objective-C 1")
LANGOPT(ObjC2             , 1, 0, "Objective-C 2")
BENIGN_LANGOPT(ObjCDefaultSynthProperties , 1, 0,
               "Objective-C auto-synthesized properties")
BENIGN_LANGOPT(EncodeExtendedBlockSig , 1, 0,
               "Encoding extended block type signature")
BENIGN_LANGOPT(ObjCInferRelatedResultType , 1, 1,
               "Objective-C related result type inference")
LANGOPT(Trigraphs         , 1, 0,"trigraphs")
LANGOPT(LineComment       , 1, 0, "'//' comments")
LANGOPT(Bool              , 1, 0, "bool, true, and false keywords")
LANGOPT(Half              , 1, 0, "half keyword")
LANGOPT(WChar             , 1, CPlusPlus, "wchar_t keyword")
BENIGN_LANGOPT(DollarIdents   , 1, 1, "'$' in identifiers")
BENIGN_LANGOPT(AsmPreprocessor, 1, 0, "preprocessor in asm mode")
BENIGN_LANGOPT(GNUMode        , 1, 1, "GNU extensions")
LANGOPT(GNUKeywords       , 1, 1, "GNU keywords")
BENIGN_LANGOPT(ImplicitInt, 1, !C99 && !CPlusPlus, "C89 implicit 'int'")
LANGOPT(Digraphs          , 1, 0, "digraphs")
BENIGN_LANGOPT(HexFloats  , 1, C99, "C99 hexadecimal float constants")
LANGOPT(CXXOperatorNames  , 1, 0, "C++ operator name keywords")
LANGOPT(AppleKext         , 1, 0, "Apple kext support")
BENIGN_LANGOPT(PascalStrings, 1, 0, "Pascal string support")
LANGOPT(WritableStrings   , 1, 0, "writable string support")
LANGOPT(ConstStrings      , 1, 0, "const-qualified string support")
LANGOPT(LaxVectorConversions , 1, 1, "lax vector conversions")
LANGOPT(AltiVec           , 1, 0, "AltiVec-style vector initializers")
LANGOPT(Exceptions        , 1, 0, "exception handling")
LANGOPT(ObjCExceptions    , 1, 0, "Objective-C exceptions")
LANGOPT(CXXExceptions     , 1, 0, "C++ exceptions")
LANGOPT(SjLjExceptions    , 1, 0, "setjmp-longjump exception handling")
LANGOPT(TraditionalCPP    , 1, 0, "traditional CPP emulation")
LANGOPT(RTTI              , 1, 1, "run-time type information")
LANGOPT(RTTIData          , 1, 1, "emit run-time type information data")
LANGOPT(MSBitfields       , 1, 0, "Microsoft-compatible structure layout")
LANGOPT(Freestanding, 1, 0, "freestanding implementation")
LANGOPT(NoBuiltin         , 1, 0, "disable builtin functions")
LANGOPT(NoMathBuiltin     , 1, 0, "disable math builtin functions")

BENIGN_LANGOPT(ThreadsafeStatics , 1, 1, "thread-safe static initializers")
LANGOPT(POSIXThreads      , 1, 0, "POSIX thread support")
LANGOPT(Blocks            , 1, 0, "blocks extension to C")
BENIGN_LANGOPT(EmitAllDecls      , 1, 0, "support for emitting all declarations")
LANGOPT(MathErrno         , 1, 1, "errno support for math functions")
BENIGN_LANGOPT(HeinousExtensions , 1, 0, "Extensions that we really don't like and may be ripped out at any time")
LANGOPT(Modules           , 1, 0, "modules extension to C")
LANGOPT(ModulesDeclUse    , 1, 0, "require declaration of module uses")
LANGOPT(ModulesSearchAll  , 1, 1, "search even non-imported modules to find unresolved references")
LANGOPT(ModulesStrictDeclUse, 1, 0, "require declaration of module uses and all headers to be in modules")
LANGOPT(ModulesErrorRecovery, 1, 1, "automatically import modules as needed when performing error recovery")
LANGOPT(Optimize          , 1, 0, "__OPTIMIZE__ predefined macro")
LANGOPT(OptimizeSize      , 1, 0, "__OPTIMIZE_SIZE__ predefined macro")
LANGOPT(Static            , 1, 0, "__STATIC__ predefined macro (as opposed to __DYNAMIC__)")
VALUE_LANGOPT(PackStruct  , 32, 0,
              "default struct packing maximum alignment")
VALUE_LANGOPT(PICLevel    , 2, 0, "__PIC__ level")
VALUE_LANGOPT(PIELevel    , 2, 0, "__PIE__ level")
LANGOPT(GNUInline         , 1, 0, "GNU inline semantics")
LANGOPT(NoInlineDefine    , 1, 0, "__NO_INLINE__ predefined macro")
LANGOPT(Deprecated        , 1, 0, "__DEPRECATED predefined macro")
LANGOPT(FastMath          , 1, 0, "__FAST_MATH__ predefined macro")
LANGOPT(FiniteMathOnly    , 1, 0, "__FINITE_MATH_ONLY__ predefined macro")

BENIGN_LANGOPT(ObjCGCBitmapPrint , 1, 0, "printing of GC's bitmap layout for __weak/__strong ivars")

BENIGN_LANGOPT(AccessControl     , 1, 1, "C++ access control")
LANGOPT(CharIsSigned      , 1, 1, "signed char")
LANGOPT(ShortWChar        , 1, 0, "unsigned short wchar_t")
ENUM_LANGOPT(MSPointerToMemberRepresentationMethod, PragmaMSPointersToMembersKind, 2, PPTMK_BestCase, "member-pointer representation method")

LANGOPT(ShortEnums        , 1, 0, "short enum types")

LANGOPT(OpenCL            , 1, 0, "OpenCL")
LANGOPT(OpenCLVersion     , 32, 0, "OpenCL version")
LANGOPT(NativeHalfType    , 1, 0, "Native half type support")
LANGOPT(CUDA              , 1, 0, "CUDA")
LANGOPT(OpenMP            , 1, 0, "OpenMP support")

LANGOPT(AssumeSaneOperatorNew , 1, 1, "implicit __attribute__((malloc)) for C++'s new operators")
LANGOPT(SizedDeallocation , 1, 0, "enable sized deallocation functions")
BENIGN_LANGOPT(ElideConstructors , 1, 1, "C++ copy constructor elision")
BENIGN_LANGOPT(DumpRecordLayouts , 1, 0, "dumping the layout of IRgen'd records")
BENIGN_LANGOPT(DumpRecordLayoutsSimple , 1, 0, "dumping the layout of IRgen'd records in a simple form")
BENIGN_LANGOPT(DumpVTableLayouts , 1, 0, "dumping the layouts of emitted vtables")
LANGOPT(NoConstantCFStrings , 1, 0, "no constant CoreFoundation strings")
BENIGN_LANGOPT(InlineVisibilityHidden , 1, 0, "hidden default visibility for inline C++ methods")
BENIGN_LANGOPT(ParseUnknownAnytype, 1, 0, "__unknown_anytype")
BENIGN_LANGOPT(DebuggerSupport , 1, 0, "debugger support")
BENIGN_LANGOPT(DebuggerCastResultToId, 1, 0, "for 'po' in the debugger, cast the result to id if it is of unknown type")
BENIGN_LANGOPT(DebuggerObjCLiteral , 1, 0, "debugger Objective-C literals and subscripting support")

BENIGN_LANGOPT(SpellChecking , 1, 1, "spell-checking")
LANGOPT(SinglePrecisionConstants , 1, 0, "treating double-precision floating point constants as single precision constants")
LANGOPT(FastRelaxedMath , 1, 0, "OpenCL fast relaxed math")
LANGOPT(DefaultFPContract , 1, 0, "FP_CONTRACT")
LANGOPT(NoBitFieldTypeAlign , 1, 0, "bit-field type alignment")
LANGOPT(HexagonQdsp6Compat , 1, 0, "hexagon-qdsp6 backward compatibility")
LANGOPT(ObjCAutoRefCount , 1, 0, "Objective-C automated reference counting")
LANGOPT(ObjCARCWeak         , 1, 0, "__weak support in the ARC runtime")
LANGOPT(ObjCSubscriptingLegacyRuntime         , 1, 0, "Subscripting support in legacy ObjectiveC runtime")
LANGOPT(FakeAddressSpaceMap , 1, 0, "OpenCL fake address space map")
ENUM_LANGOPT(AddressSpaceMapMangling , AddrSpaceMapMangling, 2, ASMM_Target, "OpenCL address space map mangling mode")

LANGOPT(MRTD , 1, 0, "-mrtd calling convention")
BENIGN_LANGOPT(DelayedTemplateParsing , 1, 0, "delayed template parsing")
LANGOPT(BlocksRuntimeOptional , 1, 0, "optional blocks runtime")

ENUM_LANGOPT(GC, GCMode, 2, NonGC, "Objective-C Garbage Collection mode")
ENUM_LANGOPT(ValueVisibilityMode, Visibility, 3, DefaultVisibility,
             "value symbol visibility")
ENUM_LANGOPT(TypeVisibilityMode, Visibility, 3, DefaultVisibility,
             "type symbol visibility")
ENUM_LANGOPT(StackProtector, StackProtectorMode, 2, SSPOff,
             "stack protector mode")
ENUM_LANGOPT(SignedOverflowBehavior, SignedOverflowBehaviorTy, 2, SOB_Undefined,
             "signed integer overflow handling")

BENIGN_LANGOPT(ArrowDepth, 32, 256,
               "maximum number of operator->s to follow")
BENIGN_LANGOPT(InstantiationDepth, 32, 256,
               "maximum template instantiation depth")
BENIGN_LANGOPT(ConstexprCallDepth, 32, 512,
               "maximum constexpr call depth")
BENIGN_LANGOPT(ConstexprStepLimit, 32, 1048576,
               "maximum constexpr evaluation steps")
BENIGN_LANGOPT(BracketDepth, 32, 256,
               "maximum bracket nesting depth")
BENIGN_LANGOPT(NumLargeByValueCopy, 32, 0,
        "if non-zero, warn about parameter or return Warn if parameter/return value is larger in bytes than this setting. 0 is no check.")
VALUE_LANGOPT(MSCompatibilityVersion, 32, 0, "Microsoft Visual C/C++ Version")
VALUE_LANGOPT(VtorDispMode, 2, 1, "How many vtordisps to insert")

LANGOPT(ApplePragmaPack, 1, 0, "Apple gcc-compatible #pragma pack handling")

LANGOPT(RetainCommentsFromSystemHeaders, 1, 0, "retain documentation comments from system headers in the AST")

#undef LANGOPT
#undef VALUE_LANGOPT
#undef BENIGN_LANGOPT
#undef ENUM_LANGOPT
#undef BENIGN_ENUM_LANGOPT

