Jakub Jelinek via Gcc-patches <gcc-patches@gcc.gnu.org> wrote:

On Thu, Aug 13, 2020 at 02:06:21PM +0200, Tobias Burnus wrote:
Build server is x86_64-gnu-linux, "i686-pc-linux-gnu-g++" is a native binary of GCC 5.2.0
[Don't ask why i686 and not x86_64 is used.]

Ah, ok, so this boils down to:
int i = alignof (long long int);
struct TTT { char a; long long int b; };
int j = alignof (TTT);
ending up to be 8, 4 with -O2 -m32 in GCC 4.8 - 7.x and
only in GCC 8+ 4, 4.

Also the case for long long (darwin) and double (darwin, aix) where the embedded alignmen is 4 and the natural aligment is 8 - as ABI (so in dependent of compiler version).
(which breaks bootstrap on all 32b Darwin hosts at least)

If the desired outcome is that the embedded vector is aligned to the natural alignment
of the type that could be forced on that field of the vec?

Iain



So perhaps we want:
--- gcc/vec.h.jj        2020-08-12 12:45:58.410686880 +0200
+++ gcc/vec.h   2020-08-13 14:18:06.967041880 +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)]; };
+  struct V { char a; T b; };
+  struct alignas (V) 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);
}

or
--- gcc/vec.h.jj        2020-08-12 12:45:58.410686880 +0200
+++ gcc/vec.h   2020-08-13 14:18:06.967041880 +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)]; };
+  struct V { char a; T b; } *v;
+  struct alignas (alignof (v->b)) 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