+print "\n\n"
+print "bool "
+print "common_handle_option_auto (struct gcc_options *opts, "
+print " struct gcc_options *opts_set, "
+print " const struct cl_decoded_option *decoded, "
+print " unsigned int lang_mask, int kind, "
+print " location_t loc, "
+print " const struct cl_option_handlers *handlers, "
+print " diagnostic_context *dc) "
+print "{ "
+print " size_t scode = decoded->opt_index; "
+print " int value = decoded->value; "
+print " enum opt_code code = (enum opt_code) scode; "
+print " "
+print " gcc_assert (decoded->canonical_option_num_elements <= 2); "
+print " "
+print " switch (code) "
+print " { "
+# Handle EnabledBy
+for (i = 0; i < n_enabledby; i++) {
+ enabledby_name = enabledby[i];
+ print " case " opt_enum(enabledby_name) ":"
+ n_enables = split(enables[enabledby_name], thisenable, ";");
+ n_enablesif = split(enablesif[enabledby_name], thisenableif, ";");
+ if (n_enables != n_enablesif) {
+ print "#error n_enables != n_enablesif: Something went wrong!"
+ }
+ for (j = 1; j < n_enables; j++) {
+ opt_var_name = var_name(flags[opt_numbers[thisenable[j]]]);
+ if (opt_var_name != "") {
+ condition = "!opts_set->x_" opt_var_name
+ if (thisenableif[j] != "") {
+ condition = condition " && (" thisenableif[j] ")"
+ }
+ print " if (" condition ")"
+ print " handle_generated_option (opts, opts_set,"
+ print " " opt_enum(thisenable[j]) ", NULL, value,"
+ print " lang_mask, kind, loc, handlers, dc);"
+ } else {
+ print "#error " thisenable[j] " does not have a Var() flag"
+ }
+ }
+ print " break;\n"
+}
+print " default: "
+print " break; "
+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_thisenable = split(enables[lang_name,enabledby_name], thisenable, ";");
+ for (j = 1; j < n_thisenable; j++) {
+ n_thisenable_args = split(thisenable[j], thisenable_args, ",");
+ if (n_thisenable_args == 1) {
+ thisenable_opt = thisenable[j];
+ value = "value";
+ } else {
+ thisenable_opt = thisenable_args[1];
+ with_posarg = thisenable_args[2];
+ with_negarg = thisenable_args[3];
+ value = "value ? " with_posarg " : " with_negarg;
+ }
+ opt_var_name = var_name(flags[opt_numbers[thisenable_opt]]);
+ if (opt_var_name != "") {
+ print " if (!opts_set->x_" opt_var_name ")"
+ print " handle_generated_option (opts, opts_set,"
+ print " " opt_enum(thisenable_opt) ", NULL, " value ","
+ print " lang_mask, kind, loc, handlers, dc);"
+ } else {
+ print "#error " thisenable_opt " does not have a Var() flag"
+ }
+ }
+ print " break;\n"
+ }
+ print " default: "
+ print " break; "
+ print " } "
+ print " return true; "
+ print "} "
+}
+