OSDN Git Service

* config/pa/fptr.c: Update license header.
[pf3gnuchains/gcc-fork.git] / gcc / opth-gen.awk
index 6cea944..97abcf0 100644 (file)
@@ -1,4 +1,4 @@
-#  Copyright (C) 2003,2004 Free Software Foundation, Inc.
+#  Copyright (C) 2003,2004,2005,2006 Free Software Foundation, Inc.
 #  Contributed by Kelley Cook, June 2004.
 #  Original code from Neil Booth, May 2003.
 #
@@ -14,7 +14,7 @@
 # 
 # You should have received a copy of the GNU General Public License
 # along with this program; if not, write to the Free Software
-# Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+# Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 
 # This Awk script reads in the option records generated from 
 # opt-gather.awk, combines the flags of duplicate options and generates a
@@ -26,7 +26,8 @@
 BEGIN {
        n_opts = 0
        n_langs = 0
-        quote = "\042"
+       n_extra_masks = 0
+       quote = "\042"
        comma = ","
        FS=SUBSEP
 }
@@ -38,10 +39,16 @@ BEGIN {
                        n_langs++;
                }
                else {
-                       opts[n_opts]  = $1
-                       flags[n_opts] = $2
-                       help[n_opts]  = $3
-                       n_opts++;
+                       name = opt_args("Mask", $1)
+                       if (name == "") {
+                               opts[n_opts]  = $1
+                               flags[n_opts] = $2
+                               help[n_opts]  = $3
+                               n_opts++;
+                       }
+                       else {
+                               extra_masks[n_extra_masks++] = name
+                       }
                }
        }
 
@@ -53,19 +60,78 @@ print ""
 print "#ifndef OPTIONS_H"
 print "#define OPTIONS_H"
 print ""
+print "extern int target_flags;"
+print ""
 
 for (i = 0; i < n_opts; i++) {
        name = var_name(flags[i]);
        if (name == "")
                continue;
 
-       print "/* Set by -" opts[i] "."
-       print "   " help[i] "  */"
-       print "extern int " name ";"
-       print ""
+       print "extern " var_type(flags[i]) name ";"
+}
+print ""
 
-    }
+for (i = 0; i < n_opts; i++) {
+       name = opt_args("Mask", flags[i])
+       vname = var_name(flags[i])
+       mask = "MASK_"
+       if (vname != "") {
+               mask = "OPTION_MASK_"
+       }
+       if (name != "" && !flag_set_p("MaskExists", flags[i]))
+               print "#define " mask name " (1 << " masknum[vname]++ ")"
+}
+for (i = 0; i < n_extra_masks; i++) {
+       print "#define MASK_" extra_masks[i] " (1 << " masknum[""]++ ")"
+}
+
+for (var in masknum) {
+       if (masknum[var] > 31) {
+               if (var == "")
+                       print "#error too many target masks"
+               else
+                       print "#error too many masks for " var
+       }
+}
+print ""
+
+for (i = 0; i < n_opts; i++) {
+       name = opt_args("Mask", flags[i])
+       vname = var_name(flags[i])
+       macro = "OPTION_"
+       mask = "OPTION_MASK_"
+       if (vname == "") {
+               vname = "target_flags"
+               macro = "TARGET_"
+               mask = "MASK_"
+       }
+       if (name != "" && !flag_set_p("MaskExists", flags[i]))
+               print "#define " macro name \
+                     " ((" vname " & " mask name ") != 0)"
+}
+for (i = 0; i < n_extra_masks; i++) {
+       print "#define TARGET_" extra_masks[i] \
+             " ((target_flags & MASK_" extra_masks[i] ") != 0)"
+}
+print ""
 
+for (i = 0; i < n_opts; i++) {
+       opt = opt_args("InverseMask", flags[i])
+       if (opt ~ ",") {
+               vname = var_name(flags[i])
+               macro = "OPTION_"
+               mask = "OPTION_MASK_"
+               if (vname == "") {
+                       vname = "target_flags"
+                       macro = "TARGET_"
+                       mask = "MASK_"
+               }
+               print "#define " macro nth_arg(1, opt) \
+                     " ((" vname " & " mask nth_arg(0, opt) ") == 0)"
+       }
+}
+print ""
 
 for (i = 0; i < n_langs; i++) {
        macros[i] = "CL_" langs[i]
@@ -73,6 +139,7 @@ for (i = 0; i < n_langs; i++) {
        s = substr("            ", length (macros[i]))
        print "#define " macros[i] s " (1 << " i ")"
     }
+print "#define CL_LANG_ALL   ((1 << " n_langs ") - 1)"
 
 print ""
 print "enum opt_code"
@@ -81,14 +148,14 @@ print "{"
 for (i = 0; i < n_opts; i++)
        back_chain[i] = "N_OPTS";
 
-       for (i = 0; i < n_opts; i++) {
-               # Combine the flags of identical switches.  Switches
-               # appear many times if they are handled by many front
-               # ends, for example.
-               while( i + 1 != n_opts && opts[i] == opts[i + 1] ) {
-                       flags[i + 1] = flags[i] " " flags[i + 1];
-                       i++;
-               }
+for (i = 0; i < n_opts; i++) {
+       # Combine the flags of identical switches.  Switches
+       # appear many times if they are handled by many front
+       # ends, for example.
+       while( i + 1 != n_opts && opts[i] == opts[i + 1] ) {
+               flags[i + 1] = flags[i] " " flags[i + 1];
+               i++;
+       }
 
        len = length (opts[i]);
        enum = "OPT_" opts[i]
@@ -101,7 +168,7 @@ for (i = 0; i < n_opts; i++)
        # a later switch S is a longer prefix of a switch T, T
        # will be back-chained to S in a later iteration of this
        # for() loop, which is what we want.
-       if (flags[i] ~ "Joined") {
+       if (flag_set_p("Joined.*", flags[i])) {
                for (j = i + 1; j < n_opts; j++) {
                        if (substr (opts[j], 1, len) != opts[i])
                                break;