]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/opth-gen.awk
Update copyright years.
[thirdparty/gcc.git] / gcc / opth-gen.awk
CommitLineData
fbd26352 1# Copyright (C) 2003-2019 Free Software Foundation, Inc.
e8b212b8 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
8c4c00c1 7# Free Software Foundation; either version 3, or (at your option) any
e8b212b8 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
8c4c00c1 16# along with this program; see the file COPYING3. If not see
17# <http://www.gnu.org/licenses/>.
e8b212b8 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#
1e127302 23# This program uses functions from opt-functions.awk and code from
24# opt-read.awk.
25# Usage: awk -f opt-functions.awk -f opt-read.awk -f opth-gen.awk \
26# < inputfile > options.h
e8b212b8 27
28# Dump out an enumeration into a .h file.
29# Combine the flags of duplicate options.
30END {
5e2d3b19 31print "/* This file is auto-generated by opth-gen.awk. */"
e8b212b8 32print ""
33print "#ifndef OPTIONS_H"
34print "#define OPTIONS_H"
35print ""
a317e77e 36print "#include \"flag-types.h\""
37print ""
e8b212b8 38
755fa783 39if (n_extra_h_includes > 0) {
40 for (i = 0; i < n_extra_h_includes; i++) {
41 print "#include " quote extra_h_includes[i] quote
42 }
43 print ""
44}
46f8e3b0 45
f3f006ad 46print "#if !defined(IN_LIBGCC2) && !defined(IN_TARGET_LIBS) && !defined(IN_RTS)"
5ae82d58 47print "#ifndef GENERATOR_FILE"
0bfbe373 48print "#if !defined(IN_LIBGCC2) && !defined(IN_TARGET_LIBS)"
755fa783 49print "struct GTY(()) gcc_options"
50print "#else"
51print "struct gcc_options"
52print "#endif"
53print "{"
5ae82d58 54print "#endif"
55
0f8defe5 56for (i = 0; i < n_extra_vars; i++) {
57 var = extra_vars[i]
58 sub(" *=.*", "", var)
5ae82d58 59 orig_var = var
60 name = var
61 type = var
d7175aef 62 type_after = var
5ae82d58 63 sub("^.*[ *]", "", name)
d7175aef 64 sub("\\[.*\\]$", "", name)
65 sub("\\[.*\\]$", "", type)
5ae82d58 66 sub(" *" name "$", "", type)
d7175aef 67 sub("^.*" name, "", type_after)
5ae82d58 68 var_seen[name] = 1
69 print "#ifdef GENERATOR_FILE"
70 print "extern " orig_var ";"
71 print "#else"
d7175aef 72 print " " type " x_" name type_after ";"
5ae82d58 73 print "#define " name " global_options.x_" name
74 print "#endif"
0f8defe5 75}
76
e8b212b8 77for (i = 0; i < n_opts; i++) {
46f8e3b0 78 if (flag_set_p("Save", flags[i]))
79 have_save = 1;
80
e8b212b8 81 name = var_name(flags[i]);
82 if (name == "")
83 continue;
84
46f8e3b0 85 if (name in var_seen)
86 continue;
87
88 var_seen[name] = 1;
5ae82d58 89 print "#ifdef GENERATOR_FILE"
0fe44c73 90 print "extern " var_type(flags[i]) name ";"
5ae82d58 91 print "#else"
92 print " " var_type(flags[i]) "x_" name ";"
93 print "#define " name " global_options.x_" name
94 print "#endif"
0fe44c73 95}
2c5d2e39 96for (i = 0; i < n_opts; i++) {
97 name = static_var(opts[i], flags[i]);
98 if (name != "") {
99 print "#ifndef GENERATOR_FILE"
100 print " " var_type(flags[i]) "x_" name ";"
101 print "#define x_" name " do_not_use"
102 print "#endif"
103 }
104}
ecee1b29 105for (i = 0; i < n_opts; i++) {
106 if (flag_set_p("SetByCombined", flags[i])) {
107 print "#ifndef GENERATOR_FILE"
108 print " bool frontend_set_" var_name(flags[i]) ";"
109 print "#endif"
110 }
111}
5ae82d58 112print "#ifndef GENERATOR_FILE"
113print "};"
114print "extern struct gcc_options global_options;"
f3f006ad 115print "extern const struct gcc_options global_options_init;"
f83b64ca 116print "extern struct gcc_options global_options_set;"
a702fa95 117print "#define target_flags_explicit global_options_set.x_target_flags"
5ae82d58 118print "#endif"
f3f006ad 119print "#endif"
0fe44c73 120print ""
e8b212b8 121
46f8e3b0 122# All of the optimization switches gathered together so they can be saved and restored.
123# This will allow attribute((cold)) to turn on space optimization.
124
125# Change the type of normal switches from int to unsigned char to save space.
126# Also, order the structure so that pointer fields occur first, then int
127# fields, and then char fields to provide the best packing.
128
bfa29ed4 129print "#if !defined(IN_LIBGCC2) && !defined(IN_TARGET_LIBS) && !defined(IN_RTS)"
46f8e3b0 130print ""
131print "/* Structure to save/restore optimization and target specific options. */";
fb1e4f4a 132print "struct GTY(()) cl_optimization";
46f8e3b0 133print "{";
134
bfedbed1 135n_opt_char = 3;
46f8e3b0 136n_opt_short = 0;
137n_opt_int = 0;
b92389a6 138n_opt_enum = 0;
46f8e3b0 139n_opt_other = 0;
5ae82d58 140var_opt_char[0] = "unsigned char x_optimize";
141var_opt_char[1] = "unsigned char x_optimize_size";
bfedbed1 142var_opt_char[2] = "unsigned char x_optimize_debug";
46f8e3b0 143
144for (i = 0; i < n_opts; i++) {
05d8c5f8 145 if (flag_set_p("(Optimization|PerFunction)", flags[i])) {
46f8e3b0 146 name = var_name(flags[i])
147 if(name == "")
148 continue;
149
150 if(name in var_opt_seen)
151 continue;
152
153 var_opt_seen[name]++;
154 otype = var_type_struct(flags[i]);
155 if (otype ~ "^((un)?signed +)?int *$")
5ae82d58 156 var_opt_int[n_opt_int++] = otype "x_" name;
46f8e3b0 157
158 else if (otype ~ "^((un)?signed +)?short *$")
5ae82d58 159 var_opt_short[n_opt_short++] = otype "x_" name;
46f8e3b0 160
161 else if (otype ~ "^((un)?signed +)?char *$")
5ae82d58 162 var_opt_char[n_opt_char++] = otype "x_" name;
46f8e3b0 163
755fa783 164 else if (otype ~ ("^enum +[_" alnum "]+ *$"))
165 var_opt_enum[n_opt_enum++] = otype "x_" name;
166
46f8e3b0 167 else
5ae82d58 168 var_opt_other[n_opt_other++] = otype "x_" name;
46f8e3b0 169 }
170}
171
172for (i = 0; i < n_opt_other; i++) {
173 print " " var_opt_other[i] ";";
174}
175
176for (i = 0; i < n_opt_int; i++) {
177 print " " var_opt_int[i] ";";
178}
179
755fa783 180for (i = 0; i < n_opt_enum; i++) {
181 print " " var_opt_enum[i] ";";
182}
183
46f8e3b0 184for (i = 0; i < n_opt_short; i++) {
185 print " " var_opt_short[i] ";";
186}
187
188for (i = 0; i < n_opt_char; i++) {
189 print " " var_opt_char[i] ";";
190}
191
192print "};";
193print "";
194
195# Target and optimization save/restore/print functions.
196print "/* Structure to save/restore selected target specific options. */";
fb1e4f4a 197print "struct GTY(()) cl_target_option";
46f8e3b0 198print "{";
199
200n_target_char = 0;
201n_target_short = 0;
202n_target_int = 0;
755fa783 203n_target_enum = 0;
46f8e3b0 204n_target_other = 0;
205
206for (i = 0; i < n_target_save; i++) {
ca40ed4b 207 if (target_save_decl[i] ~ "^((un)?signed +)?int +[_" alnum "]+$")
46f8e3b0 208 var_target_int[n_target_int++] = target_save_decl[i];
209
ca40ed4b 210 else if (target_save_decl[i] ~ "^((un)?signed +)?short +[_" alnum "]+$")
46f8e3b0 211 var_target_short[n_target_short++] = target_save_decl[i];
212
ca40ed4b 213 else if (target_save_decl[i] ~ "^((un)?signed +)?char +[_ " alnum "]+$")
46f8e3b0 214 var_target_char[n_target_char++] = target_save_decl[i];
215
755fa783 216 else if (target_save_decl[i] ~ ("^enum +[_" alnum "]+ +[_" alnum "]+$")) {
217 var_target_enum[n_target_enum++] = target_save_decl[i];
218 }
46f8e3b0 219 else
220 var_target_other[n_target_other++] = target_save_decl[i];
221}
222
223if (have_save) {
224 for (i = 0; i < n_opts; i++) {
225 if (flag_set_p("Save", flags[i])) {
226 name = var_name(flags[i])
227 if(name == "")
228 name = "target_flags";
229
230 if(name in var_save_seen)
231 continue;
232
233 var_save_seen[name]++;
234 otype = var_type_struct(flags[i])
235 if (otype ~ "^((un)?signed +)?int *$")
5ae82d58 236 var_target_int[n_target_int++] = otype "x_" name;
46f8e3b0 237
238 else if (otype ~ "^((un)?signed +)?short *$")
5ae82d58 239 var_target_short[n_target_short++] = otype "x_" name;
46f8e3b0 240
241 else if (otype ~ "^((un)?signed +)?char *$")
5ae82d58 242 var_target_char[n_target_char++] = otype "x_" name;
46f8e3b0 243
755fa783 244 else if (otype ~ ("^enum +[_" alnum "]+ +[_" alnum "]+"))
245 var_target_enum[n_target_enum++] = otype "x_" name;
246
46f8e3b0 247 else
5ae82d58 248 var_target_other[n_target_other++] = otype "x_" name;
46f8e3b0 249 }
250 }
251} else {
5ae82d58 252 var_target_int[n_target_int++] = "int x_target_flags";
46f8e3b0 253}
254
255for (i = 0; i < n_target_other; i++) {
256 print " " var_target_other[i] ";";
257}
258
755fa783 259for (i = 0; i < n_target_enum; i++) {
260 print " " var_target_enum[i] ";";
261}
262
46f8e3b0 263for (i = 0; i < n_target_int; i++) {
264 print " " var_target_int[i] ";";
265}
266
267for (i = 0; i < n_target_short; i++) {
268 print " " var_target_short[i] ";";
269}
270
271for (i = 0; i < n_target_char; i++) {
272 print " " var_target_char[i] ";";
273}
274
275print "};";
276print "";
277print "";
278print "/* Save optimization variables into a structure. */"
2c5d2e39 279print "extern void cl_optimization_save (struct cl_optimization *, struct gcc_options *);";
46f8e3b0 280print "";
281print "/* Restore optimization variables from a structure. */";
2c5d2e39 282print "extern void cl_optimization_restore (struct gcc_options *, struct cl_optimization *);";
46f8e3b0 283print "";
284print "/* Print optimization variables from a structure. */";
285print "extern void cl_optimization_print (FILE *, int, struct cl_optimization *);";
286print "";
7174b54b 287print "/* Print different optimization variables from structures provided as arguments. */";
288print "extern void cl_optimization_print_diff (FILE *, int, cl_optimization *ptr1, cl_optimization *ptr2);";
289print "";
46f8e3b0 290print "/* Save selected option variables into a structure. */"
2c5d2e39 291print "extern void cl_target_option_save (struct cl_target_option *, struct gcc_options *);";
46f8e3b0 292print "";
293print "/* Restore selected option variables from a structure. */"
2c5d2e39 294print "extern void cl_target_option_restore (struct gcc_options *, struct cl_target_option *);";
46f8e3b0 295print "";
296print "/* Print target option variables from a structure. */";
297print "extern void cl_target_option_print (FILE *, int, struct cl_target_option *);";
fbb6fbd8 298print "";
7174b54b 299print "/* Print different target option variables from structures provided as arguments. */";
300print "extern void cl_target_option_print_diff (FILE *, int, cl_target_option *ptr1, cl_target_option *ptr2);";
301print "";
ab90b67e 302print "/* Compare two target option variables from a structure. */";
303print "extern bool cl_target_option_eq (const struct cl_target_option *, const struct cl_target_option *);";
304print "";
305print "/* Hash option variables from a structure. */";
306print "extern hashval_t cl_target_option_hash (const struct cl_target_option *);";
307print "";
54f880b2 308print "/* Hash optimization from a structure. */";
309print "extern hashval_t cl_optimization_hash (const struct cl_optimization *);";
310print "";
6848a0ae 311print "/* Compare two optimization options. */";
312print "extern bool cl_optimization_option_eq (cl_optimization const *ptr1, cl_optimization const *ptr2);"
313print "";
e51764ad 314print "/* Generator files may not have access to location_t, and don't need these. */"
315print "#if defined(UNKNOWN_LOCATION)"
fbb6fbd8 316print "bool "
317print "common_handle_option_auto (struct gcc_options *opts, "
318print " struct gcc_options *opts_set, "
319print " const struct cl_decoded_option *decoded, "
320print " unsigned int lang_mask, int kind, "
321print " location_t loc, "
322print " const struct cl_option_handlers *handlers, "
323print " diagnostic_context *dc); "
d3b7ee7c 324for (i = 0; i < n_langs; i++) {
325 lang_name = lang_sanitized_name(langs[i]);
8e18705e 326 print "bool"
327 print lang_name "_handle_option_auto (struct gcc_options *opts,"
328 print " struct gcc_options *opts_set,"
329 print " size_t scode, const char *arg,"
330 print " HOST_WIDE_INT value,"
331 print " unsigned int lang_mask, int kind,"
332 print " location_t loc,"
333 print " const struct cl_option_handlers *handlers,"
334 print " diagnostic_context *dc);"
d3b7ee7c 335}
3636964b 336print "void cpp_handle_option_auto (const struct gcc_options * opts, size_t scode,"
337print " struct cpp_options * cpp_opts);"
338print "void init_global_opts_from_cpp(struct gcc_options * opts, "
339print " const struct cpp_options * cpp_opts);"
fbb6fbd8 340print "#endif";
46f8e3b0 341print "#endif";
342print "";
343
ff05e09e 344for (i = 0; i < n_opts; i++) {
345 name = opt_args("Mask", flags[i])
dbc6e347 346 if (name == "") {
347 opt = opt_args("InverseMask", flags[i])
348 if (opt ~ ",")
349 name = nth_arg(0, opt)
350 else
351 name = opt
c5e839cb 352 }
dbc6e347 353 if (name != "" && mask_bits[name] == 0) {
354 mask_bits[name] = 1
355 vname = var_name(flags[i])
356 mask = "MASK_"
e16d8ad0 357 mask_1 = "1U"
dbc6e347 358 if (vname != "") {
359 mask = "OPTION_MASK_"
360 if (host_wide_int[vname] == "yes")
e16d8ad0 361 mask_1 = "HOST_WIDE_INT_1U"
5fcf082c 362 } else
363 extra_mask_bits[name] = 1
72ec6882 364 print "#define " mask name " (" mask_1 " << " masknum[vname]++ ")"
dbc6e347 365 }
ff05e09e 366}
a9341855 367for (i = 0; i < n_extra_masks; i++) {
5fcf082c 368 if (extra_mask_bits[extra_masks[i]] == 0)
e16d8ad0 369 print "#define MASK_" extra_masks[i] " (1U << " masknum[""]++ ")"
c5e839cb 370}
371
372for (var in masknum) {
72ec6882 373 if (var != "" && host_wide_int[var] == "yes") {
e16d8ad0 374 print "#if defined(HOST_BITS_PER_WIDE_INT) && " masknum[var] " > HOST_BITS_PER_WIDE_INT"
72ec6882 375 print "#error too many masks for " var
376 print "#endif"
377 }
e16d8ad0 378 else if (masknum[var] > 32) {
c5e839cb 379 if (var == "")
380 print "#error too many target masks"
381 else
382 print "#error too many masks for " var
383 }
a9341855 384}
ff05e09e 385print ""
386
387for (i = 0; i < n_opts; i++) {
388 name = opt_args("Mask", flags[i])
dbc6e347 389 if (name == "") {
390 opt = opt_args("InverseMask", flags[i])
391 if (opt ~ ",")
392 name = nth_arg(0, opt)
393 else
394 name = opt
c5e839cb 395 }
dbc6e347 396 if (name != "" && mask_macros[name] == 0) {
397 mask_macros[name] = 1
398 vname = var_name(flags[i])
dbc6e347 399 mask = "OPTION_MASK_"
400 if (vname == "") {
401 vname = "target_flags"
dbc6e347 402 mask = "MASK_"
5fcf082c 403 extra_mask_macros[name] = 1
dbc6e347 404 }
66da3ba4 405 print "#define TARGET_" name \
c5e839cb 406 " ((" vname " & " mask name ") != 0)"
55310327 407 print "#define TARGET_" name "_P(" vname ")" \
e16d8ad0 408 " (((" vname ") & " mask name ") != 0)"
dbc6e347 409 }
ff05e09e 410}
a9341855 411for (i = 0; i < n_extra_masks; i++) {
5fcf082c 412 if (extra_mask_macros[extra_masks[i]] == 0)
413 print "#define TARGET_" extra_masks[i] \
414 " ((target_flags & MASK_" extra_masks[i] ") != 0)"
a9341855 415}
ff05e09e 416print ""
417
418for (i = 0; i < n_opts; i++) {
419 opt = opt_args("InverseMask", flags[i])
c490c13b 420 if (opt ~ ",") {
421 vname = var_name(flags[i])
c490c13b 422 mask = "OPTION_MASK_"
423 if (vname == "") {
424 vname = "target_flags"
c490c13b 425 mask = "MASK_"
426 }
66da3ba4 427 print "#define TARGET_" nth_arg(1, opt) \
c490c13b 428 " ((" vname " & " mask nth_arg(0, opt) ") == 0)"
429 }
ff05e09e 430}
431print ""
e8b212b8 432
433for (i = 0; i < n_langs; i++) {
d3b7ee7c 434 macros[i] = "CL_" lang_sanitized_name(langs[i])
e8b212b8 435 s = substr(" ", length (macros[i]))
607eb2c8 436 print "#define " macros[i] s " (1U << " i ")"
e8b212b8 437 }
607eb2c8 438print "#define CL_LANG_ALL ((1U << " n_langs ") - 1)"
e8b212b8 439
440print ""
441print "enum opt_code"
442print "{"
443
444for (i = 0; i < n_opts; i++)
445 back_chain[i] = "N_OPTS";
446
67089c6b 447enum_value = 0
a324cccc 448for (i = 0; i < n_opts; i++) {
449 # Combine the flags of identical switches. Switches
450 # appear many times if they are handled by many front
451 # ends, for example.
452 while( i + 1 != n_opts && opts[i] == opts[i + 1] ) {
453 flags[i + 1] = flags[i] " " flags[i + 1];
454 i++;
455 }
e8b212b8 456
457 len = length (opts[i]);
d4c7816a 458 enum = opt_enum(opts[i])
67089c6b 459 enum_string = enum " = " enum_value ","
460
461 # Aliases do not get enumeration names.
0b1d266f 462 if ((flag_set_p("Alias.*", flags[i]) \
463 && !flag_set_p("SeparateAlias", flags[i])) \
464 || flag_set_p("Ignore", flags[i])) {
67089c6b 465 enum_string = "/* " enum_string " */"
466 }
e8b212b8 467
468 # If this switch takes joined arguments, back-chain all
469 # subsequent switches to it for which it is a prefix. If
470 # a later switch S is a longer prefix of a switch T, T
471 # will be back-chained to S in a later iteration of this
472 # for() loop, which is what we want.
a150399d 473 if (flag_set_p("Joined.*", flags[i])) {
e8b212b8 474 for (j = i + 1; j < n_opts; j++) {
475 if (substr (opts[j], 1, len) != opts[i])
476 break;
477 back_chain[j] = enum;
478 }
479 }
480
67089c6b 481 s = substr(" ",
482 length (enum_string))
e8b212b8 483
484 if (help[i] == "")
485 hlp = "0"
486 else
487 hlp = "N_(\"" help[i] "\")";
488
67089c6b 489 print " " enum_string s "/* -" opts[i] " */"
490 enum_value++
e8b212b8 491}
492
615ef0bb 493print " N_OPTS,"
494print " OPT_SPECIAL_unknown,"
3b0273a1 495print " OPT_SPECIAL_ignore,"
0c46a085 496print " OPT_SPECIAL_deprecated,"
615ef0bb 497print " OPT_SPECIAL_program_name,"
498print " OPT_SPECIAL_input_file"
e8b212b8 499print "};"
500print ""
b20a8bb4 501print "#ifdef GCC_C_COMMON_C"
7ff8db31 502print "/* Mapping from cpp message reasons to the options that enable them. */"
503print "#include <cpplib.h>"
504print "struct cpp_reason_option_codes_t"
505print "{"
fb225cf1 506print " /* cpplib message reason. */"
507print " const enum cpp_warning_reason reason;"
508print " /* gcc option that controls this message. */"
509print " const int option_code;"
7ff8db31 510print "};"
511print ""
512print "static const struct cpp_reason_option_codes_t cpp_reason_option_codes[] = {"
513for (i = 0; i < n_opts; i++) {
514 # With identical flags, pick only the last one. The
515 # earlier loop ensured that it has all flags merged,
516 # and a nonempty help text if one of the texts was nonempty.
517 while( i + 1 != n_opts && opts[i] == opts[i + 1] ) {
518 i++;
519 }
520 cpp_reason = nth_arg(0, opt_args("CppReason", flags[i]));
521 if (cpp_reason != "") {
522 cpp_reason = cpp_reason ",";
523 printf(" {%-40s %s},\n", cpp_reason, opt_enum(opts[i]))
524 }
525}
526printf(" {%-40s 0},\n", "CPP_W_NONE,")
527print "};"
528print "#endif"
529print ""
e8b212b8 530print "#endif /* OPTIONS_H */"
531}