detached 08ca952

internal/fakecgo: generate more (#141)

Before only the symbols.go and trampolines_stubs.s were generated. however, if more symbols are added symbols_GOOS.go also needs to be updated. Might as well generate that too.
commit
08ca952ca680063c8cbbc86e73071412ee707287
author
TotallyGamerJet · · 2023-07-01 03:26 UTC
committer
GitHub · · 2023-07-01 03:26 UTC
parent
ee8dcec
signature
GPG Unverified4AEE18F83AFDEB23 The key is unknown
5 files · +124 -82
M internal/fakecgo/gen.go +64 -20
@@ -6,6 +6,9 @@
66 package main
77
88 import (
9+ "bytes"
10+ "fmt"
11+ "go/format"
912 "log"
1013 "os"
1114 "strings"
@@ -108,24 +111,28 @@ type Symbol struct {
108111 Return string
109112 }
110113
111-var symbols = []Symbol{
112- {"malloc", [5]Arg{{"size", "uintptr"}}, "unsafe.Pointer"},
113- {"free", [5]Arg{{"ptr", "unsafe.Pointer"}}, ""},
114- {"setenv", [5]Arg{{"name", "*byte"}, {"value", "*byte"}, {"overwrite", "int32"}}, "int32"},
115- {"unsetenv", [5]Arg{{"name", "*byte"}}, "int32"},
116- {"pthread_attr_init", [5]Arg{{"attr", "*pthread_attr_t"}}, "int32"},
117- {"pthread_create", [5]Arg{{"thread", "*pthread_t"}, {"attr", "*pthread_attr_t"}, {"start", "unsafe.Pointer"}, {"arg", "unsafe.Pointer"}}, "int32"},
118- {"pthread_detach", [5]Arg{{"thread", "pthread_t"}}, "int32"},
119- {"pthread_sigmask", [5]Arg{{"how", "sighow"}, {"ign", "*sigset_t"}, {"oset", "*sigset_t"}}, "int32"},
120- {"pthread_self", [5]Arg{}, "pthread_t"},
121- {"pthread_get_stacksize_np", [5]Arg{{"thread", "pthread_t"}}, "size_t"},
122- {"pthread_attr_getstacksize", [5]Arg{{"attr", "*pthread_attr_t"}, {"stacksize", "*size_t"}}, "int32"},
123- {"pthread_attr_setstacksize", [5]Arg{{"attr", "*pthread_attr_t"}, {"size", "size_t"}}, "int32"},
124- {"pthread_attr_destroy", [5]Arg{{"attr", "*pthread_attr_t"}}, "int32"},
125- {"sigfillset", [5]Arg{{"set", "*sigset_t"}}, "int32"},
126- {"nanosleep", [5]Arg{{"ts", "*syscall.Timespec"}, {"rem", "*syscall.Timespec"}}, "int32"},
127- {"abort", [5]Arg{}, ""},
128-}
114+var (
115+ libcSymbols = []Symbol{
116+ {"malloc", [5]Arg{{"size", "uintptr"}}, "unsafe.Pointer"},
117+ {"free", [5]Arg{{"ptr", "unsafe.Pointer"}}, ""},
118+ {"setenv", [5]Arg{{"name", "*byte"}, {"value", "*byte"}, {"overwrite", "int32"}}, "int32"},
119+ {"unsetenv", [5]Arg{{"name", "*byte"}}, "int32"},
120+ {"sigfillset", [5]Arg{{"set", "*sigset_t"}}, "int32"},
121+ {"nanosleep", [5]Arg{{"ts", "*syscall.Timespec"}, {"rem", "*syscall.Timespec"}}, "int32"},
122+ {"abort", [5]Arg{}, ""},
123+ }
124+ pthreadSymbols = []Symbol{
125+ {"pthread_attr_init", [5]Arg{{"attr", "*pthread_attr_t"}}, "int32"},
126+ {"pthread_create", [5]Arg{{"thread", "*pthread_t"}, {"attr", "*pthread_attr_t"}, {"start", "unsafe.Pointer"}, {"arg", "unsafe.Pointer"}}, "int32"},
127+ {"pthread_detach", [5]Arg{{"thread", "pthread_t"}}, "int32"},
128+ {"pthread_sigmask", [5]Arg{{"how", "sighow"}, {"ign", "*sigset_t"}, {"oset", "*sigset_t"}}, "int32"},
129+ {"pthread_self", [5]Arg{}, "pthread_t"},
130+ {"pthread_get_stacksize_np", [5]Arg{{"thread", "pthread_t"}}, "size_t"},
131+ {"pthread_attr_getstacksize", [5]Arg{{"attr", "*pthread_attr_t"}, {"stacksize", "*size_t"}}, "int32"},
132+ {"pthread_attr_setstacksize", [5]Arg{{"attr", "*pthread_attr_t"}, {"size", "size_t"}}, "int32"},
133+ {"pthread_attr_destroy", [5]Arg{{"attr", "*pthread_attr_t"}}, "int32"},
134+ }
135+)
129136
130137 var funcs = map[string]any{
131138 "hasPrefix": strings.HasPrefix,
@@ -141,7 +148,16 @@ func run() error {
141148 if err != nil {
142149 return err
143150 }
144- if err := t.Execute(f, symbols); err != nil {
151+ allSymbols := append(append([]Symbol{}, libcSymbols...), pthreadSymbols...)
152+ buf := new(bytes.Buffer)
153+ if err := t.Execute(buf, allSymbols); err != nil {
154+ return err
155+ }
156+ source, err := format.Source(buf.Bytes())
157+ if err != nil {
158+ return err
159+ }
160+ if _, err = f.Write(source); err != nil {
145161 return err
146162 }
147163 t, err = template.New("trampolines_stubs.s").Funcs(funcs).Parse(templateTrampolinesStubs)
@@ -153,9 +169,37 @@ func run() error {
153169 if err != nil {
154170 return err
155171 }
156- if err := t.Execute(f, symbols); err != nil {
172+ if err := t.Execute(f, allSymbols); err != nil {
157173 return err
158174 }
175+ for _, goos := range []string{"darwin", "linux"} {
176+ f, err = os.Create(fmt.Sprintf("symbols_%s.go", goos))
177+ defer f.Close()
178+ if err != nil {
179+ return err
180+ }
181+ f.WriteString(`// Code generated by 'go generate' with gen.go. DO NOT EDIT.
182+
183+// SPDX-License-Identifier: Apache-2.0
184+// SPDX-FileCopyrightText: 2022 The Ebitengine Authors
185+
186+package fakecgo
187+
188+`)
189+ const importPragma = `//go:cgo_import_dynamic purego_%s %s "%s"` + "\n"
190+ libcSO := "/usr/lib/libSystem.B.dylib"
191+ pthreadSO := "/usr/lib/libSystem.B.dylib"
192+ if goos == "linux" {
193+ libcSO = "libc.so.6"
194+ pthreadSO = "libpthread.so.0"
195+ }
196+ for _, sym := range libcSymbols {
197+ f.WriteString(fmt.Sprintf(importPragma, sym.Name, sym.Name, libcSO))
198+ }
199+ for _, sym := range pthreadSymbols {
200+ f.WriteString(fmt.Sprintf(importPragma, sym.Name, sym.Name, pthreadSO))
201+ }
202+ }
159203 return nil
160204 }
161205
@@ -6,6 +6,9 @@
6 package main6 package main
7 7
8 import (8 import (
9+ "bytes"
10+ "fmt"
11+ "go/format"
9 "log"12 "log"
10 "os"13 "os"
11 "strings"14 "strings"
@@ -108,24 +111,28 @@ type Symbol struct {
108 Return string111 Return string
109 }112 }
110 113
111-var symbols = []Symbol{114+var (
112- {"malloc", [5]Arg{{"size", "uintptr"}}, "unsafe.Pointer"},115+ libcSymbols = []Symbol{
113- {"free", [5]Arg{{"ptr", "unsafe.Pointer"}}, ""},116+ {"malloc", [5]Arg{{"size", "uintptr"}}, "unsafe.Pointer"},
114- {"setenv", [5]Arg{{"name", "*byte"}, {"value", "*byte"}, {"overwrite", "int32"}}, "int32"},117+ {"free", [5]Arg{{"ptr", "unsafe.Pointer"}}, ""},
115- {"unsetenv", [5]Arg{{"name", "*byte"}}, "int32"},118+ {"setenv", [5]Arg{{"name", "*byte"}, {"value", "*byte"}, {"overwrite", "int32"}}, "int32"},
116- {"pthread_attr_init", [5]Arg{{"attr", "*pthread_attr_t"}}, "int32"},119+ {"unsetenv", [5]Arg{{"name", "*byte"}}, "int32"},
117- {"pthread_create", [5]Arg{{"thread", "*pthread_t"}, {"attr", "*pthread_attr_t"}, {"start", "unsafe.Pointer"}, {"arg", "unsafe.Pointer"}}, "int32"},120+ {"sigfillset", [5]Arg{{"set", "*sigset_t"}}, "int32"},
118- {"pthread_detach", [5]Arg{{"thread", "pthread_t"}}, "int32"},121+ {"nanosleep", [5]Arg{{"ts", "*syscall.Timespec"}, {"rem", "*syscall.Timespec"}}, "int32"},
119- {"pthread_sigmask", [5]Arg{{"how", "sighow"}, {"ign", "*sigset_t"}, {"oset", "*sigset_t"}}, "int32"},122+ {"abort", [5]Arg{}, ""},
120- {"pthread_self", [5]Arg{}, "pthread_t"},123+ }
121- {"pthread_get_stacksize_np", [5]Arg{{"thread", "pthread_t"}}, "size_t"},124+ pthreadSymbols = []Symbol{
122- {"pthread_attr_getstacksize", [5]Arg{{"attr", "*pthread_attr_t"}, {"stacksize", "*size_t"}}, "int32"},125+ {"pthread_attr_init", [5]Arg{{"attr", "*pthread_attr_t"}}, "int32"},
123- {"pthread_attr_setstacksize", [5]Arg{{"attr", "*pthread_attr_t"}, {"size", "size_t"}}, "int32"},126+ {"pthread_create", [5]Arg{{"thread", "*pthread_t"}, {"attr", "*pthread_attr_t"}, {"start", "unsafe.Pointer"}, {"arg", "unsafe.Pointer"}}, "int32"},
124- {"pthread_attr_destroy", [5]Arg{{"attr", "*pthread_attr_t"}}, "int32"},127+ {"pthread_detach", [5]Arg{{"thread", "pthread_t"}}, "int32"},
125- {"sigfillset", [5]Arg{{"set", "*sigset_t"}}, "int32"},128+ {"pthread_sigmask", [5]Arg{{"how", "sighow"}, {"ign", "*sigset_t"}, {"oset", "*sigset_t"}}, "int32"},
126- {"nanosleep", [5]Arg{{"ts", "*syscall.Timespec"}, {"rem", "*syscall.Timespec"}}, "int32"},129+ {"pthread_self", [5]Arg{}, "pthread_t"},
127- {"abort", [5]Arg{}, ""},130+ {"pthread_get_stacksize_np", [5]Arg{{"thread", "pthread_t"}}, "size_t"},
128-}131+ {"pthread_attr_getstacksize", [5]Arg{{"attr", "*pthread_attr_t"}, {"stacksize", "*size_t"}}, "int32"},
132+ {"pthread_attr_setstacksize", [5]Arg{{"attr", "*pthread_attr_t"}, {"size", "size_t"}}, "int32"},
133+ {"pthread_attr_destroy", [5]Arg{{"attr", "*pthread_attr_t"}}, "int32"},
134+ }
135+)
129 136
130 var funcs = map[string]any{137 var funcs = map[string]any{
131 "hasPrefix": strings.HasPrefix,138 "hasPrefix": strings.HasPrefix,
@@ -141,7 +148,16 @@ func run() error {
141 if err != nil {148 if err != nil {
142 return err149 return err
143 }150 }
144- if err := t.Execute(f, symbols); err != nil {151+ allSymbols := append(append([]Symbol{}, libcSymbols...), pthreadSymbols...)
152+ buf := new(bytes.Buffer)
153+ if err := t.Execute(buf, allSymbols); err != nil {
154+ return err
155+ }
156+ source, err := format.Source(buf.Bytes())
157+ if err != nil {
158+ return err
159+ }
160+ if _, err = f.Write(source); err != nil {
145 return err161 return err
146 }162 }
147 t, err = template.New("trampolines_stubs.s").Funcs(funcs).Parse(templateTrampolinesStubs)163 t, err = template.New("trampolines_stubs.s").Funcs(funcs).Parse(templateTrampolinesStubs)
@@ -153,9 +169,37 @@ func run() error {
153 if err != nil {169 if err != nil {
154 return err170 return err
155 }171 }
156- if err := t.Execute(f, symbols); err != nil {172+ if err := t.Execute(f, allSymbols); err != nil {
157 return err173 return err
158 }174 }
175+ for _, goos := range []string{"darwin", "linux"} {
176+ f, err = os.Create(fmt.Sprintf("symbols_%s.go", goos))
177+ defer f.Close()
178+ if err != nil {
179+ return err
180+ }
181+ f.WriteString(`// Code generated by 'go generate' with gen.go. DO NOT EDIT.
182+
183+// SPDX-License-Identifier: Apache-2.0
184+// SPDX-FileCopyrightText: 2022 The Ebitengine Authors
185+
186+package fakecgo
187+
188+`)
189+ const importPragma = `//go:cgo_import_dynamic purego_%s %s "%s"` + "\n"
190+ libcSO := "/usr/lib/libSystem.B.dylib"
191+ pthreadSO := "/usr/lib/libSystem.B.dylib"
192+ if goos == "linux" {
193+ libcSO = "libc.so.6"
194+ pthreadSO = "libpthread.so.0"
195+ }
196+ for _, sym := range libcSymbols {
197+ f.WriteString(fmt.Sprintf(importPragma, sym.Name, sym.Name, libcSO))
198+ }
199+ for _, sym := range pthreadSymbols {
200+ f.WriteString(fmt.Sprintf(importPragma, sym.Name, sym.Name, pthreadSO))
201+ }
202+ }
159 return nil203 return nil
160 }204 }
161 205
M internal/fakecgo/symbols.go +24 -24
@@ -39,6 +39,18 @@ func unsetenv(name *byte) int32 {
3939 return int32(call5(unsetenvABI0, uintptr(unsafe.Pointer(name)), 0, 0, 0, 0))
4040 }
4141
42+func sigfillset(set *sigset_t) int32 {
43+ return int32(call5(sigfillsetABI0, uintptr(unsafe.Pointer(set)), 0, 0, 0, 0))
44+}
45+
46+func nanosleep(ts *syscall.Timespec, rem *syscall.Timespec) int32 {
47+ return int32(call5(nanosleepABI0, uintptr(unsafe.Pointer(ts)), uintptr(unsafe.Pointer(rem)), 0, 0, 0))
48+}
49+
50+func abort() {
51+ call5(abortABI0, 0, 0, 0, 0, 0)
52+}
53+
4254 func pthread_attr_init(attr *pthread_attr_t) int32 {
4355 return int32(call5(pthread_attr_initABI0, uintptr(unsafe.Pointer(attr)), 0, 0, 0, 0))
4456 }
@@ -75,18 +87,6 @@ func pthread_attr_destroy(attr *pthread_attr_t) int32 {
7587 return int32(call5(pthread_attr_destroyABI0, uintptr(unsafe.Pointer(attr)), 0, 0, 0, 0))
7688 }
7789
78-func sigfillset(set *sigset_t) int32 {
79- return int32(call5(sigfillsetABI0, uintptr(unsafe.Pointer(set)), 0, 0, 0, 0))
80-}
81-
82-func nanosleep(ts *syscall.Timespec, rem *syscall.Timespec) int32 {
83- return int32(call5(nanosleepABI0, uintptr(unsafe.Pointer(ts)), uintptr(unsafe.Pointer(rem)), 0, 0, 0))
84-}
85-
86-func abort() {
87- call5(abortABI0, 0, 0, 0, 0, 0)
88-}
89-
9090 //go:linkname _malloc _malloc
9191 var _malloc uintptr
9292 var mallocABI0 = uintptr(unsafe.Pointer(&_malloc))
@@ -103,6 +103,18 @@ var setenvABI0 = uintptr(unsafe.Pointer(&_setenv))
103103 var _unsetenv uintptr
104104 var unsetenvABI0 = uintptr(unsafe.Pointer(&_unsetenv))
105105
106+//go:linkname _sigfillset _sigfillset
107+var _sigfillset uintptr
108+var sigfillsetABI0 = uintptr(unsafe.Pointer(&_sigfillset))
109+
110+//go:linkname _nanosleep _nanosleep
111+var _nanosleep uintptr
112+var nanosleepABI0 = uintptr(unsafe.Pointer(&_nanosleep))
113+
114+//go:linkname _abort _abort
115+var _abort uintptr
116+var abortABI0 = uintptr(unsafe.Pointer(&_abort))
117+
106118 //go:linkname _pthread_attr_init _pthread_attr_init
107119 var _pthread_attr_init uintptr
108120 var pthread_attr_initABI0 = uintptr(unsafe.Pointer(&_pthread_attr_init))
@@ -138,15 +150,3 @@ var pthread_attr_setstacksizeABI0 = uintptr(unsafe.Pointer(&_pthread_attr_setsta
138150 //go:linkname _pthread_attr_destroy _pthread_attr_destroy
139151 var _pthread_attr_destroy uintptr
140152 var pthread_attr_destroyABI0 = uintptr(unsafe.Pointer(&_pthread_attr_destroy))
141-
142-//go:linkname _sigfillset _sigfillset
143-var _sigfillset uintptr
144-var sigfillsetABI0 = uintptr(unsafe.Pointer(&_sigfillset))
145-
146-//go:linkname _nanosleep _nanosleep
147-var _nanosleep uintptr
148-var nanosleepABI0 = uintptr(unsafe.Pointer(&_nanosleep))
149-
150-//go:linkname _abort _abort
151-var _abort uintptr
152-var abortABI0 = uintptr(unsafe.Pointer(&_abort))
@@ -39,6 +39,18 @@ func unsetenv(name *byte) int32 {
39 return int32(call5(unsetenvABI0, uintptr(unsafe.Pointer(name)), 0, 0, 0, 0))39 return int32(call5(unsetenvABI0, uintptr(unsafe.Pointer(name)), 0, 0, 0, 0))
40 }40 }
41 41
42+func sigfillset(set *sigset_t) int32 {
43+ return int32(call5(sigfillsetABI0, uintptr(unsafe.Pointer(set)), 0, 0, 0, 0))
44+}
45+
46+func nanosleep(ts *syscall.Timespec, rem *syscall.Timespec) int32 {
47+ return int32(call5(nanosleepABI0, uintptr(unsafe.Pointer(ts)), uintptr(unsafe.Pointer(rem)), 0, 0, 0))
48+}
49+
50+func abort() {
51+ call5(abortABI0, 0, 0, 0, 0, 0)
52+}
53+
42 func pthread_attr_init(attr *pthread_attr_t) int32 {54 func pthread_attr_init(attr *pthread_attr_t) int32 {
43 return int32(call5(pthread_attr_initABI0, uintptr(unsafe.Pointer(attr)), 0, 0, 0, 0))55 return int32(call5(pthread_attr_initABI0, uintptr(unsafe.Pointer(attr)), 0, 0, 0, 0))
44 }56 }
@@ -75,18 +87,6 @@ func pthread_attr_destroy(attr *pthread_attr_t) int32 {
75 return int32(call5(pthread_attr_destroyABI0, uintptr(unsafe.Pointer(attr)), 0, 0, 0, 0))87 return int32(call5(pthread_attr_destroyABI0, uintptr(unsafe.Pointer(attr)), 0, 0, 0, 0))
76 }88 }
77 89
78-func sigfillset(set *sigset_t) int32 {
79- return int32(call5(sigfillsetABI0, uintptr(unsafe.Pointer(set)), 0, 0, 0, 0))
80-}
81-
82-func nanosleep(ts *syscall.Timespec, rem *syscall.Timespec) int32 {
83- return int32(call5(nanosleepABI0, uintptr(unsafe.Pointer(ts)), uintptr(unsafe.Pointer(rem)), 0, 0, 0))
84-}
85-
86-func abort() {
87- call5(abortABI0, 0, 0, 0, 0, 0)
88-}
89-
90 //go:linkname _malloc _malloc90 //go:linkname _malloc _malloc
91 var _malloc uintptr91 var _malloc uintptr
92 var mallocABI0 = uintptr(unsafe.Pointer(&_malloc))92 var mallocABI0 = uintptr(unsafe.Pointer(&_malloc))
@@ -103,6 +103,18 @@ var setenvABI0 = uintptr(unsafe.Pointer(&_setenv))
103 var _unsetenv uintptr103 var _unsetenv uintptr
104 var unsetenvABI0 = uintptr(unsafe.Pointer(&_unsetenv))104 var unsetenvABI0 = uintptr(unsafe.Pointer(&_unsetenv))
105 105
106+//go:linkname _sigfillset _sigfillset
107+var _sigfillset uintptr
108+var sigfillsetABI0 = uintptr(unsafe.Pointer(&_sigfillset))
109+
110+//go:linkname _nanosleep _nanosleep
111+var _nanosleep uintptr
112+var nanosleepABI0 = uintptr(unsafe.Pointer(&_nanosleep))
113+
114+//go:linkname _abort _abort
115+var _abort uintptr
116+var abortABI0 = uintptr(unsafe.Pointer(&_abort))
117+
106 //go:linkname _pthread_attr_init _pthread_attr_init118 //go:linkname _pthread_attr_init _pthread_attr_init
107 var _pthread_attr_init uintptr119 var _pthread_attr_init uintptr
108 var pthread_attr_initABI0 = uintptr(unsafe.Pointer(&_pthread_attr_init))120 var pthread_attr_initABI0 = uintptr(unsafe.Pointer(&_pthread_attr_init))
@@ -138,15 +150,3 @@ var pthread_attr_setstacksizeABI0 = uintptr(unsafe.Pointer(&_pthread_attr_setsta
138 //go:linkname _pthread_attr_destroy _pthread_attr_destroy150 //go:linkname _pthread_attr_destroy _pthread_attr_destroy
139 var _pthread_attr_destroy uintptr151 var _pthread_attr_destroy uintptr
140 var pthread_attr_destroyABI0 = uintptr(unsafe.Pointer(&_pthread_attr_destroy))152 var pthread_attr_destroyABI0 = uintptr(unsafe.Pointer(&_pthread_attr_destroy))
141-
142-//go:linkname _sigfillset _sigfillset
143-var _sigfillset uintptr
144-var sigfillsetABI0 = uintptr(unsafe.Pointer(&_sigfillset))
145-
146-//go:linkname _nanosleep _nanosleep
147-var _nanosleep uintptr
148-var nanosleepABI0 = uintptr(unsafe.Pointer(&_nanosleep))
149-
150-//go:linkname _abort _abort
151-var _abort uintptr
152-var abortABI0 = uintptr(unsafe.Pointer(&_abort))
M internal/fakecgo/symbols_darwin.go +10 -8
@@ -1,3 +1,5 @@
1+// Code generated by 'go generate' with gen.go. DO NOT EDIT.
2+
13 // SPDX-License-Identifier: Apache-2.0
24 // SPDX-FileCopyrightText: 2022 The Ebitengine Authors
35
@@ -7,15 +9,15 @@ package fakecgo
79 //go:cgo_import_dynamic purego_free free "/usr/lib/libSystem.B.dylib"
810 //go:cgo_import_dynamic purego_setenv setenv "/usr/lib/libSystem.B.dylib"
911 //go:cgo_import_dynamic purego_unsetenv unsetenv "/usr/lib/libSystem.B.dylib"
10-//go:cgo_import_dynamic purego_pthread_self pthread_self "/usr/lib/libSystem.B.dylib"
11-//go:cgo_import_dynamic purego_pthread_get_stacksize_np pthread_get_stacksize_np "/usr/lib/libSystem.B.dylib"
12-//go:cgo_import_dynamic purego_pthread_attr_setstacksize pthread_attr_setstacksize "/usr/lib/libSystem.B.dylib"
12+//go:cgo_import_dynamic purego_sigfillset sigfillset "/usr/lib/libSystem.B.dylib"
13+//go:cgo_import_dynamic purego_nanosleep nanosleep "/usr/lib/libSystem.B.dylib"
14+//go:cgo_import_dynamic purego_abort abort "/usr/lib/libSystem.B.dylib"
1315 //go:cgo_import_dynamic purego_pthread_attr_init pthread_attr_init "/usr/lib/libSystem.B.dylib"
1416 //go:cgo_import_dynamic purego_pthread_create pthread_create "/usr/lib/libSystem.B.dylib"
1517 //go:cgo_import_dynamic purego_pthread_detach pthread_detach "/usr/lib/libSystem.B.dylib"
16-//go:cgo_import_dynamic purego_pthread_attr_destroy pthread_attr_destroy "/usr/lib/libSystem.B.dylib"
17-//go:cgo_import_dynamic purego_pthread_attr_getstacksize pthread_attr_getstacksize "/usr/lib/libSystem.B.dylib"
1818 //go:cgo_import_dynamic purego_pthread_sigmask pthread_sigmask "/usr/lib/libSystem.B.dylib"
19-//go:cgo_import_dynamic purego_abort abort "/usr/lib/libSystem.B.dylib"
20-//go:cgo_import_dynamic purego_sigfillset sigfillset "/usr/lib/libSystem.B.dylib"
21-//go:cgo_import_dynamic purego_nanosleep nanosleep "/usr/lib/libSystem.B.dylib"
19+//go:cgo_import_dynamic purego_pthread_self pthread_self "/usr/lib/libSystem.B.dylib"
20+//go:cgo_import_dynamic purego_pthread_get_stacksize_np pthread_get_stacksize_np "/usr/lib/libSystem.B.dylib"
21+//go:cgo_import_dynamic purego_pthread_attr_getstacksize pthread_attr_getstacksize "/usr/lib/libSystem.B.dylib"
22+//go:cgo_import_dynamic purego_pthread_attr_setstacksize pthread_attr_setstacksize "/usr/lib/libSystem.B.dylib"
23+//go:cgo_import_dynamic purego_pthread_attr_destroy pthread_attr_destroy "/usr/lib/libSystem.B.dylib"
@@ -1,3 +1,5 @@
1+// Code generated by 'go generate' with gen.go. DO NOT EDIT.
2+
1 // SPDX-License-Identifier: Apache-2.03 // SPDX-License-Identifier: Apache-2.0
2 // SPDX-FileCopyrightText: 2022 The Ebitengine Authors4 // SPDX-FileCopyrightText: 2022 The Ebitengine Authors
3 5
@@ -7,15 +9,15 @@ package fakecgo
7 //go:cgo_import_dynamic purego_free free "/usr/lib/libSystem.B.dylib"9 //go:cgo_import_dynamic purego_free free "/usr/lib/libSystem.B.dylib"
8 //go:cgo_import_dynamic purego_setenv setenv "/usr/lib/libSystem.B.dylib"10 //go:cgo_import_dynamic purego_setenv setenv "/usr/lib/libSystem.B.dylib"
9 //go:cgo_import_dynamic purego_unsetenv unsetenv "/usr/lib/libSystem.B.dylib"11 //go:cgo_import_dynamic purego_unsetenv unsetenv "/usr/lib/libSystem.B.dylib"
10-//go:cgo_import_dynamic purego_pthread_self pthread_self "/usr/lib/libSystem.B.dylib"12+//go:cgo_import_dynamic purego_sigfillset sigfillset "/usr/lib/libSystem.B.dylib"
11-//go:cgo_import_dynamic purego_pthread_get_stacksize_np pthread_get_stacksize_np "/usr/lib/libSystem.B.dylib"13+//go:cgo_import_dynamic purego_nanosleep nanosleep "/usr/lib/libSystem.B.dylib"
12-//go:cgo_import_dynamic purego_pthread_attr_setstacksize pthread_attr_setstacksize "/usr/lib/libSystem.B.dylib"14+//go:cgo_import_dynamic purego_abort abort "/usr/lib/libSystem.B.dylib"
13 //go:cgo_import_dynamic purego_pthread_attr_init pthread_attr_init "/usr/lib/libSystem.B.dylib"15 //go:cgo_import_dynamic purego_pthread_attr_init pthread_attr_init "/usr/lib/libSystem.B.dylib"
14 //go:cgo_import_dynamic purego_pthread_create pthread_create "/usr/lib/libSystem.B.dylib"16 //go:cgo_import_dynamic purego_pthread_create pthread_create "/usr/lib/libSystem.B.dylib"
15 //go:cgo_import_dynamic purego_pthread_detach pthread_detach "/usr/lib/libSystem.B.dylib"17 //go:cgo_import_dynamic purego_pthread_detach pthread_detach "/usr/lib/libSystem.B.dylib"
16-//go:cgo_import_dynamic purego_pthread_attr_destroy pthread_attr_destroy "/usr/lib/libSystem.B.dylib"
17-//go:cgo_import_dynamic purego_pthread_attr_getstacksize pthread_attr_getstacksize "/usr/lib/libSystem.B.dylib"
18 //go:cgo_import_dynamic purego_pthread_sigmask pthread_sigmask "/usr/lib/libSystem.B.dylib"18 //go:cgo_import_dynamic purego_pthread_sigmask pthread_sigmask "/usr/lib/libSystem.B.dylib"
19-//go:cgo_import_dynamic purego_abort abort "/usr/lib/libSystem.B.dylib"19+//go:cgo_import_dynamic purego_pthread_self pthread_self "/usr/lib/libSystem.B.dylib"
20-//go:cgo_import_dynamic purego_sigfillset sigfillset "/usr/lib/libSystem.B.dylib"20+//go:cgo_import_dynamic purego_pthread_get_stacksize_np pthread_get_stacksize_np "/usr/lib/libSystem.B.dylib"
21-//go:cgo_import_dynamic purego_nanosleep nanosleep "/usr/lib/libSystem.B.dylib"21+//go:cgo_import_dynamic purego_pthread_attr_getstacksize pthread_attr_getstacksize "/usr/lib/libSystem.B.dylib"
22+//go:cgo_import_dynamic purego_pthread_attr_setstacksize pthread_attr_setstacksize "/usr/lib/libSystem.B.dylib"
23+//go:cgo_import_dynamic purego_pthread_attr_destroy pthread_attr_destroy "/usr/lib/libSystem.B.dylib"
M internal/fakecgo/symbols_linux.go +14 -18
@@ -1,27 +1,23 @@
1+// Code generated by 'go generate' with gen.go. DO NOT EDIT.
2+
13 // SPDX-License-Identifier: Apache-2.0
24 // SPDX-FileCopyrightText: 2022 The Ebitengine Authors
35
46 package fakecgo
57
6-// pthread_attr_init will get us the wrong version on glibc - but this doesn't matter, since the memory we
7-// provide is zeroed - which will lead the correct result again
8-
9-//go:cgo_import_dynamic purego_pthread_attr_init pthread_attr_init "libpthread.so.0"
10-//go:cgo_import_dynamic purego_pthread_attr_getstacksize pthread_attr_getstacksize "libpthread.so.0"
11-//go:cgo_import_dynamic purego_pthread_attr_destroy pthread_attr_destroy "libpthread.so.0"
12-//go:cgo_import_dynamic purego_pthread_sigmask pthread_sigmask "libpthread.so.0"
13-//go:cgo_import_dynamic purego_pthread_create pthread_create "libpthread.so.0"
14-//go:cgo_import_dynamic purego_pthread_detach pthread_detach "libpthread.so.0"
15-//go:cgo_import_dynamic purego_setenv setenv "libc.so.6"
16-//go:cgo_import_dynamic purego_unsetenv unsetenv "libc.so.6"
178 //go:cgo_import_dynamic purego_malloc malloc "libc.so.6"
189 //go:cgo_import_dynamic purego_free free "libc.so.6"
19-//go:cgo_import_dynamic purego_nanosleep nanosleep "libc.so.6"
10+//go:cgo_import_dynamic purego_setenv setenv "libc.so.6"
11+//go:cgo_import_dynamic purego_unsetenv unsetenv "libc.so.6"
2012 //go:cgo_import_dynamic purego_sigfillset sigfillset "libc.so.6"
13+//go:cgo_import_dynamic purego_nanosleep nanosleep "libc.so.6"
2114 //go:cgo_import_dynamic purego_abort abort "libc.so.6"
22-
23-// on amd64 we don't need the following lines - on 386 we do...
24-// anyway - with those lines the output is better (but doesn't matter) - without it on amd64 we get multiple DT_NEEDED with "libc.so.6" etc
25-
26-//go:cgo_import_dynamic _ _ "libpthread.so.0"
27-//go:cgo_import_dynamic _ _ "libc.so.6"
15+//go:cgo_import_dynamic purego_pthread_attr_init pthread_attr_init "libpthread.so.0"
16+//go:cgo_import_dynamic purego_pthread_create pthread_create "libpthread.so.0"
17+//go:cgo_import_dynamic purego_pthread_detach pthread_detach "libpthread.so.0"
18+//go:cgo_import_dynamic purego_pthread_sigmask pthread_sigmask "libpthread.so.0"
19+//go:cgo_import_dynamic purego_pthread_self pthread_self "libpthread.so.0"
20+//go:cgo_import_dynamic purego_pthread_get_stacksize_np pthread_get_stacksize_np "libpthread.so.0"
21+//go:cgo_import_dynamic purego_pthread_attr_getstacksize pthread_attr_getstacksize "libpthread.so.0"
22+//go:cgo_import_dynamic purego_pthread_attr_setstacksize pthread_attr_setstacksize "libpthread.so.0"
23+//go:cgo_import_dynamic purego_pthread_attr_destroy pthread_attr_destroy "libpthread.so.0"
@@ -1,27 +1,23 @@
1+// Code generated by 'go generate' with gen.go. DO NOT EDIT.
2+
1 // SPDX-License-Identifier: Apache-2.03 // SPDX-License-Identifier: Apache-2.0
2 // SPDX-FileCopyrightText: 2022 The Ebitengine Authors4 // SPDX-FileCopyrightText: 2022 The Ebitengine Authors
3 5
4 package fakecgo6 package fakecgo
5 7
6-// pthread_attr_init will get us the wrong version on glibc - but this doesn't matter, since the memory we
7-// provide is zeroed - which will lead the correct result again
8-
9-//go:cgo_import_dynamic purego_pthread_attr_init pthread_attr_init "libpthread.so.0"
10-//go:cgo_import_dynamic purego_pthread_attr_getstacksize pthread_attr_getstacksize "libpthread.so.0"
11-//go:cgo_import_dynamic purego_pthread_attr_destroy pthread_attr_destroy "libpthread.so.0"
12-//go:cgo_import_dynamic purego_pthread_sigmask pthread_sigmask "libpthread.so.0"
13-//go:cgo_import_dynamic purego_pthread_create pthread_create "libpthread.so.0"
14-//go:cgo_import_dynamic purego_pthread_detach pthread_detach "libpthread.so.0"
15-//go:cgo_import_dynamic purego_setenv setenv "libc.so.6"
16-//go:cgo_import_dynamic purego_unsetenv unsetenv "libc.so.6"
17 //go:cgo_import_dynamic purego_malloc malloc "libc.so.6"8 //go:cgo_import_dynamic purego_malloc malloc "libc.so.6"
18 //go:cgo_import_dynamic purego_free free "libc.so.6"9 //go:cgo_import_dynamic purego_free free "libc.so.6"
19-//go:cgo_import_dynamic purego_nanosleep nanosleep "libc.so.6"10+//go:cgo_import_dynamic purego_setenv setenv "libc.so.6"
11+//go:cgo_import_dynamic purego_unsetenv unsetenv "libc.so.6"
20 //go:cgo_import_dynamic purego_sigfillset sigfillset "libc.so.6"12 //go:cgo_import_dynamic purego_sigfillset sigfillset "libc.so.6"
13+//go:cgo_import_dynamic purego_nanosleep nanosleep "libc.so.6"
21 //go:cgo_import_dynamic purego_abort abort "libc.so.6"14 //go:cgo_import_dynamic purego_abort abort "libc.so.6"
22-15+//go:cgo_import_dynamic purego_pthread_attr_init pthread_attr_init "libpthread.so.0"
23-// on amd64 we don't need the following lines - on 386 we do...16+//go:cgo_import_dynamic purego_pthread_create pthread_create "libpthread.so.0"
24-// anyway - with those lines the output is better (but doesn't matter) - without it on amd64 we get multiple DT_NEEDED with "libc.so.6" etc17+//go:cgo_import_dynamic purego_pthread_detach pthread_detach "libpthread.so.0"
25-18+//go:cgo_import_dynamic purego_pthread_sigmask pthread_sigmask "libpthread.so.0"
26-//go:cgo_import_dynamic _ _ "libpthread.so.0"19+//go:cgo_import_dynamic purego_pthread_self pthread_self "libpthread.so.0"
27-//go:cgo_import_dynamic _ _ "libc.so.6"20+//go:cgo_import_dynamic purego_pthread_get_stacksize_np pthread_get_stacksize_np "libpthread.so.0"
21+//go:cgo_import_dynamic purego_pthread_attr_getstacksize pthread_attr_getstacksize "libpthread.so.0"
22+//go:cgo_import_dynamic purego_pthread_attr_setstacksize pthread_attr_setstacksize "libpthread.so.0"
23+//go:cgo_import_dynamic purego_pthread_attr_destroy pthread_attr_destroy "libpthread.so.0"
M internal/fakecgo/trampolines_stubs.s +12 -12
@@ -25,6 +25,18 @@ TEXT _unsetenv(SB), NOSPLIT, $0-0
2525 JMP purego_unsetenv(SB)
2626 RET
2727
28+TEXT _sigfillset(SB), NOSPLIT, $0-0
29+ JMP purego_sigfillset(SB)
30+ RET
31+
32+TEXT _nanosleep(SB), NOSPLIT, $0-0
33+ JMP purego_nanosleep(SB)
34+ RET
35+
36+TEXT _abort(SB), NOSPLIT, $0-0
37+ JMP purego_abort(SB)
38+ RET
39+
2840 TEXT _pthread_attr_init(SB), NOSPLIT, $0-0
2941 JMP purego_pthread_attr_init(SB)
3042 RET
@@ -60,15 +72,3 @@ TEXT _pthread_attr_setstacksize(SB), NOSPLIT, $0-0
6072 TEXT _pthread_attr_destroy(SB), NOSPLIT, $0-0
6173 JMP purego_pthread_attr_destroy(SB)
6274 RET
63-
64-TEXT _sigfillset(SB), NOSPLIT, $0-0
65- JMP purego_sigfillset(SB)
66- RET
67-
68-TEXT _nanosleep(SB), NOSPLIT, $0-0
69- JMP purego_nanosleep(SB)
70- RET
71-
72-TEXT _abort(SB), NOSPLIT, $0-0
73- JMP purego_abort(SB)
74- RET
@@ -25,6 +25,18 @@ TEXT _unsetenv(SB), NOSPLIT, $0-0
25 JMP purego_unsetenv(SB)25 JMP purego_unsetenv(SB)
26 RET26 RET
27 27
28+TEXT _sigfillset(SB), NOSPLIT, $0-0
29+ JMP purego_sigfillset(SB)
30+ RET
31+
32+TEXT _nanosleep(SB), NOSPLIT, $0-0
33+ JMP purego_nanosleep(SB)
34+ RET
35+
36+TEXT _abort(SB), NOSPLIT, $0-0
37+ JMP purego_abort(SB)
38+ RET
39+
28 TEXT _pthread_attr_init(SB), NOSPLIT, $0-040 TEXT _pthread_attr_init(SB), NOSPLIT, $0-0
29 JMP purego_pthread_attr_init(SB)41 JMP purego_pthread_attr_init(SB)
30 RET42 RET
@@ -60,15 +72,3 @@ TEXT _pthread_attr_setstacksize(SB), NOSPLIT, $0-0
60 TEXT _pthread_attr_destroy(SB), NOSPLIT, $0-072 TEXT _pthread_attr_destroy(SB), NOSPLIT, $0-0
61 JMP purego_pthread_attr_destroy(SB)73 JMP purego_pthread_attr_destroy(SB)
62 RET74 RET
63-
64-TEXT _sigfillset(SB), NOSPLIT, $0-0
65- JMP purego_sigfillset(SB)
66- RET
67-
68-TEXT _nanosleep(SB), NOSPLIT, $0-0
69- JMP purego_nanosleep(SB)
70- RET
71-
72-TEXT _abort(SB), NOSPLIT, $0-0
73- JMP purego_abort(SB)
74- RET

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