This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH, PR 57748] Set mode of structures with zero sized arrays to be BLK


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;
> + }


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]