On August 14, 2020 8:58:55 AM GMT+02:00, Jakub Jelinek <ja...@redhat.com> wrote:
>Hi!
>
>As mentioned earlier, embedded_size is broken on vecs of long long,
>double
>etc. on some platforms, which breaks bootstrap.
>E.g. on i686-linux, the problem is mostly with older GCC versions being
>used
>as stage1 compiler (GCC 4.8 to 7.* in particular), because alignas
>(long long)
>makes U 64-bit aligned, while when long long m_vecdata[1]; is in vec,
>it is
>only 32-bit aligned.  We've tried various ways and the following one
>seems
>to work, use the old way (offsetof (vec, m_vecdata)) for non-class
>types
>as well as standard layout class types, i.e. whenever offsetof is
>guaranteed
>to work, and for others use the new day (in that case we don't run into
>problems with long long or other scalar types and for the structure
>layout
>there is just a struct with a given alignment.
>
>Bootstrapped/regtested on x86_64-linux and i686-linux, AFAIK Iain and
>David
>are bootstrapping/regtesting it on 32-bit darwin and AIX and it got
>through
>the spots where it broke before, ok for trunk?

OK. 

Thanks, 
Richard. 

>2020-08-14  Jakub Jelinek  <ja...@redhat.com>
>           Jonathan Wakely  <jwak...@redhat.com>
>
>       * system.h: Include type_traits.
>       * vec.h (vec<T, A, vl_embed>::embedded_size): Use offsetof and asserts
>       on vec_stdlayout, which is conditionally a vec (for standard layout T)
>       and otherwise vec_embedded.
>
>--- gcc/system.h.jj    2020-07-28 15:39:09.984756558 +0200
>+++ gcc/system.h       2020-08-13 16:33:48.330642026 +0200
>@@ -235,6 +235,7 @@ extern int errno;
> # include <cstring>
> # include <new>
> # include <utility>
>+# include <type_traits>
> #endif
> 
> /* Some of glibc's string inlines cause warnings.  Plus we'd rather
>--- gcc/vec.h.jj       2020-08-13 15:41:17.221755055 +0200
>+++ gcc/vec.h  2020-08-13 16:31:42.190367975 +0200
>@@ -1283,9 +1283,11 @@ vec<T, A, vl_embed>::embedded_size (unsi
> {
>   struct alignas (T) 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), "");
>-  return offsetof (vec_embedded, m_vecdata) + alloc * sizeof (T);
>+  typedef typename std::conditional<std::is_standard_layout<T>::value,
>+                                  vec, vec_embedded>::type vec_stdlayout;
>+  static_assert (sizeof (vec_stdlayout) == sizeof (vec), "");
>+  static_assert (alignof (vec_stdlayout) == alignof (vec), "");
>+  return offsetof (vec_stdlayout, m_vecdata) + alloc * sizeof (T);
> }
> 
> 
>
>       Jakub

Reply via email to