libphobos: Fix multilib builds for s390x-linux-gnu
authorIain Buclaw <ibuclaw@gcc.gnu.org>
Mon, 29 Apr 2019 05:42:48 +0000 (05:42 +0000)
committerIain Buclaw <ibuclaw@gcc.gnu.org>
Mon, 29 Apr 2019 05:42:48 +0000 (05:42 +0000)
Merges upstream druntime aab44549, phobos 3dc363783.

Reviewed-on: https://github.com/dlang/druntime/pull/2590
     https://github.com/dlang/phobos/pull/6983

libphobos/ChangeLog:

2019-04-28  Iain Buclaw  <ibuclaw@gdcproject.org>

* libdruntime/gcc/sections/elf_shared.d (IBMZ_Any): Define when
version S390 or SystemZ.  Use condition instead of SystemZ.
(getTLSRange): Return null on GNU_EMUTLS targets.

From-SVN: r270639

libphobos/libdruntime/MERGE
libphobos/libdruntime/core/sys/linux/link.d
libphobos/libdruntime/core/sys/posix/setjmp.d
libphobos/libdruntime/core/sys/posix/sys/stat.d
libphobos/libdruntime/core/sys/posix/ucontext.d
libphobos/libdruntime/gcc/sections/elf_shared.d
libphobos/src/MERGE
libphobos/src/std/math.d

index d947097ec65103a094bc985c7962da3c59f0c5da..dec75f7cb33e2a70446472dade36aa6f2701221d 100644 (file)
@@ -1,4 +1,4 @@
-1ca80e4e0cf460575752a0c157ca52c184f4b982
+aab44549221cb29434fe2feccaf1174af54dd79d
 
 The first line of this file holds the git revision number of the last
 merge done from the dlang/druntime repository.
index b57b5e5d00f1f3a7fcc5fc48d95e191c62ac149b..e242d2b28767e66fc7b9d2742462a857c6fc5d4c 100644 (file)
@@ -18,8 +18,10 @@ version (PPC)     version = PPC_Any;
 version (PPC64)   version = PPC_Any;
 version (RISCV32) version = RISCV_Any;
 version (RISCV64) version = RISCV_Any;
+version (S390)    version = IBMZ_Any;
 version (SPARC)   version = SPARC_Any;
 version (SPARC64) version = SPARC_Any;
+version (SystemZ) version = IBMZ_Any;
 version (X86)     version = X86_Any;
 version (X86_64)  version = X86_Any;
 
@@ -71,11 +73,14 @@ else version (SPARC_Any)
     alias __WORDSIZE __ELF_NATIVE_CLASS;
     alias uint32_t Elf_Symndx;
 }
-else version (SystemZ)
+else version (IBMZ_Any)
 {
     // http://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/unix/sysv/linux/s390/bits/elfclass.h
     alias __WORDSIZE __ELF_NATIVE_CLASS;
-    alias uint64_t Elf_Symndx;
+    static if (__WORDSIZE == 64)
+        alias uint64_t Elf_Symndx;
+    else
+        alias uint32_t Elf_Symndx;
 }
 else
     static assert(0, "unimplemented");
index 8b636683e3d02136d8e1aaee201596edd3e48096..fcdbca496c40627e9e0a3adeadf3ed5ffc3d1a43 100644 (file)
@@ -153,6 +153,15 @@ version (CRuntime_Glibc)
         }
         alias __jmp_buf = __riscv_jmp_buf[1];
     }
+    else version (S390)
+    {
+        struct __s390_jmp_buf
+        {
+            c_long[10] __gregs;
+            c_long[4] __fpregs;
+        }
+        alias __jmp_buf = __s390_jmp_buf[1];
+    }
     else version (SystemZ)
     {
         struct __s390_jmp_buf
index 963a241f0762cdcbdac0ba33d6d908d51047db7f..76e4460550df1bdbcd225ba8a813c8c064f4be73 100644 (file)
@@ -791,6 +791,82 @@ version (CRuntime_Glibc)
         }
         static assert(stat_t.sizeof == 144);
     }
