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 @@ -259,11 +259,12 @@ } // A boolean option which is opt-out in CC1. The negative option exists in CC1 and -// !Args.has(OPT_fno_foo) is used to check that the flag is disabled. +// Args.has(OPT_ffoo) or !Arg.has(OPT_fno_foo) is used to check that the flag is disabled. // // This is useful if the option has positive semantics (e.g. 'Autolink') that is by // default enabled (Autolink == 1), can be reaffirmed by -fautolink (Autolink == 1) // and disabled by -fno-autolink (Autolink == 0). +// todo: add ImpliedByAnyOf if necessary multiclass OptOutPositiveFFlag flags=[], code keypath=""> { def f#NAME : Flag<["-"], "f"#name>, Flags, @@ -271,8 +272,6 @@ def fno_#NAME : Flag<["-"], "fno-"#name>, Flags, Group, HelpText, MarshallingInfoFlag, IsNegative; - // todo: consider adding the line below when needed - // ImpliedByAnyOf; } // A boolean option which is opt-out in CC1. The negative option exists in CC1 and @@ -1915,12 +1914,8 @@ def fsplit_stack : Flag<["-"], "fsplit-stack">, Group; def fstack_protector_all : Flag<["-"], "fstack-protector-all">, Group, HelpText<"Enable stack protectors for all functions">; -// todo: join the following two into OptInFFlag -def fstack_clash_protection : Flag<["-"], "fstack-clash-protection">, Group, Flags<[CC1Option]>, - HelpText<"Enable stack clash protection">, - MarshallingInfoFlag<"CodeGenOpts.StackClashProtector">; -def fno_stack_clash_protection : Flag<["-"], "fno-stack-clash-protection">, Group, - HelpText<"Disable stack clash protection">; +defm stack_clash_protection : OptInFFlag<"stack-clash-protection", "Enable", "Disable", " stack clash protection", + [], "CodeGenOpts.StackClashProtector">; def fstack_protector_strong : Flag<["-"], "fstack-protector-strong">, Group, HelpText<"Enable stack protectors for some functions vulnerable to stack smashing. " "Compared to -fstack-protector, this uses a stronger heuristic " @@ -1961,7 +1956,6 @@ HelpText<"Enable optimizations based on the strict definition of an enum's " "value range">, MarshallingInfoFlag<"CodeGenOpts.StrictEnums">; -// fixme: finish the two below defm strict_vtable_pointers : OptInFFlag<"strict-vtable-pointers", "Enable optimizations based on the strict rules for overwriting polymorphic C++ objects", "", "", [], "CodeGenOpts.StrictVTablePointers">; @@ -1992,10 +1986,7 @@ HelpText<"Only include passes which match a specified regular expression in the generated optimization record (by default, include all passes)">, MetaVarName<"">; -// todo: merge this and point it to `CodeGenOpts.EmitGcovNotes` -def ftest_coverage : Flag<["-"], "ftest-coverage">, Flags<[CC1Option]>, Group, - MarshallingInfoFlag<"CodeGenOpts.EmitGcovNotes">; -def fno_test_coverage : Flag<["-"], "fno-test-coverage">, Group; +defm test_coverage : OptInFFlag<"test-coverage", "", "", "", [], "CodeGenOpts.EmitGcovNotes">; def fvectorize : Flag<["-"], "fvectorize">, Group, HelpText<"Enable the loop vectorization passes">; def fno_vectorize : Flag<["-"], "fno-vectorize">, Group; @@ -2061,11 +2052,8 @@ def funwind_tables : Flag<["-"], "funwind-tables">, Group; defm register_global_dtors_with_atexit : OptInFFlag<"register-global-dtors-with-atexit", "Use", "Don't use", " atexit or __cxa_atexit to register global destructors", [], "CodeGenOpts.RegisterGlobalDtorsWithAtExit">; -// todo: figure out why this needs to be split up -def fuse_init_array : Flag<["-"], "fuse-init-array">, Group; -def fno_use_init_array : Flag<["-"], "fno-use-init-array">, Group, Flags<[CC1Option]>, - HelpText<"Use .ctors/.dtors instead of .init_array/.fini_array">, - MarshallingInfoFlag<"CodeGenOpts.UseInitArray", "true">, IsNegative; +defm use_init_array : OptOutPositiveFFlag<"use-init-array", "", "Use .ctors/.dtors instead of .init_array/.fini_array", "", + [], "CodeGenOpts.UseInitArray">; def fno_var_tracking : Flag<["-"], "fno-var-tracking">, Group; def fverbose_asm : Flag<["-"], "fverbose-asm">, Group, HelpText<"Generate verbose assembly output">; @@ -2131,21 +2119,17 @@ defm unique_internal_linkage_names : OptInFFlag<"unique-internal-linkage-names", "Uniqueify Internal Linkage Symbol Names by appending the MD5 hash of the module path", "", "", [], "CodeGenOpts.UniqueInternalLinkageNames">; -// todo: join into single OptInFFlag -def funique_section_names : Flag<["-"], "funique-section-names">, Group; -def fno_unique_section_names : Flag<["-"], "fno-unique-section-names">, Group, Flags<[CC1Option]>, - HelpText<"Don't use unique names for text and data sections">, - MarshallingInfoFlag<"CodeGenOpts.UniqueSectionNames", "true">, IsNegative; +defm unique_section_names : OptOutPositiveFFlag<"unique-section-names", + "", "Don't use unique names for text and data sections", "", + [], "CodeGenOpts.UniqueSectionNames">; defm split_machine_functions: OptInFFlag<"split-machine-functions", "Enable", "Disable", " late function splitting using profile information (x86 ELF)", [], "CodeGenOpts.SplitMachineFunctions">; -// todo: join into single OptInFFlag -def fstrict_return : Flag<["-"], "fstrict-return">, Group; -def fno_strict_return : Flag<["-"], "fno-strict-return">, Group, Flags<[CC1Option]>, - HelpText<"Don't treat control flow paths that fall off the end of a non-void function as unreachable">, - MarshallingInfoFlag<"CodeGenOpts.StrictReturn", "true">, IsNegative; +defm strict_return : OptOutPositiveFFlag<"strict-return", + "", "Don't treat control flow paths that fall off the end of a non-void function as unreachable", "", + [], "CodeGenOpts.StrictReturn">; def fenable_matrix : Flag<["-"], "fenable-matrix">, Group, Flags<[CC1Option]>, @@ -2157,11 +2141,9 @@ def fno_debug_types_section: Flag<["-"], "fno-debug-types-section">, Group; defm debug_ranges_base_address : OptInFFlag<"debug-ranges-base-address", "Use DWARF base address selection entries in .debug_ranges", "", "", [], "CodeGenOpts.DebugRangesBaseAddress">; -// todo: join into single OptInFFlag -def fsplit_dwarf_inlining: Flag <["-"], "fsplit-dwarf-inlining">, Group, - HelpText<"Provide minimal debug info in the object/executable to facilitate online symbolication/stack traces in the absence of .dwo/.dwp files when using Split DWARF">; -def fno_split_dwarf_inlining: Flag<["-"], "fno-split-dwarf-inlining">, Group, - Flags<[CC1Option]>, MarshallingInfoFlag<"CodeGenOpts.SplitDwarfInlining", "true">, IsNegative; +defm split_dwarf_inlining : OptOutPositiveFFlag<"split-dwarf-inlining", + "Provide minimal debug info in the object/executable to facilitate online symbolication/stack traces in the absence of .dwo/.dwp files when using Split DWARF", "", "", + [], "CodeGenOpts.SplitDwarfInlining">; def fdebug_default_version: Joined<["-"], "fdebug-default-version=">, Group, HelpText<"Default DWARF version to use, if a -g option caused DWARF debug info to be produced">; def fdebug_prefix_map_EQ @@ -2215,7 +2197,7 @@ Flags<[CC1Option, CoreOption]>, MarshallingInfoFlag<"CodeGenOpts.CodeViewGHash">; def gno_codeview_ghash : Flag<["-"], "gno-codeview-ghash">, Flags<[CoreOption]>; -// todo: join following into single OptInFFlag (what about Flags though?) +// todo: simplify these into a version of OptOutFFlag that doesn't imply `f_Group` and `f` in names def ginline_line_tables : Flag<["-"], "ginline-line-tables">, Flags<[CoreOption]>; def gno_inline_line_tables : Flag<["-"], "gno-inline-line-tables">, Flags<[CC1Option, CoreOption]>, HelpText<"Don't emit inline line tables">, @@ -2236,7 +2218,7 @@ def : Flag<["-"], "gno-record-gcc-switches">, Alias; def gstrict_dwarf : Flag<["-"], "gstrict-dwarf">, Group; def gno_strict_dwarf : Flag<["-"], "gno-strict-dwarf">, Group; -// todo: try to merge into one OptOutFlag +// todo: simplify these into a version of OptOutPositiveFFlag that doesn't imply `f_Group` and `f` in names def gcolumn_info : Flag<["-"], "gcolumn-info">, Group, Flags<[CoreOption]>; def gno_column_info : Flag<["-"], "gno-column-info">, Group, Flags<[CoreOption, CC1Option]>, MarshallingInfoFlag<"CodeGenOpts.DebugColumnInfo", "true">, IsNegative; @@ -2713,7 +2695,7 @@ def mignore_xcoff_visibility : Flag<["-"], "mignore-xcoff-visibility">, Group, HelpText<"Not emit the visibility attribute for asm in AIX OS or give all symbols 'unspecified' visibility in XCOFF object file">, Flags<[CC1Option]>; -// todo: join into single OptOutMFlag +// todo: simplify these into a version of OptInFFlag that doesn't imply `f_Group`, `f` in names and Flags def mbackchain : Flag<["-"], "mbackchain">, Group, Flags<[NoXarchOption,CC1Option]>, HelpText<"Link stack frames through backchain on System Z">, MarshallingInfoFlag<"CodeGenOpts.Backchain">; @@ -2758,7 +2740,7 @@ HelpText<"Use the given offset for addressing the stack-protector guard">; def mstack_protector_guard_reg_EQ : Joined<["-"], "mstack-protector-guard-reg=">, Group, Flags<[CC1Option]>, HelpText<"Use the given reg for addressing the stack-protector guard">; -// todo: join into OptInMFlag +// todo: simplify these into a version of OptInFFlag that doesn't imply `f_Group` and `f` in names def mpie_copy_relocations : Flag<["-"], "mpie-copy-relocations">, Group, Flags<[CC1Option]>, HelpText<"Use copy relocations support for PIE builds">, @@ -4422,7 +4404,7 @@ HelpText<"Print the output of the dependency directives source minimizer">; } -// todo: join into one OptInFlag +// todo: simplify this into a version of OptInFFlag that doesn't imply `f_Group` and `f` in names, append CC1Option flag def no_emit_llvm_uselists : Flag<["-"], "no-emit-llvm-uselists">, HelpText<"Don't preserve order of LLVM use-lists when serializing">; def emit_llvm_uselists : Flag<["-"], "emit-llvm-uselists">,