aboutsummaryrefslogtreecommitdiff
path: root/libphobos/libdruntime
diff options
context:
space:
mode:
authorIain Buclaw <ibuclaw@gdcproject.org>2019-04-24 22:46:59 +0000
committerIain Buclaw <ibuclaw@gcc.gnu.org>2019-04-24 22:46:59 +0000
commit2493e718159bdee3a589234196ce177d37b1e649 (patch)
tree1fcbbacd1e37224ecd98458ffb0021f4a4efbf5d /libphobos/libdruntime
parent7c3e085e4405ef4148edf4ea5bedd7930df23c58 (diff)
downloadgcc-2493e718159bdee3a589234196ce177d37b1e649.zip
gcc-2493e718159bdee3a589234196ce177d37b1e649.tar.gz
gcc-2493e718159bdee3a589234196ce177d37b1e649.tar.bz2
libphobos: Fix linker warning and SEGV in core.thread tests.
The monolithic core/threadasm.S source has been removed, and split into multiple parts, one for each intended target CPU/OS. Added .type and .size directives for all asm implementations of fiber_switchContent and callWithStackShell where they were missing. libphobos/ChangeLog: 2019-04-25 Iain Buclaw <ibuclaw@gdcproject.org> PR d/90086 * m4/druntime/cpu.m4 (DRUNTIME_CPU_SOURCES): New macro. * configure.ac: Use it. * configure: Regenerate. * libdruntime/Makefile.am: Add new config sources to DRUNTIME_SOURCES_CONFIGURED. * libdruntime/Makefile.in: Regenerate. * libdruntime/config/aarch64/switchcontext.S: New file. * libdruntime/config/arm/switchcontext.S: New file. * libdruntime/config/common/threadasm.S: New file. * libdruntime/config/mingw/switchcontext.S: New file. * libdruntime/config/mips/switchcontext.S: New file. * libdruntime/config/powerpc/switchcontext.S: New file. * libdruntime/config/powerpc64/callwithstack.S: New file. * libdruntime/config/x86/switchcontext.S: New file. * libdruntime/core/threadasm.S: Remove. From-SVN: r270560
Diffstat (limited to 'libphobos/libdruntime')
-rw-r--r--libphobos/libdruntime/Makefile.am73
-rw-r--r--libphobos/libdruntime/Makefile.in213
-rw-r--r--libphobos/libdruntime/config/aarch64/switchcontext.S103
-rw-r--r--libphobos/libdruntime/config/arm/switchcontext.S118
-rw-r--r--libphobos/libdruntime/config/common/threadasm.S43
-rw-r--r--libphobos/libdruntime/config/mingw/switchcontext.S109
-rw-r--r--libphobos/libdruntime/config/mips/switchcontext.S102
-rw-r--r--libphobos/libdruntime/config/powerpc/switchcontext.S150
-rw-r--r--libphobos/libdruntime/config/powerpc64/callwithstack.S168
-rw-r--r--libphobos/libdruntime/config/x86/switchcontext.S96
-rw-r--r--libphobos/libdruntime/core/threadasm.S682
11 files changed, 1092 insertions, 765 deletions
diff --git a/libphobos/libdruntime/Makefile.am b/libphobos/libdruntime/Makefile.am
index 8cdea52..b981f23 100644
--- a/libphobos/libdruntime/Makefile.am
+++ b/libphobos/libdruntime/Makefile.am
@@ -36,43 +36,67 @@ ALL_DRUNTIME_INSTALL_DSOURCES = $(DRUNTIME_DSOURCES) \
$(DRUNTIME_DSOURCES_STDCXX)
# Setup source files depending on configure
-ALL_DRUNTIME_COMPILE_DSOURCES = $(DRUNTIME_DSOURCES)
+DRUNTIME_SOURCES_CONFIGURED =
+
# GC sources
if DRUNTIME_GC_ENABLE
- ALL_DRUNTIME_COMPILE_DSOURCES += $(DRUNTIME_DSOURCES_GC)
+ DRUNTIME_SOURCES_CONFIGURED += $(DRUNTIME_DSOURCES_GC)
else
- ALL_DRUNTIME_COMPILE_DSOURCES += $(DRUNTIME_DSOURCES_GCSTUB)
+ DRUNTIME_SOURCES_CONFIGURED += $(DRUNTIME_DSOURCES_GCSTUB)
endif
# OS specific sources
if DRUNTIME_OS_UNIX
- ALL_DRUNTIME_COMPILE_DSOURCES += $(DRUNTIME_DSOURCES_POSIX)
+ DRUNTIME_SOURCES_CONFIGURED += $(DRUNTIME_DSOURCES_POSIX)
endif
if DRUNTIME_OS_DARWIN
- ALL_DRUNTIME_COMPILE_DSOURCES += $(DRUNTIME_DSOURCES_DARWIN)
+ DRUNTIME_SOURCES_CONFIGURED += $(DRUNTIME_DSOURCES_DARWIN)
endif
if DRUNTIME_OS_DRAGONFLYBSD
- ALL_DRUNTIME_COMPILE_DSOURCES += $(DRUNTIME_DSOURCES_DRAGONFLYBSD)
+ DRUNTIME_SOURCES_CONFIGURED += $(DRUNTIME_DSOURCES_DRAGONFLYBSD)
endif
if DRUNTIME_OS_ANDROID
- ALL_DRUNTIME_COMPILE_DSOURCES += $(DRUNTIME_DSOURCES_BIONIC)
+ DRUNTIME_SOURCES_CONFIGURED += $(DRUNTIME_DSOURCES_BIONIC)
endif
if DRUNTIME_OS_FREEBSD
- ALL_DRUNTIME_COMPILE_DSOURCES += $(DRUNTIME_DSOURCES_FREEBSD)
+ DRUNTIME_SOURCES_CONFIGURED += $(DRUNTIME_DSOURCES_FREEBSD)
endif
if DRUNTIME_OS_NETBSD
- ALL_DRUNTIME_COMPILE_DSOURCES += $(DRUNTIME_DSOURCES_NETBSD)
+ DRUNTIME_SOURCES_CONFIGURED += $(DRUNTIME_DSOURCES_NETBSD)
endif
if DRUNTIME_OS_OPENBSD
- ALL_DRUNTIME_COMPILE_DSOURCES += $(DRUNTIME_DSOURCES_OPENBSD)
+ DRUNTIME_SOURCES_CONFIGURED += $(DRUNTIME_DSOURCES_OPENBSD)
endif
if DRUNTIME_OS_LINUX
- ALL_DRUNTIME_COMPILE_DSOURCES += $(DRUNTIME_DSOURCES_LINUX)
+ DRUNTIME_SOURCES_CONFIGURED += $(DRUNTIME_DSOURCES_LINUX)
endif
if DRUNTIME_OS_MINGW
- ALL_DRUNTIME_COMPILE_DSOURCES += $(DRUNTIME_DSOURCES_WINDOWS)
+ DRUNTIME_SOURCES_CONFIGURED += $(DRUNTIME_DSOURCES_WINDOWS)
endif
if DRUNTIME_OS_SOLARIS
- ALL_DRUNTIME_COMPILE_DSOURCES += $(DRUNTIME_DSOURCES_SOLARIS)
+ DRUNTIME_SOURCES_CONFIGURED += $(DRUNTIME_DSOURCES_SOLARIS)
+endif
+# CPU specific sources
+if DRUNTIME_CPU_AARCH64
+ DRUNTIME_SOURCES_CONFIGURED += config/aarch64/switchcontext.S
+endif
+if DRUNTIME_CPU_ARM
+ DRUNTIME_SOURCES_CONFIGURED += config/arm/switchcontext.S
+endif
+if DRUNTIME_CPU_MIPS
+ DRUNTIME_SOURCES_CONFIGURED += config/mips/switchcontext.S
+endif
+if DRUNTIME_CPU_POWERPC
+ DRUNTIME_SOURCES_CONFIGURED += config/powerpc/switchcontext.S
+endif
+if DRUNTIME_CPU_POWERPC64
+ DRUNTIME_SOURCES_CONFIGURED += config/powerpc64/callwithstack.S
+endif
+if DRUNTIME_CPU_X86
+if DRUNTIME_OS_MINGW
+ DRUNTIME_SOURCES_CONFIGURED += config/mingw/switchcontext.S
+else
+ DRUNTIME_SOURCES_CONFIGURED += config/x86/switchcontext.S
+endif
endif
# Provide __start_minfo, __stop_minfo if linker doesn't.
@@ -89,10 +113,10 @@ gcc/drtend.o: gcc/drtstuff.c
endif
# Generated by configure
-ALL_DRUNTIME_COMPILE_DSOURCES += $(DRUNTIME_DSOURCES_GENERATED)
+DRUNTIME_DSOURCES_GENERATED = gcc/config.d gcc/libbacktrace.d
-ALL_DRUNTIME_SOURCES = $(ALL_DRUNTIME_COMPILE_DSOURCES) $(DRUNTIME_CSOURCES) \
- $(DRUNTIME_SSOURCES)
+ALL_DRUNTIME_SOURCES = $(DRUNTIME_DSOURCES) $(DRUNTIME_CSOURCES) \
+ $(DRUNTIME_SOURCES_CONFIGURED) $(DRUNTIME_DSOURCES_GENERATED)
toolexeclib_LTLIBRARIES = libgdruntime.la
libgdruntime_la_SOURCES = $(ALL_DRUNTIME_SOURCES)
@@ -114,13 +138,10 @@ install-data-local:
fi ; \
done
-
-DRUNTIME_DSOURCES_GENERATED = gcc/config.d gcc/libbacktrace.d
# Source file definitions. Boring stuff, auto-generated with
# https://gist.github.com/jpf91/8ad1dbc9902d6ad876313f134c6527d1
# Can't use wildcards here:
# https://www.gnu.org/software/automake/manual/html_node/Wildcards.html
-DRUNTIME_SSOURCES = core/threadasm.S
DRUNTIME_CSOURCES = core/stdc/errno_.c
@@ -141,13 +162,13 @@ DRUNTIME_DSOURCES = core/atomic.d core/attribute.d core/bitop.d \
core/sync/rwmutex.d core/sync/semaphore.d core/thread.d core/time.d \
core/vararg.d gcc/attribute.d gcc/backtrace.d gcc/builtins.d gcc/deh.d \
gcc/sections/android.d gcc/sections/elf_shared.d gcc/sections/osx.d \
- gcc/sections/package.d gcc/sections/win32.d \
- gcc/sections/win64.d gcc/unwind/arm.d gcc/unwind/arm_common.d \
- gcc/unwind/c6x.d gcc/unwind/generic.d gcc/unwind/package.d \
- gcc/unwind/pe.d object.d rt/aApply.d rt/aApplyR.d rt/aaA.d rt/adi.d \
- rt/arrayassign.d rt/arraycast.d rt/arraycat.d rt/cast_.d rt/config.d \
- rt/critical_.d rt/deh.d rt/dmain2.d rt/invariant.d rt/lifetime.d \
- rt/memory.d rt/minfo.d rt/monitor_.d rt/obj.d rt/qsort.d rt/sections.d \
+ gcc/sections/package.d gcc/sections/win32.d gcc/sections/win64.d \
+ gcc/unwind/arm.d gcc/unwind/arm_common.d gcc/unwind/c6x.d \
+ gcc/unwind/generic.d gcc/unwind/package.d gcc/unwind/pe.d object.d \
+ rt/aApply.d rt/aApplyR.d rt/aaA.d rt/adi.d rt/arrayassign.d \
+ rt/arraycast.d rt/arraycat.d rt/cast_.d rt/config.d rt/critical_.d \
+ rt/deh.d rt/dmain2.d rt/invariant.d rt/lifetime.d rt/memory.d \
+ rt/minfo.d rt/monitor_.d rt/obj.d rt/qsort.d rt/sections.d \
rt/switch_.d rt/tlsgc.d rt/typeinfo/ti_Acdouble.d \
rt/typeinfo/ti_Acfloat.d rt/typeinfo/ti_Acreal.d \
rt/typeinfo/ti_Adouble.d rt/typeinfo/ti_Afloat.d rt/typeinfo/ti_Ag.d \
diff --git a/libphobos/libdruntime/Makefile.in b/libphobos/libdruntime/Makefile.in
index 6157046..eb290b6 100644
--- a/libphobos/libdruntime/Makefile.in
+++ b/libphobos/libdruntime/Makefile.in
@@ -107,6 +107,7 @@ POST_UNINSTALL = :
build_triplet = @build@
host_triplet = @host@
target_triplet = @target@
+
# GC sources
@DRUNTIME_GC_ENABLE_TRUE@am__append_1 = $(DRUNTIME_DSOURCES_GC)
@DRUNTIME_GC_ENABLE_FALSE@am__append_2 = $(DRUNTIME_DSOURCES_GCSTUB)
@@ -121,6 +122,14 @@ target_triplet = @target@
@DRUNTIME_OS_LINUX_TRUE@am__append_10 = $(DRUNTIME_DSOURCES_LINUX)
@DRUNTIME_OS_MINGW_TRUE@am__append_11 = $(DRUNTIME_DSOURCES_WINDOWS)
@DRUNTIME_OS_SOLARIS_TRUE@am__append_12 = $(DRUNTIME_DSOURCES_SOLARIS)
+# CPU specific sources
+@DRUNTIME_CPU_AARCH64_TRUE@am__append_13 = config/aarch64/switchcontext.S
+@DRUNTIME_CPU_ARM_TRUE@am__append_14 = config/arm/switchcontext.S
+@DRUNTIME_CPU_MIPS_TRUE@am__append_15 = config/mips/switchcontext.S
+@DRUNTIME_CPU_POWERPC_TRUE@am__append_16 = config/powerpc/switchcontext.S
+@DRUNTIME_CPU_POWERPC64_TRUE@am__append_17 = config/powerpc64/callwithstack.S
+@DRUNTIME_CPU_X86_TRUE@@DRUNTIME_OS_MINGW_TRUE@am__append_18 = config/mingw/switchcontext.S
+@DRUNTIME_CPU_X86_TRUE@@DRUNTIME_OS_MINGW_FALSE@am__append_19 = config/x86/switchcontext.S
subdir = libdruntime
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
am__aclocal_m4_deps = $(top_srcdir)/../config/acx.m4 \
@@ -228,13 +237,14 @@ am__objects_1 = core/atomic.lo core/attribute.lo core/bitop.lo \
rt/util/container/common.lo rt/util/container/hashtab.lo \
rt/util/container/treap.lo rt/util/random.lo \
rt/util/typeinfo.lo rt/util/utf.lo
-am__objects_2 = gc/bits.lo gc/config.lo gc/gcinterface.lo \
+am__objects_2 = core/stdc/libgdruntime_la-errno_.lo
+am__objects_3 = gc/bits.lo gc/config.lo gc/gcinterface.lo \
gc/impl/conservative/gc.lo gc/impl/manual/gc.lo gc/os.lo \
gc/pooltable.lo gc/proxy.lo
-@DRUNTIME_GC_ENABLE_TRUE@am__objects_3 = $(am__objects_2)
-am__objects_4 = gcstub/gc.lo
-@DRUNTIME_GC_ENABLE_FALSE@am__objects_5 = $(am__objects_4)
-am__objects_6 = core/sys/posix/aio.lo core/sys/posix/arpa/inet.lo \
+@DRUNTIME_GC_ENABLE_TRUE@am__objects_4 = $(am__objects_3)
+am__objects_5 = gcstub/gc.lo
+@DRUNTIME_GC_ENABLE_FALSE@am__objects_6 = $(am__objects_5)
+am__objects_7 = core/sys/posix/aio.lo core/sys/posix/arpa/inet.lo \
core/sys/posix/config.lo core/sys/posix/dirent.lo \
core/sys/posix/dlfcn.lo core/sys/posix/fcntl.lo \
core/sys/posix/grp.lo core/sys/posix/iconv.lo \
@@ -259,8 +269,8 @@ am__objects_6 = core/sys/posix/aio.lo core/sys/posix/arpa/inet.lo \
core/sys/posix/syslog.lo core/sys/posix/termios.lo \
core/sys/posix/time.lo core/sys/posix/ucontext.lo \
core/sys/posix/unistd.lo core/sys/posix/utime.lo
-@DRUNTIME_OS_UNIX_TRUE@am__objects_7 = $(am__objects_6)
-am__objects_8 = core/sys/darwin/crt_externs.lo \
+@DRUNTIME_OS_UNIX_TRUE@am__objects_8 = $(am__objects_7)
+am__objects_9 = core/sys/darwin/crt_externs.lo \
core/sys/darwin/dlfcn.lo core/sys/darwin/execinfo.lo \
core/sys/darwin/mach/dyld.lo core/sys/darwin/mach/getsect.lo \
core/sys/darwin/mach/kern_return.lo \
@@ -270,8 +280,8 @@ am__objects_8 = core/sys/darwin/crt_externs.lo \
core/sys/darwin/netinet/in_.lo core/sys/darwin/pthread.lo \
core/sys/darwin/sys/cdefs.lo core/sys/darwin/sys/event.lo \
core/sys/darwin/sys/mman.lo
-@DRUNTIME_OS_DARWIN_TRUE@am__objects_9 = $(am__objects_8)
-am__objects_10 = core/sys/dragonflybsd/dlfcn.lo \
+@DRUNTIME_OS_DARWIN_TRUE@am__objects_10 = $(am__objects_9)
+am__objects_11 = core/sys/dragonflybsd/dlfcn.lo \
core/sys/dragonflybsd/execinfo.lo \
core/sys/dragonflybsd/netinet/in_.lo \
core/sys/dragonflybsd/pthread_np.lo \
@@ -286,10 +296,10 @@ am__objects_10 = core/sys/dragonflybsd/dlfcn.lo \
core/sys/dragonflybsd/sys/link_elf.lo \
core/sys/dragonflybsd/sys/mman.lo \
core/sys/dragonflybsd/time.lo
-@DRUNTIME_OS_DRAGONFLYBSD_TRUE@am__objects_11 = $(am__objects_10)
-am__objects_12 = core/sys/bionic/fcntl.lo core/sys/bionic/unistd.lo
-@DRUNTIME_OS_ANDROID_TRUE@am__objects_13 = $(am__objects_12)
-am__objects_14 = core/sys/freebsd/dlfcn.lo \
+@DRUNTIME_OS_DRAGONFLYBSD_TRUE@am__objects_12 = $(am__objects_11)
+am__objects_13 = core/sys/bionic/fcntl.lo core/sys/bionic/unistd.lo
+@DRUNTIME_OS_ANDROID_TRUE@am__objects_14 = $(am__objects_13)
+am__objects_15 = core/sys/freebsd/dlfcn.lo \
core/sys/freebsd/execinfo.lo core/sys/freebsd/netinet/in_.lo \
core/sys/freebsd/pthread_np.lo core/sys/freebsd/sys/_bitset.lo \
core/sys/freebsd/sys/_cpuset.lo core/sys/freebsd/sys/cdefs.lo \
@@ -299,16 +309,16 @@ am__objects_14 = core/sys/freebsd/dlfcn.lo \
core/sys/freebsd/sys/event.lo core/sys/freebsd/sys/link_elf.lo \
core/sys/freebsd/sys/mman.lo core/sys/freebsd/sys/mount.lo \
core/sys/freebsd/time.lo core/sys/freebsd/unistd.lo
-@DRUNTIME_OS_FREEBSD_TRUE@am__objects_15 = $(am__objects_14)
-am__objects_16 = core/sys/netbsd/dlfcn.lo core/sys/netbsd/execinfo.lo \
+@DRUNTIME_OS_FREEBSD_TRUE@am__objects_16 = $(am__objects_15)
+am__objects_17 = core/sys/netbsd/dlfcn.lo core/sys/netbsd/execinfo.lo \
core/sys/netbsd/sys/elf.lo core/sys/netbsd/sys/elf32.lo \
core/sys/netbsd/sys/elf64.lo core/sys/netbsd/sys/elf_common.lo \
core/sys/netbsd/sys/event.lo core/sys/netbsd/sys/link_elf.lo \
core/sys/netbsd/sys/mman.lo core/sys/netbsd/time.lo
-@DRUNTIME_OS_NETBSD_TRUE@am__objects_17 = $(am__objects_16)
-am__objects_18 = core/sys/openbsd/dlfcn.lo
-@DRUNTIME_OS_OPENBSD_TRUE@am__objects_19 = $(am__objects_18)
-am__objects_20 = core/sys/linux/config.lo core/sys/linux/dlfcn.lo \
+@DRUNTIME_OS_NETBSD_TRUE@am__objects_18 = $(am__objects_17)
+am__objects_19 = core/sys/openbsd/dlfcn.lo
+@DRUNTIME_OS_OPENBSD_TRUE@am__objects_20 = $(am__objects_19)
+am__objects_21 = core/sys/linux/config.lo core/sys/linux/dlfcn.lo \
core/sys/linux/elf.lo core/sys/linux/epoll.lo \
core/sys/linux/errno.lo core/sys/linux/execinfo.lo \
core/sys/linux/fcntl.lo core/sys/linux/ifaddrs.lo \
@@ -323,8 +333,8 @@ am__objects_20 = core/sys/linux/config.lo core/sys/linux/dlfcn.lo \
core/sys/linux/sys/xattr.lo core/sys/linux/termios.lo \
core/sys/linux/time.lo core/sys/linux/timerfd.lo \
core/sys/linux/tipc.lo core/sys/linux/unistd.lo
-@DRUNTIME_OS_LINUX_TRUE@am__objects_21 = $(am__objects_20)
-am__objects_22 = core/sys/windows/accctrl.lo \
+@DRUNTIME_OS_LINUX_TRUE@am__objects_22 = $(am__objects_21)
+am__objects_23 = core/sys/windows/accctrl.lo \
core/sys/windows/aclapi.lo core/sys/windows/aclui.lo \
core/sys/windows/basetsd.lo core/sys/windows/basetyps.lo \
core/sys/windows/cderr.lo core/sys/windows/cguid.lo \
@@ -407,8 +417,8 @@ am__objects_22 = core/sys/windows/accctrl.lo \
core/sys/windows/winspool.lo core/sys/windows/winsvc.lo \
core/sys/windows/winuser.lo core/sys/windows/winver.lo \
core/sys/windows/wtsapi32.lo core/sys/windows/wtypes.lo
-@DRUNTIME_OS_MINGW_TRUE@am__objects_23 = $(am__objects_22)
-am__objects_24 = core/sys/solaris/dlfcn.lo core/sys/solaris/elf.lo \
+@DRUNTIME_OS_MINGW_TRUE@am__objects_24 = $(am__objects_23)
+am__objects_25 = core/sys/solaris/dlfcn.lo core/sys/solaris/elf.lo \
core/sys/solaris/execinfo.lo core/sys/solaris/libelf.lo \
core/sys/solaris/link.lo core/sys/solaris/sys/elf.lo \
core/sys/solaris/sys/elf_386.lo \
@@ -419,17 +429,25 @@ am__objects_24 = core/sys/solaris/dlfcn.lo core/sys/solaris/elf.lo \
core/sys/solaris/sys/priocntl.lo \
core/sys/solaris/sys/procset.lo core/sys/solaris/sys/types.lo \
core/sys/solaris/time.lo
-@DRUNTIME_OS_SOLARIS_TRUE@am__objects_25 = $(am__objects_24)
-am__objects_26 = gcc/config.lo gcc/libbacktrace.lo
-am__objects_27 = $(am__objects_1) $(am__objects_3) $(am__objects_5) \
- $(am__objects_7) $(am__objects_9) $(am__objects_11) \
- $(am__objects_13) $(am__objects_15) $(am__objects_17) \
- $(am__objects_19) $(am__objects_21) $(am__objects_23) \
- $(am__objects_25) $(am__objects_26)
-am__objects_28 = core/stdc/libgdruntime_la-errno_.lo
-am__objects_29 = core/libgdruntime_la-threadasm.lo
-am__objects_30 = $(am__objects_27) $(am__objects_28) $(am__objects_29)
-am_libgdruntime_la_OBJECTS = $(am__objects_30)
+@DRUNTIME_OS_SOLARIS_TRUE@am__objects_26 = $(am__objects_25)
+@DRUNTIME_CPU_AARCH64_TRUE@am__objects_27 = config/aarch64/libgdruntime_la-switchcontext.lo
+@DRUNTIME_CPU_ARM_TRUE@am__objects_28 = config/arm/libgdruntime_la-switchcontext.lo
+@DRUNTIME_CPU_MIPS_TRUE@am__objects_29 = config/mips/libgdruntime_la-switchcontext.lo
+@DRUNTIME_CPU_POWERPC_TRUE@am__objects_30 = config/powerpc/libgdruntime_la-switchcontext.lo
+@DRUNTIME_CPU_POWERPC64_TRUE@am__objects_31 = config/powerpc64/libgdruntime_la-callwithstack.lo
+@DRUNTIME_CPU_X86_TRUE@@DRUNTIME_OS_MINGW_TRUE@am__objects_32 = config/mingw/libgdruntime_la-switchcontext.lo
+@DRUNTIME_CPU_X86_TRUE@@DRUNTIME_OS_MINGW_FALSE@am__objects_33 = config/x86/libgdruntime_la-switchcontext.lo
+am__objects_34 = $(am__objects_4) $(am__objects_6) $(am__objects_8) \
+ $(am__objects_10) $(am__objects_12) $(am__objects_14) \
+ $(am__objects_16) $(am__objects_18) $(am__objects_20) \
+ $(am__objects_22) $(am__objects_24) $(am__objects_26) \
+ $(am__objects_27) $(am__objects_28) $(am__objects_29) \
+ $(am__objects_30) $(am__objects_31) $(am__objects_32) \
+ $(am__objects_33)
+am__objects_35 = gcc/config.lo gcc/libbacktrace.lo
+am__objects_36 = $(am__objects_1) $(am__objects_2) $(am__objects_34) \
+ $(am__objects_35)
+am_libgdruntime_la_OBJECTS = $(am__objects_36)
libgdruntime_la_OBJECTS = $(am_libgdruntime_la_OBJECTS)
AM_V_P = $(am__v_P_@AM_V@)
am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
@@ -692,20 +710,22 @@ ALL_DRUNTIME_INSTALL_DSOURCES = $(DRUNTIME_DSOURCES) \
# Setup source files depending on configure
-
-# Generated by configure
-ALL_DRUNTIME_COMPILE_DSOURCES = $(DRUNTIME_DSOURCES) $(am__append_1) \
- $(am__append_2) $(am__append_3) $(am__append_4) \
- $(am__append_5) $(am__append_6) $(am__append_7) \
- $(am__append_8) $(am__append_9) $(am__append_10) \
- $(am__append_11) $(am__append_12) \
- $(DRUNTIME_DSOURCES_GENERATED)
+DRUNTIME_SOURCES_CONFIGURED = $(am__append_1) $(am__append_2) \
+ $(am__append_3) $(am__append_4) $(am__append_5) \
+ $(am__append_6) $(am__append_7) $(am__append_8) \
+ $(am__append_9) $(am__append_10) $(am__append_11) \
+ $(am__append_12) $(am__append_13) $(am__append_14) \
+ $(am__append_15) $(am__append_16) $(am__append_17) \
+ $(am__append_18) $(am__append_19)
# Provide __start_minfo, __stop_minfo if linker doesn't.
@DRUNTIME_OS_MINFO_BRACKETING_FALSE@DRTSTUFF = gcc/drtbegin.o gcc/drtend.o
@DRUNTIME_OS_MINFO_BRACKETING_FALSE@toolexeclib_DATA = $(DRTSTUFF)
-ALL_DRUNTIME_SOURCES = $(ALL_DRUNTIME_COMPILE_DSOURCES) $(DRUNTIME_CSOURCES) \
- $(DRUNTIME_SSOURCES)
+
+# Generated by configure
+DRUNTIME_DSOURCES_GENERATED = gcc/config.d gcc/libbacktrace.d
+ALL_DRUNTIME_SOURCES = $(DRUNTIME_DSOURCES) $(DRUNTIME_CSOURCES) \
+ $(DRUNTIME_SOURCES_CONFIGURED) $(DRUNTIME_DSOURCES_GENERATED)
toolexeclib_LTLIBRARIES = libgdruntime.la
libgdruntime_la_SOURCES = $(ALL_DRUNTIME_SOURCES)
@@ -715,12 +735,11 @@ libgdruntime_la_LDFLAGS = -Wc,-nophoboslib,-dstartfiles,-B../src,-Bgcc \
libgdruntime_la_LIBADD = $(LIBATOMIC) $(LIBBACKTRACE)
libgdruntime_la_DEPENDENCIES = $(DRTSTUFF)
-DRUNTIME_DSOURCES_GENERATED = gcc/config.d gcc/libbacktrace.d
+
# Source file definitions. Boring stuff, auto-generated with
# https://gist.github.com/jpf91/8ad1dbc9902d6ad876313f134c6527d1
# Can't use wildcards here:
# https://www.gnu.org/software/automake/manual/html_node/Wildcards.html
-DRUNTIME_SSOURCES = core/threadasm.S
DRUNTIME_CSOURCES = core/stdc/errno_.c
DRUNTIME_DSOURCES = core/atomic.d core/attribute.d core/bitop.d \
core/checkedint.d core/cpuid.d core/demangle.d core/exception.d \
@@ -739,13 +758,13 @@ DRUNTIME_DSOURCES = core/atomic.d core/attribute.d core/bitop.d \
core/sync/rwmutex.d core/sync/semaphore.d core/thread.d core/time.d \
core/vararg.d gcc/attribute.d gcc/backtrace.d gcc/builtins.d gcc/deh.d \
gcc/sections/android.d gcc/sections/elf_shared.d gcc/sections/osx.d \
- gcc/sections/package.d gcc/sections/win32.d \
- gcc/sections/win64.d gcc/unwind/arm.d gcc/unwind/arm_common.d \
- gcc/unwind/c6x.d gcc/unwind/generic.d gcc/unwind/package.d \
- gcc/unwind/pe.d object.d rt/aApply.d rt/aApplyR.d rt/aaA.d rt/adi.d \
- rt/arrayassign.d rt/arraycast.d rt/arraycat.d rt/cast_.d rt/config.d \
- rt/critical_.d rt/deh.d rt/dmain2.d rt/invariant.d rt/lifetime.d \
- rt/memory.d rt/minfo.d rt/monitor_.d rt/obj.d rt/qsort.d rt/sections.d \
+ gcc/sections/package.d gcc/sections/win32.d gcc/sections/win64.d \
+ gcc/unwind/arm.d gcc/unwind/arm_common.d gcc/unwind/c6x.d \
+ gcc/unwind/generic.d gcc/unwind/package.d gcc/unwind/pe.d object.d \
+ rt/aApply.d rt/aApplyR.d rt/aaA.d rt/adi.d rt/arrayassign.d \
+ rt/arraycast.d rt/arraycat.d rt/cast_.d rt/config.d rt/critical_.d \
+ rt/deh.d rt/dmain2.d rt/invariant.d rt/lifetime.d rt/memory.d \
+ rt/minfo.d rt/monitor_.d rt/obj.d rt/qsort.d rt/sections.d \
rt/switch_.d rt/tlsgc.d rt/typeinfo/ti_Acdouble.d \
rt/typeinfo/ti_Acfloat.d rt/typeinfo/ti_Acreal.d \
rt/typeinfo/ti_Adouble.d rt/typeinfo/ti_Afloat.d rt/typeinfo/ti_Ag.d \
@@ -1182,6 +1201,7 @@ rt/util/container/treap.lo: rt/util/container/$(am__dirstamp)
rt/util/random.lo: rt/util/$(am__dirstamp)
rt/util/typeinfo.lo: rt/util/$(am__dirstamp)
rt/util/utf.lo: rt/util/$(am__dirstamp)
+core/stdc/libgdruntime_la-errno_.lo: core/stdc/$(am__dirstamp)
gc/$(am__dirstamp):
@$(MKDIR_P) gc
@: > gc/$(am__dirstamp)
@@ -1629,16 +1649,63 @@ core/sys/solaris/sys/priocntl.lo: \
core/sys/solaris/sys/procset.lo: core/sys/solaris/sys/$(am__dirstamp)
core/sys/solaris/sys/types.lo: core/sys/solaris/sys/$(am__dirstamp)
core/sys/solaris/time.lo: core/sys/solaris/$(am__dirstamp)
+config/aarch64/$(am__dirstamp):
+ @$(MKDIR_P) config/aarch64
+ @: > config/aarch64/$(am__dirstamp)
+config/aarch64/libgdruntime_la-switchcontext.lo: \
+ config/aarch64/$(am__dirstamp)
+config/arm/$(am__dirstamp):
+ @$(MKDIR_P) config/arm
+ @: > config/arm/$(am__dirstamp)
+config/arm/libgdruntime_la-switchcontext.lo: \
+ config/arm/$(am__dirstamp)
+config/mips/$(am__dirstamp):
+ @$(MKDIR_P) config/mips
+ @: > config/mips/$(am__dirstamp)
+config/mips/libgdruntime_la-switchcontext.lo: \
+ config/mips/$(am__dirstamp)
+config/powerpc/$(am__dirstamp):
+ @$(MKDIR_P) config/powerpc
+ @: > config/powerpc/$(am__dirstamp)
+config/powerpc/libgdruntime_la-switchcontext.lo: \
+ config/powerpc/$(am__dirstamp)
+config/powerpc64/$(am__dirstamp):
+ @$(MKDIR_P) config/powerpc64
+ @: > config/powerpc64/$(am__dirstamp)
+config/powerpc64/libgdruntime_la-callwithstack.lo: \
+ config/powerpc64/$(am__dirstamp)
+config/mingw/$(am__dirstamp):
+ @$(MKDIR_P) config/mingw
+ @: > config/mingw/$(am__dirstamp)
+config/mingw/libgdruntime_la-switchcontext.lo: \
+ config/mingw/$(am__dirstamp)
+config/x86/$(am__dirstamp):
+ @$(MKDIR_P) config/x86
+ @: > config/x86/$(am__dirstamp)
+config/x86/libgdruntime_la-switchcontext.lo: \
+ config/x86/$(am__dirstamp)
gcc/config.lo: gcc/$(am__dirstamp)
gcc/libbacktrace.lo: gcc/$(am__dirstamp)
-core/stdc/libgdruntime_la-errno_.lo: core/stdc/$(am__dirstamp)
-core/libgdruntime_la-threadasm.lo: core/$(am__dirstamp)
libgdruntime.la: $(libgdruntime_la_OBJECTS) $(libgdruntime_la_DEPENDENCIES) $(EXTRA_libgdruntime_la_DEPENDENCIES)
$(AM_V_GEN)$(libgdruntime_la_LINK) -rpath $(toolexeclibdir) $(libgdruntime_la_OBJECTS) $(libgdruntime_la_LIBADD) $(LIBS)
mostlyclean-compile:
-rm -f *.$(OBJEXT)
+ -rm -f config/aarch64/*.$(OBJEXT)
+ -rm -f config/aarch64/*.lo
+ -rm -f config/arm/*.$(OBJEXT)
+ -rm -f config/arm/*.lo
+ -rm -f config/mingw/*.$(OBJEXT)
+ -rm -f config/mingw/*.lo
+ -rm -f config/mips/*.$(OBJEXT)
+ -rm -f config/mips/*.lo
+ -rm -f config/powerpc/*.$(OBJEXT)
+ -rm -f config/powerpc/*.lo
+ -rm -f config/powerpc64/*.$(OBJEXT)
+ -rm -f config/powerpc64/*.lo
+ -rm -f config/x86/*.$(OBJEXT)
+ -rm -f config/x86/*.lo
-rm -f core/*.$(OBJEXT)
-rm -f core/*.lo
-rm -f core/internal/*.$(OBJEXT)
@@ -1734,8 +1801,26 @@ distclean-compile:
.S.lo:
$(AM_V_CPPAS)$(LTCPPASCOMPILE) -c -o $@ $<
-core/libgdruntime_la-threadasm.lo: core/threadasm.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 core/libgdruntime_la-threadasm.lo `test -f 'core/threadasm.S' || echo '$(srcdir)/'`core/threadasm.S
+config/aarch64/libgdruntime_la-switchcontext.lo: config/aarch64/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/aarch64/libgdruntime_la-switchcontext.lo `test -f 'config/aarch64/switchcontext.S' || echo '$(srcdir)/'`config/aarch64/switchcontext.S
+
+config/arm/libgdruntime_la-switchcontext.lo: config/arm/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/arm/libgdruntime_la-switchcontext.lo `test -f 'config/arm/switchcontext.S' || echo '$(srcdir)/'`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-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
+
+config/powerpc64/libgdruntime_la-callwithstack.lo: config/powerpc64/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/powerpc64/libgdruntime_la-callwithstack.lo `test -f 'config/powerpc64/callwithstack.S' || echo '$(srcdir)/'`config/powerpc64/callwithstack.S
+
+config/mingw/libgdruntime_la-switchcontext.lo: config/mingw/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/mingw/libgdruntime_la-switchcontext.lo `test -f 'config/mingw/switchcontext.S' || echo '$(srcdir)/'`config/mingw/switchcontext.S
+
+config/x86/libgdruntime_la-switchcontext.lo: config/x86/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/x86/libgdruntime_la-switchcontext.lo `test -f 'config/x86/switchcontext.S' || echo '$(srcdir)/'`config/x86/switchcontext.S
.c.o:
$(AM_V_CC)$(COMPILE) -c -o $@ $<
@@ -1754,6 +1839,13 @@ mostlyclean-libtool:
clean-libtool:
-rm -rf .libs _libs
+ -rm -rf config/aarch64/.libs config/aarch64/_libs
+ -rm -rf config/arm/.libs config/arm/_libs
+ -rm -rf config/mingw/.libs config/mingw/_libs
+ -rm -rf config/mips/.libs config/mips/_libs
+ -rm -rf config/powerpc/.libs config/powerpc/_libs
+ -rm -rf config/powerpc64/.libs config/powerpc64/_libs
+ -rm -rf config/x86/.libs config/x86/_libs
-rm -rf core/.libs core/_libs
-rm -rf core/internal/.libs core/internal/_libs
-rm -rf core/stdc/.libs core/stdc/_libs
@@ -1901,6 +1993,13 @@ clean-generic:
distclean-generic:
-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+ -rm -f config/aarch64/$(am__dirstamp)
+ -rm -f config/arm/$(am__dirstamp)
+ -rm -f config/mingw/$(am__dirstamp)
+ -rm -f config/mips/$(am__dirstamp)
+ -rm -f config/powerpc/$(am__dirstamp)
+ -rm -f config/powerpc64/$(am__dirstamp)
+ -rm -f config/x86/$(am__dirstamp)
-rm -f core/$(am__dirstamp)
-rm -f core/internal/$(am__dirstamp)
-rm -f core/stdc/$(am__dirstamp)
diff --git a/libphobos/libdruntime/config/aarch64/switchcontext.S b/libphobos/libdruntime/config/aarch64/switchcontext.S
new file mode 100644
index 0000000..0a29bac
--- /dev/null
+++ b/libphobos/libdruntime/config/aarch64/switchcontext.S
@@ -0,0 +1,103 @@
+/* AArch64 support code for fibers and multithreading.
+ Copyright (C) 2019 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
+<http://www.gnu.org/licenses/>. */
+
+#include "../common/threadasm.S"
+
+/**
+ * preserve/restore AAPCS64 registers
+ * x19-x28 5.1.1 64-bit callee saved
+ * x29 fp, or possibly callee saved reg - depends on platform choice 5.2.3)
+ * x30 lr
+ * d8-d15 5.1.2 says callee only must save bottom 64-bits (the "d" regs)
+ *
+ * saved regs on stack will look like:
+ * 19: x19
+ * 18: x20
+ * ...
+ * 10: x28
+ * 9: x29 (fp) <-- oldp / *newp save stack top
+ * 8: x30 (lr)
+ * 7: d8
+ * ...
+ * 0: d15 <-- sp
+ */
+ .text
+ .global CSYM(fiber_switchContext)
+ .type CSYM(fiber_switchContext), %function
+ .align 4
+CSYM(fiber_switchContext):
+ .cfi_startproc
+ stp d15, d14, [sp, #-20*8]!
+ stp d13, d12, [sp, #2*8]
+ stp d11, d10, [sp, #4*8]
+ stp d9, d8, [sp, #6*8]
+ stp x30, x29, [sp, #8*8] // lr, fp
+ stp x28, x27, [sp, #10*8]
+ stp x26, x25, [sp, #12*8]
+ stp x24, x23, [sp, #14*8]
+ stp x22, x21, [sp, #16*8]
+ stp x20, x19, [sp, #18*8]
+
+ // oldp is set above saved lr (x30) to hide it and float regs
+ // from GC
+ add x19, sp, #9*8
+ str x19, [x0] // *oldp tstack
+ sub sp, x1, #9*8 // switch to newp sp
+
+ ldp x20, x19, [sp, #18*8]
+ ldp x22, x21, [sp, #16*8]
+ ldp x24, x23, [sp, #14*8]
+ ldp x26, x25, [sp, #12*8]
+ ldp x28, x27, [sp, #10*8]
+ ldp x30, x29, [sp, #8*8] // lr, fp
+ ldp d9, d8, [sp, #6*8]
+ ldp d11, d10, [sp, #4*8]
+ ldp d13, d12, [sp, #2*8]
+ ldp d15, d14, [sp], #20*8
+ ret
+ .cfi_endproc
+ .size CSYM(fiber_switchContext),.-CSYM(fiber_switchContext)
+
+/**
+ * When generating any kind of backtrace (gdb, exception handling) for
+ * a function called in a Fiber, we need to tell the unwinder to stop
+ * at our Fiber main entry point, i.e. we need to mark the bottom of
+ * the call stack. This can be done by clearing the link register lr
+ * prior to calling fiber_entryPoint (i.e. in fiber_switchContext) or
+ * using a .cfi_undefined directive for the link register in the
+ * Fiber entry point. cfi_undefined seems to yield better results in gdb.
+ * Unfortunately we can't place it into fiber_entryPoint using inline
+ * asm, so we use this trampoline instead.
+ */
+ .text
+ .global CSYM(fiber_trampoline)
+ .p2align 2
+ .type CSYM(fiber_trampoline), %function
+CSYM(fiber_trampoline):
+ .cfi_startproc
+ .cfi_undefined x30
+ // fiber_entryPoint never returns
+ bl CSYM(fiber_entryPoint)
+ .cfi_endproc
+ .size CSYM(fiber_trampoline),.-CSYM(fiber_trampoline)
diff --git a/libphobos/libdruntime/config/arm/switchcontext.S b/libphobos/libdruntime/config/arm/switchcontext.S
new file mode 100644
index 0000000..bc510cf
--- /dev/null
+++ b/libphobos/libdruntime/config/arm/switchcontext.S
@@ -0,0 +1,118 @@
+/* ARM support code for fibers and multithreading.
+ Copyright (C) 2019 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
+<http://www.gnu.org/licenses/>. */
+
+#include "../common/threadasm.S"
+
+#if defined(__ARM_EABI__)
+
+/**
+ * Performs a context switch.
+ *
+ * Parameters:
+ * r0 - void** - ptr to old stack pointer
+ * r1 - void* - new stack pointer
+ *
+ * ARM EABI registers:
+ * r0-r3 : argument/scratch registers
+ * r4-r10 : callee-save registers
+ * r11 : frame pointer (or a callee save register if fp isn't needed)
+ * r12 =ip : inter procedure register. We can treat it like any other scratch
+ * register
+ * r13 =sp : stack pointer
+ * r14 =lr : link register, it contains the return address (belonging to the
+ * function which called us)
+ * r15 =pc : program counter
+ *
+ * For floating point registers:
+ * According to AAPCS (version 2.09, section 5.1.2) only the d8-d15 registers
+ * need to be preserved across method calls. This applies to all ARM FPU
+ * variants, whether they have 16 or 32 double registers NEON support or not,
+ * half-float support or not and so on does not matter.
+ *
+ * Note: If this file was compiled with -mfloat-abi=soft but the code runs on a
+ * softfp system with fpu the d8-d15 registers won't be saved (we do not know
+ * that the system has got a fpu in that case) but the registers might actually
+ * be used by other code if it was compiled with -mfloat-abi=softfp.
+ *
+ * Interworking is only supported on ARMv5+, not on ARM v4T as ARM v4t requires
+ * special stubs when changing from thumb to arm mode or the other way round.
+ */
+
+ .text
+#if defined(__ARM_PCS_VFP) || (defined(__ARM_PCS) && !defined(__SOFTFP__))
+ .fpu vfp
+#endif
+ .global CSYM(fiber_switchContext)
+ .type CSYM(fiber_switchContext), %function
+ .align 4
+CSYM(fiber_switchContext):
+ .cfi_sections .debug_frame
+ .cfi_startproc
+ .fnstart
+ push {r4-r11}
+ // update the oldp pointer. Link register and floating point registers
+ // stored later to prevent the GC from scanning them.
+ str sp, [r0]
+ // push r0 (or any other register) as well to keep stack 8byte aligned
+ push {r0, lr}
+
+ // ARM_HardFloat || ARM_SoftFP
+#if defined(__ARM_PCS_VFP) || (defined(__ARM_PCS) && !defined(__SOFTFP__))
+ vpush {d8-d15}
+ // now switch over to the new stack.
+ // Need to subtract (8*8[d8-d15]+2*4[r0, lr]) to position stack pointer
+ // below the last saved register. Remember we saved the SP before pushing
+ // [r0, lr, d8-d15].
+ sub sp, r1, #72
+ vpop {d8-d15}
+#else
+ sub sp, r1, #8
+#endif
+
+ // we don't really care about r0, we only used that for padding.
+ // r1 is now what used to be in the link register when saving.
+ pop {r0, r1, r4-r11}
+ /**
+ * The link register for the initial jump to fiber_entryPoint must be zero:
+ * The jump actually looks like a normal method call as we jump to the
+ * start of the fiber_entryPoint function. Although fiber_entryPoint never
+ * returns and therefore never accesses lr, it saves lr to the stack.
+ * ARM unwinding will then look at the stack, find lr and think that
+ * fiber_entryPoint was called by the function in lr! So if we have some
+ * address in lr the unwinder will try to continue stack unwinding,
+ * although it's already at the stack base and crash.
+ * In all other cases the content of lr doesn't matter.
+ * Note: If we simply loaded into lr above and then moved lr into pc, the
+ * initial method call to fiber_entryPoint would look as if it was called
+ * from fiber_entryPoint itself, as the fiber_entryPoint address is in lr
+ * on the initial context switch.
+ */
+ mov lr, #0
+ // return by writing lr into pc
+ mov pc, r1
+ .fnend
+ .cfi_endproc
+ .size CSYM(fiber_switchContext),.-CSYM(fiber_switchContext)
+
+#endif
diff --git a/libphobos/libdruntime/config/common/threadasm.S b/libphobos/libdruntime/config/common/threadasm.S
new file mode 100644
index 0000000..4f43722
--- /dev/null
+++ b/libphobos/libdruntime/config/common/threadasm.S
@@ -0,0 +1,43 @@
+/* Support code for fibers and multithreading.
+ Copyright (C) 2019 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
+<http://www.gnu.org/licenses/>. */
+
+#if (__linux__ || __FreeBSD__ || __NetBSD__ || __DragonFly__) && __ELF__
+/*
+ * Mark the resulting object file as not requiring execution permissions on
+ * stack memory. The absence of this section would mark the whole resulting
+ * library as requiring an executable stack, making it impossible to
+ * dynamically load druntime on several Linux platforms where this is
+ * forbidden due to security policies.
+ */
+ .section .note.GNU-stack,"",%progbits
+#endif
+
+/* Let preprocessor tell us if C symbols have a prefix: __USER_LABEL_PREFIX__ */
+#ifdef __USER_LABEL_PREFIX__
+#define __CONCAT2(a, b) a ## b
+#define __CONCAT(a, b) __CONCAT2(a, b)
+#define CSYM(name) __CONCAT(__USER_LABEL_PREFIX__, name)
+#else
+#define CSYM(name) name
+#endif
diff --git a/libphobos/libdruntime/config/mingw/switchcontext.S b/libphobos/libdruntime/config/mingw/switchcontext.S
new file mode 100644
index 0000000..2951fea
--- /dev/null
+++ b/libphobos/libdruntime/config/mingw/switchcontext.S
@@ -0,0 +1,109 @@
+/* Windows i386 support code for fibers and multithreading.
+ Copyright (C) 2019 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
+<http://www.gnu.org/licenses/>. */
+
+#include "../common/threadasm.S"
+
+#if defined(__x86_64__)
+
+ .text
+ .globl CSYM(fiber_switchContext)
+ .type CSYM(fiber_switchContext), @function
+ .align 16
+CSYM(fiber_switchContext):
+ .cfi_startproc
+ pushq %RBP;
+ movq %RSP, %RBP;
+ pushq %RBX;
+ pushq %R12;
+ pushq %R13;
+ pushq %R14;
+ pushq %R15;
+ pushq %GS:0;
+ pushq %GS:8;
+ pushq %GS:16;
+
+ // store oldp
+ movq %RSP, (%RCX);
+ // load newp to begin context switch
+ movq %RDX, %RSP;
+
+ // load saved state from new stack
+ popq %GS:16;
+ popq %GS:8;
+ popq %GS:0;
+ popq %R15;
+ popq %R14;
+ popq %R13;
+ popq %R12;
+ popq %RBX;
+ popq %RBP;
+
+ // 'return' to complete switch
+ popq %RCX;
+ jmp *%RCX;
+ .cfi_endproc
+ .size CSYM(fiber_switchContext),.-CSYM(fiber_switchContext)
+
+#elif defined(_X86_)
+
+ .text
+ .globl CSYM(fiber_switchContext)
+ .type CSYM(fiber_switchContext), @function
+ .align 16
+CSYM(fiber_switchContext):
+ .cfi_startproc
+ // Save current stack state.save current stack state
+ // Standard CDECL prologue.
+ push %EBP;
+ mov %ESP, %EBP;
+ push %EDI;
+ push %ESI;
+ push %EBX;
+ push %FS:0;
+ push %FS:4;
+ push %FS:8;
+ push %EAX;
+
+ // store oldp again with more accurate address
+ mov 8(%EBP), %EAX;
+ mov %ESP, (%EAX);
+ // load newp to begin context switch
+ mov 12(%EBP), %ESP;
+
+ // load saved state from new stack
+ pop %EAX;
+ pop %FS:8;
+ pop %FS:4;
+ pop %FS:0;
+ pop %EBX;
+ pop %ESI;
+ pop %EDI;
+ pop %EBP;
+
+ // 'return' to complete switch
+ ret;
+ .cfi_endproc
+ .size CSYM(fiber_switchContext),.-CSYM(fiber_switchContext)
+
+#endif
diff --git a/libphobos/libdruntime/config/mips/switchcontext.S b/libphobos/libdruntime/config/mips/switchcontext.S
new file mode 100644
index 0000000..7604ba1
--- /dev/null
+++ b/libphobos/libdruntime/config/mips/switchcontext.S
@@ -0,0 +1,102 @@
+/* MIPS support code for fibers and multithreading.
+ Copyright (C) 2019 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
+<http://www.gnu.org/licenses/>. */
+
+#include "../common/threadasm.S"
+
+#if _MIPS_SIM == _ABIO32
+
+/**
+ * Performs a context switch.
+ *
+ * $a0 - void** - ptr to old stack pointer
+ * $a1 - void* - new stack pointer
+ *
+ */
+ .text
+ .globl fiber_switchContext
+ .align 2
+ .ent fiber_switchContext,0
+fiber_switchContext:
+ .cfi_startproc
+ addiu $sp, $sp, -(10 * 4)
+
+ // fp regs and return address are stored below the stack
+ // because we don't want the GC to scan them.
+
+#ifdef __mips_hard_float
+#define ALIGN8(val) (val + (-val & 7))
+#define BELOW (ALIGN8(6 * 8 + 4))
+ sdc1 $f20, (0 * 8 - BELOW)($sp)
+ sdc1 $f22, (1 * 8 - BELOW)($sp)
+ sdc1 $f24, (2 * 8 - BELOW)($sp)
+ sdc1 $f26, (3 * 8 - BELOW)($sp)
+ sdc1 $f28, (4 * 8 - BELOW)($sp)
+ sdc1 $f30, (5 * 8 - BELOW)($sp)
+#endif
+ sw $ra, -4($sp)
+
+ sw $s0, (0 * 4)($sp)
+ sw $s1, (1 * 4)($sp)
+ sw $s2, (2 * 4)($sp)
+ sw $s3, (3 * 4)($sp)
+ sw $s4, (4 * 4)($sp)
+ sw $s5, (5 * 4)($sp)
+ sw $s6, (6 * 4)($sp)
+ sw $s7, (7 * 4)($sp)
+ sw $s8, (8 * 4)($sp)
+ sw $gp, (9 * 4)($sp)
+
+ // swap stack pointer
+ sw $sp, 0($a0)
+ move $sp, $a1
+
+#ifdef __mips_hard_float
+ ldc1 $f20, (0 * 8 - BELOW)($sp)
+ ldc1 $f22, (1 * 8 - BELOW)($sp)
+ ldc1 $f24, (2 * 8 - BELOW)($sp)
+ ldc1 $f26, (3 * 8 - BELOW)($sp)
+ ldc1 $f28, (4 * 8 - BELOW)($sp)
+ ldc1 $f30, (5 * 8 - BELOW)($sp)
+#endif
+ lw $ra, -4($sp)
+
+ lw $s0, (0 * 4)($sp)
+ lw $s1, (1 * 4)($sp)
+ lw $s2, (2 * 4)($sp)
+ lw $s3, (3 * 4)($sp)
+ lw $s4, (4 * 4)($sp)
+ lw $s5, (5 * 4)($sp)
+ lw $s6, (6 * 4)($sp)
+ lw $s7, (7 * 4)($sp)
+ lw $s8, (8 * 4)($sp)
+ lw $gp, (9 * 4)($sp)
+
+ addiu $sp, $sp, (10 * 4)
+
+ jr $ra // return
+ .cfi_endproc
+ .end fiber_switchContext
+ .size fiber_switchContext,.-fiber_switchContext
+
+#endif
diff --git a/libphobos/libdruntime/config/powerpc/switchcontext.S b/libphobos/libdruntime/config/powerpc/switchcontext.S
new file mode 100644
index 0000000..3d0aebd
--- /dev/null
+++ b/libphobos/libdruntime/config/powerpc/switchcontext.S
@@ -0,0 +1,150 @@
+/* PowerPC support code for fibers and multithreading.
+ Copyright (C) 2019 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
+<http://www.gnu.org/licenses/>. */
+
+#include "../common/threadasm.S"
+
+/**
+ * Performs a context switch.
+ *
+ * r3 - old context pointer
+ * r4 - new context pointer
+ *
+ */
+ .text
+ .globl CSYM(_fiber_switchContext)
+ .type CSYM(_fiber_switchContext), @function
+ .align 2
+CSYM(_fiber_switchContext):
+ .cfi_startproc
+ /* Save linkage area */
+ mflr 0
+ mfcr 5
+ stw 0, 8(1)
+ stw 5, 4(1)
+
+ /* Save GPRs */
+ stw 11, (-1 * 4)(1)
+ stw 13, (-2 * 4)(1)
+ stw 14, (-3 * 4)(1)
+ stw 15, (-4 * 4)(1)
+ stw 16, (-5 * 4)(1)
+ stw 17, (-6 * 4)(1)
+ stw 18, (-7 * 4)(1)
+ stw 19, (-8 * 4)(1)
+ stw 20, (-9 * 4)(1)
+ stw 21, (-10 * 4)(1)
+ stw 22, (-11 * 4)(1)
+ stw 23, (-12 * 4)(1)
+ stw 24, (-13 * 4)(1)
+ stw 25, (-14 * 4)(1)
+ stw 26, (-15 * 4)(1)
+ stw 27, (-16 * 4)(1)
+ stw 28, (-17 * 4)(1)
+ stw 29, (-18 * 4)(1)
+ stw 30, (-19 * 4)(1)
+ stwu 31, (-20 * 4)(1)
+
+ /* We update the stack pointer here, since we do not want the GC to
+ scan the floating point registers. */
+
+ /* Save FPRs */
+ stfd 14, (-1 * 8)(1)
+ stfd 15, (-2 * 8)(1)
+ stfd 16, (-3 * 8)(1)
+ stfd 17, (-4 * 8)(1)
+ stfd 18, (-5 * 8)(1)
+ stfd 19, (-6 * 8)(1)
+ stfd 20, (-7 * 8)(1)
+ stfd 21, (-8 * 8)(1)
+ stfd 22, (-9 * 8)(1)
+ stfd 23, (-10 * 8)(1)
+ stfd 24, (-11 * 8)(1)
+ stfd 25, (-12 * 8)(1)
+ stfd 26, (-13 * 8)(1)
+ stfd 27, (-14 * 8)(1)
+ stfd 28, (-15 * 8)(1)
+ stfd 29, (-16 * 8)(1)
+ stfd 30, (-17 * 8)(1)
+ stfd 31, (-18 * 8)(1)
+
+ /* Update the old stack pointer */
+ stw 1, 0(3)
+
+ /* Set new stack pointer */
+ addi 1, 4, 20 * 4
+
+ /* Restore linkage area */
+ lwz 0, 8(1)
+ lwz 5, 4(1)
+
+ /* Restore GPRs */
+ lwz 11, (-1 * 4)(1)
+ lwz 13, (-2 * 4)(1)
+ lwz 14, (-3 * 4)(1)
+ lwz 15, (-4 * 4)(1)
+ lwz 16, (-5 * 4)(1)
+ lwz 17, (-6 * 4)(1)
+ lwz 18, (-7 * 4)(1)
+ lwz 19, (-8 * 4)(1)
+ lwz 20, (-9 * 4)(1)
+ lwz 21, (-10 * 4)(1)
+ lwz 22, (-11 * 4)(1)
+ lwz 23, (-12 * 4)(1)
+ lwz 24, (-13 * 4)(1)
+ lwz 25, (-14 * 4)(1)
+ lwz 26, (-15 * 4)(1)
+ lwz 27, (-16 * 4)(1)
+ lwz 28, (-17 * 4)(1)
+ lwz 29, (-18 * 4)(1)
+ lwz 30, (-19 * 4)(1)
+ lwz 31, (-20 * 4)(1)
+
+ /* Restore FPRs */
+ lfd 14, (-1 * 8)(4)
+ lfd 15, (-2 * 8)(4)
+ lfd 16, (-3 * 8)(4)
+ lfd 17, (-4 * 8)(4)
+ lfd 18, (-5 * 8)(4)
+ lfd 19, (-6 * 8)(4)
+ lfd 20, (-7 * 8)(4)
+ lfd 21, (-8 * 8)(4)
+ lfd 22, (-9 * 8)(4)
+ lfd 23, (-10 * 8)(4)
+ lfd 24, (-11 * 8)(4)
+ lfd 25, (-12 * 8)(4)
+ lfd 26, (-13 * 8)(4)
+ lfd 27, (-14 * 8)(4)
+ lfd 28, (-15 * 8)(4)
+ lfd 29, (-16 * 8)(4)
+ lfd 30, (-17 * 8)(4)
+ lfd 31, (-18 * 8)(4)
+
+ /* Set condition and link register */
+ mtcr 5
+ mtlr 0
+
+ /* Return and switch context */
+ blr
+ .cfi_endproc
+ .size CSYM(_fiber_switchContext),.-CSYM(_fiber_switchContext)
diff --git a/libphobos/libdruntime/config/powerpc64/callwithstack.S b/libphobos/libdruntime/config/powerpc64/callwithstack.S
new file mode 100644
index 0000000..79ecd69
--- /dev/null
+++ b/libphobos/libdruntime/config/powerpc64/callwithstack.S
@@ -0,0 +1,168 @@
+/* PowerPC64 support code for fibers and multithreading.
+ Copyright (C) 2019 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
+<http://www.gnu.org/licenses/>. */
+
+#include "../common/threadasm.S"
+
+#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
diff --git a/libphobos/libdruntime/config/x86/switchcontext.S b/libphobos/libdruntime/config/x86/switchcontext.S
new file mode 100644
index 0000000..be3862f
--- /dev/null
+++ b/libphobos/libdruntime/config/x86/switchcontext.S
@@ -0,0 +1,96 @@
+/* i386 support code for fibers and multithreading.
+ Copyright (C) 2019 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
+<http://www.gnu.org/licenses/>. */
+
+#include "../common/threadasm.S"
+
+#if defined(__i386__)
+
+ .text
+ .globl CSYM(fiber_switchContext)
+ .type CSYM(fiber_switchContext), @function
+ .align 16
+CSYM(fiber_switchContext):
+ .cfi_startproc
+ // save current stack state
+ push %ebp
+ mov %esp, %ebp
+ push %edi
+ push %esi
+ push %ebx
+ push %eax
+
+ // store oldp again with more accurate address
+ mov 8(%ebp), %eax
+ mov %esp, (%eax)
+ // load newp to begin context switch
+ mov 12(%ebp), %esp
+
+ // load saved state from new stack
+ pop %eax
+ pop %ebx
+ pop %esi
+ pop %edi
+ pop %ebp
+
+ // 'return' to complete switch
+ ret
+ .cfi_endproc
+ .size CSYM(fiber_switchContext),.-CSYM(fiber_switchContext)
+
+#elif defined(__x86_64__) && !defined(__ILP32__)
+
+ .text
+ .globl CSYM(fiber_switchContext)
+ .type CSYM(fiber_switchContext), @function
+ .align 16
+CSYM(fiber_switchContext):
+ .cfi_startproc
+ // Save current stack state.save current stack state
+ push %rbp
+ mov %rsp, %rbp
+ push %rbx
+ push %r12
+ push %r13
+ push %r14
+ push %r15
+
+ // store oldp again with more accurate address
+ mov %rsp, (%rdi)
+ // load newp to begin context switch
+ mov %rsi, %rsp
+
+ // load saved state from new stack
+ pop %r15
+ pop %r14
+ pop %r13
+ pop %r12
+ pop %rbx
+ pop %rbp
+
+ // 'return' to complete switch
+ ret
+ .cfi_endproc
+ .size CSYM(fiber_switchContext),.-CSYM(fiber_switchContext)
+
+#endif
diff --git a/libphobos/libdruntime/core/threadasm.S b/libphobos/libdruntime/core/threadasm.S
deleted file mode 100644
index 140e5f9..0000000
--- a/libphobos/libdruntime/core/threadasm.S
+++ /dev/null
@@ -1,682 +0,0 @@
-/**
- * Support code for mutithreading.
- *
- * Copyright: Copyright Mikola Lysenko 2005 - 2012.
- * License: $(HTTP www.boost.org/LICENSE_1_0.txt, Boost License 1.0).
- * Authors: Mikola Lysenko, Martin Nowak, Kai Nacke
- */
-
-/*
- * Copyright Mikola Lysenko 2005 - 2012.
- * Distributed under the Boost Software License, Version 1.0.
- * (See accompanying file LICENSE_1_0.txt or copy at
- * http://www.boost.org/LICENSE_1_0.txt)
- */
-
-/* NOTE: This file has been patched from the original DMD distribution to
- * work with the GDC compiler.
- */
-#if (__linux__ || __FreeBSD__ || __NetBSD__ || __DragonFly__) && __ELF__
-/*
- * Mark the resulting object file as not requiring execution permissions on
- * stack memory. The absence of this section would mark the whole resulting
- * library as requiring an executable stack, making it impossible to
- * dynamically load druntime on several Linux platforms where this is
- * forbidden due to security policies.
- * Use %progbits instead of @progbits to support ARM and X86.
- */
-.section .note.GNU-stack,"",%progbits
-#endif
-
-/* Let preprocessor tell us if C symbols have a prefix: __USER_LABEL_PREFIX__ */
-#ifdef __USER_LABEL_PREFIX__
-#define GLUE2(a, b) a ## b
-#define GLUE(a, b) GLUE2(a, b)
-#define CSYM(name) GLUE(__USER_LABEL_PREFIX__, name)
-#else
-#define CSYM(name) name
-#endif
-
-/************************************************************************************
- * POWER PC ASM BITS
- ************************************************************************************/
-#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
-
-#elif defined( __ppc__ ) || defined( __PPC__ ) || defined( __powerpc__ )
-
-
-/**
- * Performs a context switch.
- *
- * r3 - old context pointer
- * r4 - new context pointer
- *
- */
-.text
-.align 2
-.globl _fiber_switchContext
-_fiber_switchContext:
-
- /* Save linkage area */
- mflr 0
- mfcr 5
- stw 0, 8(1)
- stw 5, 4(1)
-
- /* Save GPRs */
- stw 11, (-1 * 4)(1)
- stw 13, (-2 * 4)(1)
- stw 14, (-3 * 4)(1)
- stw 15, (-4 * 4)(1)
- stw 16, (-5 * 4)(1)
- stw 17, (-6 * 4)(1)
- stw 18, (-7 * 4)(1)
- stw 19, (-8 * 4)(1)
- stw 20, (-9 * 4)(1)
- stw 21, (-10 * 4)(1)
- stw 22, (-11 * 4)(1)
- stw 23, (-12 * 4)(1)
- stw 24, (-13 * 4)(1)
- stw 25, (-14 * 4)(1)
- stw 26, (-15 * 4)(1)
- stw 27, (-16 * 4)(1)
- stw 28, (-17 * 4)(1)
- stw 29, (-18 * 4)(1)
- stw 30, (-19 * 4)(1)
- stwu 31, (-20 * 4)(1)
-
- /* We update the stack pointer here, since we do not want the GC to
- scan the floating point registers. */
-
- /* Save FPRs */
- stfd 14, (-1 * 8)(1)
- stfd 15, (-2 * 8)(1)
- stfd 16, (-3 * 8)(1)
- stfd 17, (-4 * 8)(1)
- stfd 18, (-5 * 8)(1)
- stfd 19, (-6 * 8)(1)
- stfd 20, (-7 * 8)(1)
- stfd 21, (-8 * 8)(1)
- stfd 22, (-9 * 8)(1)
- stfd 23, (-10 * 8)(1)
- stfd 24, (-11 * 8)(1)
- stfd 25, (-12 * 8)(1)
- stfd 26, (-13 * 8)(1)
- stfd 27, (-14 * 8)(1)
- stfd 28, (-15 * 8)(1)
- stfd 29, (-16 * 8)(1)
- stfd 30, (-17 * 8)(1)
- stfd 31, (-18 * 8)(1)
-
- /* Update the old stack pointer */
- stw 1, 0(3)
-
- /* Set new stack pointer */
- addi 1, 4, 20 * 4
-
- /* Restore linkage area */
- lwz 0, 8(1)
- lwz 5, 4(1)
-
- /* Restore GPRs */
- lwz 11, (-1 * 4)(1)
- lwz 13, (-2 * 4)(1)
- lwz 14, (-3 * 4)(1)
- lwz 15, (-4 * 4)(1)
- lwz 16, (-5 * 4)(1)
- lwz 17, (-6 * 4)(1)
- lwz 18, (-7 * 4)(1)
- lwz 19, (-8 * 4)(1)
- lwz 20, (-9 * 4)(1)
- lwz 21, (-10 * 4)(1)
- lwz 22, (-11 * 4)(1)
- lwz 23, (-12 * 4)(1)
- lwz 24, (-13 * 4)(1)
- lwz 25, (-14 * 4)(1)
- lwz 26, (-15 * 4)(1)
- lwz 27, (-16 * 4)(1)
- lwz 28, (-17 * 4)(1)
- lwz 29, (-18 * 4)(1)
- lwz 30, (-19 * 4)(1)
- lwz 31, (-20 * 4)(1)
-
-
- /* Restore FPRs */
- lfd 14, (-1 * 8)(4)
- lfd 15, (-2 * 8)(4)
- lfd 16, (-3 * 8)(4)
- lfd 17, (-4 * 8)(4)
- lfd 18, (-5 * 8)(4)
- lfd 19, (-6 * 8)(4)
- lfd 20, (-7 * 8)(4)
- lfd 21, (-8 * 8)(4)
- lfd 22, (-9 * 8)(4)
- lfd 23, (-10 * 8)(4)
- lfd 24, (-11 * 8)(4)
- lfd 25, (-12 * 8)(4)
- lfd 26, (-13 * 8)(4)
- lfd 27, (-14 * 8)(4)
- lfd 28, (-15 * 8)(4)
- lfd 29, (-16 * 8)(4)
- lfd 30, (-17 * 8)(4)
- lfd 31, (-18 * 8)(4)
-
- /* Set condition and link register */
- mtcr 5
- mtlr 0
-
- /* Return and switch context */
- blr
-
-#elif defined(__mips__) && _MIPS_SIM == _ABIO32
-/************************************************************************************
- * MIPS ASM BITS
- ************************************************************************************/
-
-/**
- * Performs a context switch.
- *
- * $a0 - void** - ptr to old stack pointer
- * $a1 - void* - new stack pointer
- *
- */
-.text
-.globl fiber_switchContext
-fiber_switchContext:
- addiu $sp, $sp, -(10 * 4)
-
- // fp regs and return address are stored below the stack
- // because we don't want the GC to scan them.
-
-#ifdef __mips_hard_float
-#define ALIGN8(val) (val + (-val & 7))
-#define BELOW (ALIGN8(6 * 8 + 4))
- sdc1 $f20, (0 * 8 - BELOW)($sp)
- sdc1 $f22, (1 * 8 - BELOW)($sp)
- sdc1 $f24, (2 * 8 - BELOW)($sp)
- sdc1 $f26, (3 * 8 - BELOW)($sp)
- sdc1 $f28, (4 * 8 - BELOW)($sp)
- sdc1 $f30, (5 * 8 - BELOW)($sp)
-#endif
- sw $ra, -4($sp)
-
- sw $s0, (0 * 4)($sp)
- sw $s1, (1 * 4)($sp)
- sw $s2, (2 * 4)($sp)
- sw $s3, (3 * 4)($sp)
- sw $s4, (4 * 4)($sp)
- sw $s5, (5 * 4)($sp)
- sw $s6, (6 * 4)($sp)
- sw $s7, (7 * 4)($sp)
- sw $s8, (8 * 4)($sp)
- sw $gp, (9 * 4)($sp)
-
- // swap stack pointer
- sw $sp, 0($a0)
- move $sp, $a1
-
-#ifdef __mips_hard_float
- ldc1 $f20, (0 * 8 - BELOW)($sp)
- ldc1 $f22, (1 * 8 - BELOW)($sp)
- ldc1 $f24, (2 * 8 - BELOW)($sp)
- ldc1 $f26, (3 * 8 - BELOW)($sp)
- ldc1 $f28, (4 * 8 - BELOW)($sp)
- ldc1 $f30, (5 * 8 - BELOW)($sp)
-#endif
- lw $ra, -4($sp)
-
- lw $s0, (0 * 4)($sp)
- lw $s1, (1 * 4)($sp)
- lw $s2, (2 * 4)($sp)
- lw $s3, (3 * 4)($sp)
- lw $s4, (4 * 4)($sp)
- lw $s5, (5 * 4)($sp)
- lw $s6, (6 * 4)($sp)
- lw $s7, (7 * 4)($sp)
- lw $s8, (8 * 4)($sp)
- lw $gp, (9 * 4)($sp)
-
- addiu $sp, $sp, (10 * 4)
-
- jr $ra // return
-
-#elif defined(__arm__) && defined(__ARM_EABI__)
-/************************************************************************************
- * ARM ASM BITS
- ************************************************************************************/
-
-/**
- * Performs a context switch.
- *
- * Parameters:
- * r0 - void** - ptr to old stack pointer
- * r1 - void* - new stack pointer
- *
- * ARM EABI registers:
- * r0-r3 : argument/scratch registers
- * r4-r10 : callee-save registers
- * r11 : frame pointer (or a callee save register if fp isn't needed)
- * r12 =ip : inter procedure register. We can treat it like any other scratch register
- * r13 =sp : stack pointer
- * r14 =lr : link register, it contains the return address (belonging to the function which called us)
- * r15 =pc : program counter
- *
- * For floating point registers:
- * According to AAPCS (version 2.09, section 5.1.2) only the d8-d15 registers need to be preserved
- * across method calls. This applies to all ARM FPU variants, whether they have 16 or 32 double registers
- * NEON support or not, half-float support or not and so on does not matter.
- *
- * Note: If this file was compiled with -mfloat-abi=soft but the code runs on a softfp system with fpu the d8-d15
- * registers won't be saved (we do not know that the system has got a fpu in that case) but the registers might actually
- * be used by other code if it was compiled with -mfloat-abi=softfp.
- *
- * Interworking is only supported on ARMv5+, not on ARM v4T as ARM v4t requires special stubs when changing
- * from thumb to arm mode or the other way round.
- */
-
-.text
-.align 2
-.global fiber_switchContext
-#if defined(__ARM_PCS_VFP) || (defined(__ARM_PCS) && !defined(__SOFTFP__)) // ARM_HardFloat || ARM_SoftFP
- .fpu vfp
-#endif
-.type fiber_switchContext, %function
-fiber_switchContext:
- .fnstart
- push {r4-r11}
- // update the oldp pointer. Link register and floating point registers stored later to prevent the GC from
- // scanning them.
- str sp, [r0]
- // push r0 (or any other register) as well to keep stack 8byte aligned
- push {r0, lr}
-
- #if defined(__ARM_PCS_VFP) || (defined(__ARM_PCS) && !defined(__SOFTFP__)) // ARM_HardFloat || ARM_SoftFP
- vpush {d8-d15}
- // now switch over to the new stack. Need to subtract (8*8[d8-d15]+2*4[r0, lr]) to position stack pointer
- // below the last saved register. Remember we saved the SP before pushing [r0, lr, d8-d15]
- sub sp, r1, #72
- vpop {d8-d15}
- #else
- sub sp, r1, #8
- #endif
-
- // we don't really care about r0, we only used that for padding.
- // r1 is now what used to be in the link register when saving.
- pop {r0, r1, r4-r11}
- /**
- * The link register for the initial jump to fiber_entryPoint must be zero: The jump actually
- * looks like a normal method call as we jump to the start of the fiber_entryPoint function.
- * Although fiber_entryPoint never returns and therefore never accesses lr, it saves lr to the stack.
- * ARM unwinding will then look at the stack, find lr and think that fiber_entryPoint was called by
- * the function in lr! So if we have some address in lr the unwinder will try to continue stack unwinding,
- * although it's already at the stack base and crash.
- * In all other cases the content of lr doesn't matter.
- * Note: If we simply loaded into lr above and then moved lr into pc, the initial method call
- * to fiber_entryPoint would look as if it was called from fiber_entryPoint itself, as the fiber_entryPoint
- * address is in lr on the initial context switch.
- */
- mov lr, #0
- // return by writing lr into pc
- mov pc, r1
- .fnend
-
-#elif defined(__aarch64__)
-/************************************************************************************
- * AArch64 (arm64) ASM BITS
- ************************************************************************************/
-/**
- * preserve/restore AAPCS64 registers
- * x19-x28 5.1.1 64-bit callee saved
- * x29 fp, or possibly callee saved reg - depends on platform choice 5.2.3)
- * x30 lr
- * d8-d15 5.1.2 says callee only must save bottom 64-bits (the "d" regs)
- *
- * saved regs on stack will look like:
- * 19: x19
- * 18: x20
- * ...
- * 10: x28
- * 9: x29 (fp) <-- oldp / *newp save stack top
- * 8: x30 (lr)
- * 7: d8
- * ...
- * 0: d15 <-- sp
- */
- .text
- .global CSYM(fiber_switchContext)
- .type fiber_switchContext, %function
- .p2align 2
-CSYM(fiber_switchContext):
- stp d15, d14, [sp, #-20*8]!
- stp d13, d12, [sp, #2*8]
- stp d11, d10, [sp, #4*8]
- stp d9, d8, [sp, #6*8]
- stp x30, x29, [sp, #8*8] // lr, fp
- stp x28, x27, [sp, #10*8]
- stp x26, x25, [sp, #12*8]
- stp x24, x23, [sp, #14*8]
- stp x22, x21, [sp, #16*8]
- stp x20, x19, [sp, #18*8]
-
- // oldp is set above saved lr (x30) to hide it and float regs
- // from GC
- add x19, sp, #9*8
- str x19, [x0] // *oldp tstack
- sub sp, x1, #9*8 // switch to newp sp
-
- ldp x20, x19, [sp, #18*8]
- ldp x22, x21, [sp, #16*8]
- ldp x24, x23, [sp, #14*8]
- ldp x26, x25, [sp, #12*8]
- ldp x28, x27, [sp, #10*8]
- ldp x30, x29, [sp, #8*8] // lr, fp
- ldp d9, d8, [sp, #6*8]
- ldp d11, d10, [sp, #4*8]
- ldp d13, d12, [sp, #2*8]
- ldp d15, d14, [sp], #20*8
- ret
-
-
-/**
- * When generating any kind of backtrace (gdb, exception handling) for
- * a function called in a Fiber, we need to tell the unwinder to stop
- * at our Fiber main entry point, i.e. we need to mark the bottom of
- * the call stack. This can be done by clearing the link register lr
- * prior to calling fiber_entryPoint (i.e. in fiber_switchContext) or
- * using a .cfi_undefined directive for the link register in the
- * Fiber entry point. cfi_undefined seems to yield better results in gdb.
- * Unfortunately we can't place it into fiber_entryPoint using inline
- * asm, so we use this trampoline instead.
- */
- .text
- .global CSYM(fiber_trampoline)
- .p2align 2
- .type fiber_trampoline, %function
-CSYM(fiber_trampoline):
- .cfi_startproc
- .cfi_undefined x30
- // fiber_entryPoint never returns
- bl fiber_entryPoint
- .cfi_endproc
-
-#elif defined(__MINGW32__)
-/************************************************************************************
- * GDC MinGW ASM BITS
- ************************************************************************************/
-#if defined(__x86_64__)
-.global fiber_switchContext
-fiber_switchContext:
- pushq %RBP;
- movq %RSP, %RBP;
- pushq %RBX;
- pushq %R12;
- pushq %R13;
- pushq %R14;
- pushq %R15;
- pushq %GS:0;
- pushq %GS:8;
- pushq %GS:16;
-
- // store oldp
- movq %RSP, (%RCX);
- // load newp to begin context switch
- movq %RDX, %RSP;
-
- // load saved state from new stack
- popq %GS:16;
- popq %GS:8;
- popq %GS:0;
- popq %R15;
- popq %R14;
- popq %R13;
- popq %R12;
- popq %RBX;
- popq %RBP;
-
- // 'return' to complete switch
- popq %RCX;
- jmp *%RCX;
-#elif defined(_X86_)
-.global _fiber_switchContext
-_fiber_switchContext:
- // Save current stack state.save current stack state
- // Standard CDECL prologue.
- push %EBP;
- mov %ESP, %EBP;
- push %EDI;
- push %ESI;
- push %EBX;
- push %FS:0;
- push %FS:4;
- push %FS:8;
- push %EAX;
-
- // store oldp again with more accurate address
- mov 8(%EBP), %EAX;
- mov %ESP, (%EAX);
- // load newp to begin context switch
- mov 12(%EBP), %ESP;
-
- // load saved state from new stack
- pop %EAX;
- pop %FS:8;
- pop %FS:4;
- pop %FS:0;
- pop %EBX;
- pop %ESI;
- pop %EDI;
- pop %EBP;
-
- // 'return' to complete switch
- ret;
-#endif
-
-// if POSIX boils down to this (reference http://nadeausoftware.com)
-#elif !defined(_WIN32) && (defined(__unix__) || defined(__unix) || (defined(__APPLE__) && defined(__MACH__)))
-/************************************************************************************
- * i386- and x86_64-apple-darwin POSIX ASM BITS
- ************************************************************************************/
-#if defined(__i386__)
-.text
-.p2align 4
-.globl CSYM(fiber_switchContext)
-CSYM(fiber_switchContext):
- // save current stack state
- push %ebp
- mov %esp, %ebp
- push %edi
- push %esi
- push %ebx
- push %eax
-
- // store oldp again with more accurate address
- mov 8(%ebp), %eax
- mov %esp, (%eax)
- // load newp to begin context switch
- mov 12(%ebp), %esp
-
- // load saved state from new stack
- pop %eax
- pop %ebx
- pop %esi
- pop %edi
- pop %ebp
-
- // 'return' to complete switch
- ret
-
-#elif defined(__x86_64__) && !defined(__ILP32__)
-.text
-.p2align 4
-.globl CSYM(fiber_switchContext)
-CSYM(fiber_switchContext):
- // Save current stack state.save current stack state
- push %rbp
- mov %rsp, %rbp
- push %rbx
- push %r12
- push %r13
- push %r14
- push %r15
-
- // store oldp again with more accurate address
- mov %rsp, (%rdi)
- // load newp to begin context switch
- mov %rsi, %rsp
-
- // load saved state from new stack
- pop %r15
- pop %r14
- pop %r13
- pop %r12
- pop %rbx
- pop %rbp
-
- // 'return' to complete switch
- ret
-#endif // __x86_64__ && !__ILP32__
-
-#endif // posix