+    else version (S390)
+    {
+        private
+        {
+            alias __dev_t = ulong;
+            alias __ino_t = c_ulong;
+            alias __ino64_t = ulong;
+            alias __mode_t = uint;
+            alias __nlink_t = uint;
+            alias __uid_t = uint;
+            alias __gid_t = uint;
+            alias __off_t = c_long;
+            alias __off64_t = long;
+            alias __blksize_t = c_long;
+            alias __blkcnt_t = c_long;
+            alias __blkcnt64_t = long;
+            alias __timespec = timespec;
+            alias __time_t = time_t;
+        }
+        struct stat_t
+        {
+            __dev_t st_dev;
+            uint __pad1;
+            static if (!__USE_FILE_OFFSET64)
+                __ino_t st_ino;
+            else
+                __ino_t __st_ino;
+            __mode_t st_mode;
+            __nlink_t st_nlink;
+            __uid_t st_uid;
+            __gid_t st_gid;
+            __dev_t st_rdev;
+            uint __pad2;
+            static if (!__USE_FILE_OFFSET64)
+                __off_t st_size;
+            else
+                __off64_t st_size;
+            __blksize_t st_blksize;
+            static if (!__USE_FILE_OFFSET64)
+                __blkcnt_t st_blocks;
+            else
+                __blkcnt64_t st_blocks;
+            static if (__USE_XOPEN2K8)
+            {
+                __timespec st_atim;
+                __timespec st_mtim;
+                __timespec st_ctim;
+                extern(D)
+                {
+                    @property ref time_t st_atime() { return st_atim.tv_sec; }
+                    @property ref time_t st_mtime() { return st_mtim.tv_sec; }
+                    @property ref time_t st_ctime() { return st_ctim.tv_sec; }
+                }
+            }
+            else
+            {
+                __time_t st_atime;
+                c_ulong st_atimensec;
+                __time_t st_mtime;
+                c_ulong st_mtimensec;
+                __time_t st_ctime;
+                c_ulong st_ctimensec;
+            }
+            static if (!__USE_FILE_OFFSET64)
+            {
+                c_ulong __glibc_reserved4;
+                c_ulong __glibc_reserved5;
+            }
+            else
+                __ino64_t st_ino;
+        }
+        static if (__USE_FILE_OFFSET64)
+            static assert(stat_t.sizeof == 104);
+        else
+            static assert(stat_t.sizeof == 88);
+    }
     else version (SystemZ)
     {
         private
index 6200bfc3fe2721952b320121f62bc00b7549315b..d664f2e5e41305e722ca874fa798851b8b4f853e 100644 (file)
@@ -25,8 +25,10 @@ nothrow:
 
 version (RISCV32) version = RISCV_Any;
 version (RISCV64) version = RISCV_Any;
+version (S390)    version = IBMZ_Any;
 version (SPARC)   version = SPARC_Any;
 version (SPARC64) version = SPARC_Any;
+version (SystemZ) version = IBMZ_Any;
 version (X86)     version = X86_Any;
 version (X86_64)  version = X86_Any;
 
@@ -719,7 +721,7 @@ version (CRuntime_Glibc)
         alias greg_t = c_ulong;
         alias gregset_t = greg_t[NGREG];
     }
-    else version (SystemZ)
+    else version (IBMZ_Any)
     {
         public import core.sys.posix.signal : sigset_t;
 
index 1eafecdd32276134b12dab91918cdf2f0784f522..7f9036bf5052861960f8a1d4a20838437c5c519c 100644 (file)
@@ -24,6 +24,8 @@ module gcc.sections.elf_shared;
 
 version (RISCV32) version = RISCV_Any;
 version (RISCV64) version = RISCV_Any;
+version (S390)    version = IBMZ_Any;
+version (SystemZ) version = IBMZ_Any;
 
 version (CRuntime_Glibc) enum SharedELF = true;
 else version (CRuntime_Musl) enum SharedELF = true;
@@ -1060,7 +1062,7 @@ else version (MIPS32)
     enum TLS_DTV_OFFSET = 0x8000;
 else version (MIPS64)
     enum TLS_DTV_OFFSET = 0x8000;
-else version (SystemZ)
+else version (IBMZ_Any)
     enum TLS_DTV_OFFSET = 0x0;
 else
     static assert( false, "Platform not supported." );
@@ -1070,20 +1072,25 @@ void[] getTLSRange(size_t mod, size_t sz) nothrow @nogc
     if (mod == 0)
         return null;
 
-    version (Solaris)
+    version (GNU_EMUTLS)
+        return null;    // Handled in scanTLSRanges().
+    else
     {
-        static if (!OS_Have_Dlpi_Tls_Modid)
-            mod -= 1;
-    }
+        version (Solaris)
+        {
+            static if (!OS_Have_Dlpi_Tls_Modid)
+                mod -= 1;
+        }
 
-    // base offset
-    auto ti = tls_index(mod, 0);
-    version (SystemZ)
-    {
-        auto idx = cast(void *)__tls_get_addr_internal(&ti)
-            + cast(ulong)__builtin_thread_pointer();
-        return idx[0 .. sz];
+        // base offset
+        auto ti = tls_index(mod, 0);
+        version (IBMZ_Any)
+        {
+            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];
     }
-    else
-        return (__tls_get_addr(&ti)-TLS_DTV_OFFSET)[0 .. sz];
 }
index 685b4e65d24c432502c7cc9645d5ce4e20996dfa..cfac5c66b4ecc0c22fe6772fe1611e86a4d0d1ee 100644 (file)
@@ -1,4 +1,4 @@
-b5e9661a089b6514e01fa5195c0f2bc9cc06eddd
+3dc363783ea7b1e82336983486a14f3f44bbeadd
 
 The first line of this file holds the git revision number of the last
 merge done from the dlang/phobos repository.
index 062b57035cab9f01541467f5a3f4bb1335d83de5..7e6a97f1dcdcc43e18d130fe42fc64d2ae91e719 100644 (file)
@@ -160,8 +160,10 @@ version (MIPS32)    version = MIPS_Any;
 version (MIPS64)    version = MIPS_Any;
 version (AArch64)   version = ARM_Any;
 version (ARM)       version = ARM_Any;
+version (S390)      version = IBMZ_Any;
 version (SPARC)     version = SPARC_Any;
 version (SPARC64)   version = SPARC_Any;
+version (SystemZ)   version = IBMZ_Any;
 version (RISCV32)   version = RISCV_Any;
 version (RISCV64)   version = RISCV_Any;
 
@@ -5241,7 +5243,7 @@ struct FloatingPointControl
                                  | inexactException,
         }
     }
-    else version (SystemZ)
+    else version (IBMZ_Any)
     {
         enum : ExceptionMask
         {
@@ -5379,7 +5381,7 @@ private:
     {
         alias ControlState = ulong;
     }
-    else version (SystemZ)
+    else version (IBMZ_Any)
     {
         alias ControlState = uint;
     }