Hi, Richard,
In order to be consistent with other flags in flag-types.h, for example,
“sanitize_code”,
I didn’t use namespace, instead making the name more specific as following:
/* Different settings for zeroing subset of registers. */
enum zero_regs_flags {
ZERO_REGS_UNSET = 0,
ZERO_REGS_SKIP = 1UL << 0,
ZERO_REGS_ONLY_USED = 1UL << 1,
ZERO_REGS_ONLY_GPR = 1UL << 2,
ZERO_REGS_ONLY_ARG = 1UL << 3,
ZERO_REGS_ENABLED = 1UL << 4,
ZERO_REGS_USED_GPR_ARG = ZERO_REGS_ENABLED | ZERO_REGS_ONLY_USED
| ZERO_REGS_ONLY_GPR | ZERO_REGS_ONLY_ARG,
ZERO_REGS_USED_GPR = ZERO_REGS_ENABLED | ZERO_REGS_ONLY_USED
| ZERO_REGS_ONLY_GPR,
ZERO_REGS_USED_ARG = ZERO_REGS_ENABLED | ZERO_REGS_ONLY_USED
| ZERO_REGS_ONLY_ARG,
ZERO_REGS_USED = ZERO_REGS_ENABLED | ZERO_REGS_ONLY_USED,
ZERO_REGS_ALL_GPR_ARG = ZERO_REGS_ENABLED | ZERO_REGS_ONLY_GPR
| ZERO_REGS_ONLY_ARG,
ZERO_REGS_ALL_GPR = ZERO_REGS_ENABLED | ZERO_REGS_ONLY_GPR,
ZERO_REGS_ALL_ARG = ZERO_REGS_ENABLED | ZERO_REGS_ONLY_ARG,
ZERO_REGS_ALL = ZERO_REGS_ENABLED
};
Is this good?
Or you still prefer namespace?
thanks.
Qing
> On Oct 27, 2020, at 10:36 AM, Richard Sandiford <[email protected]>
> wrote:
>
> Qing Zhao <[email protected]> writes:
>>>> diff --git a/gcc/flag-types.h b/gcc/flag-types.h
>>>> index 852ea76..0f7e503 100644
>>>> --- a/gcc/flag-types.h
>>>> +++ b/gcc/flag-types.h
>>>> @@ -285,6 +285,15 @@ enum sanitize_code {
>>>> | SANITIZE_BOUNDS_STRICT
>>>> };
>>>>
>>>> +enum zero_call_used_regs_code {
>>>> + UNSET = 0,
>>>> + SKIP = 1UL << 0,
>>>> + ONLY_USED = 1UL << 1,
>>>> + ONLY_GPR = 1UL << 2,
>>>> + ONLY_ARG = 1UL << 3,
>>>> + ALL = 1UL << 4
>>>> +};
>>>
>>> I'd suggested these names on the assumption that we'd be using
>>> a C++ enum class, so that the enum would be referenced as
>>> name::ALL, name::SKIP, etc. But I guess using a C++ enum class
>>> doesn't work well with bitfields after all.
>>>
>>> These names are too generic without the name:: scoping though.
>>> Perhaps we should put them in a namespace:
>>>
>>> namespace zero_regs_flags {
>>> const unsigned int UNSET = 0;
>>> …etc…
>>> }
>>>
>>> (call-used probably doesn't need to be part of the flag names,
>>> since the concept is more general than that and call-usedness
>>> is really a filter that's being applied on top. Although I guess
>>> the same is true of “zero”. ;-))
>>>
>>> I don't think we should have ALL as a separate flag: ALL is the absence
>>> of ONLY_*. Maybe we should have an ENABLED flag that all non-skip
>>> combinations use?
>>>
>>> If it makes things easier, I think it would be good to have e.g.:
>>>
>>> unsigned int USED_GPR = ENABLED | ONLY_USED | ONLY_GPR;
>>>
>>> inside the namespace, to reduce the verbosity in the option table.
>>
>> Then, the final namespace will look like:
>>
>> namespace zero_regs_flags {
>> const unsigned int UNSET = 0;
>> const unsigned int SKIP = 1UL << 0;
>> const unsigned int ONLY_USED = 1UL << 1;
>> const unsigned int ONLY_GPR = 1UL << 2;
>> const unsigned int ONLY_ARG = 1UL << 3;
>> const unsigned int ENABLED = 1UL << 4;
>> const unsigned int USED_GPR_ARG = ONLY_USED | ONLY_GPR | ONLY_ARG;
>
> “ENABLED |” here
>
>> const unsigned int USED_GPR = ENABLED | ONLY_USED | ONLY_GPR;
>> const unsigned int USED_ARG = ENABLED | ONLY_USED | ONLY_ARG;
>> const unsigned int USED = ENABLED | ONLY_USED;
>> const unsigned int ALL_GRP_ARG = ENABLED | ONLY_GPR | ONLY_ARG;
>
> GPR
>
>> const unsigned int ALL_GPR = ENABLED | ONLY_GPR;
>> const unsigned int ALL_ARG = ENABLED | ONLY_ARG;
>> const unsigned int ALL = ENABLED;
>> }
>>
>> ??
>