summaryrefslogtreecommitdiff
path: root/gcc/opts-common.cc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/opts-common.cc')
-rw-r--r--gcc/opts-common.cc45
1 files changed, 32 insertions, 13 deletions
diff --git a/gcc/opts-common.cc b/gcc/opts-common.cc
index fb5d953968c..1663be1f602 100644
--- a/gcc/opts-common.cc
+++ b/gcc/opts-common.cc
@@ -811,8 +811,8 @@ decode_cmdline_option (const char *const *argv, unsigned int lang_mask,
{
const struct cl_enum *e = &cl_enums[option->var_enum];
- gcc_assert (option->var_value || value == 1);
- if (option->var_value)
+ gcc_assert (option->var_value != CLEV_NORMAL || value == 1);
+ if (option->var_value != CLEV_NORMAL)
{
const char *p = arg;
HOST_WIDE_INT sum_value = 0;
@@ -834,19 +834,30 @@ decode_cmdline_option (const char *const *argv, unsigned int lang_mask,
break;
}
- unsigned set = e->values[idx].flags >> CL_ENUM_SET_SHIFT;
- gcc_checking_assert (set >= 1 && set <= HOST_BITS_PER_WIDE_INT);
- if ((used_sets & (HOST_WIDE_INT_1U << (set - 1))) != 0)
+ HOST_WIDE_INT this_mask = 0;
+ if (option->var_value == CLEV_SET)
{
- errors |= CL_ERR_ENUM_SET_ARG;
- break;
+ unsigned set = e->values[idx].flags >> CL_ENUM_SET_SHIFT;
+ gcc_checking_assert (set >= 1
+ && set <= HOST_BITS_PER_WIDE_INT);
+ if ((used_sets & (HOST_WIDE_INT_1U << (set - 1))) != 0)
+ {
+ errors |= CL_ERR_ENUM_SET_ARG;
+ break;
+ }
+ used_sets |= HOST_WIDE_INT_1U << (set - 1);
+
+ for (int i = 0; e->values[i].arg != NULL; i++)
+ if (set == (e->values[i].flags >> CL_ENUM_SET_SHIFT))
+ this_mask |= e->values[i].value;
+ }
+ else
+ {
+ gcc_assert (option->var_value == CLEV_BITSET
+ && ((e->values[idx].flags >> CL_ENUM_SET_SHIFT)
+ == 0));
+ this_mask = this_value;
}
- used_sets |= HOST_WIDE_INT_1U << (set - 1);
-
- HOST_WIDE_INT this_mask = 0;
- for (int i = 0; e->values[i].arg != NULL; i++)
- if (set == (e->values[i].flags >> CL_ENUM_SET_SHIFT))
- this_mask |= e->values[i].value;
sum_value |= this_value;
mask |= this_mask;
@@ -1430,6 +1441,14 @@ cmdline_handle_error (location_t loc, const struct cl_option *option,
break;
}
+ if (option->var_value == CLEV_BITSET)
+ {
+ if (q == NULL)
+ break;
+ p = q + 1;
+ continue;
+ }
+
unsigned set = e->values[idx].flags >> CL_ENUM_SET_SHIFT;
gcc_checking_assert (set >= 1 && set <= HOST_BITS_PER_WIDE_INT);
if ((used_sets & (HOST_WIDE_INT_1U << (set - 1))) != 0)