aboutsummaryrefslogtreecommitdiff
path: root/gcc/optc-gen.awk
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/optc-gen.awk')
-rw-r--r--gcc/optc-gen.awk112
1 files changed, 85 insertions, 27 deletions
diff --git a/gcc/optc-gen.awk b/gcc/optc-gen.awk
index 61dbe8c..1d46a5d 100644
--- a/gcc/optc-gen.awk
+++ b/gcc/optc-gen.awk
@@ -30,6 +30,50 @@
# 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 != "") {
+ enabledby_name = enabledby_arg;
+ enabledby_index = opt_numbers[enabledby_name];
+ if (enabledby_index == "") {
+ print "#error Enabledby: " enabledby_name
+ } else {
+ if (enables[enabledby_name] == "") {
+ enabledby[n_enabledby] = enabledby_name;
+ n_enabledby++;
+ }
+ enables[enabledby_name] = enables[enabledby_name] opts[i] ",";
+ }
+ }
+
+ enabledby_arg = opt_args("LangEnabledBy", flags[i]);
+ if (enabledby_arg != "") {
+ n_enabledby_arg_langs = split(nth_arg(0, enabledby_arg), enabledby_arg_langs, " ");
+ enabledby_name = nth_arg(1, enabledby_arg);
+ enabledby_index = opt_numbers[enabledby_name];
+ if (enabledby_index == "") {
+ print "#error Enabledby: " enabledby_name
+ } else {
+ for (j = 1; j <= n_enabledby_arg_langs; j++) {
+ lang_name = lang_sanitized_name(enabledby_arg_langs[j]);
+ lang_index = lang_numbers[enabledby_arg_langs[j]];
+ if (enables[lang_name,enabledby_name] == "") {
+ enabledby[lang_name,n_enabledby_lang[lang_index]] = enabledby_name;
+ n_enabledby_lang[lang_index]++;
+ }
+ enables[lang_name,enabledby_name] = enables[lang_name,enabledby_name] opts[i] ",";
+ }
+ }
+ }
+}
+
+
print "/* This file is auto-generated by optc-gen.awk. */"
print ""
n_headers = split(header_name, headers, " ")
@@ -161,8 +205,7 @@ print ""
print "const char * const lang_names[] =\n{"
for (i = 0; i < n_langs; i++) {
- macros[i] = "CL_" langs[i]
- gsub( "[^" alnum "_]", "X", macros[i] )
+ macros[i] = "CL_" lang_sanitized_name(langs[i])
s = substr(" ", length (macros[i]))
print " " quote langs[i] quote ","
}
@@ -342,30 +385,6 @@ print " gcc_assert (decoded->canonical_option_num_elements <= 2); "
print " "
print " switch (code) "
print " { "
-n_enabledby = 0;
-for (i = 0; i < n_opts; i++) {
- # With identical flags, pick only the last one. The
- # earlier loop ensured that it has all flags merged,
- # and a nonempty help text if one of the texts was nonempty.
- while( i + 1 != n_opts && opts[i] == opts[i + 1] ) {
- i++;
- }
- enabledby_arg = opt_args("EnabledBy", flags[i]);
- if (enabledby_arg != "") {
- enabledby_name = enabledby_arg;
- enabledby_index = opt_numbers[enabledby_name];
- if (enabledby_index == "") {
- print "#error Enabledby: " enabledby_name
- } else {
- enabledby_var_name = var_name(flags[enabledby_index]);
- if (enables[enabledby_name] == "") {
- enabledby[n_enabledby] = enabledby_name;
- n_enabledby++;
- }
- enables[enabledby_name] = enables[enabledby_name] opts[i] ",";
- }
- }
-}
for (i = 0; i < n_enabledby; i++) {
enabledby_name = enabledby[i];
print " case " opt_enum(enabledby_name) ":"
@@ -378,7 +397,6 @@ for (i = 0; i < n_enabledby; i++) {
print " lang_mask, kind, loc, handlers, dc);"
}
print " break;\n"
-
}
print " default: "
print " break; "
@@ -386,4 +404,44 @@ print " } "
print " return true; "
print "} "
+# Handle LangEnabledBy
+for (i = 0; i < n_langs; i++) {
+ lang_name = lang_sanitized_name(langs[i]);
+ mark_unused = " ATTRIBUTE_UNUSED";
+
+ print "\n\n"
+ print "bool "
+ print lang_name "_handle_option_auto (struct gcc_options *opts" mark_unused ", "
+ print " struct gcc_options *opts_set" mark_unused ", "
+ print " size_t scode" mark_unused ", const char *arg" mark_unused ", int value" mark_unused ", "
+ print " unsigned int lang_mask" mark_unused ", int kind" mark_unused ", "
+ print " location_t loc" mark_unused ", "
+ print " const struct cl_option_handlers *handlers" mark_unused ", "
+ print " diagnostic_context *dc" mark_unused ") "
+ print "{ "
+ print " enum opt_code code = (enum opt_code) scode; "
+ print " "
+ print " switch (code) "
+ print " { "
+
+ for (k = 0; k < n_enabledby_lang[i]; k++) {
+ enabledby_name = enabledby[lang_name,k];
+ print " case " opt_enum(enabledby_name) ":"
+ n_enables = split(enables[lang_name,enabledby_name], thisenable, ",");
+ for (j = 1; j < n_enables; j++) {
+ opt_var_name = var_name(flags[opt_numbers[thisenable[j]]]);
+ print " if (!opts_set->x_" opt_var_name ")"
+ print " handle_generated_option (opts, opts_set,"
+ print " " opt_enum(thisenable[j]) ", arg, value,"
+ print " lang_mask, kind, loc, handlers, dc);"
+ }
+ print " break;\n"
+ }
+ print " default: "
+ print " break; "
+ print " } "
+ print " return true; "
+ print "} "
+}
+
}