detached 432cdf2

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 UnverifiedB5690EEEBB952194 The key is unknown
8 files · +14 -17
M internal/fakecgo/gen.go +1 -1
@@ -120,7 +120,7 @@ var (
120120 {"sigfillset", [5]Arg{{"set", "*sigset_t"}}, "int32", nil},
121121 {"nanosleep", [5]Arg{{"ts", "*syscall.Timespec"}, {"rem", "*syscall.Timespec"}}, "int32", nil},
122122 {"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"}},
124124 }
125125 pthreadSymbols = []Symbol{
126126 {"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() {
5656 call5(abortABI0, 0, 0, 0, 0, 0)
5757 }
5858
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-
6559 //go:nosplit
6660 //go:norace
6761 func pthread_attr_init(attr *pthread_attr_t) int32 {
@@ -138,10 +132,6 @@ var nanosleepABI0 = uintptr(unsafe.Pointer(&_nanosleep))
138132 var _abort uint8
139133 var abortABI0 = uintptr(unsafe.Pointer(&_abort))
140134
141-//go:linkname _sigaltstack _sigaltstack
142-var _sigaltstack uint8
143-var sigaltstackABI0 = uintptr(unsafe.Pointer(&_sigaltstack))
144-
145135 //go:linkname _pthread_attr_init _pthread_attr_init
146136 var _pthread_attr_init uint8
147137 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:nosplit59 //go:nosplit
66 //go:norace60 //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 uint8132 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_init135 //go:linkname _pthread_attr_init _pthread_attr_init
146 var _pthread_attr_init uint8136 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"
1616 //go:cgo_import_dynamic purego_sigfillset sigfillset "/usr/lib/libSystem.B.dylib"
1717 //go:cgo_import_dynamic purego_nanosleep nanosleep "/usr/lib/libSystem.B.dylib"
1818 //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"
2019 //go:cgo_import_dynamic purego_pthread_attr_init pthread_attr_init "/usr/lib/libSystem.B.dylib"
2120 //go:cgo_import_dynamic purego_pthread_create pthread_create "/usr/lib/libSystem.B.dylib"
2221 //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"
1616 //go:cgo_import_dynamic purego_sigfillset sigfillset "libc.so.7"
1717 //go:cgo_import_dynamic purego_nanosleep nanosleep "libc.so.7"
1818 //go:cgo_import_dynamic purego_abort abort "libc.so.7"
19-//go:cgo_import_dynamic purego_sigaltstack sigaltstack "libc.so.7"
2019 //go:cgo_import_dynamic purego_pthread_attr_init pthread_attr_init "libpthread.so"
2120 //go:cgo_import_dynamic purego_pthread_create pthread_create "libpthread.so"
2221 //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"
1616 //go:cgo_import_dynamic purego_sigfillset sigfillset "libc.so.6"
1717 //go:cgo_import_dynamic purego_nanosleep nanosleep "libc.so.6"
1818 //go:cgo_import_dynamic purego_abort abort "libc.so.6"
19-//go:cgo_import_dynamic purego_sigaltstack sigaltstack "libc.so.6"
2019 //go:cgo_import_dynamic purego_pthread_attr_init pthread_attr_init "libpthread.so.0"
2120 //go:cgo_import_dynamic purego_pthread_create pthread_create "libpthread.so.0"
2221 //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"
2828 //go:cgo_import_dynamic purego_pthread_attr_getstacksize pthread_attr_getstacksize "libpthread.so"
2929 //go:cgo_import_dynamic purego_pthread_attr_destroy pthread_attr_destroy "libpthread.so"
3030
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+
3137 //go:nosplit
3238 //go:norace
3339 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 {
4046 return int32(call5(pthread_attr_destroyABI0, uintptr(unsafe.Pointer(attr)), 0, 0, 0, 0))
4147 }
4248
49+//go:linkname _sigaltstack _sigaltstack
50+var _sigaltstack uint8
51+var sigaltstackABI0 = uintptr(unsafe.Pointer(&_sigaltstack))
52+
4353 //go:linkname _pthread_attr_getstacksize _pthread_attr_getstacksize
4454 var _pthread_attr_getstacksize uint8
4555 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:nosplit37 //go:nosplit
32 //go:norace38 //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_getstacksize53 //go:linkname _pthread_attr_getstacksize _pthread_attr_getstacksize
44 var _pthread_attr_getstacksize uint854 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 @@
99
1010 // these stubs are here because it is not possible to go:linkname directly the C functions
1111
12+TEXT _sigaltstack(SB), NOSPLIT|NOFRAME, $0-0
13+ JMP purego_sigaltstack(SB)
14+
1215 TEXT _pthread_attr_getstacksize(SB), NOSPLIT|NOFRAME, $0-0
1316 JMP purego_pthread_attr_getstacksize(SB)
1417
@@ -9,6 +9,9 @@
9 9
10 // these stubs are here because it is not possible to go:linkname directly the C functions10 // 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-015 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
3030 TEXT _abort(SB), NOSPLIT|NOFRAME, $0-0
3131 JMP purego_abort(SB)
3232
33-TEXT _sigaltstack(SB), NOSPLIT|NOFRAME, $0-0
34- JMP purego_sigaltstack(SB)
35-
3633 TEXT _pthread_attr_init(SB), NOSPLIT|NOFRAME, $0-0
3734 JMP purego_pthread_attr_init(SB)
3835
@@ -30,9 +30,6 @@ TEXT _nanosleep(SB), NOSPLIT|NOFRAME, $0-0
30 TEXT _abort(SB), NOSPLIT|NOFRAME, $0-030 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-033 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

Keyboard shortcuts

Single-key shortcuts are on. ctrl k and esc work whatever this says.

ctrl k :
go to a section, branch, tag, file or repository
?
this list
j k
move the row cursor down / up
enter
open the row under the cursor; on Files, a directory opens or closes in place
↑ ↓ ← → home end
in the file tree (focus on a row): previous / next row, close / open a directory or go to its parent / first entry, first / last row. They never open a file
l h
on Files: open a directory or a file / close a directory or go up to its parent, then to the parent page. Elsewhere: into the side panel (on a merge request, its files) / back to the content; there j k move between its controls
g g G
first / last row
/
filter the list; on Files, find a file anywhere in the repository (esc clears, enter opens the best match)
b
switch branch or tag
g s g f g c g b g m g i g r g a
tabs: summary, files, commits, branches & tags, merge requests, issues, releases, actions (when available)
g h
home
w
wide mode: use the whole width of the screen, or not (remembered)
y
copy a permalink pinned to the commit
d u x
diff: split / unified / collapse or expand all
e E
diff: the whole file in view / every file, with the lines the hunks hide
n
merge request: next note in the diff
esc
close a dialog, leave a field

Branches 1

Tags 102

↑↓ moveenter openesc close