enable handling of -gno- command-line options as negated prefixes
authorAlexandre Oliva <aoliva@redhat.com>
Thu, 21 Sep 2017 02:18:02 +0000 (02:18 +0000)
committerAlexandre Oliva <aoliva@gcc.gnu.org>
Thu, 21 Sep 2017 02:18:02 +0000 (02:18 +0000)
This patch that adds -g to the set of negatable prefixes along with -f,
-m and -W.  Besides the mapping from -gno- to negated -g in option_map
and adding g to the [fmW] matches for negatable options, I had to
introduce gno- as an remapping prefix, for the option searching
machinery to backtrack to and recognize as a remapping prefix, instead
of backtracking to -g and stopping at it as if no-* was its Joined
argument.  Adding such remapping prefixes to preempt further
backtracking can be accomplished by introducing the prefix as an
Undocumented option with a Joined argument and without Driver, Target,
Common, or any language-specific option.  Whenever we match such a fake
options prefix, we abandon further backtracking (it matches, after all),
but find_opt returns the same code it would if it hadn't found any
match, so that we resort to option mapping.

I've arranged for such remapping prefixes to not be considered when
looking for and suggesting a correct spelling for misspelled options.
While testing that, I found a few -W-started options that were not
marked as RejectNegative but should (-Wno-a, is not something we'd like
to suggest ;-)  I've also marked as such -g-started options that
it makes no sense to negate, and removed the explicit -gno- ones,
allowing their opposites to be negated.

for  gcc/ChangeLog

* common.opt (Wa, Wl, Wp, g, gz=): Add
RejectNegative.
(gno-column-info): Remove.
(gcolumn-info): Drop RejectNegative.
(gno-): New prefix.
(gno-record-gcc-switches): Remove.
(grecord-gcc-switches): Drop RejectNegative.
(gno-split-dwarf): Remove.
(gsplit-dwarf): Drop RejectNegative.
(gno-strict-dwarf): Remove.
(gstrict-dwarf): Drop RejectNegative.
* config/darwin.opt (gfull, gused): Add RejectNegative.
* dwarf2out.c (gen_producer_string): Drop
gno-record-gcc-switches handler.
* optc-gen.awk: Add g to prefixes with negative forms.
* opts-common.c (remapping_prefix_p): New.
(find_opt): Check it.
(generate_canonical_option): Test g prefix.
(option_map): Add -gno- mapping.
(add_misspelling_candidates): Check remapping_prefix_p.

for  gcc/ada/ChangeLog

* gcc-interface/lang.opt (gant, gnatO, gnat): Add
        RejectNegative.

for  gcc/c-family/ChangeLog

* c.opt (gen-decls): Add RejectNegative.

From-SVN: r253047

gcc/ChangeLog
gcc/ada/ChangeLog
gcc/ada/gcc-interface/lang.opt
gcc/c-family/ChangeLog
gcc/c-family/c.opt
gcc/common.opt
gcc/config/darwin.opt
gcc/dwarf2out.c
gcc/optc-gen.awk
gcc/opts-common.c

index 588542c6eef20cc612e9e1ef89ece86066732be6..0c88145d5a757d7530810cd08888789891eca3b1 100644 (file)
@@ -1,3 +1,26 @@
+2017-09-20  Alexandre Oliva <aoliva@redhat.com>
+
+       * common.opt (Wa, Wl, Wp, g, gz=): Add
+       RejectNegative.
+       (gno-column-info): Remove.
+       (gcolumn-info): Drop RejectNegative.
+       (gno-): New prefix.
+       (gno-record-gcc-switches): Remove.
+       (grecord-gcc-switches): Drop RejectNegative.
+       (gno-split-dwarf): Remove.
+       (gsplit-dwarf): Drop RejectNegative.
+       (gno-strict-dwarf): Remove.
+       (gstrict-dwarf): Drop RejectNegative.
+       * config/darwin.opt (gfull, gused): Add RejectNegative.
+       * dwarf2out.c (gen_producer_string): Drop
+       gno-record-gcc-switches handler.
+       * optc-gen.awk: Add g to prefixes with negative forms.
+       * opts-common.c (remapping_prefix_p): New.
+       (find_opt): Check it.
+       (generate_canonical_option): Test g prefix.
+       (option_map): Add -gno- mapping.
+       (add_misspelling_candidates): Check remapping_prefix_p.
+
 2017-09-20  Jeff Law  <law@redhat.com>
 
        * config/powerpcspe/powerpcspe.c (rs6000_expand_prologue): Fix
