]> Cypherpunks repositories - gostls13.git/commitdiff
all: add support for c-archive and c-shared on linux/riscv64
authorJoel Sing <joel@sing.id.au>
Thu, 15 Jul 2021 17:06:18 +0000 (03:06 +1000)
committerJoel Sing <joel@sing.id.au>
Wed, 3 Nov 2021 09:23:34 +0000 (09:23 +0000)
This provides the runtime glue (_rt0_riscv64_linux_lib) for c-archive and c-shared
support, along with enabling both of these buildmodes on linux/riscv64.

Both misc/cgo/testcarchive and misc/cgo/testcshared now pass on this platform.

Fixes #47100

Change-Id: I7ad75b23ae1d592dbac60d15bba557668287711f
Reviewed-on: https://go-review.googlesource.com/c/go/+/334872
Trust: Joel Sing <joel@sing.id.au>
Run-TryBot: Joel Sing <joel@sing.id.au>
Reviewed-by: Cherry Mui <cherryyz@google.com>
misc/cgo/testcshared/testdata/libgo2/dup2.go
misc/cgo/testcshared/testdata/libgo2/dup3.go
src/cmd/compile/internal/ssa/regalloc.go
src/cmd/dist/test.go
src/cmd/internal/sys/supported.go
src/cmd/link/internal/ld/config.go
src/runtime/rt0_linux_riscv64.s

index d18f0b130d3f767671e4030fd34056c85c4bd132..d343aa54d9a8779450092461213c8d748d26fb84 100644 (file)
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-// +build darwin dragonfly freebsd linux,!arm64 netbsd openbsd
+// +build darwin dragonfly freebsd linux,!arm64,!riscv64 netbsd openbsd
 
 package main
 
index c9c65a6e3c1f62be51add7bc6c129cb92dabe2b3..459f0dc196874fbf53db87bf2d976f21d18c4043 100644 (file)
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-// +build linux,arm64
+// +build linux,arm64 linux,riscv64
 
 package main
 
