In fortran/*.opt, I'd like to use:

Fortran Var(warn_tabs) Warning EnabledBy(Wall || Wpedantic)

However, "||" is not supported by EnabledBy. This patch adds it. I checked that option.c remains the same after the patch.

I attached the patch twice: Once with "-w -U16" to show the modification (minus re-indenting) and once with re-indenting.

OK for the trunk?

Tobias

gcc/
2014-11-22  Tobias Burnus <net-b.de>

    * optc-gen.awk: Support || in EnabledBy.
diff --git a/gcc/optc-gen.awk b/gcc/optc-gen.awk
index ecb225c..0707db2 100644
--- a/gcc/optc-gen.awk
+++ b/gcc/optc-gen.awk
@@ -25,63 +25,84 @@
 # opt-read.awk.
 #
 # Usage: awk -f opt-functions.awk -f opt-read.awk -f optc-gen.awk \
 #            [-v header_name=header.h] < inputfile > options.c
 
 # Dump that array of options into a C file.
 END {
 
 # Record first EnabledBy and LangEnabledBy uses.
 n_enabledby = 0;
 for (i = 0; i < n_langs; i++) {
     n_enabledby_lang[i] = 0;
 }
 for (i = 0; i < n_opts; i++) {
     enabledby_arg = opt_args("EnabledBy", flags[i]);
     if (enabledby_arg != "") {
+       if (index(enabledby_arg, " && ") == 0) {
+           # Enabledby(arg) or Enabledby(arg1 || arg2 || arg3)
+           n_enabledby_names = split(enabledby_arg, enabledby_names, " \\|\\| ");
+           for (j = 1; j <= n_enabledby_names; j++) {
+                enabledby_name = enabledby_names[j];
+                enabledby_index = opt_numbers[enabledby_name];
+                if (enabledby_index == "") {
+                    print "#error Enabledby: " enabledby_name
+                } else {
+                    condition = "";
+                    if (enables[enabledby_name] == "") {
+                        enabledby[n_enabledby] = enabledby_name;
+                        n_enabledby++;
+                    }
+                    enables[enabledby_name] = enables[enabledby_name] opts[i] ";";
+                    enablesif[enabledby_name] = enablesif[enabledby_name] condition ";";
+                }
+           }
+       } else {
+            # Enabledby(arg1 && arg2)
             n_enabledby_names = split(enabledby_arg, enabledby_names, " && ");
             if (n_enabledby_names > 2) {
                 print "#error EnabledBy (Wfoo && Wbar && Wbaz) not currently supported"
             }
             for (j = 1; j <= n_enabledby_names; j++) {
                 enabledby_name = enabledby_names[j];
                 enabledby_index = opt_numbers[enabledby_name];
                 if (enabledby_index == "") {
                     print "#error Enabledby: " enabledby_name
                 } else {
                     condition = "";
                     if (n_enabledby_names == 2) {
                         opt_var_name_1 = search_var_name(enabledby_names[1], opt_numbers, opts, flags, n_opts);
                         opt_var_name_2 = search_var_name(enabledby_names[2], opt_numbers, opts, flags, n_opts);
                         if (opt_var_name_1 == "") {
                             print "#error " enabledby_names[1] " does not have a Var() flag"
                         }
                         if (opt_var_name_2 == "") {
                             print "#error " enabledby_names[2] " does not have a Var() flag"
                         }
                         condition = "opts->x_" opt_var_name_1 " && opts->x_" opt_var_name_2;
                     }
                     if (enables[enabledby_name] == "") {
                         enabledby[n_enabledby] = enabledby_name;
                         n_enabledby++;
                     }
                     enables[enabledby_name] = enables[enabledby_name] opts[i] ";";
                     enablesif[enabledby_name] = enablesif[enabledby_name] condition ";";
                 }
             }
       }
+    }
 
     enabledby_arg = opt_args("LangEnabledBy", flags[i]);
     if (enabledby_arg != "") {
         enabledby_langs = nth_arg(0, enabledby_arg);
         enabledby_name = nth_arg(1, enabledby_arg);
         enabledby_posarg = nth_arg(2, enabledby_arg);
 	enabledby_negarg = nth_arg(3, enabledby_arg);
         lang_enabled_by(enabledby_langs, enabledby_name, enabledby_posarg, enabledby_negarg);
     }
 }
 
 
 print "/* This file is auto-generated by optc-gen.awk.  */"
 print ""
 n_headers = split(header_name, headers, " ")
 for (i = 1; i <= n_headers; i++)
