Hi!

On Thu, Jun 17, 2021 at 10:18:59AM -0500, Bill Schmidt wrote:
>       * config/rs6000/rs6000-gen-builtins.c (complete_vector_type): New
>       function.
>       (complete_base_type): Likewise.
>       (construct_fntype_id): Likewise.
>       (parse_bif_entry): Call contruct_fntype_id.
>       (parse_ovld_entry): Likewise.

> +/* Convert a vector type into a mode string.  */
> +static void
> +complete_vector_type (typeinfo *typeptr, char *buf, int *bufi)
> +{
> +  if (typeptr->isbool)
> +    buf[(*bufi)++] = 'b';
> +  buf[(*bufi)++] = 'v';
> +  if (typeptr->ispixel)
> +    {
> +      memcpy (&buf[*bufi], "p8hi", 4);
> +      *bufi += 4;

      return;
    }

> +  else

... and then you don't need this, and everything after this loses a
level of indentation.  The power of early outs :-)

> +/* Build a function type descriptor identifier from the return type
> +   and argument types described by PROTOPTR, and store it if it does
> +   not already exist.  Return the identifier.  */
> +static char *
> +construct_fntype_id (prototype *protoptr)
> +{
> +  /* Determine the maximum space for a function type descriptor id.
> +     Each type requires at most 9 characters (6 for the mode*, 1 for
> +     the optional 'u' preceding the mode, 1 for the optional 'p'
> +     preceding the mode, and 1 for an underscore following the mode).
> +     We also need 5 characters for the string "ftype" that separates
> +     the return mode from the argument modes.  The last argument doesn't
> +     need a trailing underscore, but we count that as the one trailing
> +     "ftype" instead.  For the special case of zero arguments, we need 9
> +     for the return type and 7 for "ftype_v".  Finally, we need one
> +     character for the terminating null.  Thus for a function with N
> +     arguments, we need at most 9N+15 characters for N>0, otherwise 17.
> +     ----
> +       *Worst case is bv16qi for "vector bool char".  */
> +  int len = protoptr->nargs ? (protoptr->nargs + 1) * 9 + 6 : 17;
> +  char *buf = (char *) malloc (len);

I would completely avoid all this by using asprintf.  But that requires
a little restructuring, so *shrug* (it could use some factoring anyway,
but we don't need this to be perfect ;-) )

> +      assert (!argptr);
> +      }

Formatting here is broken...  Probably that last line has two spaces
to many, but please check.

> +  /* Ignore return value, as duplicates are expected.  */
> +  (void) rbt_insert (&fntype_rbt, buf);

Casting to void does not ignore a return value.  But is rbt_insert
marked up as warn_unused_result anyway?  Simply not using the return
value is fine as well.  If you want to be very explicit, you can write

  if (rbt_insert (&fntype_rbt, buf))
    ; /* Duplicates are fine and expected here.  */

Okay for trunk with or without such improvements.  But do fix that
indentation thing please ;-)  Thanks!


Segher

Reply via email to