diff options
Diffstat (limited to 'gcc/optc-gen.awk')
-rw-r--r-- | gcc/optc-gen.awk | 112 |
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 "} " +} + } |