index b90a2623342f7f62f1928ad0cdffa3fe9c1f8cec..2ea969057b71d20e03ebe34b1579f30c7f60745b 100644 (file)
@@ -1,3 +1,8 @@
+2017-09-20  Alexandre Oliva <aoliva@redhat.com>
+
+       * gcc-interface/lang.opt (gant, gnatO, gnat): Add
+       RejectNegative.
+
 2017-09-18  Bob Duff  <duff@adacore.com>
 
        * sem_ch4.adb (Complete_Object_Operation): Do not insert 'Access for
index 241eafc90ad9ef71d44aeda25636fbd1698e21ce..17c6dc8478321e2dac9b248aff334cab376f3d57 100644 (file)
@@ -81,15 +81,15 @@ Ada AdaWhy AdaSCIL
 Make \"char\" signed by default.
 
 gant
-Ada AdaWhy AdaSCIL Driver Joined Undocumented
+Ada AdaWhy AdaSCIL Driver Joined Undocumented RejectNegative
 Catch typos.
 
 gnatO
-Ada AdaWhy AdaSCIL Driver Separate
+Ada AdaWhy AdaSCIL Driver Separate RejectNegative
 Set name of output ALI file (internal switch).
 
 gnat
-Ada AdaWhy AdaSCIL Driver Joined
+Ada AdaWhy AdaSCIL Driver Joined RejectNegative
 -gnat<options> Specify options to GNAT.
 
 fbuiltin-printf
index 8003fb55fc705a120b03d49fa79aed420311c238..32f87276a0bbc295858edcfa58c1a058faa6af24 100644 (file)
@@ -1,3 +1,7 @@
+2017-09-20  Alexandre Oliva <aoliva@redhat.com>
+
+       * c.opt (gen-decls): Add RejectNegative.
+
 2017-09-15  Andrew Sutton  <andrew.n.sutton@gmail.com>
            Jakub Jelinek  <jakub@redhat.com>
 
index 3c2c107ba4b2643a0ae1e8313f23f5e24ccabfbe..13d2a59b8a5977ff55030a8961b3b55331e00ac8 100644 (file)
@@ -1810,7 +1810,7 @@ ObjC ObjC++ Var(flag_zero_link)
 Generate lazy class lookup (via objc_getClass()) for use in Zero-Link mode.
 
 gen-decls
-ObjC ObjC++ Driver Var(flag_gen_declaration)
+ObjC ObjC++ Driver Var(flag_gen_declaration) RejectNegative
 Dump declarations to a .decl file.
 
 femit-struct-debug-baseonly
index f22661cfbba7f9e7a4265a545838993674985007..dfde6adba910f828ac5651a5a7b799c9674ce2de 100644 (file)
@@ -534,13 +534,13 @@ Common RejectNegative Warning Alias(Wextra)
 This switch is deprecated; use -Wextra instead.
 
 Wa,
-Driver JoinedOrMissing
+Driver JoinedOrMissing RejectNegative
 
 Wl,
-Driver JoinedOrMissing
+Driver JoinedOrMissing RejectNegative
 
 Wp,
-Driver JoinedOrMissing
+Driver JoinedOrMissing RejectNegative
 
 Waggregate-return
 Common Var(warn_aggregate_return) Warning
@@ -2834,19 +2834,15 @@ Common Report Var(flag_zero_initialized_in_bss) Init(1)
 Put zero initialized data in the bss section.
 
 g
