diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -436,11 +436,13 @@ // Key paths that are constant during parsing of options with the same key path prefix. defvar cplusplus = LangOpts<"CPlusPlus">; defvar cpp11 = LangOpts<"CPlusPlus11">; +defvar cpp17 = LangOpts<"CPlusPlus17">; defvar cpp20 = LangOpts<"CPlusPlus20">; defvar c99 = LangOpts<"C99">; defvar c2x = LangOpts<"C2x">; defvar lang_std = LangOpts<"LangStd">; defvar open_cl = LangOpts<"OpenCL">; +defvar cuda = LangOpts<"CUDA">; defvar render_script = LangOpts<"RenderScript">; defvar hip = LangOpts<"HIP">; defvar gnu_mode = LangOpts<"GNUMode">; @@ -993,8 +995,10 @@ LangOpts<"ApplePragmaPack">, DefaultFalse, PosFlag, NegFlag>; -def fxl_pragma_pack : Flag<["-"], "fxl-pragma-pack">, Group, Flags<[CC1Option]>, - HelpText<"Enable IBM XL #pragma pack handling">; +defm xl_pragma_pack : BoolFOption<"xl-pragma-pack", + LangOpts<"XLPragmaPack">, DefaultFalse, + PosFlag, + NegFlag>; def shared_libsan : Flag<["-"], "shared-libsan">, HelpText<"Dynamically link the sanitizer runtime">; def static_libsan : Flag<["-"], "static-libsan">, @@ -1271,8 +1275,6 @@ Group, Flags<[CC1Option]>, HelpText<"Print a template comparison tree for differing templates">, MarshallingInfoFlag>; -def fdeclspec : Flag<["-"], "fdeclspec">, Group, - HelpText<"Allow __declspec as a keyword">, Flags<[CC1Option]>; def fdiscard_value_names : Flag<["-"], "fdiscard-value-names">, Group, HelpText<"Discard value names in LLVM IR">, Flags<[NoXarchOption]>; def fno_discard_value_names : Flag<["-"], "fno-discard-value-names">, Group, @@ -1344,14 +1346,21 @@ def ffp_model_EQ : Joined<["-"], "ffp-model=">, Group, Flags<[NoXarchOption]>, HelpText<"Controls the semantics of floating-point calculations.">; def ffp_exception_behavior_EQ : Joined<["-"], "ffp-exception-behavior=">, Group, Flags<[CC1Option]>, - HelpText<"Specifies the exception behavior of floating-point operations.">; + HelpText<"Specifies the exception behavior of floating-point operations.">, + Values<"ignore,maytrap,strict">, NormalizedValuesScope<"LangOptions">, + NormalizedValues<["FPE_Ignore", "FPE_MayTrap", "FPE_Strict"]>, + MarshallingInfoString, "FPE_Ignore">, AutoNormalizeEnum; defm fast_math : OptInFFlag<"fast-math", "Allow aggressive, lossy floating-point optimizations", "", "", [], LangOpts<"FastMath">, [cl_fast_relaxed_math.KeyPath]>; def menable_unsafe_fp_math : Flag<["-"], "menable-unsafe-fp-math">, Flags<[CC1Option]>, HelpText<"Allow unsafe floating-point math optimizations which may decrease precision">, MarshallingInfoFlag>, ImpliedByAnyOf<[cl_unsafe_math_optimizations.KeyPath, ffast_math.KeyPath]>; -defm math_errno : OptInFFlag<"math-errno", "Require math functions to indicate errors by setting errno">; +defm math_errno : BoolFOption<"math-errno", + LangOpts<"MathErrno">, DefaultFalse, + PosFlag, + NegFlag>, + ShouldParseIf; def fbracket_depth_EQ : Joined<["-"], "fbracket-depth=">, Group, Flags<[CoreOption]>; def fsignaling_math : Flag<["-"], "fsignaling-math">, Group; def fno_signaling_math : Flag<["-"], "fno-signaling-math">, Group; @@ -1850,6 +1859,19 @@ "PPTMK_FullGeneralityVirtualInheritance"]>, MarshallingInfoString, "PPTMK_BestCase">, AutoNormalizeEnum; +// __declspec is enabled by default for the PS4 by the driver, and also +// enabled for Microsoft Extensions or Borland Extensions, here. +// +// FIXME: __declspec is also currently enabled for CUDA, but isn't really a +// CUDA extension. However, it is required for supporting +// __clang_cuda_builtin_vars.h, which uses __declspec(property). Once that has +// been rewritten in terms of something more generic, remove the Opts.CUDA +// term here. +defm declspec : BoolOption<"f", "declspec", + LangOpts<"DeclSpecKeyword">, DefaultFalse, + PosFlag, + NegFlag, + BothFlags<[CC1Option], " __declspec as a keyword">>, Group; def fmodules_cache_path : Joined<["-"], "fmodules-cache-path=">, Group, Flags<[NoXarchOption, CC1Option]>, MetaVarName<"">, HelpText<"Specify the module cache path">; @@ -1976,7 +1998,6 @@ def fmudflap : Flag<["-"], "fmudflap">, Group; def fnested_functions : Flag<["-"], "fnested-functions">, Group; def fnext_runtime : Flag<["-"], "fnext-runtime">, Group; -def fno_xl_pragma_pack : Flag<["-"], "fno-xl-pragma-pack">, Group; def fno_asm : Flag<["-"], "fno-asm">, Group; def fno_asynchronous_unwind_tables : Flag<["-"], "fno-asynchronous-unwind-tables">, Group; def fno_assume_sane_operator_new : Flag<["-"], "fno-assume-sane-operator-new">, Group, @@ -1997,8 +2018,6 @@ PosFlag', '<%', '%>', '%:', '%:%:' (default)">, NegFlag', '<%', '%>', '%:', '%:%:'">, BothFlags<[CC1Option]>>; -def fno_declspec : Flag<["-"], "fno-declspec">, Group, - HelpText<"Disallow __declspec as a keyword">, Flags<[CC1Option]>; def fno_eliminate_unused_debug_symbols : Flag<["-"], "fno-eliminate-unused-debug-symbols">, Group; def fno_inline_functions : Flag<["-"], "fno-inline-functions">, Group, Flags<[CC1Option]>; def fno_inline : Flag<["-"], "fno-inline">, Group, Flags<[CC1Option]>; @@ -2084,10 +2103,10 @@ LangOpts<"SizedDeallocation">, DefaultFalse, PosFlag, NegFlag>; -def faligned_allocation : Flag<["-"], "faligned-allocation">, Flags<[CC1Option]>, - HelpText<"Enable C++17 aligned allocation functions">, Group; -def fno_aligned_allocation: Flag<["-"], "fno-aligned-allocation">, - Group, Flags<[CC1Option]>; +defm aligned_allocation : BoolFOption<"aligned-allocation", + LangOpts<"AlignedAllocation">, Default, + PosFlag, + NegFlag, BothFlags<[CC1Option]>>; def fnew_alignment_EQ : Joined<["-"], "fnew-alignment=">, HelpText<"Specifies the largest alignment guaranteed by '::operator new(size_t)'">, MetaVarName<"">, Group, Flags<[CC1Option]>, @@ -2243,10 +2262,10 @@ PosFlag, NegFlag>; -def fchar8__t : Flag<["-"], "fchar8_t">, Group, Flags<[CC1Option]>, - HelpText<"Enable C++ builtin type char8_t">; -def fno_char8__t : Flag<["-"], "fno-char8_t">, Group, Flags<[CC1Option]>, - HelpText<"Disable C++ builtin type char8_t">; +defm char8__t : BoolFOption<"char8_t", + LangOpts<"Char8">, Default, + PosFlag, NegFlag, + BothFlags<[CC1Option], " C++ builtin type char8_t">>; def fshort_wchar : Flag<["-"], "fshort-wchar">, Group, HelpText<"Force wchar_t to be a short unsigned int">; def fno_short_wchar : Flag<["-"], "fno-short-wchar">, Group, @@ -2269,7 +2288,10 @@ NegFlag, PosFlag>; def fspell_checking_limit_EQ : Joined<["-"], "fspell-checking-limit=">, Group; def fsigned_bitfields : Flag<["-"], "fsigned-bitfields">, Group; -defm signed_char : OptOutFFlag<"signed-char", "char is signed", "char is unsigned">; +defm signed_char : BoolFOption<"signed-char", + LangOpts<"CharIsSigned">, DefaultTrue, + NegFlag, PosFlag>, + ShouldParseIf; def fsplit_stack : Flag<["-"], "fsplit-stack">, Group; def fstack_protector_all : Flag<["-"], "fstack-protector-all">, Group, HelpText<"Enable stack protectors for all functions">; @@ -2874,7 +2896,9 @@ HelpText<"Disable stack probes which are enabled by default">, MarshallingInfoFlag>; def mthread_model : Separate<["-"], "mthread-model">, Group, Flags<[CC1Option]>, - HelpText<"The thread model to use, e.g. posix, single (posix by default)">, Values<"posix,single">; + HelpText<"The thread model to use, e.g. posix, single (posix by default)">, Values<"posix,single">, + NormalizedValues<["POSIX", "Single"]>, NormalizedValuesScope<"LangOptions::ThreadModelKind">, + MarshallingInfoString, "POSIX">, AutoNormalizeEnum; def meabi : Separate<["-"], "meabi">, Group, Flags<[CC1Option]>, HelpText<"Set EABI type, e.g. 4, 5 or gnu (default depends on triple)">, Values<"default,4,5,gnu">, MarshallingInfoString, "Default">, @@ -2995,7 +3019,9 @@ Group, Flags<[NoXarchOption,CC1Option]>, HelpText<"Specify the size in bits of an SVE vector register. Defaults to the" " vector length agnostic value of \"scalable\". (AArch64 only)">, - Values<"128,256,512,1024,2048,scalable">; + Values<"128,256,512,1024,2048,scalable">, + NormalizedValues<["128", "256", "512", "1024", "2048", "0"]>, + MarshallingInfoString, "0">, AutoNormalizeEnum; def msign_return_address_EQ : Joined<["-"], "msign-return-address=">, Flags<[CC1Option]>, Group, Values<"none,all,non-leaf">, @@ -3064,7 +3090,8 @@ def mno_spe : Flag<["-"], "mno-spe">, Group; def mefpu2 : Flag<["-"], "mefpu2">, Group; def mabi_EQ_vec_extabi : Flag<["-"], "mabi=vec-extabi">, Group, Flags<[CC1Option]>, - HelpText<"Enable the extended Altivec ABI on AIX (AIX only). Uses volatile and nonvolatile vector registers">; + HelpText<"Enable the extended Altivec ABI on AIX (AIX only). Uses volatile and nonvolatile vector registers">, + MarshallingInfoFlag>; def mabi_EQ_vec_default : Flag<["-"], "mabi=vec-default">, Group, Flags<[CC1Option]>, HelpText<"Enable the default Altivec ABI on AIX (AIX only). Uses only volatile vector registers.">; def mvsx : Flag<["-"], "mvsx">, Group; @@ -5007,11 +5034,13 @@ def stats_file : Joined<["-"], "stats-file=">, HelpText<"Filename to write statistics to">, MarshallingInfoString>; -def fdump_record_layouts : Flag<["-"], "fdump-record-layouts">, - HelpText<"Dump record layout information">; def fdump_record_layouts_simple : Flag<["-"], "fdump-record-layouts-simple">, HelpText<"Dump record layout information in a simple form used for testing">, MarshallingInfoFlag>; +def fdump_record_layouts : Flag<["-"], "fdump-record-layouts">, + HelpText<"Dump record layout information">, + MarshallingInfoFlag>, + ImpliedByAnyOf<[fdump_record_layouts_simple.KeyPath]>; def fix_what_you_can : Flag<["-"], "fix-what-you-can">, HelpText<"Apply fix-it advice even in the presence of unfixable errors">, MarshallingInfoFlag>; @@ -5045,7 +5074,9 @@ MarshallingInfoFlag>; def aligned_alloc_unavailable : Flag<["-"], "faligned-alloc-unavailable">, - HelpText<"Aligned allocation/deallocation functions are unavailable">; + HelpText<"Aligned allocation/deallocation functions are unavailable">, + MarshallingInfoFlag>, + ShouldParseIf; //===----------------------------------------------------------------------===// // Language Options @@ -5075,7 +5106,9 @@ HelpText<"Name of the split dwarf debug info file to encode in the object file">, MarshallingInfoString>; def fno_wchar : Flag<["-"], "fno-wchar">, - HelpText<"Disable C++ builtin type wchar_t">; + HelpText<"Disable C++ builtin type wchar_t">, + MarshallingInfoNegativeFlag, cplusplus.KeyPath>, + ShouldParseIf; def fconstant_string_class : Separate<["-"], "fconstant-string-class">, MetaVarName<"">, HelpText<"Specify the class to use for constant Objective-C string objects.">, @@ -5100,7 +5133,8 @@ HelpText<"default alignment for functions">, MarshallingInfoStringInt>; def pic_level : Separate<["-"], "pic-level">, - HelpText<"Value for __PIC__">; + HelpText<"Value for __PIC__">, + MarshallingInfoStringInt>; def pic_is_pie : Flag<["-"], "pic-is-pie">, HelpText<"File is for a position independent executable">, MarshallingInfoFlag>; @@ -5187,10 +5221,10 @@ def fdebugger_objc_literal : Flag<["-"], "fdebugger-objc-literal">, HelpText<"Enable special debugger support for Objective-C subscripting and literals">, MarshallingInfoFlag>; -def fdeprecated_macro : Flag<["-"], "fdeprecated-macro">, - HelpText<"Defines the __DEPRECATED macro">; -def fno_deprecated_macro : Flag<["-"], "fno-deprecated-macro">, - HelpText<"Undefines the __DEPRECATED macro">; +defm deprecated_macro : BoolOption<"f", "deprecated-macro", + LangOpts<"Deprecated">, DefaultFalse, + PosFlag, NegFlag, + BothFlags<[], " the __DEPRECATED macro">>; def fobjc_subscripting_legacy_runtime : Flag<["-"], "fobjc-subscripting-legacy-runtime">, HelpText<"Allow Objective-C array and dictionary subscripting in legacy runtime">; // TODO: Enforce values valid for MSVtorDispMode. diff --git a/clang/lib/Frontend/CompilerInvocation.cpp b/clang/lib/Frontend/CompilerInvocation.cpp --- a/clang/lib/Frontend/CompilerInvocation.cpp +++ b/clang/lib/Frontend/CompilerInvocation.cpp @@ -432,6 +432,9 @@ if (LangOpts.AppleKext && !LangOpts.CPlusPlus) Diags.Report(diag::warn_c_kext); + if (Args.hasArg(OPT_fconcepts_ts)) + Diags.Report(diag::warn_fe_concepts_ts_flag); + if (LangOpts.NewAlignOverride && !llvm::isPowerOf2_32(LangOpts.NewAlignOverride)) { Arg *A = Args.getLastArg(OPT_fnew_alignment_EQ); @@ -2076,11 +2079,6 @@ // OpenCL has half keyword Opts.Half = Opts.OpenCL; - - // C++ has wchar_t keyword. - Opts.WChar = Opts.CPlusPlus; - - Opts.AlignedAllocation = Opts.CPlusPlus17; } /// Check if input file kind and language standard are compatible. @@ -2356,47 +2354,16 @@ Opts.SYCLIsDevice || Args.hasArg(OPT_fconvergent_functions); - Opts.CharIsSigned = Opts.OpenCL || !Args.hasArg(OPT_fno_signed_char); - Opts.WChar = Opts.CPlusPlus && !Args.hasArg(OPT_fno_wchar); - Opts.Char8 = Args.hasFlag(OPT_fchar8__t, OPT_fno_char8__t, Opts.CPlusPlus20); Opts.NoBuiltin = Args.hasArg(OPT_fno_builtin) || Opts.Freestanding; if (!Opts.NoBuiltin) getAllNoBuiltinFuncValues(Args, Opts.NoBuiltinFuncs); - Opts.AlignedAllocation = - Args.hasFlag(OPT_faligned_allocation, OPT_fno_aligned_allocation, - Opts.AlignedAllocation); - Opts.AlignedAllocationUnavailable = - Opts.AlignedAllocation && Args.hasArg(OPT_aligned_alloc_unavailable); - if (Args.hasArg(OPT_fconcepts_ts)) - Diags.Report(diag::warn_fe_concepts_ts_flag); - Opts.MathErrno = !Opts.OpenCL && Args.hasArg(OPT_fmath_errno); Opts.LongDoubleSize = Args.hasArg(OPT_mlong_double_128) ? 128 : Args.hasArg(OPT_mlong_double_64) ? 64 : 0; - Opts.EnableAIXExtendedAltivecABI = Args.hasArg(OPT_mabi_EQ_vec_extabi); - Opts.PICLevel = getLastArgIntValue(Args, OPT_pic_level, 0, Diags); - Opts.DumpRecordLayouts = Opts.DumpRecordLayoutsSimple - || Args.hasArg(OPT_fdump_record_layouts); if (Opts.FastRelaxedMath) Opts.setDefaultFPContractMode(LangOptions::FPM_Fast); - Opts.XLPragmaPack = Args.hasArg(OPT_fxl_pragma_pack); llvm::sort(Opts.ModuleFeatures); - Opts.ArmSveVectorBits = - getLastArgIntValue(Args, options::OPT_msve_vector_bits_EQ, 0, Diags); - - // __declspec is enabled by default for the PS4 by the driver, and also - // enabled for Microsoft Extensions or Borland Extensions, here. - // - // FIXME: __declspec is also currently enabled for CUDA, but isn't really a - // CUDA extension. However, it is required for supporting - // __clang_cuda_builtin_vars.h, which uses __declspec(property). Once that has - // been rewritten in terms of something more generic, remove the Opts.CUDA - // term here. - Opts.DeclSpecKeyword = - Args.hasFlag(OPT_fdeclspec, OPT_fno_declspec, - (Opts.MicrosoftExt || Opts.Borland || Opts.CUDA)); - // -mrtd option if (Arg *A = Args.getLastArg(OPT_mrtd)) { if (Opts.getDefaultCallingConv() != LangOptions::DCC_None) @@ -2519,11 +2486,6 @@ Opts.OpenMPIsDevice && (T.isNVPTX() || T.isAMDGCN()) && Args.hasArg(options::OPT_fopenmp_cuda_force_full_runtime); - // Record whether the __DEPRECATED define was requested. - Opts.Deprecated = Args.hasFlag(OPT_fdeprecated_macro, - OPT_fno_deprecated_macro, - Opts.Deprecated); - // FIXME: Eliminate this dependency. unsigned Opt = getOptimizationLevel(Args, IK, Diags), OptSize = getOptimizationLevelSize(Args); @@ -2554,20 +2516,6 @@ Diags.Report(diag::err_drv_invalid_value) << A->getAsString(Args) << Val; } - LangOptions::FPExceptionModeKind FPEB = LangOptions::FPE_Ignore; - if (Arg *A = Args.getLastArg(OPT_ffp_exception_behavior_EQ)) { - StringRef Val = A->getValue(); - if (Val.equals("ignore")) - FPEB = LangOptions::FPE_Ignore; - else if (Val.equals("maytrap")) - FPEB = LangOptions::FPE_MayTrap; - else if (Val.equals("strict")) - FPEB = LangOptions::FPE_Strict; - else - Diags.Report(diag::err_drv_invalid_value) << A->getAsString(Args) << Val; - } - Opts.setFPExceptionMode(FPEB); - // Parse -fsanitize= arguments. parseSanitizerKinds("-fsanitize=", Args.getAllArgValues(OPT_fsanitize_EQ), Diags, Opts.Sanitize); @@ -2643,16 +2591,6 @@ } } } - - std::string ThreadModel = - std::string(Args.getLastArgValue(OPT_mthread_model, "posix")); - if (ThreadModel != "posix" && ThreadModel != "single") - Diags.Report(diag::err_drv_invalid_value) - << Args.getLastArg(OPT_mthread_model)->getAsString(Args) << ThreadModel; - Opts.setThreadModel( - llvm::StringSwitch(ThreadModel) - .Case("posix", LangOptions::ThreadModelKind::POSIX) - .Case("single", LangOptions::ThreadModelKind::Single)); } static bool isStrictlyPreprocessorAction(frontend::ActionKind Action) {