Segher Boessenkool <[email protected]> writes:
> Hi!
>
> On Sat, Mar 20, 2021 at 10:53:32AM -0400, Vladimir Makarov via Gcc-patches
> wrote:
>> It seems CONSTRAINT_LEN treats constraint '\0' as one having length 1.
>
> Maybe we should fix that? See attached patch.
I don't strongly object, but CONSTRAINT_LEN (0) doesn't feel to me like a
question we should be asking. IMO it would be confusing to have, say:
p += CONSTRAINT_LEN (*p);
“stick” at a null terminator even though the code is notionally
an increment.
'\0' is just a normal string null terminator and so I don't think we
should be processing it as if it were a constraint character.
How about having a gcc_unreachable on zero instead?
Thanks,
Richard
> Segher
>
>
> diff --git a/gcc/genpreds.c b/gcc/genpreds.c
> index 8499a2a2383b..b83a030d6a5d 100644
> --- a/gcc/genpreds.c
> +++ b/gcc/genpreds.c
> @@ -1141,6 +1141,9 @@ write_insn_constraint_len (void)
> " switch (fc)\n"
> " {");
>
> + /* Empty constraints have length 0. */
> + printf (" case 0: return 0;\n");
> +
> for (i = 0; i < ARRAY_SIZE (constraints_by_letter_table); i++)
> {
> class constraint_data *c = constraints_by_letter_table[i];
> @@ -1470,14 +1473,9 @@ write_tm_preds_h (void)
> address_start, address_end);
> write_allows_reg_mem_function ();
>
> - if (constraint_max_namelen > 1)
> - {
> - write_insn_constraint_len ();
> - puts ("#define CONSTRAINT_LEN(c_,s_) "
> - "insn_constraint_len (c_,s_)\n");
> - }
> - else
> - puts ("#define CONSTRAINT_LEN(c_,s_) 1\n");
> + write_insn_constraint_len ();
> + puts ("#define CONSTRAINT_LEN(c_,s_) insn_constraint_len (c_,s_)\n");
> +
> if (have_register_constraints)
> puts ("extern enum reg_class reg_class_for_constraint_1 "
> "(enum constraint_num);\n"