X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=gcc%2Foptc-gen.awk;h=738cb5a26a7e594903c93133a91c945626de292e;hb=4d8cd3a26294ce35abb17668eac2b6c38dd23bd0;hp=e28c397f48a9a3614d58a172c34b21d855c7d0f6;hpb=c944d49b3bd3667c65c299afd3b1d756084203f4;p=platform%2Fupstream%2Fgcc48.git diff --git a/gcc/optc-gen.awk b/gcc/optc-gen.awk index e28c397..738cb5a 100644 --- a/gcc/optc-gen.awk +++ b/gcc/optc-gen.awk @@ -1,5 +1,4 @@ -# Copyright (C) 2003, 2004, 2007, 2008, 2009, 2010, 2011 -# Free Software Foundation, Inc. +# Copyright (C) 2003-2013 Free Software Foundation, Inc. # Contributed by Kelley Cook, June 2004. # Original code from Neil Booth, May 2003. # @@ -30,6 +29,58 @@ # 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 != "") { + n_enabledby_names = split(enabledby_arg, enabledby_names, " && "); + if (n_enabledby_names > 2) { + print "#error EnabledBy (Wfoo && Wbar && Wbaz) not currently supported" + } + for (j = 1; j <= n_enabledby_names; j++) { + enabledby_name = enabledby_names[j]; + enabledby_index = opt_numbers[enabledby_name]; + if (enabledby_index == "") { + print "#error Enabledby: " enabledby_name + } else { + condition = ""; + if (n_enabledby_names == 2) { + opt_var_name_1 = search_var_name(enabledby_names[1], opt_numbers, opts, flags, n_opts); + opt_var_name_2 = search_var_name(enabledby_names[2], opt_numbers, opts, flags, n_opts); + if (opt_var_name_1 == "") { + print "#error " enabledby_names[1] " does not have a Var() flag" + } + if (opt_var_name_2 == "") { + print "#error " enabledby_names[2] " does not have a Var() flag" + } + condition = "opts->x_" opt_var_name_1 " && opts->x_" opt_var_name_2; + } + if (enables[enabledby_name] == "") { + enabledby[n_enabledby] = enabledby_name; + n_enabledby++; + } + enables[enabledby_name] = enables[enabledby_name] opts[i] ";"; + enablesif[enabledby_name] = enablesif[enabledby_name] condition ";"; + } + } + } + + enabledby_arg = opt_args("LangEnabledBy", flags[i]); + if (enabledby_arg != "") { + enabledby_langs = nth_arg(0, enabledby_arg); + enabledby_name = nth_arg(1, enabledby_arg); + enabledby_posarg = nth_arg(2, enabledby_arg); + enabledby_negarg = nth_arg(3, enabledby_arg); + lang_enabled_by(enabledby_langs, enabledby_name, enabledby_posarg, enabledby_negarg); + } +} + + print "/* This file is auto-generated by optc-gen.awk. */" print "" n_headers = split(header_name, headers, " ") @@ -161,8 +212,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 "," } @@ -188,9 +238,9 @@ for (i = 0; i < n_opts; i++) { if (help[i + 1] == "") help[i + 1] = help[i] else if (help[i] != "" && help[i + 1] != help[i]) - print "warning: multiple different help strings for " \ - opts[i] ":\n\t" help[i] "\n\t" help[i + 1] \ - | "cat 1>&2" + print "#error Multiple different help strings for " \ + opts[i] ":\n\t" help[i] "\n\t" help[i + 1] + i++; back_chain[i] = "N_OPTS"; indices[opts[i]] = j; @@ -324,4 +374,108 @@ for (i = 0; i < n_opts; i++) { print "};" +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 "} " +} + }