On Thu, 18 Apr 2019 at 16:55, Robin Dapp <rd...@linux.ibm.com> wrote:
>
> Hi Rainer,
>
> > I noticed you missed one piece of Iain's typeinfo.cc patch, btw.:
> >
> > diff --git a/gcc/d/typeinfo.cc b/gcc/d/typeinfo.cc
> > --- a/gcc/d/typeinfo.cc
> > +++ b/gcc/d/typeinfo.cc
> > @@ -886,7 +886,7 @@ public:
> >       if (cd->isCOMinterface ())
> >         flags |= ClassFlags::isCOMclass;
> >
> > -     this->layout_field (build_integer_cst (flags));
> > +     this->layout_field (build_integer_cst (flags, d_uint_type));
> >
> >       /* void *deallocator;
> >          OffsetTypeInfo[] m_offTi;  (not implemented)
>
> thanks for catching this.  I amended the patch and ran the D test suite
> on S/390 and i386 one more time.
>
> For S/390 the number of FAILs is unchanged
>
>                 === libphobos Summary ===
>
> # of expected passes            380
> # of unexpected failures        30
>
> Some of the FAILs are still a little worrying, like tests for "-shared"
> which I haven't looked at at all so far.  Still, it's better than the
> >200 before.
>
> On i386 I see no FAILs with the patch.
>

Thanks, I've upstreamed and committed the dmd, druntime, and phobos
parts in r270485, r270490, and r270491 respectively.

Of the remaining patch, the sections module is now
libdruntime/gcc/sections/elf_shared.d.

Other than that, all looks OK.

--
Iain
---
diff --git a/gcc/d/typeinfo.cc b/gcc/d/typeinfo.cc
index dac66acdcd4..865fde2c863 100644
--- a/gcc/d/typeinfo.cc
+++ b/gcc/d/typeinfo.cc
@@ -830,7 +830,7 @@ public:
     flags |= ClassFlags::noPointers;

     Lhaspointers:
-    this->layout_field (size_int (flags));
+    this->layout_field (build_integer_cst (flags, d_uint_type));

     /* void *deallocator;  */
     tree ddtor = (cd->aggDelete)
@@ -886,7 +886,7 @@ public:
     if (cd->isCOMinterface ())
       flags |= ClassFlags::isCOMclass;

-    this->layout_field (size_int (flags));
+    this->layout_field (build_integer_cst (flags, d_uint_type));

     /* void *deallocator;
        OffsetTypeInfo[] m_offTi;  (not implemented)
@@ -1019,7 +1019,7 @@ public:
     StructFlags::Type m_flags = 0;
     if (ti->hasPointers ())
       m_flags |= StructFlags::hasPointers;
-    this->layout_field (size_int (m_flags));
+    this->layout_field (build_integer_cst (m_flags, d_uint_type));

     /* void function(void*) xdtor;  */
     tree dtor = (sd->dtor) ? build_address (get_symbol_decl (sd->dtor))
@@ -1033,7 +1033,7 @@ public:
       this->layout_field (null_pointer_node);

     /* uint m_align;  */
-    this->layout_field (size_int (ti->alignsize ()));
+    this->layout_field (build_integer_cst (ti->alignsize (), d_uint_type));

     if (global.params.is64bit)
       {
@@ -1489,8 +1489,8 @@ create_typeinfo (Type *type, Module *mod)
                       array_type_node, array_type_node,
                       ptr_type_node, ptr_type_node,
                       ptr_type_node, ptr_type_node,
-                      size_type_node, ptr_type_node,
-                      ptr_type_node, size_type_node,
+                      d_uint_type, ptr_type_node,
+                      ptr_type_node, d_uint_type,
                       ptr_type_node, argtype, argtype, NULL);
         }
       t->vtinfo = TypeInfoStructDeclaration::create (t);
diff --git a/gcc/testsuite/gdc.dg/runnable.d b/gcc/testsuite/gdc.dg/runnable.d
index e36a2585027..8d9a5868831 100644
--- a/gcc/testsuite/gdc.dg/runnable.d
+++ b/gcc/testsuite/gdc.dg/runnable.d
@@ -890,12 +890,17 @@ struct S186
     }
 }

+static if (size_t.sizeof == 8)
+     size_t checkval = 0x0200000000000002;
+static if (size_t.sizeof == 4)
+     size_t checkval = 0x02000002;
+
 void check186(in S186 obj, byte fieldB)
 {
     assert(obj.fieldA == 2);
     assert(obj.fieldB == 0);
     assert(obj.fieldC == 0);
-    assert(obj._complete == 2);
+    assert(obj._complete == checkval);
     assert(fieldB == 0);
 }

