On Thu, Aug 13, 2020 at 01:55:40PM +0100, Iain Sandoe wrote:
> diff --git a/gcc/vec.h b/gcc/vec.h
> index db48e97..a8fca34 100644
> --- a/gcc/vec.h
> +++ b/gcc/vec.h
> @@ -623,7 +623,7 @@ public:
>    /* FIXME - These fields should be private, but we need to cater to
>            compilers that have stricter notions of PODness for types.  */
>    vec_prefix m_vecpfx;
> -  T m_vecdata[1];
> +  T m_vecdata[1] __attribute__((__aligned__(alignof(T))));

That uses an extension, so won't help us if the system compiler doesn't
support that extension, and will unnecessarily waste bytes in all the long
long (and some double?) vecs.

Perhaps even better we can just use vec itself rather than creating a new
artificial type, and just query the alignof the m_vecdata member in that
case:

--- gcc/vec.h.jj        2020-08-12 12:45:58.410686880 +0200
+++ gcc/vec.h   2020-08-13 15:03:15.823777382 +0200
@@ -1281,10 +1281,11 @@ template<typename T, typename A>
 inline size_t
 vec<T, A, vl_embed>::embedded_size (unsigned alloc)
 {
-  struct alignas (T) U { char data[sizeof (T)]; };
+  vec *v;
+  struct alignas (alignof (v->m_vecdata)) U { char data[sizeof (T)]; };
   typedef vec<U, A, vl_embed> vec_embedded;
-  static_assert (sizeof (vec_embedded) == sizeof(vec), "");
-  static_assert (alignof (vec_embedded) == alignof(vec), "");
+  static_assert (sizeof (vec_embedded) == sizeof (vec), "");
+  static_assert (alignof (vec_embedded) == alignof (vec), "");
   return offsetof (vec_embedded, m_vecdata) + alloc * sizeof (T);
 }
 


        Jakub

Reply via email to