-Common Driver JoinedOrMissing
+Common Driver RejectNegative JoinedOrMissing
 Generate debug information in default format.
 
 gcoff
 Common Driver JoinedOrMissing Negative(gdwarf)
 Generate debug information in COFF format.
 
-gno-column-info
-Common Driver RejectNegative Var(debug_column_info,0) Init(0)
-Don't record DW_AT_decl_column and DW_AT_call_column in DWARF.
-
 gcolumn-info
-Common Driver RejectNegative Var(debug_column_info,1)
+Common Driver Var(debug_column_info,1) Init(0)
 Record DW_AT_decl_column and DW_AT_call_column in DWARF.
 
 gdwarf
@@ -2861,6 +2857,10 @@ ggdb
 Common Driver JoinedOrMissing
 Generate debug information in default extended format.
 
+gno-
+RejectNegative Joined Undocumented
+; Catch the gno- prefix, so it doesn't backtrack to g<level>.
+
 gno-pubnames
 Common Driver Negative(gpubnames) Var(debug_generate_pub_sections, 0) Init(-1)
 Don't generate DWARF pubnames and pubtypes sections.
@@ -2873,20 +2873,12 @@ ggnu-pubnames
 Common Driver Negative(gno-pubnames) Var(debug_generate_pub_sections, 2)
 Generate DWARF pubnames and pubtypes sections with GNU extensions.
 
-gno-record-gcc-switches
-Common Driver RejectNegative Var(dwarf_record_gcc_switches,0) Init(1)
-Don't record gcc command line switches in DWARF DW_AT_producer.
-
 grecord-gcc-switches
-Common Driver RejectNegative Var(dwarf_record_gcc_switches,1)
+Common Driver Var(dwarf_record_gcc_switches) Init(1)
 Record gcc command line switches in DWARF DW_AT_producer.
 
-gno-split-dwarf
-Common Driver RejectNegative Var(dwarf_split_debug_info,0) Init(0)
-Don't generate debug information in separate .dwo files.
-
 gsplit-dwarf
-Common Driver RejectNegative Var(dwarf_split_debug_info,1)
+Common Driver Var(dwarf_split_debug_info) Init(0)
 Generate debug information in separate .dwo files.
 
 gstabs
@@ -2897,12 +2889,8 @@ gstabs+
 Common Driver JoinedOrMissing Negative(gvms)
 Generate debug information in extended STABS format.
 
-gno-strict-dwarf
-Common Driver RejectNegative Var(dwarf_strict,0) Init(0)
-Emit DWARF additions beyond selected version.
-
 gstrict-dwarf
-Common Driver Report RejectNegative Var(dwarf_strict,1)
+Common Driver Report Var(dwarf_strict) Init(0)
 Don't emit DWARF additions beyond selected version.
 
 gtoggle
@@ -2940,7 +2928,7 @@ Common Driver
 Generate compressed debug sections.
 
 gz=
-Common Driver Joined Enum(compressed_debug_sections)
+Common Driver RejectNegative Joined Enum(compressed_debug_sections)
 -gz=<format>   Generate compressed debug sections in format <format>.
 
 h
index 135a9c023cbfa1c1153c63b7bb685b8187875bda..4871014229c6509f4a10051ec09e2bfec1467fa9 100644 (file)
@@ -92,10 +92,10 @@ fterminated-vtables
 Driver RejectNegative
 
 gfull
-Driver
+Driver RejectNegative
 
 gused
-Driver
+Driver RejectNegative
 
 headerpad_max_install_names
 Driver
index eed3a40c422143a02f9ff2162c79fe6a4d0b7ad4..360971765f66c30a4460f2100862fe703702eb7e 100644 (file)
@@ -23349,7 +23349,6 @@ gen_producer_string (void)
       case OPT_SPECIAL_program_name:
       case OPT_SPECIAL_input_file:
       case OPT_grecord_gcc_switches:
-      case OPT_gno_record_gcc_switches:
       case OPT__output_pch_:
       case OPT_fdiagnostics_show_location_:
       case OPT_fdiagnostics_show_option:
