]>
Commit | Line | Data |
---|---|---|
776dc15d KC |
1 | # Copyright (C) 2003,2004 Free Software Foundation, Inc. |
2 | # Contributed by Kelley Cook, June 2004. | |
3 | # Original code from Neil Booth, May 2003. | |
4 | # | |
5 | # This program is free software; you can redistribute it and/or modify it | |
6 | # under the terms of the GNU General Public License as published by the | |
7 | # Free Software Foundation; either version 2, or (at your option) any | |
8 | # later version. | |
9 | # | |
10 | # This program is distributed in the hope that it will be useful, | |
11 | # but WITHOUT ANY WARRANTY; without even the implied warranty of | |
12 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
13 | # GNU General Public License for more details. | |
14 | # | |
15 | # You should have received a copy of the GNU General Public License | |
16 | # along with this program; if not, write to the Free Software | |
17 | # Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | |
18 | ||
19 | # This Awk script reads in the option records generated from | |
20 | # opt-gather.awk, combines the flags of duplicate options and generates a | |
21 | # C header file. | |
22 | # | |
23 | # This program uses functions from opt-functions.awk | |
24 | # Usage: awk -f opt-functions.awk -f opth-gen.awk < inputfile > options.h | |
25 | ||
26 | BEGIN { | |
27 | n_opts = 0 | |
28 | n_langs = 0 | |
fe609b0f EB |
29 | n_extra_masks = 0 |
30 | quote = "\042" | |
776dc15d KC |
31 | comma = "," |
32 | FS=SUBSEP | |
33 | } | |
34 | ||
35 | # Collect the text and flags of each option into an array | |
36 | { | |
37 | if ($1 == "Language") { | |
38 | langs[n_langs] = $2 | |
39 | n_langs++; | |
40 | } | |
41 | else { | |
fe609b0f EB |
42 | name = opt_args("Mask", $1) |
43 | if (name == "") { | |
44 | opts[n_opts] = $1 | |
45 | flags[n_opts] = $2 | |
46 | help[n_opts] = $3 | |
47 | n_opts++; | |
48 | } | |
49 | else { | |
50 | extra_masks[n_extra_masks++] = name | |
51 | } | |
776dc15d KC |
52 | } |
53 | } | |
54 | ||
55 | # Dump out an enumeration into a .h file. | |
56 | # Combine the flags of duplicate options. | |
57 | END { | |
58 | print "/* This file is auto-generated by opts.sh. */" | |
59 | print "" | |
60 | print "#ifndef OPTIONS_H" | |
61 | print "#define OPTIONS_H" | |
62 | print "" | |
75685792 | 63 | print "extern int target_flags;" |
fe609b0f | 64 | print "" |
776dc15d KC |
65 | |
66 | for (i = 0; i < n_opts; i++) { | |
67 | name = var_name(flags[i]); | |
68 | if (name == "") | |
69 | continue; | |
70 | ||
71 | print "/* Set by -" opts[i] "." | |
72 | print " " help[i] " */" | |
73 | print "extern int " name ";" | |
74 | print "" | |
75 | ||
76 | } | |
77 | ||
75685792 RS |
78 | for (i = 0; i < n_opts; i++) { |
79 | name = opt_args("Mask", flags[i]) | |
f7f655c7 DD |
80 | vname = var_name(flags[i]) |
81 | mask = "MASK_" | |
82 | if (vname != "") { | |
83 | mask = "OPTION_MASK_" | |
84 | } | |
f9b4c1db | 85 | if (name != "" && !flag_set_p("MaskExists", flags[i])) |
f7f655c7 | 86 | print "#define " mask name " (1 << " masknum[vname]++ ")" |
75685792 | 87 | } |
fe609b0f | 88 | for (i = 0; i < n_extra_masks; i++) { |
f7f655c7 DD |
89 | print "#define MASK_" extra_masks[i] " (1 << " masknum[""]++ ")" |
90 | } | |
91 | ||
92 | for (var in masknum) { | |
93 | if (masknum[var] > 31) { | |
94 | if (var == "") | |
95 | print "#error too many target masks" | |
96 | else | |
97 | print "#error too many masks for " var | |
98 | } | |
fe609b0f | 99 | } |
75685792 RS |
100 | print "" |
101 | ||
102 | for (i = 0; i < n_opts; i++) { | |
103 | name = opt_args("Mask", flags[i]) | |
f7f655c7 DD |
104 | vname = var_name(flags[i]) |
105 | macro = "OPTION_" | |
106 | mask = "OPTION_MASK_" | |
107 | if (vname == "") { | |
108 | vname = "target_flags" | |
109 | macro = "TARGET_" | |
110 | mask = "MASK_" | |
111 | } | |
f9b4c1db | 112 | if (name != "" && !flag_set_p("MaskExists", flags[i])) |
f7f655c7 DD |
113 | print "#define " macro name \ |
114 | " ((" vname " & " mask name ") != 0)" | |
75685792 | 115 | } |
fe609b0f EB |
116 | for (i = 0; i < n_extra_masks; i++) { |
117 | print "#define TARGET_" extra_masks[i] \ | |
118 | " ((target_flags & MASK_" extra_masks[i] ") != 0)" | |
119 | } | |
75685792 RS |
120 | print "" |
121 | ||
122 | for (i = 0; i < n_opts; i++) { | |
123 | opt = opt_args("InverseMask", flags[i]) | |
124 | if (opt ~ ",") | |
125 | print "#define TARGET_" nth_arg(1, opt) \ | |
126 | " ((target_flags & MASK_" nth_arg(0, opt) ") == 0)" | |
127 | } | |
128 | print "" | |
776dc15d KC |
129 | |
130 | for (i = 0; i < n_langs; i++) { | |
131 | macros[i] = "CL_" langs[i] | |
132 | gsub( "[^A-Za-z0-9_]", "X", macros[i] ) | |
133 | s = substr(" ", length (macros[i])) | |
134 | print "#define " macros[i] s " (1 << " i ")" | |
135 | } | |
136 | ||
137 | print "" | |
138 | print "enum opt_code" | |
139 | print "{" | |
140 | ||
141 | for (i = 0; i < n_opts; i++) | |
142 | back_chain[i] = "N_OPTS"; | |
143 | ||
64fbae21 RS |
144 | for (i = 0; i < n_opts; i++) { |
145 | # Combine the flags of identical switches. Switches | |
146 | # appear many times if they are handled by many front | |
147 | # ends, for example. | |
148 | while( i + 1 != n_opts && opts[i] == opts[i + 1] ) { | |
149 | flags[i + 1] = flags[i] " " flags[i + 1]; | |
150 | i++; | |
151 | } | |
776dc15d KC |
152 | |
153 | len = length (opts[i]); | |
154 | enum = "OPT_" opts[i] | |
155 | if (opts[i] == "finline-limit=") | |
156 | enum = enum "eq" | |
157 | gsub ("[^A-Za-z0-9]", "_", enum) | |
158 | ||
159 | # If this switch takes joined arguments, back-chain all | |
160 | # subsequent switches to it for which it is a prefix. If | |
161 | # a later switch S is a longer prefix of a switch T, T | |
162 | # will be back-chained to S in a later iteration of this | |
163 | # for() loop, which is what we want. | |
a56a0779 | 164 | if (flag_set_p("Joined.*", flags[i])) { |
776dc15d KC |
165 | for (j = i + 1; j < n_opts; j++) { |
166 | if (substr (opts[j], 1, len) != opts[i]) | |
167 | break; | |
168 | back_chain[j] = enum; | |
169 | } | |
170 | } | |
171 | ||
172 | s = substr(" ", length (opts[i])) | |
173 | if (i + 1 == n_opts) | |
174 | comma = "" | |
175 | ||
176 | if (help[i] == "") | |
177 | hlp = "0" | |
178 | else | |
179 | hlp = "N_(\"" help[i] "\")"; | |
180 | ||
181 | print " " enum "," s "/* -" opts[i] " */" | |
182 | } | |
183 | ||
184 | print " N_OPTS" | |
185 | print "};" | |
186 | print "" | |
187 | print "#endif /* OPTIONS_H */" | |
188 | } |