index 91b04e99f42c3beaf3455330426b670fbef11096..64792d0c80b241663f70ae336024fd773bc20a97 100644 (file)
@@ -635,6 +635,8 @@ func (s *regAllocState) init(f *Func) {
                        // nothing to do
                case "ppc64le": // R2 already reserved.
                        // nothing to do
+               case "riscv64": // X3 (aka GP) and X4 (aka TP) already reserved.
+                       // nothing to do
                case "s390x":
                        s.allocatable &^= 1 << 11 // R11
                default:
index 5935011e197b69b6b610f83239547f1e838fb9df..14b48351db1070f7a88f869ad623cb6955dddb0d 100644 (file)
@@ -1031,7 +1031,7 @@ func (t *tester) supportedBuildmode(mode string) bool {
                switch pair {
                case "aix-ppc64",
                        "darwin-amd64", "darwin-arm64", "ios-arm64",
-                       "linux-amd64", "linux-386", "linux-ppc64le", "linux-s390x",
+                       "linux-amd64", "linux-386", "linux-ppc64le", "linux-riscv64", "linux-s390x",
                        "freebsd-amd64",
                        "windows-amd64", "windows-386":
                        return true
@@ -1039,7 +1039,7 @@ func (t *tester) supportedBuildmode(mode string) bool {
                return false
        case "c-shared":
                switch pair {
-               case "linux-386", "linux-amd64", "linux-arm", "linux-arm64", "linux-ppc64le", "linux-s390x",
+               case "linux-386", "linux-amd64", "linux-arm", "linux-arm64", "linux-ppc64le", "linux-riscv64", "linux-s390x",
                        "darwin-amd64", "darwin-arm64",
                        "freebsd-amd64",
                        "android-arm", "android-arm64", "android-386",
index de2a3fd140d43c04b7a7058f5132c76913c2201b..c6a78a51eb1aaf805bc3e2aefcbe87e793f70e2a 100644 (file)
@@ -105,7 +105,7 @@ func BuildModeSupported(compiler, buildmode, goos, goarch string) bool {
 
        case "c-shared":
                switch platform {
-               case "linux/amd64", "linux/arm", "linux/arm64", "linux/386", "linux/ppc64le", "linux/s390x",
+               case "linux/amd64", "linux/arm", "linux/arm64", "linux/386", "linux/ppc64le", "linux/riscv64", "linux/s390x",
                        "android/amd64", "android/arm", "android/arm64", "android/386",
                        "freebsd/amd64",
                        "darwin/amd64", "darwin/arm64",
index 72616ff62f9012ca15e91963044eea14aac1bc64..2d7e1bff68a11afda5c65b2aacdb72b0067308fe 100644 (file)
@@ -74,7 +74,7 @@ func (mode *BuildMode) Set(s string) error {
                *mode = BuildModeCArchive
        case "c-shared":
                switch buildcfg.GOARCH {
-               case "386", "amd64", "arm", "arm64", "ppc64le", "s390x":
+               case "386", "amd64", "arm", "arm64", "ppc64le", "riscv64", "s390x":
                default:
                        return badmode()
                }
index f31f7f75e5153e3645fc2f85df6ad48fd6ab0c6d..d6b8ac85dca6468065b71d11e831fca5c1722356 100644 (file)
@@ -9,6 +9,104 @@ TEXT _rt0_riscv64_linux(SB),NOSPLIT|NOFRAME,$0
        ADD     $8, X2, A1      // argv
        JMP     main(SB)
 
+// When building with -buildmode=c-shared, this symbol is called when the shared
+// library is loaded.
+TEXT _rt0_riscv64_linux_lib(SB),NOSPLIT,$224
+       // Preserve callee-save registers, along with X1 (LR).
+       MOV     X1, (8*3)(X2)
+       MOV     X8, (8*4)(X2)
+       MOV     X9, (8*5)(X2)
+       MOV     X18, (8*6)(X2)
+       MOV     X19, (8*7)(X2)
+       MOV     X20, (8*8)(X2)
+       MOV     X21, (8*9)(X2)
+       MOV     X22, (8*10)(X2)
+       MOV     X23, (8*11)(X2)
+       MOV     X24, (8*12)(X2)
+       MOV     X25, (8*13)(X2)
+       MOV     X26, (8*14)(X2)
+       MOV     g, (8*15)(X2)
+       MOVD    F8, (8*16)(X2)
+       MOVD    F9, (8*17)(X2)
+       MOVD    F18, (8*18)(X2)
+       MOVD    F19, (8*19)(X2)
+       MOVD    F20, (8*20)(X2)
+       MOVD    F21, (8*21)(X2)
+       MOVD    F22, (8*22)(X2)
+       MOVD    F23, (8*23)(X2)
+       MOVD    F24, (8*24)(X2)
+       MOVD    F25, (8*25)(X2)
+       MOVD    F26, (8*26)(X2)
+       MOVD    F27, (8*27)(X2)
+
+       // Initialize g as nil in case of using g later e.g. sigaction in cgo_sigaction.go
+       MOV     X0, g
+
+       MOV     A0, _rt0_riscv64_linux_lib_argc<>(SB)
+       MOV     A1, _rt0_riscv64_linux_lib_argv<>(SB)
+
+       // Synchronous initialization.
+       MOV     $runtime·libpreinit(SB), T0
+       JALR    RA, T0
+
+       // Create a new thread to do the runtime initialization and return.
+       MOV     _cgo_sys_thread_create(SB), T0
+       BEQZ    T0, nocgo
+       MOV     $_rt0_riscv64_linux_lib_go(SB), A0
+       MOV     $0, A1
+       JALR    RA, T0
+       JMP     restore
+
+nocgo:
+       MOV     $0x800000, A0                     // stacksize = 8192KB
+       MOV     $_rt0_riscv64_linux_lib_go(SB), A1
+       MOV     A0, 8(X2)
+       MOV     A1, 16(X2)
+       MOV     $runtime·newosproc0(SB), T0
+       JALR    RA, T0
+
+restore:
+       // Restore callee-save registers, along with X1 (LR).
+       MOV     (8*3)(X2), X1
+       MOV     (8*4)(X2), X8
+       MOV     (8*5)(X2), X9
+       MOV     (8*6)(X2), X18
+       MOV     (8*7)(X2), X19
+       MOV     (8*8)(X2), X20
+       MOV     (8*9)(X2), X21
+       MOV     (8*10)(X2), X22
+       MOV     (8*11)(X2), X23
+       MOV     (8*12)(X2), X24
+       MOV     (8*13)(X2), X25
+       MOV     (8*14)(X2), X26
+       MOV     (8*15)(X2), g
+       MOVD    (8*16)(X2), F8
+       MOVD    (8*17)(X2), F9
+       MOVD    (8*18)(X2), F18
+       MOVD    (8*19)(X2), F19
+       MOVD    (8*20)(X2), F20
+       MOVD    (8*21)(X2), F21
+       MOVD    (8*22)(X2), F22
+       MOVD    (8*23)(X2), F23
+       MOVD    (8*24)(X2), F24
+       MOVD    (8*25)(X2), F25
+       MOVD    (8*26)(X2), F26
+       MOVD    (8*27)(X2), F27
+
+       RET
+
+TEXT _rt0_riscv64_linux_lib_go(SB),NOSPLIT,$0
+       MOV     _rt0_riscv64_linux_lib_argc<>(SB), A0
+       MOV     _rt0_riscv64_linux_lib_argv<>(SB), A1
+       MOV     $runtime·rt0_go(SB), T0
+       JALR    ZERO, T0
+
+DATA _rt0_riscv64_linux_lib_argc<>(SB)/8, $0
+GLOBL _rt0_riscv64_linux_lib_argc<>(SB),NOPTR, $8
+DATA _rt0_riscv64_linux_lib_argv<>(SB)/8, $0
+GLOBL _rt0_riscv64_linux_lib_argv<>(SB),NOPTR, $8
+
+
 TEXT main(SB),NOSPLIT|NOFRAME,$0
        MOV     $runtime·rt0_go(SB), T0
        JALR    ZERO, T0