internal/fakecgo: only generate sigaltstack for netbsd (#396)
sigaltstack is only used on netbsd, there is no need for other OSes to import and implement trampolines for that function. Note that netbsd is currently broken (see #349), but that's orthogonal to this PR.
- commit
- 432cdf2570c881b7d4491fc16d3147d9e52fd526
- author
- Quim Muntal · · 2026-01-23 13:52 UTC
- committer
- GitHub · · 2026-01-23 13:52 UTC
- parent
- 43e2ab6
- signature
- GPG Unverified
B5690EEEBB952194The key is unknown
8 files · +14 -17
M internal/fakecgo/gen.go +1 -1
| @@ -120,7 +120,7 @@ var ( | |||
| 120 | 120 | {"sigfillset", [5]Arg{{"set", "*sigset_t"}}, "int32", nil}, | |
| 121 | 121 | {"nanosleep", [5]Arg{{"ts", "*syscall.Timespec"}, {"rem", "*syscall.Timespec"}}, "int32", nil}, | |
| 122 | 122 | {"abort", [5]Arg{}, "", nil}, | |
| 123 | - | {"sigaltstack", [5]Arg{{"ss", "*stack_t"}, {"old_ss", "*stack_t"}}, "int32", nil}, | |
| 123 | + | {"sigaltstack", [5]Arg{{"ss", "*stack_t"}, {"old_ss", "*stack_t"}}, "int32", []string{"netbsd"}}, | |
| 124 | 124 | } | |
| 125 | 125 | pthreadSymbols = []Symbol{ | |
| 126 | 126 | {"pthread_attr_init", [5]Arg{{"attr", "*pthread_attr_t"}}, "int32", nil}, | |
| @@ -120,7 +120,7 @@ var ( | |||||
| 120 | {"sigfillset", [5]Arg{{"set", "*sigset_t"}}, "int32", nil}, | 120 | {"sigfillset", [5]Arg{{"set", "*sigset_t"}}, "int32", nil}, | ||
| 121 | {"nanosleep", [5]Arg{{"ts", "*syscall.Timespec"}, {"rem", "*syscall.Timespec"}}, "int32", nil}, | 121 | {"nanosleep", [5]Arg{{"ts", "*syscall.Timespec"}, {"rem", "*syscall.Timespec"}}, "int32", nil}, | ||
| 122 | {"abort", [5]Arg{}, "", nil}, | 122 | {"abort", [5]Arg{}, "", nil}, | ||
| 123 | - | {"sigaltstack", [5]Arg{{"ss", "*stack_t"}, {"old_ss", "*stack_t"}}, "int32", nil}, | 123 | + | {"sigaltstack", [5]Arg{{"ss", "*stack_t"}, {"old_ss", "*stack_t"}}, "int32", []string{"netbsd"}}, |
| 124 | } | 124 | } | ||
| 125 | pthreadSymbols = []Symbol{ | 125 | pthreadSymbols = []Symbol{ | ||
| 126 | {"pthread_attr_init", [5]Arg{{"attr", "*pthread_attr_t"}}, "int32", nil}, | 126 | {"pthread_attr_init", [5]Arg{{"attr", "*pthread_attr_t"}}, "int32", nil}, | ||
M internal/fakecgo/zsymbols.go +0 -10
| @@ -56,12 +56,6 @@ func abort() { | |||
| 56 | 56 | call5(abortABI0, 0, 0, 0, 0, 0) | |
| 57 | 57 | } | |
| 58 | 58 | ||
| 59 | - | //go:nosplit | |
| 60 | - | //go:norace | |
| 61 | - | func sigaltstack(ss *stack_t, old_ss *stack_t) int32 { | |
| 62 | - | return int32(call5(sigaltstackABI0, uintptr(unsafe.Pointer(ss)), uintptr(unsafe.Pointer(old_ss)), 0, 0, 0)) | |
| 63 | - | } | |
| 64 | - | ||
| 65 | 59 | //go:nosplit | |
| 66 | 60 | //go:norace | |
| 67 | 61 | func pthread_attr_init(attr *pthread_attr_t) int32 { | |
| @@ -138,10 +132,6 @@ var nanosleepABI0 = uintptr(unsafe.Pointer(&_nanosleep)) | |||
| 138 | 132 | var _abort uint8 | |
| 139 | 133 | var abortABI0 = uintptr(unsafe.Pointer(&_abort)) | |
| 140 | 134 | ||
| 141 | - | //go:linkname _sigaltstack _sigaltstack | |
| 142 | - | var _sigaltstack uint8 | |
| 143 | - | var sigaltstackABI0 = uintptr(unsafe.Pointer(&_sigaltstack)) | |
| 144 | - | ||
| 145 | 135 | //go:linkname _pthread_attr_init _pthread_attr_init | |
| 146 | 136 | var _pthread_attr_init uint8 | |
| 147 | 137 | var pthread_attr_initABI0 = uintptr(unsafe.Pointer(&_pthread_attr_init)) | |
| @@ -56,12 +56,6 @@ func abort() { | |||||
| 56 | call5(abortABI0, 0, 0, 0, 0, 0) | 56 | call5(abortABI0, 0, 0, 0, 0, 0) | ||
| 57 | } | 57 | } | ||
| 58 | 58 | ||||
| 59 | - | //go:nosplit | |||
| 60 | - | //go:norace | |||
| 61 | - | func sigaltstack(ss *stack_t, old_ss *stack_t) int32 { | |||
| 62 | - | return int32(call5(sigaltstackABI0, uintptr(unsafe.Pointer(ss)), uintptr(unsafe.Pointer(old_ss)), 0, 0, 0)) | |||
| 63 | - | } | |||
| 64 | - | ||||
| 65 | //go:nosplit | 59 | //go:nosplit | ||
| 66 | //go:norace | 60 | //go:norace | ||
| 67 | func pthread_attr_init(attr *pthread_attr_t) int32 { | 61 | func pthread_attr_init(attr *pthread_attr_t) int32 { | ||
| @@ -138,10 +132,6 @@ var nanosleepABI0 = uintptr(unsafe.Pointer(&_nanosleep)) | |||||
| 138 | var _abort uint8 | 132 | var _abort uint8 | ||
| 139 | var abortABI0 = uintptr(unsafe.Pointer(&_abort)) | 133 | var abortABI0 = uintptr(unsafe.Pointer(&_abort)) | ||
| 140 | 134 | ||||
| 141 | - | //go:linkname _sigaltstack _sigaltstack | |||
| 142 | - | var _sigaltstack uint8 | |||
| 143 | - | var sigaltstackABI0 = uintptr(unsafe.Pointer(&_sigaltstack)) | |||
| 144 | - | ||||
| 145 | //go:linkname _pthread_attr_init _pthread_attr_init | 135 | //go:linkname _pthread_attr_init _pthread_attr_init | ||
| 146 | var _pthread_attr_init uint8 | 136 | var _pthread_attr_init uint8 | ||
| 147 | var pthread_attr_initABI0 = uintptr(unsafe.Pointer(&_pthread_attr_init)) | 137 | var pthread_attr_initABI0 = uintptr(unsafe.Pointer(&_pthread_attr_init)) | ||
M internal/fakecgo/zsymbols_darwin.go +0 -1
| @@ -16,7 +16,6 @@ import "unsafe" | |||
| 16 | 16 | //go:cgo_import_dynamic purego_sigfillset sigfillset "/usr/lib/libSystem.B.dylib" | |
| 17 | 17 | //go:cgo_import_dynamic purego_nanosleep nanosleep "/usr/lib/libSystem.B.dylib" | |
| 18 | 18 | //go:cgo_import_dynamic purego_abort abort "/usr/lib/libSystem.B.dylib" | |
| 19 | - | //go:cgo_import_dynamic purego_sigaltstack sigaltstack "/usr/lib/libSystem.B.dylib" | |
| 20 | 19 | //go:cgo_import_dynamic purego_pthread_attr_init pthread_attr_init "/usr/lib/libSystem.B.dylib" | |
| 21 | 20 | //go:cgo_import_dynamic purego_pthread_create pthread_create "/usr/lib/libSystem.B.dylib" | |
| 22 | 21 | //go:cgo_import_dynamic purego_pthread_detach pthread_detach "/usr/lib/libSystem.B.dylib" | |
| @@ -16,7 +16,6 @@ import "unsafe" | |||||
| 16 | //go:cgo_import_dynamic purego_sigfillset sigfillset "/usr/lib/libSystem.B.dylib" | 16 | //go:cgo_import_dynamic purego_sigfillset sigfillset "/usr/lib/libSystem.B.dylib" | ||
| 17 | //go:cgo_import_dynamic purego_nanosleep nanosleep "/usr/lib/libSystem.B.dylib" | 17 | //go:cgo_import_dynamic purego_nanosleep nanosleep "/usr/lib/libSystem.B.dylib" | ||
| 18 | //go:cgo_import_dynamic purego_abort abort "/usr/lib/libSystem.B.dylib" | 18 | //go:cgo_import_dynamic purego_abort abort "/usr/lib/libSystem.B.dylib" | ||
| 19 | - | //go:cgo_import_dynamic purego_sigaltstack sigaltstack "/usr/lib/libSystem.B.dylib" | |||
| 20 | //go:cgo_import_dynamic purego_pthread_attr_init pthread_attr_init "/usr/lib/libSystem.B.dylib" | 19 | //go:cgo_import_dynamic purego_pthread_attr_init pthread_attr_init "/usr/lib/libSystem.B.dylib" | ||
| 21 | //go:cgo_import_dynamic purego_pthread_create pthread_create "/usr/lib/libSystem.B.dylib" | 20 | //go:cgo_import_dynamic purego_pthread_create pthread_create "/usr/lib/libSystem.B.dylib" | ||
| 22 | //go:cgo_import_dynamic purego_pthread_detach pthread_detach "/usr/lib/libSystem.B.dylib" | 21 | //go:cgo_import_dynamic purego_pthread_detach pthread_detach "/usr/lib/libSystem.B.dylib" | ||
M internal/fakecgo/zsymbols_freebsd.go +0 -1
| @@ -16,7 +16,6 @@ import "unsafe" | |||
| 16 | 16 | //go:cgo_import_dynamic purego_sigfillset sigfillset "libc.so.7" | |
| 17 | 17 | //go:cgo_import_dynamic purego_nanosleep nanosleep "libc.so.7" | |
| 18 | 18 | //go:cgo_import_dynamic purego_abort abort "libc.so.7" | |
| 19 | - | //go:cgo_import_dynamic purego_sigaltstack sigaltstack "libc.so.7" | |
| 20 | 19 | //go:cgo_import_dynamic purego_pthread_attr_init pthread_attr_init "libpthread.so" | |
| 21 | 20 | //go:cgo_import_dynamic purego_pthread_create pthread_create "libpthread.so" | |
| 22 | 21 | //go:cgo_import_dynamic purego_pthread_detach pthread_detach "libpthread.so" | |
| @@ -16,7 +16,6 @@ import "unsafe" | |||||
| 16 | //go:cgo_import_dynamic purego_sigfillset sigfillset "libc.so.7" | 16 | //go:cgo_import_dynamic purego_sigfillset sigfillset "libc.so.7" | ||
| 17 | //go:cgo_import_dynamic purego_nanosleep nanosleep "libc.so.7" | 17 | //go:cgo_import_dynamic purego_nanosleep nanosleep "libc.so.7" | ||
| 18 | //go:cgo_import_dynamic purego_abort abort "libc.so.7" | 18 | //go:cgo_import_dynamic purego_abort abort "libc.so.7" | ||
| 19 | - | //go:cgo_import_dynamic purego_sigaltstack sigaltstack "libc.so.7" | |||
| 20 | //go:cgo_import_dynamic purego_pthread_attr_init pthread_attr_init "libpthread.so" | 19 | //go:cgo_import_dynamic purego_pthread_attr_init pthread_attr_init "libpthread.so" | ||
| 21 | //go:cgo_import_dynamic purego_pthread_create pthread_create "libpthread.so" | 20 | //go:cgo_import_dynamic purego_pthread_create pthread_create "libpthread.so" | ||
| 22 | //go:cgo_import_dynamic purego_pthread_detach pthread_detach "libpthread.so" | 21 | //go:cgo_import_dynamic purego_pthread_detach pthread_detach "libpthread.so" | ||
M internal/fakecgo/zsymbols_linux.go +0 -1
| @@ -16,7 +16,6 @@ import "unsafe" | |||
| 16 | 16 | //go:cgo_import_dynamic purego_sigfillset sigfillset "libc.so.6" | |
| 17 | 17 | //go:cgo_import_dynamic purego_nanosleep nanosleep "libc.so.6" | |
| 18 | 18 | //go:cgo_import_dynamic purego_abort abort "libc.so.6" | |
| 19 | - | //go:cgo_import_dynamic purego_sigaltstack sigaltstack "libc.so.6" | |
| 20 | 19 | //go:cgo_import_dynamic purego_pthread_attr_init pthread_attr_init "libpthread.so.0" | |
| 21 | 20 | //go:cgo_import_dynamic purego_pthread_create pthread_create "libpthread.so.0" | |
| 22 | 21 | //go:cgo_import_dynamic purego_pthread_detach pthread_detach "libpthread.so.0" | |
| @@ -16,7 +16,6 @@ import "unsafe" | |||||
| 16 | //go:cgo_import_dynamic purego_sigfillset sigfillset "libc.so.6" | 16 | //go:cgo_import_dynamic purego_sigfillset sigfillset "libc.so.6" | ||
| 17 | //go:cgo_import_dynamic purego_nanosleep nanosleep "libc.so.6" | 17 | //go:cgo_import_dynamic purego_nanosleep nanosleep "libc.so.6" | ||
| 18 | //go:cgo_import_dynamic purego_abort abort "libc.so.6" | 18 | //go:cgo_import_dynamic purego_abort abort "libc.so.6" | ||
| 19 | - | //go:cgo_import_dynamic purego_sigaltstack sigaltstack "libc.so.6" | |||
| 20 | //go:cgo_import_dynamic purego_pthread_attr_init pthread_attr_init "libpthread.so.0" | 19 | //go:cgo_import_dynamic purego_pthread_attr_init pthread_attr_init "libpthread.so.0" | ||
| 21 | //go:cgo_import_dynamic purego_pthread_create pthread_create "libpthread.so.0" | 20 | //go:cgo_import_dynamic purego_pthread_create pthread_create "libpthread.so.0" | ||
| 22 | //go:cgo_import_dynamic purego_pthread_detach pthread_detach "libpthread.so.0" | 21 | //go:cgo_import_dynamic purego_pthread_detach pthread_detach "libpthread.so.0" | ||
M internal/fakecgo/zsymbols_netbsd.go +10 -0
| @@ -28,6 +28,12 @@ import "unsafe" | |||
| 28 | 28 | //go:cgo_import_dynamic purego_pthread_attr_getstacksize pthread_attr_getstacksize "libpthread.so" | |
| 29 | 29 | //go:cgo_import_dynamic purego_pthread_attr_destroy pthread_attr_destroy "libpthread.so" | |
| 30 | 30 | ||
| 31 | + | //go:nosplit | |
| 32 | + | //go:norace | |
| 33 | + | func sigaltstack(ss *stack_t, old_ss *stack_t) int32 { | |
| 34 | + | return int32(call5(sigaltstackABI0, uintptr(unsafe.Pointer(ss)), uintptr(unsafe.Pointer(old_ss)), 0, 0, 0)) | |
| 35 | + | } | |
| 36 | + | ||
| 31 | 37 | //go:nosplit | |
| 32 | 38 | //go:norace | |
| 33 | 39 | func pthread_attr_getstacksize(attr *pthread_attr_t, stacksize *size_t) int32 { | |
| @@ -40,6 +46,10 @@ func pthread_attr_destroy(attr *pthread_attr_t) int32 { | |||
| 40 | 46 | return int32(call5(pthread_attr_destroyABI0, uintptr(unsafe.Pointer(attr)), 0, 0, 0, 0)) | |
| 41 | 47 | } | |
| 42 | 48 | ||
| 49 | + | //go:linkname _sigaltstack _sigaltstack | |
| 50 | + | var _sigaltstack uint8 | |
| 51 | + | var sigaltstackABI0 = uintptr(unsafe.Pointer(&_sigaltstack)) | |
| 52 | + | ||
| 43 | 53 | //go:linkname _pthread_attr_getstacksize _pthread_attr_getstacksize | |
| 44 | 54 | var _pthread_attr_getstacksize uint8 | |
| 45 | 55 | var pthread_attr_getstacksizeABI0 = uintptr(unsafe.Pointer(&_pthread_attr_getstacksize)) | |
| @@ -28,6 +28,12 @@ import "unsafe" | |||||
| 28 | //go:cgo_import_dynamic purego_pthread_attr_getstacksize pthread_attr_getstacksize "libpthread.so" | 28 | //go:cgo_import_dynamic purego_pthread_attr_getstacksize pthread_attr_getstacksize "libpthread.so" | ||
| 29 | //go:cgo_import_dynamic purego_pthread_attr_destroy pthread_attr_destroy "libpthread.so" | 29 | //go:cgo_import_dynamic purego_pthread_attr_destroy pthread_attr_destroy "libpthread.so" | ||
| 30 | 30 | ||||
| 31 | + | //go:nosplit | |||
| 32 | + | //go:norace | |||
| 33 | + | func sigaltstack(ss *stack_t, old_ss *stack_t) int32 { | |||
| 34 | + | return int32(call5(sigaltstackABI0, uintptr(unsafe.Pointer(ss)), uintptr(unsafe.Pointer(old_ss)), 0, 0, 0)) | |||
| 35 | + | } | |||
| 36 | + | ||||
| 31 | //go:nosplit | 37 | //go:nosplit | ||
| 32 | //go:norace | 38 | //go:norace | ||
| 33 | func pthread_attr_getstacksize(attr *pthread_attr_t, stacksize *size_t) int32 { | 39 | func pthread_attr_getstacksize(attr *pthread_attr_t, stacksize *size_t) int32 { | ||
| @@ -40,6 +46,10 @@ func pthread_attr_destroy(attr *pthread_attr_t) int32 { | |||||
| 40 | return int32(call5(pthread_attr_destroyABI0, uintptr(unsafe.Pointer(attr)), 0, 0, 0, 0)) | 46 | return int32(call5(pthread_attr_destroyABI0, uintptr(unsafe.Pointer(attr)), 0, 0, 0, 0)) | ||
| 41 | } | 47 | } | ||
| 42 | 48 | ||||
| 49 | + | //go:linkname _sigaltstack _sigaltstack | |||
| 50 | + | var _sigaltstack uint8 | |||
| 51 | + | var sigaltstackABI0 = uintptr(unsafe.Pointer(&_sigaltstack)) | |||
| 52 | + | ||||
| 43 | //go:linkname _pthread_attr_getstacksize _pthread_attr_getstacksize | 53 | //go:linkname _pthread_attr_getstacksize _pthread_attr_getstacksize | ||
| 44 | var _pthread_attr_getstacksize uint8 | 54 | var _pthread_attr_getstacksize uint8 | ||
| 45 | var pthread_attr_getstacksizeABI0 = uintptr(unsafe.Pointer(&_pthread_attr_getstacksize)) | 55 | var pthread_attr_getstacksizeABI0 = uintptr(unsafe.Pointer(&_pthread_attr_getstacksize)) | ||
M internal/fakecgo/ztrampolines_netbsd.s +3 -0
| @@ -9,6 +9,9 @@ | |||
| 9 | 9 | ||
| 10 | 10 | // these stubs are here because it is not possible to go:linkname directly the C functions | |
| 11 | 11 | ||
| 12 | + | TEXT _sigaltstack(SB), NOSPLIT|NOFRAME, $0-0 | |
| 13 | + | JMP purego_sigaltstack(SB) | |
| 14 | + | ||
| 12 | 15 | TEXT _pthread_attr_getstacksize(SB), NOSPLIT|NOFRAME, $0-0 | |
| 13 | 16 | JMP purego_pthread_attr_getstacksize(SB) | |
| 14 | 17 | ||
| @@ -9,6 +9,9 @@ | |||||
| 9 | 9 | ||||
| 10 | // these stubs are here because it is not possible to go:linkname directly the C functions | 10 | // these stubs are here because it is not possible to go:linkname directly the C functions | ||
| 11 | 11 | ||||
| 12 | + | TEXT _sigaltstack(SB), NOSPLIT|NOFRAME, $0-0 | |||
| 13 | + | JMP purego_sigaltstack(SB) | |||
| 14 | + | ||||
| 12 | TEXT _pthread_attr_getstacksize(SB), NOSPLIT|NOFRAME, $0-0 | 15 | TEXT _pthread_attr_getstacksize(SB), NOSPLIT|NOFRAME, $0-0 | ||
| 13 | JMP purego_pthread_attr_getstacksize(SB) | 16 | JMP purego_pthread_attr_getstacksize(SB) | ||
| 14 | 17 | ||||
M internal/fakecgo/ztrampolines_stubs.s +0 -3
| @@ -30,9 +30,6 @@ TEXT _nanosleep(SB), NOSPLIT|NOFRAME, $0-0 | |||
| 30 | 30 | TEXT _abort(SB), NOSPLIT|NOFRAME, $0-0 | |
| 31 | 31 | JMP purego_abort(SB) | |
| 32 | 32 | ||
| 33 | - | TEXT _sigaltstack(SB), NOSPLIT|NOFRAME, $0-0 | |
| 34 | - | JMP purego_sigaltstack(SB) | |
| 35 | - | ||
| 36 | 33 | TEXT _pthread_attr_init(SB), NOSPLIT|NOFRAME, $0-0 | |
| 37 | 34 | JMP purego_pthread_attr_init(SB) | |
| 38 | 35 | ||
| @@ -30,9 +30,6 @@ TEXT _nanosleep(SB), NOSPLIT|NOFRAME, $0-0 | |||||
| 30 | TEXT _abort(SB), NOSPLIT|NOFRAME, $0-0 | 30 | TEXT _abort(SB), NOSPLIT|NOFRAME, $0-0 | ||
| 31 | JMP purego_abort(SB) | 31 | JMP purego_abort(SB) | ||
| 32 | 32 | ||||
| 33 | - | TEXT _sigaltstack(SB), NOSPLIT|NOFRAME, $0-0 | |||
| 34 | - | JMP purego_sigaltstack(SB) | |||
| 35 | - | ||||
| 36 | TEXT _pthread_attr_init(SB), NOSPLIT|NOFRAME, $0-0 | 33 | TEXT _pthread_attr_init(SB), NOSPLIT|NOFRAME, $0-0 | ||
| 37 | JMP purego_pthread_attr_init(SB) | 34 | JMP purego_pthread_attr_init(SB) | ||
| 38 | 35 | ||||