@@ -907,7 +912,7 @@ void test186a(size_t val)
     assert(obj.fieldA == 2);
     assert(obj.fieldB == 0);
     assert(obj.fieldC == 0);
-    assert(obj._complete == 2);
+    assert(obj._complete == checkval);

     obj = S186(val);
     check186(obj, obj.fieldB);
@@ -915,12 +920,12 @@ void test186a(size_t val)
     assert(obj.fieldA == 2);
     assert(obj.fieldB == 0);
     assert(obj.fieldC == 0);
-    assert(obj._complete == 2);
+    assert(obj._complete == checkval);
 }

 void test186()
 {
-    test186a(2);
+    test186a(checkval);
 }

 /******************************************/
diff --git a/gcc/testsuite/gdc.dg/simd.d b/gcc/testsuite/gdc.dg/simd.d
index 812b36649aa..7d0aa0168c0 100644
--- a/gcc/testsuite/gdc.dg/simd.d
+++ b/gcc/testsuite/gdc.dg/simd.d
@@ -1576,7 +1576,10 @@ ubyte[16] foounsto()
 void testOPvecunsto()
 {
     auto a = foounsto();
-    assert(a == [0, 0, 64, 65, 0, 0, 64, 65, 0, 0, 64, 65, 0, 0, 64, 65]);
+    version(LittleEndian)
+        assert(a == [0, 0, 64, 65, 0, 0, 64, 65, 0, 0, 64, 65, 0, 0, 64, 65]);
+    version(BigEndian)
+        assert(a == [65, 64, 0, 0, 65, 64, 0, 0, 65, 64, 0, 0, 65, 64, 0, 0]);
 }

 /*****************************************/
diff --git a/libphobos/configure.tgt b/libphobos/configure.tgt
index 0471bfd816b..4ea91c949d7 100644
--- a/libphobos/configure.tgt
+++ b/libphobos/configure.tgt
@@ -32,6 +32,8 @@ case "${target}" in
     ;;
   x86_64-*-netbsd* | i?86-*-netbsd*)
     ;;
+  s390*-linux*)
+    ;;
   *)
     UNSUPPORTED=1
     ;;
diff --git a/libphobos/libdruntime/rt/sections_elf_shared.d
b/libphobos/libdruntime/rt/sections_elf_shared.d
index d4e1ff07699..5cc7a866fcb 100644
--- a/libphobos/libdruntime/rt/sections_elf_shared.d
+++ b/libphobos/libdruntime/rt/sections_elf_shared.d
@@ -978,7 +978,10 @@ struct tls_index
     }
 }

+import gcc.builtins;
+
 extern(C) void* __tls_get_addr(tls_index* ti) nothrow @nogc;
+extern(C) void* __tls_get_addr_internal(tls_index* ti) nothrow @nogc;

 /* The dynamic thread vector (DTV) pointers may point 0x8000 past the start of
  * each TLS block. This is at least true for PowerPC and Mips platforms.
@@ -1012,6 +1015,8 @@ else version (MIPS32)
     enum TLS_DTV_OFFSET = 0x8000;
 else version (MIPS64)
     enum TLS_DTV_OFFSET = 0x8000;
+else version (SystemZ)
+    enum TLS_DTV_OFFSET = 0x0;
 else
     static assert( false, "Platform not supported." );

@@ -1022,5 +1027,13 @@ void[] getTLSRange(size_t mod, size_t sz) nothrow @nogc

     // base offset
     auto ti = tls_index(mod, 0);
-    return (__tls_get_addr(&ti)-TLS_DTV_OFFSET)[0 .. sz];
+
+    version (SystemZ)
+      {
+          auto idx = cast(void *)__tls_get_addr_internal(&ti)
+              + cast(ulong)__builtin_thread_pointer ();
+          return idx[0 .. sz];
+      }
+    else
+        return (__tls_get_addr(&ti)-TLS_DTV_OFFSET)[0 .. sz];
 }
diff --git a/libphobos/testsuite/libphobos.typeinfo/struct-align.d
b/libphobos/testsuite/libphobos.typeinfo/struct-align.d
new file mode 100644
index 00000000000..72866517481
--- /dev/null
+++ b/libphobos/testsuite/libphobos.typeinfo/struct-align.d
@@ -0,0 +1,13 @@
+module structalign;
+
+void main ()
+{
+    struct K { int *a; };
+    K k;
+    auto ti = typeid (k);
+
+    assert (ti.flags () == 1);
+
+    auto ti2 = typeid (k.a);
+    assert (ti.talign () == ti2.talign ());
+}

Reply via email to