diff --git a/gcc/optc-gen.awk b/gcc/optc-gen.awk
index ecb225c..0707db2 100644
--- a/gcc/optc-gen.awk
+++ b/gcc/optc-gen.awk
@@ -38,36 +38,57 @@ for (i = 0; i < n_langs; i++) {
 for (i = 0; i < n_opts; i++) {
     enabledby_arg = opt_args("EnabledBy", flags[i]);
     if (enabledby_arg != "") {
-        n_enabledby_names = split(enabledby_arg, enabledby_names, " && ");
-        if (n_enabledby_names > 2) {
-            print "#error EnabledBy (Wfoo && Wbar && Wbaz) not currently supported"
-        }
-        for (j = 1; j <= n_enabledby_names; j++) {
-            enabledby_name = enabledby_names[j];
-            enabledby_index = opt_numbers[enabledby_name];
-            if (enabledby_index == "") {
-                print "#error Enabledby: " enabledby_name 
-            } else {
-                condition = "";
-                if (n_enabledby_names == 2) {
-                    opt_var_name_1 = search_var_name(enabledby_names[1], opt_numbers, opts, flags, n_opts);
-                    opt_var_name_2 = search_var_name(enabledby_names[2], opt_numbers, opts, flags, n_opts);
-                    if (opt_var_name_1 == "") {
-                        print "#error " enabledby_names[1] " does not have a Var() flag"
+       if (index(enabledby_arg, " && ") == 0) {
+           # Enabledby(arg) or Enabledby(arg1 || arg2 || arg3)
+           n_enabledby_names = split(enabledby_arg, enabledby_names, " \\|\\| ");
+           for (j = 1; j <= n_enabledby_names; j++) {
+                enabledby_name = enabledby_names[j];
+                enabledby_index = opt_numbers[enabledby_name];
+                if (enabledby_index == "") {
+                    print "#error Enabledby: " enabledby_name
+                } else {
+                    condition = "";
+                    if (enables[enabledby_name] == "") {
+                        enabledby[n_enabledby] = enabledby_name;
+                        n_enabledby++;
                     }
-                    if (opt_var_name_2 == "") {
-                        print "#error " enabledby_names[2] " does not have a Var() flag"
-                    }
-                    condition = "opts->x_" opt_var_name_1 " && opts->x_" opt_var_name_2;
+                    enables[enabledby_name] = enables[enabledby_name] opts[i] ";";
+                    enablesif[enabledby_name] = enablesif[enabledby_name] condition ";";
                 }
-                if (enables[enabledby_name] == "") {
-                    enabledby[n_enabledby] = enabledby_name;
-                    n_enabledby++;
+           }
+       } else {
+            # Enabledby(arg1 && arg2)
+            n_enabledby_names = split(enabledby_arg, enabledby_names, " && ");
+            if (n_enabledby_names > 2) {
+                print "#error EnabledBy (Wfoo && Wbar && Wbaz) not currently supported"
+            }
+            for (j = 1; j <= n_enabledby_names; j++) {
+                enabledby_name = enabledby_names[j];
+                enabledby_index = opt_numbers[enabledby_name];
+                if (enabledby_index == "") {
+                    print "#error Enabledby: " enabledby_name
+                } else {
+                    condition = "";
+                    if (n_enabledby_names == 2) {
+                        opt_var_name_1 = search_var_name(enabledby_names[1], opt_numbers, opts, flags, n_opts);
+                        opt_var_name_2 = search_var_name(enabledby_names[2], opt_numbers, opts, flags, n_opts);
+                        if (opt_var_name_1 == "") {
+                            print "#error " enabledby_names[1] " does not have a Var() flag"
+                        }
+                        if (opt_var_name_2 == "") {
+                            print "#error " enabledby_names[2] " does not have a Var() flag"
+                        }
+                        condition = "opts->x_" opt_var_name_1 " && opts->x_" opt_var_name_2;
+                    }
+                    if (enables[enabledby_name] == "") {
+                        enabledby[n_enabledby] = enabledby_name;
+                        n_enabledby++;
+                    }
+                    enables[enabledby_name] = enables[enabledby_name] opts[i] ";";
+                    enablesif[enabledby_name] = enablesif[enabledby_name] condition ";";
                 }
-                enables[enabledby_name] = enables[enabledby_name] opts[i] ";";
-                enablesif[enabledby_name] = enablesif[enabledby_name] condition ";";
             }
-        }
+      }
     }
 
     enabledby_arg = opt_args("LangEnabledBy", flags[i]);

Reply via email to