From 05b6520ed29a9e2b5480ecab4e71d999c7d04f29 Mon Sep 17 00:00:00 2001 From: Iain Buclaw Date: Thu, 30 Apr 2020 11:03:33 +0200 Subject: [PATCH] d: Merge upstream dmd 934df6f8c, druntime 7bdd83d7 Corrects a previous change made to the SPARC stdc bindings, and backports PPC-related fixes. The library and language testsuite now passes fully on powerpc64le-linux-gnu. Fixes: PR d/90719 Fixes: PR d/94825 Reviewed-on: https://github.com/dlang/dmd/pull/11079 https://github.com/dlang/druntime/pull/3078 https://github.com/dlang/druntime/pull/3083 libphobos/ChangeLog: PR d/94825 * libdruntime/Makefile.am (DRUNTIME_SOURCES_CONFIGURED): Remove config/powerpc/switchcontext.S * libdruntime/Makefile.in: Regenerate. * libdruntime/config/powerpc/callwithstack.S: Remove. * libdruntime/config/powerpc/switchcontext.S: Fix symbol name of fiber_switchContext. * libdruntime/core/thread.d: Disable fiber migration tests on PPC. * testsuite/libphobos.thread/fiber_guard_page.d: Set guardPageSize same as stackSize. --- gcc/d/dmd/MERGE | 2 +- gcc/testsuite/gdc.test/runnable/arrayop.d | 1 + .../gdc.test/runnable/ctorpowtests.d | 1 + gcc/testsuite/gdc.test/runnable/template2.d | 1 + gcc/testsuite/gdc.test/runnable/testaa2.d | 1 + libphobos/libdruntime/MERGE | 2 +- libphobos/libdruntime/Makefile.am | 3 +- libphobos/libdruntime/Makefile.in | 20 +- .../config/powerpc/callwithstack.S | 172 ------------------ .../config/powerpc/switchcontext.S | 8 +- libphobos/libdruntime/core/internal/convert.d | 10 +- .../libdruntime/core/sys/posix/sys/stat.d | 2 +- libphobos/libdruntime/core/thread.d | 146 ++++++++------- .../libphobos.thread/fiber_guard_page.d | 2 +- 14 files changed, 101 insertions(+), 270 deletions(-) delete mode 100644 libphobos/libdruntime/config/powerpc/callwithstack.S diff --git a/gcc/d/dmd/MERGE b/gcc/d/dmd/MERGE index a2699d39842..82cb6128770 100644 --- a/gcc/d/dmd/MERGE +++ b/gcc/d/dmd/MERGE @@ -1,4 +1,4 @@ -06160ccaed7af7955d169024f417c43beb7a8f9f +934df6f8cf848071dd0312098975f0c13873e01c The first line of this file holds the git revision number of the last merge done from the dlang/dmd repository. diff --git a/gcc/testsuite/gdc.test/runnable/arrayop.d b/gcc/testsuite/gdc.test/runnable/arrayop.d index e3749bee72a..8c6b083fd30 100644 --- a/gcc/testsuite/gdc.test/runnable/arrayop.d +++ b/gcc/testsuite/gdc.test/runnable/arrayop.d @@ -1,3 +1,4 @@ +// RUNNABLE_PHOBOS_TEST import std.math; extern(C) int printf(const char*, ...); diff --git a/gcc/testsuite/gdc.test/runnable/ctorpowtests.d b/gcc/testsuite/gdc.test/runnable/ctorpowtests.d index b193d3b1e02..1b81a9eb7b4 100644 --- a/gcc/testsuite/gdc.test/runnable/ctorpowtests.d +++ b/gcc/testsuite/gdc.test/runnable/ctorpowtests.d @@ -1,3 +1,4 @@ +// RUNNABLE_PHOBOS_TEST // PERMUTE_ARGS: int magicVariable() diff --git a/gcc/testsuite/gdc.test/runnable/template2.d b/gcc/testsuite/gdc.test/runnable/template2.d index ba5ad13ebd2..3adaeae61ae 100644 --- a/gcc/testsuite/gdc.test/runnable/template2.d +++ b/gcc/testsuite/gdc.test/runnable/template2.d @@ -1,3 +1,4 @@ +// RUNNABLE_PHOBOS_TEST // original post to the D newsgroup: // http://www.digitalmars.com/pnews/read.php?server=news.digitalmars.com&group=D&artnum=10554&header // Test to manipulate 3D vectors, in D! diff --git a/gcc/testsuite/gdc.test/runnable/testaa2.d b/gcc/testsuite/gdc.test/runnable/testaa2.d index a8d98c49e9f..d9256039788 100644 --- a/gcc/testsuite/gdc.test/runnable/testaa2.d +++ b/gcc/testsuite/gdc.test/runnable/testaa2.d @@ -1,3 +1,4 @@ +// RUNNABLE_PHOBOS_TEST // PERMUTE_ARGS: extern(C) int printf(const char*, ...); diff --git a/libphobos/libdruntime/MERGE b/libphobos/libdruntime/MERGE index c6357317ddc..c61ad7ca7ed 100644 --- a/libphobos/libdruntime/MERGE +++ b/libphobos/libdruntime/MERGE @@ -1,4 +1,4 @@ -476882795473a884f837bea6da850ac5181868d1 +7bdd83d7b4bd9fd4cb9ffca0d50babc90b31bfd6 The first line of this file holds the git revision number of the last merge done from the dlang/druntime repository. diff --git a/libphobos/libdruntime/Makefile.am b/libphobos/libdruntime/Makefile.am index e1dc24c660b..1d340a0041c 100644 --- a/libphobos/libdruntime/Makefile.am +++ b/libphobos/libdruntime/Makefile.am @@ -81,8 +81,7 @@ if DRUNTIME_CPU_MIPS DRUNTIME_SOURCES_CONFIGURED += config/mips/switchcontext.S endif if DRUNTIME_CPU_POWERPC - DRUNTIME_SOURCES_CONFIGURED += config/powerpc/callwithstack.S \ - config/powerpc/switchcontext.S + DRUNTIME_SOURCES_CONFIGURED += config/powerpc/switchcontext.S endif if DRUNTIME_CPU_X86 if DRUNTIME_OS_MINGW diff --git a/libphobos/libdruntime/Makefile.in b/libphobos/libdruntime/Makefile.in index 694de3e0b43..3fddbc340de 100644 --- a/libphobos/libdruntime/Makefile.in +++ b/libphobos/libdruntime/Makefile.in @@ -123,9 +123,7 @@ target_triplet = @target@ @DRUNTIME_CPU_AARCH64_TRUE@am__append_11 = config/aarch64/switchcontext.S @DRUNTIME_CPU_ARM_TRUE@am__append_12 = config/arm/switchcontext.S @DRUNTIME_CPU_MIPS_TRUE@am__append_13 = config/mips/switchcontext.S -@DRUNTIME_CPU_POWERPC_TRUE@am__append_14 = config/powerpc/callwithstack.S \ -@DRUNTIME_CPU_POWERPC_TRUE@ config/powerpc/switchcontext.S - +@DRUNTIME_CPU_POWERPC_TRUE@am__append_14 = config/powerpc/switchcontext.S @DRUNTIME_CPU_X86_TRUE@@DRUNTIME_OS_MINGW_TRUE@am__append_15 = config/mingw/switchcontext.S @DRUNTIME_CPU_X86_TRUE@@DRUNTIME_OS_MINGW_FALSE@am__append_16 = config/x86/switchcontext.S @DRUNTIME_CPU_SYSTEMZ_TRUE@am__append_17 = config/systemz/get_tls_offset.S @@ -441,8 +439,7 @@ am__objects_21 = core/sys/solaris/dlfcn.lo core/sys/solaris/elf.lo \ @DRUNTIME_CPU_AARCH64_TRUE@am__objects_23 = config/aarch64/libgdruntime_la-switchcontext.lo @DRUNTIME_CPU_ARM_TRUE@am__objects_24 = config/arm/libgdruntime_la-switchcontext.lo @DRUNTIME_CPU_MIPS_TRUE@am__objects_25 = config/mips/libgdruntime_la-switchcontext.lo -@DRUNTIME_CPU_POWERPC_TRUE@am__objects_26 = config/powerpc/libgdruntime_la-callwithstack.lo \ -@DRUNTIME_CPU_POWERPC_TRUE@ config/powerpc/libgdruntime_la-switchcontext.lo +@DRUNTIME_CPU_POWERPC_TRUE@am__objects_26 = config/powerpc/libgdruntime_la-switchcontext.lo @DRUNTIME_CPU_X86_TRUE@@DRUNTIME_OS_MINGW_TRUE@am__objects_27 = config/mingw/libgdruntime_la-switchcontext.lo @DRUNTIME_CPU_X86_TRUE@@DRUNTIME_OS_MINGW_FALSE@am__objects_28 = config/x86/libgdruntime_la-switchcontext.lo @DRUNTIME_CPU_SYSTEMZ_TRUE@am__objects_29 = config/systemz/libgdruntime_la-get_tls_offset.lo @@ -463,8 +460,7 @@ am__objects_34 = core/stdc/libgdruntime_convenience_la-errno_.lo @DRUNTIME_CPU_AARCH64_TRUE@am__objects_35 = config/aarch64/libgdruntime_convenience_la-switchcontext.lo @DRUNTIME_CPU_ARM_TRUE@am__objects_36 = config/arm/libgdruntime_convenience_la-switchcontext.lo @DRUNTIME_CPU_MIPS_TRUE@am__objects_37 = config/mips/libgdruntime_convenience_la-switchcontext.lo -@DRUNTIME_CPU_POWERPC_TRUE@am__objects_38 = config/powerpc/libgdruntime_convenience_la-callwithstack.lo \ -@DRUNTIME_CPU_POWERPC_TRUE@ config/powerpc/libgdruntime_convenience_la-switchcontext.lo +@DRUNTIME_CPU_POWERPC_TRUE@am__objects_38 = config/powerpc/libgdruntime_convenience_la-switchcontext.lo @DRUNTIME_CPU_X86_TRUE@@DRUNTIME_OS_MINGW_TRUE@am__objects_39 = config/mingw/libgdruntime_convenience_la-switchcontext.lo @DRUNTIME_CPU_X86_TRUE@@DRUNTIME_OS_MINGW_FALSE@am__objects_40 = config/x86/libgdruntime_convenience_la-switchcontext.lo @DRUNTIME_CPU_SYSTEMZ_TRUE@am__objects_41 = config/systemz/libgdruntime_convenience_la-get_tls_offset.lo @@ -1748,8 +1744,6 @@ config/mips/libgdruntime_la-switchcontext.lo: \ config/powerpc/$(am__dirstamp): @$(MKDIR_P) config/powerpc @: > config/powerpc/$(am__dirstamp) -config/powerpc/libgdruntime_la-callwithstack.lo: \ - config/powerpc/$(am__dirstamp) config/powerpc/libgdruntime_la-switchcontext.lo: \ config/powerpc/$(am__dirstamp) config/mingw/$(am__dirstamp): @@ -1785,8 +1779,6 @@ config/arm/libgdruntime_convenience_la-switchcontext.lo: \ config/arm/$(am__dirstamp) config/mips/libgdruntime_convenience_la-switchcontext.lo: \ config/mips/$(am__dirstamp) -config/powerpc/libgdruntime_convenience_la-callwithstack.lo: \ - config/powerpc/$(am__dirstamp) config/powerpc/libgdruntime_convenience_la-switchcontext.lo: \ config/powerpc/$(am__dirstamp) config/mingw/libgdruntime_convenience_la-switchcontext.lo: \ @@ -1921,9 +1913,6 @@ config/arm/libgdruntime_la-switchcontext.lo: config/arm/switchcontext.S config/mips/libgdruntime_la-switchcontext.lo: config/mips/switchcontext.S $(AM_V_CPPAS)$(LIBTOOL) $(AM_V_lt) $(libgdruntime_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CCAS) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CCASFLAGS) $(CCASFLAGS) -c -o config/mips/libgdruntime_la-switchcontext.lo `test -f 'config/mips/switchcontext.S' || echo '$(srcdir)/'`config/mips/switchcontext.S -config/powerpc/libgdruntime_la-callwithstack.lo: config/powerpc/callwithstack.S - $(AM_V_CPPAS)$(LIBTOOL) $(AM_V_lt) $(libgdruntime_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CCAS) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CCASFLAGS) $(CCASFLAGS) -c -o config/powerpc/libgdruntime_la-callwithstack.lo `test -f 'config/powerpc/callwithstack.S' || echo '$(srcdir)/'`config/powerpc/callwithstack.S - config/powerpc/libgdruntime_la-switchcontext.lo: config/powerpc/switchcontext.S $(AM_V_CPPAS)$(LIBTOOL) $(AM_V_lt) $(libgdruntime_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CCAS) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CCASFLAGS) $(CCASFLAGS) -c -o config/powerpc/libgdruntime_la-switchcontext.lo `test -f 'config/powerpc/switchcontext.S' || echo '$(srcdir)/'`config/powerpc/switchcontext.S @@ -1948,9 +1937,6 @@ config/arm/libgdruntime_convenience_la-switchcontext.lo: config/arm/switchcontex config/mips/libgdruntime_convenience_la-switchcontext.lo: config/mips/switchcontext.S $(AM_V_CPPAS)$(LIBTOOL) $(AM_V_lt) $(libgdruntime_convenience_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CCAS) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CCASFLAGS) $(CCASFLAGS) -c -o config/mips/libgdruntime_convenience_la-switchcontext.lo `test -f 'config/mips/switchcontext.S' || echo '$(srcdir)/'`config/mips/switchcontext.S -config/powerpc/libgdruntime_convenience_la-callwithstack.lo: config/powerpc/callwithstack.S - $(AM_V_CPPAS)$(LIBTOOL) $(AM_V_lt) $(libgdruntime_convenience_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CCAS) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CCASFLAGS) $(CCASFLAGS) -c -o config/powerpc/libgdruntime_convenience_la-callwithstack.lo `test -f 'config/powerpc/callwithstack.S' || echo '$(srcdir)/'`config/powerpc/callwithstack.S - config/powerpc/libgdruntime_convenience_la-switchcontext.lo: config/powerpc/switchcontext.S $(AM_V_CPPAS)$(LIBTOOL) $(AM_V_lt) $(libgdruntime_convenience_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CCAS) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CCASFLAGS) $(CCASFLAGS) -c -o config/powerpc/libgdruntime_convenience_la-switchcontext.lo `test -f 'config/powerpc/switchcontext.S' || echo '$(srcdir)/'`config/powerpc/switchcontext.S diff --git a/libphobos/libdruntime/config/powerpc/callwithstack.S b/libphobos/libdruntime/config/powerpc/callwithstack.S deleted file mode 100644 index 0752c5d0322..00000000000 --- a/libphobos/libdruntime/config/powerpc/callwithstack.S +++ /dev/null @@ -1,172 +0,0 @@ -/* PowerPC64 support code for fibers and multithreading. - Copyright (C) 2019-2020 Free Software Foundation, Inc. - -This file is part of GCC. - -GCC is free software; you can redistribute it and/or modify it under -the terms of the GNU General Public License as published by the Free -Software Foundation; either version 3, or (at your option) any later -version. - -GCC is distributed in the hope that it will be useful, but WITHOUT ANY -WARRANTY; without even the implied warranty of MERCHANTABILITY or -FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -for more details. - -Under Section 7 of GPL version 3, you are granted additional -permissions described in the GCC Runtime Library Exception, version -3.1, as published by the Free Software Foundation. - -You should have received a copy of the GNU General Public License and -a copy of the GCC Runtime Library Exception along with this program; -see the files COPYING3 and COPYING.RUNTIME respectively. If not, see -. */ - -#include "../common/threadasm.S" - -#if defined(__PPC64__) - -#if defined(_CALL_ELF) && _CALL_ELF == 2 -#define USE_ABI_2 -#define LINKAGE_SZ 32 -#define LR_OFS 16 -#define TOC_OFS 24 -#define GPR_OFS 32 -#define STACK_SZ (LINKAGE_SZ + 26*8) -#define OFS_R3_R10 GPR_OFS -#define OFS_R14_R31 (GPR_OFS+8*8) -#else -#define LINKAGE_SZ 48 -#define LR_OFS 16 -#define TOC_OFS 40 -#define GPR_OFS 112 -#define STACK_SZ (LINKAGE_SZ + 8*8 + 18*8) -#define OFS_R3_R10 (STACK_SZ+LINKAGE_SZ) -#define OFS_R14_R31 GPR_OFS -#endif - - .text -#if defined( USE_ABI_2 ) - .abiversion 2 -#endif - .globl _D4core6thread18callWithStackShellFNbMDFNbPvZvZv - .align 2 - .type _D4core6thread18callWithStackShellFNbMDFNbPvZvZv,@function -#if defined( USE_ABI_2 ) - .section .text._D4core6thread18callWithStackShellFNbMDFNbPvZvZv,"a",@progbits -#else - .section .opd,"aw",@progbits -#endif -_D4core6thread18callWithStackShellFNbMDFNbPvZvZv: -#if !defined( USE_ABI_2 ) - .align 3 - .quad .L._D4core6thread18callWithStackShellFNbMDFNbPvZvZv - .quad .TOC.@tocbase - .quad 0 -#endif - .text -/* - * Called with: - * r3: pointer context - * r4: pointer to function - */ -.L._D4core6thread18callWithStackShellFNbMDFNbPvZvZv: - .cfi_startproc - stdu 1, -STACK_SZ(1) - mflr 0 - std 0, LR_OFS(1) - .cfi_def_cfa_offset 256 - .cfi_offset lr, 16 - - /* Save r14-r31 in general register save area */ - std 14, (OFS_R14_R31 + 0 * 8)(1) - std 15, (OFS_R14_R31 + 1 * 8)(1) - std 16, (OFS_R14_R31 + 2 * 8)(1) - std 17, (OFS_R14_R31 + 3 * 8)(1) - std 18, (OFS_R14_R31 + 4 * 8)(1) - std 19, (OFS_R14_R31 + 5 * 8)(1) - std 20, (OFS_R14_R31 + 6 * 8)(1) - std 21, (OFS_R14_R31 + 7 * 8)(1) - std 22, (OFS_R14_R31 + 8 * 8)(1) - std 23, (OFS_R14_R31 + 9 * 8)(1) - std 24, (OFS_R14_R31 + 10 * 8)(1) - std 25, (OFS_R14_R31 + 11 * 8)(1) - std 26, (OFS_R14_R31 + 12 * 8)(1) - std 27, (OFS_R14_R31 + 13 * 8)(1) - std 28, (OFS_R14_R31 + 14 * 8)(1) - std 29, (OFS_R14_R31 + 15 * 8)(1) - std 30, (OFS_R14_R31 + 16 * 8)(1) - std 31, (OFS_R14_R31 + 17 * 8)(1) - - /* Save r3-r10 in parameter save area of caller */ - std 3, (OFS_R3_R10 + 0 * 8)(1) - std 4, (OFS_R3_R10 + 1 * 8)(1) - std 5, (OFS_R3_R10 + 2 * 8)(1) - std 6, (OFS_R3_R10 + 3 * 8)(1) - std 7, (OFS_R3_R10 + 4 * 8)(1) - std 8, (OFS_R3_R10 + 5 * 8)(1) - std 9, (OFS_R3_R10 + 6 * 8)(1) - std 10, (OFS_R3_R10 + 7 * 8)(1) - - /* Save r2 in TOC save area */ - std 2, TOC_OFS(1) - - /* Do not save r11, r12 and r13. */ - - /* Call delegate: - * r3: pointer to context - * r4: pointer to stack - */ - mr 5, 4 - mr 4, 1 - ld 6, 0(5) - ld 11, 16(5) - ld 2, 8(5) - mtctr 6 - bctrl - nop - - /* Restore r2 from TOC save area */ - ld 2, TOC_OFS(1) - - /* Restore r3-r10 from local variable space */ - ld 3, (OFS_R3_R10 + 0 * 8)(1) - ld 4, (OFS_R3_R10 + 1 * 8)(1) - ld 5, (OFS_R3_R10 + 2 * 8)(1) - ld 6, (OFS_R3_R10 + 3 * 8)(1) - ld 7, (OFS_R3_R10 + 4 * 8)(1) - ld 8, (OFS_R3_R10 + 5 * 8)(1) - ld 9, (OFS_R3_R10 + 6 * 8)(1) - ld 10, (OFS_R3_R10 + 7 * 8)(1) - - /* Restore r14-r31 from general register save area */ - ld 14, (OFS_R14_R31 + 0 * 8)(1) - ld 15, (OFS_R14_R31 + 1 * 8)(1) - ld 16, (OFS_R14_R31 + 2 * 8)(1) - ld 17, (OFS_R14_R31 + 3 * 8)(1) - ld 18, (OFS_R14_R31 + 4 * 8)(1) - ld 19, (OFS_R14_R31 + 5 * 8)(1) - ld 20, (OFS_R14_R31 + 6 * 8)(1) - ld 21, (OFS_R14_R31 + 7 * 8)(1) - ld 22, (OFS_R14_R31 + 8 * 8)(1) - ld 23, (OFS_R14_R31 + 9 * 8)(1) - ld 24, (OFS_R14_R31 + 10 * 8)(1) - ld 25, (OFS_R14_R31 + 11 * 8)(1) - ld 26, (OFS_R14_R31 + 12 * 8)(1) - ld 27, (OFS_R14_R31 + 13 * 8)(1) - ld 28, (OFS_R14_R31 + 14 * 8)(1) - ld 29, (OFS_R14_R31 + 15 * 8)(1) - ld 30, (OFS_R14_R31 + 16 * 8)(1) - ld 31, (OFS_R14_R31 + 17 * 8)(1) - - ld 0, LR_OFS(1) - mtlr 0 - addi 1, 1, STACK_SZ - blr - .long 0 - .quad 0 -.Lend: - .size _D4core6thread18callWithStackShellFNbMDFNbPvZvZv, .Lend-.L._D4core6thread18callWithStackShellFNbMDFNbPvZvZv - .cfi_endproc - -#endif /* defined(__PPC64__) */ diff --git a/libphobos/libdruntime/config/powerpc/switchcontext.S b/libphobos/libdruntime/config/powerpc/switchcontext.S index 0a6cc243942..6689217ca07 100644 --- a/libphobos/libdruntime/config/powerpc/switchcontext.S +++ b/libphobos/libdruntime/config/powerpc/switchcontext.S @@ -34,10 +34,10 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see * */ .text - .globl CSYM(_fiber_switchContext) - .type CSYM(_fiber_switchContext), @function + .globl CSYM(fiber_switchContext) + .type CSYM(fiber_switchContext), @function .align 2 -CSYM(_fiber_switchContext): +CSYM(fiber_switchContext): .cfi_startproc /* Save linkage area */ mflr 0 @@ -149,6 +149,6 @@ CSYM(_fiber_switchContext): /* Return and switch context */ blr .cfi_endproc - .size CSYM(_fiber_switchContext),.-CSYM(_fiber_switchContext) + .size CSYM(fiber_switchContext),.-CSYM(fiber_switchContext) #endif /* !defined(__PPC64__) */ diff --git a/libphobos/libdruntime/core/internal/convert.d b/libphobos/libdruntime/core/internal/convert.d index 0f540f83d42..8010ad773b8 100644 --- a/libphobos/libdruntime/core/internal/convert.d +++ b/libphobos/libdruntime/core/internal/convert.d @@ -84,7 +84,10 @@ const(ubyte)[] toUbyte(T)(const ref T val) if (is(Unqual!T == float) || is(Unqua ubyte[] buff = ctfe_alloc(T.sizeof); enum msbSize = double.sizeof; - double hi = toPrec!double(val); + static if (is(Unqual!T == ireal)) + double hi = toPrec!double(val.im); + else + double hi = toPrec!double(val); buff[0 .. msbSize] = toUbyte(hi)[]; if (val is cast(T)0.0 || val is cast(T)-0.0 || @@ -98,7 +101,10 @@ const(ubyte)[] toUbyte(T)(const ref T val) if (is(Unqual!T == float) || is(Unqua } else { - double low = toPrec!double(val - hi); + static if (is(Unqual!T == ireal)) + double low = toPrec!double(val.im - hi); + else + double low = toPrec!double(val - hi); buff[msbSize .. $] = toUbyte(low)[]; } diff --git a/libphobos/libdruntime/core/sys/posix/sys/stat.d b/libphobos/libdruntime/core/sys/posix/sys/stat.d index b0d57f28ee6..b154e1489a6 100644 --- a/libphobos/libdruntime/core/sys/posix/sys/stat.d +++ b/libphobos/libdruntime/core/sys/posix/sys/stat.d @@ -1391,6 +1391,7 @@ else version (Solaris) dev_t st_rdev; c_long[2] st_pad2; off_t st_size; + c_long st_pad3; union { timestruc_t st_atim; @@ -1424,7 +1425,6 @@ else version (Solaris) dev_t st_rdev; c_long[2] st_pad2; off64_t st_size; - c_long st_pad3; union { timestruc_t st_atim; diff --git a/libphobos/libdruntime/core/thread.d b/libphobos/libdruntime/core/thread.d index fb5f942e551..e1a68057ca1 100644 --- a/libphobos/libdruntime/core/thread.d +++ b/libphobos/libdruntime/core/thread.d @@ -2407,93 +2407,84 @@ shared static ~this() // Used for needLock below. private __gshared bool multiThreadedFlag = false; -version (PPC64) version = ExternStackShell; - -version (ExternStackShell) +// Calls the given delegate, passing the current thread's stack pointer to it. +private void callWithStackShell(scope void delegate(void* sp) nothrow fn) nothrow +in { - extern(D) public void callWithStackShell(scope void delegate(void* sp) nothrow fn) nothrow; + assert(fn); } -else +body { - // Calls the given delegate, passing the current thread's stack pointer to it. - private void callWithStackShell(scope void delegate(void* sp) nothrow fn) nothrow - in + // The purpose of the 'shell' is to ensure all the registers get + // put on the stack so they'll be scanned. We only need to push + // the callee-save registers. + void *sp = void; + + version (GNU) { - assert(fn); + __builtin_unwind_init(); + sp = &sp; } - body + else version (AsmX86_Posix) { - // The purpose of the 'shell' is to ensure all the registers get - // put on the stack so they'll be scanned. We only need to push - // the callee-save registers. - void *sp = void; - - version (GNU) - { - __builtin_unwind_init(); - sp = &sp; - } - else version (AsmX86_Posix) + size_t[3] regs = void; + asm pure nothrow @nogc { - size_t[3] regs = void; - asm pure nothrow @nogc - { - mov [regs + 0 * 4], EBX; - mov [regs + 1 * 4], ESI; - mov [regs + 2 * 4], EDI; + mov [regs + 0 * 4], EBX; + mov [regs + 1 * 4], ESI; + mov [regs + 2 * 4], EDI; - mov sp[EBP], ESP; - } + mov sp[EBP], ESP; } - else version (AsmX86_Windows) + } + else version (AsmX86_Windows) + { + size_t[3] regs = void; + asm pure nothrow @nogc { - size_t[3] regs = void; - asm pure nothrow @nogc - { - mov [regs + 0 * 4], EBX; - mov [regs + 1 * 4], ESI; - mov [regs + 2 * 4], EDI; + mov [regs + 0 * 4], EBX; + mov [regs + 1 * 4], ESI; + mov [regs + 2 * 4], EDI; - mov sp[EBP], ESP; - } + mov sp[EBP], ESP; } - else version (AsmX86_64_Posix) + } + else version (AsmX86_64_Posix) + { + size_t[5] regs = void; + asm pure nothrow @nogc { - size_t[5] regs = void; - asm pure nothrow @nogc - { - mov [regs + 0 * 8], RBX; - mov [regs + 1 * 8], R12; - mov [regs + 2 * 8], R13; - mov [regs + 3 * 8], R14; - mov [regs + 4 * 8], R15; + mov [regs + 0 * 8], RBX; + mov [regs + 1 * 8], R12; + mov [regs + 2 * 8], R13; + mov [regs + 3 * 8], R14; + mov [regs + 4 * 8], R15; - mov sp[RBP], RSP; - } + mov sp[RBP], RSP; } - else version (AsmX86_64_Windows) - { - size_t[7] regs = void; - asm pure nothrow @nogc - { - mov [regs + 0 * 8], RBX; - mov [regs + 1 * 8], RSI; - mov [regs + 2 * 8], RDI; - mov [regs + 3 * 8], R12; - mov [regs + 4 * 8], R13; - mov [regs + 5 * 8], R14; - mov [regs + 6 * 8], R15; - - mov sp[RBP], RSP; - } - } - else + } + else version (AsmX86_64_Windows) + { + size_t[7] regs = void; + asm pure nothrow @nogc { - static assert(false, "Architecture not supported."); - } + mov [regs + 0 * 8], RBX; + mov [regs + 1 * 8], RSI; + mov [regs + 2 * 8], RDI; + mov [regs + 3 * 8], R12; + mov [regs + 4 * 8], R13; + mov [regs + 5 * 8], R14; + mov [regs + 6 * 8], R15; - fn(sp); + mov sp[RBP], RSP; + } } + else + { + static assert(false, "Architecture not supported."); + } + + fn(sp); } // Used for suspendAll/resumeAll below. @@ -5287,6 +5278,23 @@ unittest // Multiple threads running shared fibers +version (PPC) version = UnsafeFiberMigration; +version (PPC64) version = UnsafeFiberMigration; + +version (UnsafeFiberMigration) +{ + // XBUG: core.thread fibers are supposed to be safe to migrate across + // threads, however, there is a problem: GCC always assumes that the + // address of thread-local variables don't change while on a given stack. + // In consequence, migrating fibers between threads currently is an unsafe + // thing to do, and will break on some targets (possibly PR26461). +} +else +{ + version = FiberMigrationUnittest; +} + +version (FiberMigrationUnittest) unittest { shared bool[10] locks; diff --git a/libphobos/testsuite/libphobos.thread/fiber_guard_page.d b/libphobos/testsuite/libphobos.thread/fiber_guard_page.d index 49c22658542..61a616acd8e 100644 --- a/libphobos/testsuite/libphobos.thread/fiber_guard_page.d +++ b/libphobos/testsuite/libphobos.thread/fiber_guard_page.d @@ -18,7 +18,7 @@ void stackMethod() void main() { - auto test_fiber = new Fiber(&stackMethod, stackSize); + auto test_fiber = new Fiber(&stackMethod, stackSize, stackSize); // allocate a page below (above) the fiber's stack to make stack overflows possible (w/o segfaulting) version (StackGrowsDown) -- 2.30.2