index 3cb0005ba40d4e9d22c1270113c115026ce684ad..295bae15c82a6a8cc5bd34d43810f803e88242c5 100644 (file)
@@ -328,7 +328,7 @@ for (i = 0; i < n_opts; i++) {
                        alias_data = "NULL, NULL, N_OPTS"
                if (flag_set_p("Enum.*", flags[i])) {
                        if (!flag_set_p("RejectNegative", flags[i]) \
-                           && opts[i] ~ "^[Wfm]")
+                           && opts[i] ~ "^[Wfgm]")
                                print "#error Enum allowing negative form"
                }
        } else {
@@ -370,7 +370,7 @@ for (i = 0; i < n_opts; i++) {
                if (flag_set_p("RejectNegative", flags[i]))
                        idx = -1;
                else {
-                       if (opts[i] ~ "^[Wfm]")
+                       if (opts[i] ~ "^[Wfgm]")
                                idx = indices[opts[i]];
                        else
                                idx = -1;
index d756814576851cb66871cca5375d9d3605ab10dc..e78ab880893ae2ad4586c8dceb30c3a52bd3a0a2 100644 (file)
@@ -28,6 +28,24 @@ along with GCC; see the file COPYING3.  If not see
 
 static void prune_options (struct cl_decoded_option **, unsigned int *);
 
+/* An option that is undocumented, that takes a joined argument, and
+   that doesn't fit any of the classes of uses (language/common,
+   driver, target) is assumed to be a prefix used to catch
+   e.g. negated options, and stop them from being further shortened to
+   a prefix that could use the negated option as an argument.  For
+   example, we want -gno-statement-frontiers to be taken as a negation
+   of -gstatement-frontiers, but without catching the gno- prefix and
+   signaling it's to be used for option remapping, it would end up
+   backtracked to g with no-statemnet-frontiers as the debug level.  */
+
+static bool
+remapping_prefix_p (const struct cl_option *opt)
+{
+  return opt->flags & CL_UNDOCUMENTED
+    && opt->flags & CL_JOINED
+    && !(opt->flags & (CL_DRIVER | CL_TARGET | CL_COMMON | CL_LANG_ALL));
+}
+
 /* Perform a binary search to find which option the command-line INPUT
    matches.  Returns its index in the option array, and
    OPT_SPECIAL_unknown on failure.
@@ -98,6 +116,9 @@ find_opt (const char *input, unsigned int lang_mask)
          if (opt->flags & lang_mask)
            return mn;
 
+         if (remapping_prefix_p (opt))
+           return OPT_SPECIAL_unknown;
+
          /* If we haven't remembered a prior match, remember this
             one.  Any prior match is necessarily better.  */
          if (match_wrong_lang == OPT_SPECIAL_unknown)
@@ -286,7 +307,8 @@ generate_canonical_option (size_t opt_index, const char *arg, int value,
 
   if (value == 0
       && !option->cl_reject_negative
-      && (opt_text[1] == 'W' || opt_text[1] == 'f' || opt_text[1] == 'm'))
+      && (opt_text[1] == 'W' || opt_text[1] == 'f'
+         || opt_text[1] == 'g' || opt_text[1] == 'm'))
     {
       char *t = XOBNEWVEC (&opts_obstack, char, option->opt_len + 5);
       t[0] = '-';
@@ -349,6 +371,7 @@ static const struct option_map option_map[] =
   {
     { "-Wno-", NULL, "-W", false, true },
     { "-fno-", NULL, "-f", false, true },
+    { "-gno-", NULL, "-g", false, true },
     { "-mno-", NULL, "-m", false, true },
     { "--debug=", NULL, "-g", false, false },
     { "--machine-", NULL, "-m", true, false },
@@ -394,6 +417,8 @@ add_misspelling_candidates (auto_vec<char *> *candidates,
   gcc_assert (candidates);
   gcc_assert (option);
   gcc_assert (opt_text);
+  if (remapping_prefix_p (option))
+    return;
   candidates->safe_push (xstrdup (opt_text + 1));
   for (unsigned i = 0; i < ARRAY_SIZE (option_map); i++)
     {