This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [PATCH, PR 57748] Set mode of structures with zero sized arrays to be BLK
- From: David Abdurachmanov <david dot abd at gmail dot com>
- To: GCC Patches <gcc-patches at gcc dot gnu dot org>
- Cc: Richard Biener <rguenther at suse dot de>, Martin Jambor <mjambor at suse dot cz>
- Date: Wed, 21 Aug 2013 00:27:51 +0200
- Subject: Re: [PATCH, PR 57748] Set mode of structures with zero sized arrays to be BLK
- References: <20130802114531 dot GE2728 at virgil dot suse> <4A9147F4-DF91-43D2-AAA4-04C4A3DC32A8 at gmail dot com>
ping^2
david
On Aug 12, 2013, at 2:31 PM, David Abdurachmanov wrote:
> Hi,
>
> Ping. Any news of the following patch being included into the trunk?
>
> Thanks,
> david
>
> On Aug 2, 2013, at 1:45 PM, Martin Jambor wrote:
>
>> Hi,
>>
>> while compute_record_mode in stor-layout.c makes sure it assigns BLK
>> mode to structs with flexible arrays, it has no such provisions for
>> zero length arrays
>> (http://gcc.gnu.org/onlinedocs/gcc-4.8.1/gcc/Zero-Length.html). I
>> think that in order to avoid problems and surprises like PR 57748
>> (where this triggered code that was intended for small structures that
>> fit into a scalar mode and ICEd), we should assign both variable array
>> possibilities the same mode.
>>
>> Bootstrapped and tested on x86_64-linux without any problems. OK for
>> trunk and the 4.8 branch? (I'm not sure about the 4.7, this PR does
>> not happen there despite the wrong mode so I'd ignore it for now.)
>>
>> Thanks,
>>
>> Martin
>>
>>
>> 2013-08-01 Martin Jambor <mjambor@suse.cz>
>>
>> PR middle-end/57748
>> * stor-layout.c (compute_record_mode): Treat zero-sized array fields
>> like incomplete types.
>>
>> testsuite/
>> * gcc.dg/torture/pr57748.c: New test.
>>
>>
>> *** /tmp/lV6Ba8_stor-layout.c Thu Aug 1 16:28:25 2013
>> --- gcc/stor-layout.c Thu Aug 1 15:36:18 2013
>> *************** compute_record_mode (tree type)
>> *** 1604,1610 ****
>> && integer_zerop (TYPE_SIZE (TREE_TYPE (field)))))
>> || ! host_integerp (bit_position (field), 1)
>> || DECL_SIZE (field) == 0
>> ! || ! host_integerp (DECL_SIZE (field), 1))
>> return;
>>
>> /* If this field is the whole struct, remember its mode so
>> --- 1604,1612 ----
>> && integer_zerop (TYPE_SIZE (TREE_TYPE (field)))))
>> || ! host_integerp (bit_position (field), 1)
>> || DECL_SIZE (field) == 0
>> ! || ! host_integerp (DECL_SIZE (field), 1)
>> ! || (TREE_CODE (TREE_TYPE (field)) == ARRAY_TYPE
>> ! && tree_low_cst (DECL_SIZE (field), 1) == 0))
>> return;
>>
>> /* If this field is the whole struct, remember its mode so
>> *** /dev/null Tue Jun 4 12:34:56 2013
>> --- gcc/testsuite/gcc.dg/torture/pr57748.c Thu Aug 1 15:42:14 2013
>> ***************
>> *** 0 ****
>> --- 1,45 ----
>> + /* PR middle-end/57748 */
>> + /* { dg-do run } */
>> +
>> + #include <stdlib.h>
>> +
>> + extern void abort (void);
>> +
>> + typedef long long V
>> + __attribute__ ((vector_size (2 * sizeof (long long)), may_alias));
>> +
>> + typedef struct S { V a; V b[0]; } P __attribute__((aligned (1)));
>> +
>> + struct __attribute__((packed)) T { char c; P s; };
>> +
>> + void __attribute__((noinline, noclone))
>> + check (struct T *t)
>> + {
>> + if (t->s.b[0][0] != 3 || t->s.b[0][1] != 4)
>> + abort ();
>> + }
>> +
>> + int __attribute__((noinline, noclone))
>> + get_i (void)
>> + {
>> + return 0;
>> + }
>> +
>> + void __attribute__((noinline, noclone))
>> + foo (P *p)
>> + {
>> + V a = { 3, 4 };
>> + int i = get_i();
>> + p->b[i] = a;
>> + }
>> +
>> + int
>> + main ()
>> + {
>> + struct T *t = (struct T *) malloc (128);
>> +
>> + foo (&t->s);
>> + check (t);
>> +
>> + return 0;
>> + }
>