aboutsummaryrefslogtreecommitdiff
path: root/gcc/params.c
diff options
context:
space:
mode:
authorTom de Vries <tom@codesourcery.com>2015-10-13 10:08:50 +0000
committerTom de Vries <vries@gcc.gnu.org>2015-10-13 10:08:50 +0000
commitd78182cc0ce05104e2f1cd40c97de974f075479f (patch)
tree89563bd3c31401b7aa9c038829d9746e20a87a34 /gcc/params.c
parent7fd103efccee2a5706df7ffafae9315995edd841 (diff)
downloadgcc-d78182cc0ce05104e2f1cd40c97de974f075479f.zip
gcc-d78182cc0ce05104e2f1cd40c97de974f075479f.tar.gz
gcc-d78182cc0ce05104e2f1cd40c97de974f075479f.tar.bz2
Support DEFPARAMENUM in params.def
2015-10-13 Tom de Vries <tom@codesourcery.com> * 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
Diffstat (limited to 'gcc/params.c')
-rw-r--r--gcc/params.c97
1 files changed, 74 insertions, 23 deletions
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