On Mon, May 14, 2018 at 8:37 AM, Alexander Monakov <amona...@ispras.ru> wrote:
> On Sun, 13 May 2018, H.J. Lu wrote:
>> This breaks bootstrap on Fedora 28/i686:
>>
>> https://gcc.gnu.org/ml/gcc-regression/2018-05/msg00088.html
>>
>> ../../src-trunk/gcc/sort.cc:112:5: note: in expansion of macro ‘REORDER_45’
>>      REORDER_45 (8, 8, 0);
>>      ^~~~~~~~~~
>> ../../src-trunk/gcc/sort.cc:100:10: error: ‘void* memcpy(void*, const
>> void*, size_t)’ forming offset [5, 8] is out of the bounds [0, 4] of
>> object ‘t2’ with type ‘size_t’ {aka ‘unsigned int’}
>> [-Werror=array-bounds]
>>    memcpy (&t2, e2 + OFFSET, SIZE);              \
>>    ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
>
> Hm, on 32-bit this is trivially dead code, I wonder why we issue the warning?
>
> In any case, due to PR 85757 it's desirable to use types with sizes matching
> the memcpy size; is the following OK to apply? Bootstrapped on 32-bit x86.

OK.

Richard.

>         * sort.cc (REORDER_23): Pass the type for the temporaries instead of
>         intended memcpy size.
>         (REORDER_45): Likewise.
> ---
>  gcc/sort.cc | 72 
> ++++++++++++++++++++++++++++++-------------------------------
>  1 file changed, 36 insertions(+), 36 deletions(-)
>
> diff --git a/gcc/sort.cc b/gcc/sort.cc
> index 4faf6d45dc6..c41683c91dd 100644
> --- a/gcc/sort.cc
> +++ b/gcc/sort.cc
> @@ -62,29 +62,29 @@ struct sort_ctx
>  static void
>  reorder23 (sort_ctx *c, char *e0, char *e1, char *e2)
>  {
> -#define REORDER_23(SIZE, STRIDE, OFFSET)        \
> -do {                                            \
> -  size_t t0, t1;                                \
> -  memcpy (&t0, e0 + OFFSET, SIZE);              \
> -  memcpy (&t1, e1 + OFFSET, SIZE);              \
> -  char *out = c->out + OFFSET;                  \
> -  if (likely (c->n == 3))                       \
> -    memcpy (out + 2*STRIDE, e2 + OFFSET, SIZE); \
> -  memcpy (out, &t0, SIZE); out += STRIDE;       \
> -  memcpy (out, &t1, SIZE);                      \
> +#define REORDER_23(TYPE, STRIDE, OFFSET)                 \
> +do {                                                     \
> +  TYPE t0, t1;                                           \
> +  memcpy (&t0, e0 + OFFSET, sizeof (TYPE));              \
> +  memcpy (&t1, e1 + OFFSET, sizeof (TYPE));              \
> +  char *out = c->out + OFFSET;                           \
> +  if (likely (c->n == 3))                                \
> +    memcpy (out + 2*STRIDE, e2 + OFFSET, sizeof (TYPE)); \
> +  memcpy (out, &t0, sizeof (TYPE)); out += STRIDE;       \
> +  memcpy (out, &t1, sizeof (TYPE));                      \
>  } while (0)
>
> -  if (sizeof (size_t) == 8 && likely (c->size == 8))
> -    REORDER_23 (8, 8, 0);
> -  else if (likely (c->size == 4))
> -    REORDER_23 (4, 4, 0);
> +  if (likely (c->size == sizeof (size_t)))
> +    REORDER_23 (size_t, sizeof (size_t), 0);
> +  else if (likely (c->size == sizeof (int)))
> +    REORDER_23 (int, sizeof (int), 0);
>    else
>      {
>        size_t offset = 0, step = sizeof (size_t);
>        for (; offset + step <= c->size; offset += step)
> -       REORDER_23 (step, c->size, offset);
> +       REORDER_23 (size_t, c->size, offset);
>        for (; offset < c->size; offset++)
> -       REORDER_23 (1, c->size, offset);
> +       REORDER_23 (char, c->size, offset);
>      }
>  }
>
> @@ -92,33 +92,33 @@ do {                                            \
>  static void
>  reorder45 (sort_ctx *c, char *e0, char *e1, char *e2, char *e3, char *e4)
>  {
> -#define REORDER_45(SIZE, STRIDE, OFFSET)        \
> -do {                                            \
> -  size_t t0, t1, t2, t3;                        \
> -  memcpy (&t0, e0 + OFFSET, SIZE);              \
> -  memcpy (&t1, e1 + OFFSET, SIZE);              \
> -  memcpy (&t2, e2 + OFFSET, SIZE);              \
> -  memcpy (&t3, e3 + OFFSET, SIZE);              \
> -  char *out = c->out + OFFSET;                  \
> -  if (likely (c->n == 5))                       \
> -    memcpy (out + 4*STRIDE, e4 + OFFSET, SIZE); \
> -  memcpy (out, &t0, SIZE); out += STRIDE;       \
> -  memcpy (out, &t1, SIZE); out += STRIDE;       \
> -  memcpy (out, &t2, SIZE); out += STRIDE;       \
> -  memcpy (out, &t3, SIZE);                      \
> +#define REORDER_45(TYPE, STRIDE, OFFSET)                 \
> +do {                                                     \
> +  TYPE t0, t1, t2, t3;                                   \
> +  memcpy (&t0, e0 + OFFSET, sizeof (TYPE));              \
> +  memcpy (&t1, e1 + OFFSET, sizeof (TYPE));              \
> +  memcpy (&t2, e2 + OFFSET, sizeof (TYPE));              \
> +  memcpy (&t3, e3 + OFFSET, sizeof (TYPE));              \
> +  char *out = c->out + OFFSET;                           \
> +  if (likely (c->n == 5))                                \
> +    memcpy (out + 4*STRIDE, e4 + OFFSET, sizeof (TYPE)); \
> +  memcpy (out, &t0, sizeof (TYPE)); out += STRIDE;       \
> +  memcpy (out, &t1, sizeof (TYPE)); out += STRIDE;       \
> +  memcpy (out, &t2, sizeof (TYPE)); out += STRIDE;       \
> +  memcpy (out, &t3, sizeof (TYPE));                      \
>  } while (0)
>
> -  if (sizeof (size_t) == 8 && likely (c->size == 8))
> -    REORDER_45 (8, 8, 0);
> -  else if (likely(c->size == 4))
> -    REORDER_45 (4, 4, 0);
> +  if (likely (c->size == sizeof (size_t)))
> +    REORDER_45 (size_t, sizeof (size_t), 0);
> +  else if (likely(c->size == sizeof (int)))
> +    REORDER_45 (int,  sizeof (int), 0);
>    else
>      {
>        size_t offset = 0, step = sizeof (size_t);
>        for (; offset + step <= c->size; offset += step)
> -       REORDER_45 (step, c->size, offset);
> +       REORDER_45 (size_t, c->size, offset);
>        for (; offset < c->size; offset++)
> -       REORDER_45 (1, c->size, offset);
> +       REORDER_45 (char, c->size, offset);
>      }
>  }
>
> --
> 2.13.3

Reply via email to