libphobos: Add D support for S/390 Linux
authorIain Buclaw <ibuclaw@gdcproject.org>
Tue, 23 Apr 2019 22:53:25 +0000 (22:53 +0000)
committerIain Buclaw <ibuclaw@gcc.gnu.org>
Tue, 23 Apr 2019 22:53:25 +0000 (22:53 +0000)
gcc/d/ChangeLog:

2019-04-23  Iain Buclaw  <ibuclaw@gdcproject.org>
    Robin Dapp  <rdapp@linux.ibm.com>

* typeinfo.cc (create_typeinfo): Write typeinfo flags as uint.

gcc/testsuite/ChangeLog:

2019-04-23  Iain Buclaw  <ibuclaw@gdcproject.org>
    Robin Dapp  <rdapp@linux.ibm.com>

* gdc.dg/link.d: Test if target d_runtime.
* gdc.dg/runnable.d: Fix tests to work on BigEndian.
* gdc.dg/simd.d: Likewise.

libphobos/ChangeLog:

2019-04-23  Iain Buclaw  <ibuclaw@gdcproject.org>
    Robin Dapp  <rdapp@linux.ibm.com>

* configure.tgt: Add s390*-linux* as a supported target.
* libdruntime/gcc/sections/elf_shared.d: import gcc.builtins.
(__tls_get_addr_internal): Declare.
(TLS_DTV_OFFSET): Define as zero on SystemZ.
(getTLSRange): Support getting TLS on SystemZ.
* testsuite/libphobos.typeinfo/struct-align.d: New test.

Co-Authored-By: Robin Dapp <rdapp@linux.ibm.com>
From-SVN: r270523

gcc/d/ChangeLog
gcc/d/typeinfo.cc
gcc/testsuite/ChangeLog
gcc/testsuite/gdc.dg/link.d
gcc/testsuite/gdc.dg/runnable.d
gcc/testsuite/gdc.dg/simd.d
libphobos/ChangeLog
libphobos/configure.tgt
libphobos/libdruntime/gcc/sections/elf_shared.d
libphobos/testsuite/libphobos.typeinfo/struct-align.d [new file with mode: 0644]

index de191cb7a0215fc9dd489b25f2b3f0d388dbb7b8..a0a3266f1a2537e4eb31f973dee4b6910d69667e 100644 (file)
@@ -1,3 +1,8 @@
+2019-04-23  Iain Buclaw  <ibuclaw@gdcproject.org>
+           Robin Dapp  <rdapp@linux.ibm.com>
+
+       * typeinfo.cc (create_typeinfo): Write typeinfo flags as uint.
+
 2019-04-23  Iain Buclaw  <ibuclaw@gdcproject.org>
 
        * d-builtins.cc (d_init_versions): Add D_BetterC, D_ModuleInfo,
index ffa7e23786512754f73b4115a333d3334bb10cb0..bbd3961181ddc8ab02086c7fa66eaa5d2e4fbb7e 100644 (file)
@@ -860,7 +860,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)
@@ -916,7 +916,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)
@@ -1049,7 +1049,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))
@@ -1063,7 +1063,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)
       {
@@ -1531,8 +1531,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);
index 22145fb0cb3fe9ea9b9644404df005717347f078..66d0b6f7562a769a8dd77e3123e0065c40587be4 100644 (file)
@@ -1,3 +1,10 @@
+2019-04-23  Iain Buclaw  <ibuclaw@gdcproject.org>
+           Robin Dapp  <rdapp@linux.ibm.com>
+
+       * gdc.dg/link.d: Test if target d_runtime.
+       * gdc.dg/runnable.d: Fix tests to work on BigEndian.
+       * gdc.dg/simd.d: Likewise.
+
 2019-04-23  Iain Buclaw  <ibuclaw@gdcproject.org>
 
        * gdc.test/fail_compilation/fail2456.d: New test.
index a8e1da15511a00d7a60f0553595214b4bb022235..a8ca4ed5cb6db9b1d48c496d59aab5492db2db51 100644 (file)
@@ -1,4 +1,4 @@
-// { dg-do link { target arm*-*-* i?86-*-* x86_64-*-* } }
+// { dg-do link { target d_runtime } }
 
 /******************************************/
 
index e36a25850270738f6ee189c294d24c52c1b5d1a5..484a9709bf3a053c262b0a05c4cf232e1cad0752 100644 (file)
@@ -890,12 +890,17 @@ struct S186
     }
 }
 
+static if (size_t.sizeof == 8)
+    enum checkval = 0x0200000000000002;
+else
+    enum 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);
 }
 
 /******************************************/
index 812b36649aa033e6db99d51dcb658ed9c2e39b47..439c446837aad01929ff772bc0d6663bd706732b 100644 (file)
@@ -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]);
 }
 
 /*****************************************/
index 1f5ea28ddf765948586d73dbfe1da52603122d30..e7d3319b21d57ddfb6f3fa22917eefd50a132806 100644 (file)
@@ -1,3 +1,13 @@
+2019-04-23  Iain Buclaw  <ibuclaw@gdcproject.org>
+           Robin Dapp  <rdapp@linux.ibm.com>
+
+       * configure.tgt: Add s390*-linux* as a supported target.
+       * libdruntime/gcc/sections/elf_shared.d: import gcc.builtins.
+       (__tls_get_addr_internal): Declare.
+       (TLS_DTV_OFFSET): Define as zero on SystemZ.
+       (getTLSRange): Support getting TLS on SystemZ.
+       * testsuite/libphobos.typeinfo/struct-align.d: New test.
+
 2019-04-23  Iain Buclaw  <ibuclaw@gdcproject.org>
 
        * configure.tgt: Add linux/riscv as supported target.
index 5deba2a9961e73088959e98b9cc8ae76f562c3ec..a53a3c3c3be18f75ab53aa3a5ba942bf72794185 100644 (file)
@@ -32,6 +32,9 @@ case "${target}" in
   riscv*-*-linux*)
        LIBPHOBOS_SUPPORTED=yes
        ;;
+  s390*-linux*)
+       LIBPHOBOS_SUPPORTED=yes
+       ;;
   x86_64-*-kfreebsd*-gnu | i?86-*-kfreebsd*-gnu)
        LIBPHOBOS_SUPPORTED=yes
        ;;
index 89adcea889e26f653ffa0ced65b08781b3b2f315..d92e4cd9c4e423e42a541b0261d2782f226d15ce 100644 (file)
@@ -77,6 +77,7 @@ else
     static assert(0, "unimplemented");
 }
 import core.sys.posix.pthread;
+import gcc.builtins;
 import gcc.config;
 import rt.deh;
 import rt.dmain2;
@@ -992,6 +993,7 @@ struct tls_index
 }
 
 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.
@@ -1025,6 +1027,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." );
 
@@ -1041,5 +1045,12 @@ 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 (file)
index 0000000..7286651
--- /dev/null
@@ -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 ());
+}