internal/fakecgo: remove unnecessary RET instruction (#380)
A function called using a JMP instruction doesn't return to the instruction that follows the JMP, but to the JMP parent frame. This means that there is no need to follow that instruction with a RET, it will not be reached. Updates #343
- commit
- 58d717780d127fa53e8eea1da9e9c7d152797519
- author
- Quim Muntal · · 2025-12-17 14:28 UTC
- committer
- GitHub · · 2025-12-17 14:28 UTC
- parent
- da396f9
- signature
- GPG Unverified
B5690EEEBB952194The key is unknown
3 files · +0 -26
M dlfcn_stubs.s +0 -4
| @@ -8,19 +8,15 @@ | |||
| 8 | 8 | // func dlopen(path *byte, mode int) (ret uintptr) | |
| 9 | 9 | TEXT dlopen(SB), NOSPLIT|NOFRAME, $0-0 | |
| 10 | 10 | JMP purego_dlopen(SB) | |
| 11 | - | RET | |
| 12 | 11 | ||
| 13 | 12 | // func dlsym(handle uintptr, symbol *byte) (ret uintptr) | |
| 14 | 13 | TEXT dlsym(SB), NOSPLIT|NOFRAME, $0-0 | |
| 15 | 14 | JMP purego_dlsym(SB) | |
| 16 | - | RET | |
| 17 | 15 | ||
| 18 | 16 | // func dlerror() (ret *byte) | |
| 19 | 17 | TEXT dlerror(SB), NOSPLIT|NOFRAME, $0-0 | |
| 20 | 18 | JMP purego_dlerror(SB) | |
| 21 | - | RET | |
| 22 | 19 | ||
| 23 | 20 | // func dlclose(handle uintptr) (ret int) | |
| 24 | 21 | TEXT dlclose(SB), NOSPLIT|NOFRAME, $0-0 | |
| 25 | 22 | JMP purego_dlclose(SB) | |
| 26 | - | RET | |
| @@ -8,19 +8,15 @@ | |||||
| 8 | // func dlopen(path *byte, mode int) (ret uintptr) | 8 | // func dlopen(path *byte, mode int) (ret uintptr) | ||
| 9 | TEXT dlopen(SB), NOSPLIT|NOFRAME, $0-0 | 9 | TEXT dlopen(SB), NOSPLIT|NOFRAME, $0-0 | ||
| 10 | JMP purego_dlopen(SB) | 10 | JMP purego_dlopen(SB) | ||
| 11 | - | RET | |||
| 12 | 11 | ||||
| 13 | // func dlsym(handle uintptr, symbol *byte) (ret uintptr) | 12 | // func dlsym(handle uintptr, symbol *byte) (ret uintptr) | ||
| 14 | TEXT dlsym(SB), NOSPLIT|NOFRAME, $0-0 | 13 | TEXT dlsym(SB), NOSPLIT|NOFRAME, $0-0 | ||
| 15 | JMP purego_dlsym(SB) | 14 | JMP purego_dlsym(SB) | ||
| 16 | - | RET | |||
| 17 | 15 | ||||
| 18 | // func dlerror() (ret *byte) | 16 | // func dlerror() (ret *byte) | ||
| 19 | TEXT dlerror(SB), NOSPLIT|NOFRAME, $0-0 | 17 | TEXT dlerror(SB), NOSPLIT|NOFRAME, $0-0 | ||
| 20 | JMP purego_dlerror(SB) | 18 | JMP purego_dlerror(SB) | ||
| 21 | - | RET | |||
| 22 | 19 | ||||
| 23 | // func dlclose(handle uintptr) (ret int) | 20 | // func dlclose(handle uintptr) (ret int) | ||
| 24 | TEXT dlclose(SB), NOSPLIT|NOFRAME, $0-0 | 21 | TEXT dlclose(SB), NOSPLIT|NOFRAME, $0-0 | ||
| 25 | JMP purego_dlclose(SB) | 22 | JMP purego_dlclose(SB) | ||
| 26 | - | RET | |||
M internal/fakecgo/gen.go +0 -1
| @@ -95,7 +95,6 @@ const templateTrampolinesStubs = `// Code generated by 'go generate' with gen.go | |||
| 95 | 95 | {{ range . }} | |
| 96 | 96 | TEXT _{{.Name}}(SB), NOSPLIT|NOFRAME, $0-0 | |
| 97 | 97 | JMP purego_{{.Name}}(SB) | |
| 98 | - | RET | |
| 99 | 98 | {{ end -}} | |
| 100 | 99 | ` | |
| 101 | 100 | ||
| @@ -95,7 +95,6 @@ const templateTrampolinesStubs = `// Code generated by 'go generate' with gen.go | |||||
| 95 | {{ range . }} | 95 | {{ range . }} | ||
| 96 | TEXT _{{.Name}}(SB), NOSPLIT|NOFRAME, $0-0 | 96 | TEXT _{{.Name}}(SB), NOSPLIT|NOFRAME, $0-0 | ||
| 97 | JMP purego_{{.Name}}(SB) | 97 | JMP purego_{{.Name}}(SB) | ||
| 98 | - | RET | |||
| 99 | {{ end -}} | 98 | {{ end -}} | ||
| 100 | ` | 99 | ` | ||
| 101 | 100 | ||||
M internal/fakecgo/ztrampolines_stubs.s +0 -21
| @@ -11,84 +11,63 @@ | |||
| 11 | 11 | ||
| 12 | 12 | TEXT _malloc(SB), NOSPLIT|NOFRAME, $0-0 | |
| 13 | 13 | JMP purego_malloc(SB) | |
| 14 | - | RET | |
| 15 | 14 | ||
| 16 | 15 | TEXT _free(SB), NOSPLIT|NOFRAME, $0-0 | |
| 17 | 16 | JMP purego_free(SB) | |
| 18 | - | RET | |
| 19 | 17 | ||
| 20 | 18 | TEXT _setenv(SB), NOSPLIT|NOFRAME, $0-0 | |
| 21 | 19 | JMP purego_setenv(SB) | |
| 22 | - | RET | |
| 23 | 20 | ||
| 24 | 21 | TEXT _unsetenv(SB), NOSPLIT|NOFRAME, $0-0 | |
| 25 | 22 | JMP purego_unsetenv(SB) | |
| 26 | - | RET | |
| 27 | 23 | ||
| 28 | 24 | TEXT _sigfillset(SB), NOSPLIT|NOFRAME, $0-0 | |
| 29 | 25 | JMP purego_sigfillset(SB) | |
| 30 | - | RET | |
| 31 | 26 | ||
| 32 | 27 | TEXT _nanosleep(SB), NOSPLIT|NOFRAME, $0-0 | |
| 33 | 28 | JMP purego_nanosleep(SB) | |
| 34 | - | RET | |
| 35 | 29 | ||
| 36 | 30 | TEXT _abort(SB), NOSPLIT|NOFRAME, $0-0 | |
| 37 | 31 | JMP purego_abort(SB) | |
| 38 | - | RET | |
| 39 | 32 | ||
| 40 | 33 | TEXT _sigaltstack(SB), NOSPLIT|NOFRAME, $0-0 | |
| 41 | 34 | JMP purego_sigaltstack(SB) | |
| 42 | - | RET | |
| 43 | 35 | ||
| 44 | 36 | TEXT _pthread_attr_init(SB), NOSPLIT|NOFRAME, $0-0 | |
| 45 | 37 | JMP purego_pthread_attr_init(SB) | |
| 46 | - | RET | |
| 47 | 38 | ||
| 48 | 39 | TEXT _pthread_create(SB), NOSPLIT|NOFRAME, $0-0 | |
| 49 | 40 | JMP purego_pthread_create(SB) | |
| 50 | - | RET | |
| 51 | 41 | ||
| 52 | 42 | TEXT _pthread_detach(SB), NOSPLIT|NOFRAME, $0-0 | |
| 53 | 43 | JMP purego_pthread_detach(SB) | |
| 54 | - | RET | |
| 55 | 44 | ||
| 56 | 45 | TEXT _pthread_sigmask(SB), NOSPLIT|NOFRAME, $0-0 | |
| 57 | 46 | JMP purego_pthread_sigmask(SB) | |
| 58 | - | RET | |
| 59 | 47 | ||
| 60 | 48 | TEXT _pthread_self(SB), NOSPLIT|NOFRAME, $0-0 | |
| 61 | 49 | JMP purego_pthread_self(SB) | |
| 62 | - | RET | |
| 63 | 50 | ||
| 64 | 51 | TEXT _pthread_get_stacksize_np(SB), NOSPLIT|NOFRAME, $0-0 | |
| 65 | 52 | JMP purego_pthread_get_stacksize_np(SB) | |
| 66 | - | RET | |
| 67 | 53 | ||
| 68 | 54 | TEXT _pthread_attr_getstacksize(SB), NOSPLIT|NOFRAME, $0-0 | |
| 69 | 55 | JMP purego_pthread_attr_getstacksize(SB) | |
| 70 | - | RET | |
| 71 | 56 | ||
| 72 | 57 | TEXT _pthread_attr_setstacksize(SB), NOSPLIT|NOFRAME, $0-0 | |
| 73 | 58 | JMP purego_pthread_attr_setstacksize(SB) | |
| 74 | - | RET | |
| 75 | 59 | ||
| 76 | 60 | TEXT _pthread_attr_destroy(SB), NOSPLIT|NOFRAME, $0-0 | |
| 77 | 61 | JMP purego_pthread_attr_destroy(SB) | |
| 78 | - | RET | |
| 79 | 62 | ||
| 80 | 63 | TEXT _pthread_mutex_lock(SB), NOSPLIT|NOFRAME, $0-0 | |
| 81 | 64 | JMP purego_pthread_mutex_lock(SB) | |
| 82 | - | RET | |
| 83 | 65 | ||
| 84 | 66 | TEXT _pthread_mutex_unlock(SB), NOSPLIT|NOFRAME, $0-0 | |
| 85 | 67 | JMP purego_pthread_mutex_unlock(SB) | |
| 86 | - | RET | |
| 87 | 68 | ||
| 88 | 69 | TEXT _pthread_cond_broadcast(SB), NOSPLIT|NOFRAME, $0-0 | |
| 89 | 70 | JMP purego_pthread_cond_broadcast(SB) | |
| 90 | - | RET | |
| 91 | 71 | ||
| 92 | 72 | TEXT _pthread_setspecific(SB), NOSPLIT|NOFRAME, $0-0 | |
| 93 | 73 | JMP purego_pthread_setspecific(SB) | |
| 94 | - | RET | |
| @@ -11,84 +11,63 @@ | |||||
| 11 | 11 | ||||
| 12 | TEXT _malloc(SB), NOSPLIT|NOFRAME, $0-0 | 12 | TEXT _malloc(SB), NOSPLIT|NOFRAME, $0-0 | ||
| 13 | JMP purego_malloc(SB) | 13 | JMP purego_malloc(SB) | ||
| 14 | - | RET | |||
| 15 | 14 | ||||
| 16 | TEXT _free(SB), NOSPLIT|NOFRAME, $0-0 | 15 | TEXT _free(SB), NOSPLIT|NOFRAME, $0-0 | ||
| 17 | JMP purego_free(SB) | 16 | JMP purego_free(SB) | ||
| 18 | - | RET | |||
| 19 | 17 | ||||
| 20 | TEXT _setenv(SB), NOSPLIT|NOFRAME, $0-0 | 18 | TEXT _setenv(SB), NOSPLIT|NOFRAME, $0-0 | ||
| 21 | JMP purego_setenv(SB) | 19 | JMP purego_setenv(SB) | ||
| 22 | - | RET | |||
| 23 | 20 | ||||
| 24 | TEXT _unsetenv(SB), NOSPLIT|NOFRAME, $0-0 | 21 | TEXT _unsetenv(SB), NOSPLIT|NOFRAME, $0-0 | ||
| 25 | JMP purego_unsetenv(SB) | 22 | JMP purego_unsetenv(SB) | ||
| 26 | - | RET | |||
| 27 | 23 | ||||
| 28 | TEXT _sigfillset(SB), NOSPLIT|NOFRAME, $0-0 | 24 | TEXT _sigfillset(SB), NOSPLIT|NOFRAME, $0-0 | ||
| 29 | JMP purego_sigfillset(SB) | 25 | JMP purego_sigfillset(SB) | ||
| 30 | - | RET | |||
| 31 | 26 | ||||
| 32 | TEXT _nanosleep(SB), NOSPLIT|NOFRAME, $0-0 | 27 | TEXT _nanosleep(SB), NOSPLIT|NOFRAME, $0-0 | ||
| 33 | JMP purego_nanosleep(SB) | 28 | JMP purego_nanosleep(SB) | ||
| 34 | - | RET | |||
| 35 | 29 | ||||
| 36 | TEXT _abort(SB), NOSPLIT|NOFRAME, $0-0 | 30 | TEXT _abort(SB), NOSPLIT|NOFRAME, $0-0 | ||
| 37 | JMP purego_abort(SB) | 31 | JMP purego_abort(SB) | ||
| 38 | - | RET | |||
| 39 | 32 | ||||
| 40 | TEXT _sigaltstack(SB), NOSPLIT|NOFRAME, $0-0 | 33 | TEXT _sigaltstack(SB), NOSPLIT|NOFRAME, $0-0 | ||
| 41 | JMP purego_sigaltstack(SB) | 34 | JMP purego_sigaltstack(SB) | ||
| 42 | - | RET | |||
| 43 | 35 | ||||
| 44 | TEXT _pthread_attr_init(SB), NOSPLIT|NOFRAME, $0-0 | 36 | TEXT _pthread_attr_init(SB), NOSPLIT|NOFRAME, $0-0 | ||
| 45 | JMP purego_pthread_attr_init(SB) | 37 | JMP purego_pthread_attr_init(SB) | ||
| 46 | - | RET | |||
| 47 | 38 | ||||
| 48 | TEXT _pthread_create(SB), NOSPLIT|NOFRAME, $0-0 | 39 | TEXT _pthread_create(SB), NOSPLIT|NOFRAME, $0-0 | ||
| 49 | JMP purego_pthread_create(SB) | 40 | JMP purego_pthread_create(SB) | ||
| 50 | - | RET | |||
| 51 | 41 | ||||
| 52 | TEXT _pthread_detach(SB), NOSPLIT|NOFRAME, $0-0 | 42 | TEXT _pthread_detach(SB), NOSPLIT|NOFRAME, $0-0 | ||
| 53 | JMP purego_pthread_detach(SB) | 43 | JMP purego_pthread_detach(SB) | ||
| 54 | - | RET | |||
| 55 | 44 | ||||
| 56 | TEXT _pthread_sigmask(SB), NOSPLIT|NOFRAME, $0-0 | 45 | TEXT _pthread_sigmask(SB), NOSPLIT|NOFRAME, $0-0 | ||
| 57 | JMP purego_pthread_sigmask(SB) | 46 | JMP purego_pthread_sigmask(SB) | ||
| 58 | - | RET | |||
| 59 | 47 | ||||
| 60 | TEXT _pthread_self(SB), NOSPLIT|NOFRAME, $0-0 | 48 | TEXT _pthread_self(SB), NOSPLIT|NOFRAME, $0-0 | ||
| 61 | JMP purego_pthread_self(SB) | 49 | JMP purego_pthread_self(SB) | ||
| 62 | - | RET | |||
| 63 | 50 | ||||
| 64 | TEXT _pthread_get_stacksize_np(SB), NOSPLIT|NOFRAME, $0-0 | 51 | TEXT _pthread_get_stacksize_np(SB), NOSPLIT|NOFRAME, $0-0 | ||
| 65 | JMP purego_pthread_get_stacksize_np(SB) | 52 | JMP purego_pthread_get_stacksize_np(SB) | ||
| 66 | - | RET | |||
| 67 | 53 | ||||
| 68 | TEXT _pthread_attr_getstacksize(SB), NOSPLIT|NOFRAME, $0-0 | 54 | TEXT _pthread_attr_getstacksize(SB), NOSPLIT|NOFRAME, $0-0 | ||
| 69 | JMP purego_pthread_attr_getstacksize(SB) | 55 | JMP purego_pthread_attr_getstacksize(SB) | ||
| 70 | - | RET | |||
| 71 | 56 | ||||
| 72 | TEXT _pthread_attr_setstacksize(SB), NOSPLIT|NOFRAME, $0-0 | 57 | TEXT _pthread_attr_setstacksize(SB), NOSPLIT|NOFRAME, $0-0 | ||
| 73 | JMP purego_pthread_attr_setstacksize(SB) | 58 | JMP purego_pthread_attr_setstacksize(SB) | ||
| 74 | - | RET | |||
| 75 | 59 | ||||
| 76 | TEXT _pthread_attr_destroy(SB), NOSPLIT|NOFRAME, $0-0 | 60 | TEXT _pthread_attr_destroy(SB), NOSPLIT|NOFRAME, $0-0 | ||
| 77 | JMP purego_pthread_attr_destroy(SB) | 61 | JMP purego_pthread_attr_destroy(SB) | ||
| 78 | - | RET | |||
| 79 | 62 | ||||
| 80 | TEXT _pthread_mutex_lock(SB), NOSPLIT|NOFRAME, $0-0 | 63 | TEXT _pthread_mutex_lock(SB), NOSPLIT|NOFRAME, $0-0 | ||
| 81 | JMP purego_pthread_mutex_lock(SB) | 64 | JMP purego_pthread_mutex_lock(SB) | ||
| 82 | - | RET | |||
| 83 | 65 | ||||
| 84 | TEXT _pthread_mutex_unlock(SB), NOSPLIT|NOFRAME, $0-0 | 66 | TEXT _pthread_mutex_unlock(SB), NOSPLIT|NOFRAME, $0-0 | ||
| 85 | JMP purego_pthread_mutex_unlock(SB) | 67 | JMP purego_pthread_mutex_unlock(SB) | ||
| 86 | - | RET | |||
| 87 | 68 | ||||
| 88 | TEXT _pthread_cond_broadcast(SB), NOSPLIT|NOFRAME, $0-0 | 69 | TEXT _pthread_cond_broadcast(SB), NOSPLIT|NOFRAME, $0-0 | ||
| 89 | JMP purego_pthread_cond_broadcast(SB) | 70 | JMP purego_pthread_cond_broadcast(SB) | ||
| 90 | - | RET | |||
| 91 | 71 | ||||
| 92 | TEXT _pthread_setspecific(SB), NOSPLIT|NOFRAME, $0-0 | 72 | TEXT _pthread_setspecific(SB), NOSPLIT|NOFRAME, $0-0 | ||
| 93 | JMP purego_pthread_setspecific(SB) | 73 | JMP purego_pthread_setspecific(SB) | ||
| 94 | - | RET | |||