From d78182cc0ce05104e2f1cd40c97de974f075479f Mon Sep 17 00:00:00 2001 From: Tom de Vries Date: Tue, 13 Oct 2015 10:08:50 +0000 Subject: Support DEFPARAMENUM in params.def 2015-10-13 Tom de Vries * Makefile.in (PARAMS_H, PLUGIN_HEADERS): Add params-enum.h. * params-enum.h: New file. * opts.c (handle_param): Handle case that param arg is a string. * params-list.h: Handle DEFPARAMENUM5 in params.def. * params.c (find_param): New function, factored out of ... (set_param_value): ... here. (param_string_value_p): New function. * params.h (struct param_info): Add value_names field. (find_param, param_string_value_p): Declare. From-SVN: r228755 --- gcc/params.c | 97 ++++++++++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 74 insertions(+), 23 deletions(-) (limited to 'gcc/params.c') diff --git a/gcc/params.c b/gcc/params.c index b0bc80b..d58d81e 100644 --- a/gcc/params.c +++ b/gcc/params.c @@ -23,6 +23,7 @@ along with GCC; see the file COPYING3. If not see #include "coretypes.h" #include "common/common-target.h" #include "params.h" +#include "params-enum.h" #include "diagnostic-core.h" /* An array containing the compiler parameters and their current @@ -37,12 +38,23 @@ static size_t num_compiler_params; default values determined. */ static bool params_finished; +#define DEFPARAM(ENUM, OPTION, HELP, DEFAULT, MIN, MAX) +#define DEFPARAMENUM5(ENUM, OPTION, HELP, DEFAULT, V0, V1, V2, V3, V4) \ + static const char *values_ ## ENUM [] = { #V0, #V1, #V2, #V3, #V4, NULL }; +#include "params.def" +#undef DEFPARAMENUM5 +#undef DEFPARAM + static const param_info lang_independent_params[] = { #define DEFPARAM(ENUM, OPTION, HELP, DEFAULT, MIN, MAX) \ - { OPTION, DEFAULT, MIN, MAX, HELP }, + { OPTION, DEFAULT, MIN, MAX, HELP, NULL }, +#define DEFPARAMENUM5(ENUM, OPTION, HELP, DEFAULT, \ + V0, V1, V2, V3, V4) \ + { OPTION, (int)ENUM ## _KIND_ ## DEFAULT, 0, 4, HELP, values_ ## ENUM }, #include "params.def" #undef DEFPARAM - { NULL, 0, 0, 0, NULL } +#undef DEFPARAMENUM5 + { NULL, 0, 0, 0, NULL, NULL } }; /* Add the N PARAMS to the current list of compiler parameters. */ @@ -114,6 +126,45 @@ set_param_value_internal (compiler_param num, int value, params_set[i] = true; } +/* Return true if it can find the matching entry for NAME in the parameter + table, and assign the entry index to INDEX. Return false otherwise. */ + +bool +find_param (const char *name, enum compiler_param *index) +{ + for (size_t i = 0; i < num_compiler_params; ++i) + if (strcmp (compiler_params[i].option, name) == 0) + { + *index = (enum compiler_param) i; + return true; + } + + return false; +} + +/* Return true if param with entry index INDEX should be defined using strings. + If so, return the value corresponding to VALUE_NAME in *VALUE_P. */ + +bool +param_string_value_p (enum compiler_param index, const char *value_name, + int *value_p) +{ + param_info *entry = &compiler_params[(int) index]; + if (entry->value_names == NULL) + return false; + + *value_p = -1; + + for (int i = 0; entry->value_names[i] != NULL; ++i) + if (strcmp (entry->value_names[i], value_name) == 0) + { + *value_p = i; + return true; + } + + return true; +} + /* Set the VALUE associated with the parameter given by NAME in PARAMS and PARAMS_SET. */ @@ -126,27 +177,27 @@ set_param_value (const char *name, int value, /* Make sure nobody tries to set a parameter to an invalid value. */ gcc_assert (value != INVALID_PARAM_VAL); - /* Scan the parameter table to find a matching entry. */ - for (i = 0; i < num_compiler_params; ++i) - if (strcmp (compiler_params[i].option, name) == 0) - { - if (value < compiler_params[i].min_value) - error ("minimum value of parameter %qs is %u", - compiler_params[i].option, - compiler_params[i].min_value); - else if (compiler_params[i].max_value > compiler_params[i].min_value - && value > compiler_params[i].max_value) - error ("maximum value of parameter %qs is %u", - compiler_params[i].option, - compiler_params[i].max_value); - else - set_param_value_internal ((compiler_param) i, value, - params, params_set, true); - return; - } - - /* If we didn't find this parameter, issue an error message. */ - error ("invalid parameter %qs", name); + enum compiler_param index; + if (!find_param (name, &index)) + { + /* If we didn't find this parameter, issue an error message. */ + error ("invalid parameter %qs", name); + return; + } + i = (size_t)index; + + if (value < compiler_params[i].min_value) + error ("minimum value of parameter %qs is %u", + compiler_params[i].option, + compiler_params[i].min_value); + else if (compiler_params[i].max_value > compiler_params[i].min_value + && value > compiler_params[i].max_value) + error ("maximum value of parameter %qs is %u", + compiler_params[i].option, + compiler_params[i].max_value); + else + set_param_value_internal ((compiler_param) i, value, + params, params_set, true); } /* Set the value of the parameter given by NUM to VALUE in PARAMS and -- cgit v1.1