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