detached 43e2ab6

internal/fakecgo: use C ABI in arm64/loong64/riscv64 trampolines (#395)

Same as #394 but for arm64/loong64/riscv64.
commit
43e2ab6b78a92c4d7c02c4321098cac5cc43e1e7
author
Quim Muntal · · 2026-01-23 04:03 UTC
committer
GitHub · · 2026-01-23 04:03 UTC
parent
4f3cc27
signature
GPG UnverifiedB5690EEEBB952194 The key is unknown
3 files · +53 -50
M internal/fakecgo/trampolines_arm64.s +20 -19
@@ -9,29 +9,30 @@
99
1010 // These trampolines map the gcc ABI to Go ABIInternal and then calls into the Go equivalent functions.
1111 // Note that C arguments are passed in R0-R7, which matches Go ABIInternal for the first eight arguments.
12+// R9 is used as a temporary register.
1213
1314 TEXT x_cgo_init_trampoline(SB), NOSPLIT, $0-0
14- MOVD ·x_cgo_init_call(SB), R26
15- MOVD (R26), R2
16- CALL (R2)
15+ MOVD ·x_cgo_init_call(SB), R9
16+ MOVD (R9), R9
17+ CALL R9
1718 RET
1819
1920 TEXT x_cgo_thread_start_trampoline(SB), NOSPLIT, $0-0
20- MOVD ·x_cgo_thread_start_call(SB), R26
21- MOVD (R26), R2
22- CALL (R2)
21+ MOVD ·x_cgo_thread_start_call(SB), R9
22+ MOVD (R9), R9
23+ CALL R9
2324 RET
2425
2526 TEXT x_cgo_setenv_trampoline(SB), NOSPLIT, $0-0
26- MOVD ·x_cgo_setenv_call(SB), R26
27- MOVD (R26), R2
28- CALL (R2)
27+ MOVD ·x_cgo_setenv_call(SB), R9
28+ MOVD (R9), R9
29+ CALL R9
2930 RET
3031
3132 TEXT x_cgo_unsetenv_trampoline(SB), NOSPLIT, $0-0
32- MOVD ·x_cgo_unsetenv_call(SB), R26
33- MOVD (R26), R2
34- CALL (R2)
33+ MOVD ·x_cgo_unsetenv_call(SB), R9
34+ MOVD (R9), R9
35+ CALL R9
3536 RET
3637
3738 TEXT x_cgo_notify_runtime_init_done_trampoline(SB), NOSPLIT, $0-0
@@ -45,8 +46,8 @@ TEXT x_cgo_bindm_trampoline(SB), NOSPLIT, $0
4546 // func setg_trampoline(setg uintptr, g uintptr)
4647 TEXT ·setg_trampoline(SB), NOSPLIT, $0-16
4748 MOVD G+8(FP), R0
48- MOVD setg+0(FP), R1
49- CALL R1
49+ MOVD setg+0(FP), R9
50+ CALL R9
5051 RET
5152
5253 TEXT threadentry_trampoline(SB), NOSPLIT, $0-0
@@ -59,9 +60,9 @@ TEXT threadentry_trampoline(SB), NOSPLIT, $0-0
5960 SAVE_F8_TO_F15(8*14)
6061 STP (R29, R30), (8*22)(RSP)
6162
62- MOVD ·threadentry_call(SB), R26
63- MOVD (R26), R2
64- CALL (R2)
63+ MOVD ·threadentry_call(SB), R9
64+ MOVD (R9), R9
65+ CALL R9
6566 MOVD $0, R0 // TODO: get the return value from threadentry
6667
6768 RESTORE_R19_TO_R28(8*4)
@@ -72,12 +73,12 @@ TEXT threadentry_trampoline(SB), NOSPLIT, $0-0
7273 RET
7374
7475 TEXT ·call5(SB), NOSPLIT, $0-0
75- MOVD fn+0(FP), R6
76+ MOVD fn+0(FP), R9
7677 MOVD a1+8(FP), R0
7778 MOVD a2+16(FP), R1
7879 MOVD a3+24(FP), R2
7980 MOVD a4+32(FP), R3
8081 MOVD a5+40(FP), R4
81- CALL R6
82+ CALL R9
8283 MOVD R0, ret+48(FP)
8384 RET
@@ -9,29 +9,30 @@
9 9
10 // These trampolines map the gcc ABI to Go ABIInternal and then calls into the Go equivalent functions.10 // These trampolines map the gcc ABI to Go ABIInternal and then calls into the Go equivalent functions.
11 // Note that C arguments are passed in R0-R7, which matches Go ABIInternal for the first eight arguments.11 // Note that C arguments are passed in R0-R7, which matches Go ABIInternal for the first eight arguments.
12+// R9 is used as a temporary register.
12 13
13 TEXT x_cgo_init_trampoline(SB), NOSPLIT, $0-014 TEXT x_cgo_init_trampoline(SB), NOSPLIT, $0-0
14- MOVD ·x_cgo_init_call(SB), R2615+ MOVD ·x_cgo_init_call(SB), R9
15- MOVD (R26), R216+ MOVD (R9), R9
16- CALL (R2)17+ CALL R9
17 RET18 RET
18 19
19 TEXT x_cgo_thread_start_trampoline(SB), NOSPLIT, $0-020 TEXT x_cgo_thread_start_trampoline(SB), NOSPLIT, $0-0
20- MOVD ·x_cgo_thread_start_call(SB), R2621+ MOVD ·x_cgo_thread_start_call(SB), R9
21- MOVD (R26), R222+ MOVD (R9), R9
22- CALL (R2)23+ CALL R9
23 RET24 RET
24 25
25 TEXT x_cgo_setenv_trampoline(SB), NOSPLIT, $0-026 TEXT x_cgo_setenv_trampoline(SB), NOSPLIT, $0-0
26- MOVD ·x_cgo_setenv_call(SB), R2627+ MOVD ·x_cgo_setenv_call(SB), R9
27- MOVD (R26), R228+ MOVD (R9), R9
28- CALL (R2)29+ CALL R9
29 RET30 RET
30 31
31 TEXT x_cgo_unsetenv_trampoline(SB), NOSPLIT, $0-032 TEXT x_cgo_unsetenv_trampoline(SB), NOSPLIT, $0-0
32- MOVD ·x_cgo_unsetenv_call(SB), R2633+ MOVD ·x_cgo_unsetenv_call(SB), R9
33- MOVD (R26), R234+ MOVD (R9), R9
34- CALL (R2)35+ CALL R9
35 RET36 RET
36 37
37 TEXT x_cgo_notify_runtime_init_done_trampoline(SB), NOSPLIT, $0-038 TEXT x_cgo_notify_runtime_init_done_trampoline(SB), NOSPLIT, $0-0
@@ -45,8 +46,8 @@ TEXT x_cgo_bindm_trampoline(SB), NOSPLIT, $0
45 // func setg_trampoline(setg uintptr, g uintptr)46 // func setg_trampoline(setg uintptr, g uintptr)
46 TEXT ·setg_trampoline(SB), NOSPLIT, $0-1647 TEXT ·setg_trampoline(SB), NOSPLIT, $0-16
47 MOVD G+8(FP), R048 MOVD G+8(FP), R0
48- MOVD setg+0(FP), R149+ MOVD setg+0(FP), R9
49- CALL R150+ CALL R9
50 RET51 RET
51 52
52 TEXT threadentry_trampoline(SB), NOSPLIT, $0-053 TEXT threadentry_trampoline(SB), NOSPLIT, $0-0
@@ -59,9 +60,9 @@ TEXT threadentry_trampoline(SB), NOSPLIT, $0-0
59 SAVE_F8_TO_F15(8*14)60 SAVE_F8_TO_F15(8*14)
60 STP (R29, R30), (8*22)(RSP)61 STP (R29, R30), (8*22)(RSP)
61 62
62- MOVD ·threadentry_call(SB), R2663+ MOVD ·threadentry_call(SB), R9
63- MOVD (R26), R264+ MOVD (R9), R9
64- CALL (R2)65+ CALL R9
65 MOVD $0, R0 // TODO: get the return value from threadentry66 MOVD $0, R0 // TODO: get the return value from threadentry
66 67
67 RESTORE_R19_TO_R28(8*4)68 RESTORE_R19_TO_R28(8*4)
@@ -72,12 +73,12 @@ TEXT threadentry_trampoline(SB), NOSPLIT, $0-0
72 RET73 RET
73 74
74 TEXT ·call5(SB), NOSPLIT, $0-075 TEXT ·call5(SB), NOSPLIT, $0-0
75- MOVD fn+0(FP), R676+ MOVD fn+0(FP), R9
76 MOVD a1+8(FP), R077 MOVD a1+8(FP), R0
77 MOVD a2+16(FP), R178 MOVD a2+16(FP), R1
78 MOVD a3+24(FP), R279 MOVD a3+24(FP), R2
79 MOVD a4+32(FP), R380 MOVD a4+32(FP), R3
80 MOVD a5+40(FP), R481 MOVD a5+40(FP), R4
81- CALL R682+ CALL R9
82 MOVD R0, ret+48(FP)83 MOVD R0, ret+48(FP)
83 RET84 RET
M internal/fakecgo/trampolines_loong64.s +20 -19
@@ -8,34 +8,35 @@
88 #include "abi_loong64.h"
99
1010 // these trampolines map the gcc ABI to Go ABI and then calls into the Go equivalent functions.
11+// R23 is used as temporary register.
1112
1213 TEXT x_cgo_init_trampoline(SB), NOSPLIT, $16
1314 MOVV R4, 8(R3)
1415 MOVV R5, 16(R3)
15- MOVV ·x_cgo_init_call(SB), R6
16- MOVV (R6), R7
17- CALL (R7)
16+ MOVV ·x_cgo_init_call(SB), R23
17+ MOVV (R23), R23
18+ CALL (R23)
1819 RET
1920
2021 TEXT x_cgo_thread_start_trampoline(SB), NOSPLIT, $8
2122 MOVV R4, 8(R3)
22- MOVV ·x_cgo_thread_start_call(SB), R5
23- MOVV (R5), R6
24- CALL (R6)
23+ MOVV ·x_cgo_thread_start_call(SB), R23
24+ MOVV (R23), R23
25+ CALL (R23)
2526 RET
2627
2728 TEXT x_cgo_setenv_trampoline(SB), NOSPLIT, $8
2829 MOVV R4, 8(R3)
29- MOVV ·x_cgo_setenv_call(SB), R5
30- MOVV (R5), R6
31- CALL (R6)
30+ MOVV ·x_cgo_setenv_call(SB), R23
31+ MOVV (R23), R23
32+ CALL (R23)
3233 RET
3334
3435 TEXT x_cgo_unsetenv_trampoline(SB), NOSPLIT, $8
3536 MOVV R4, 8(R3)
36- MOVV ·x_cgo_unsetenv_call(SB), R5
37- MOVV (R5), R6
38- CALL (R6)
37+ MOVV ·x_cgo_unsetenv_call(SB), R23
38+ MOVV (R23), R23
39+ CALL (R23)
3940 RET
4041
4142 TEXT x_cgo_notify_runtime_init_done_trampoline(SB), NOSPLIT, $0
@@ -49,8 +50,8 @@ TEXT x_cgo_bindm_trampoline(SB), NOSPLIT, $0
4950 // func setg_trampoline(setg uintptr, g uintptr)
5051 TEXT ·setg_trampoline(SB), NOSPLIT, $0
5152 MOVV G+8(FP), R4
52- MOVV setg+0(FP), R5
53- CALL (R5)
53+ MOVV setg+0(FP), R23
54+ CALL (R23)
5455 RET
5556
5657 TEXT threadentry_trampoline(SB), NOSPLIT, $0
@@ -64,9 +65,9 @@ TEXT threadentry_trampoline(SB), NOSPLIT, $0
6465 SAVE_F24_TO_F31((14*8))
6566 MOVV R1, (22*8)(R3)
6667
67- MOVV ·threadentry_call(SB), R5
68- MOVV (R5), R6
69- CALL (R6)
68+ MOVV ·threadentry_call(SB), R23
69+ MOVV (R23), R23
70+ CALL (R23)
7071
7172 RESTORE_R22_TO_R31((4*8))
7273 RESTORE_F24_TO_F31((14*8))
@@ -76,12 +77,12 @@ TEXT threadentry_trampoline(SB), NOSPLIT, $0
7677 RET
7778
7879 TEXT ·call5(SB), NOSPLIT, $0-0
79- MOVV fn+0(FP), R9
80+ MOVV fn+0(FP), R23
8081 MOVV a1+8(FP), R4
8182 MOVV a2+16(FP), R5
8283 MOVV a3+24(FP), R6
8384 MOVV a4+32(FP), R7
8485 MOVV a5+40(FP), R8
85- CALL (R9)
86+ CALL (R23)
8687 MOVV R4, ret+48(FP)
8788 RET
@@ -8,34 +8,35 @@
8 #include "abi_loong64.h"8 #include "abi_loong64.h"
9 9
10 // these trampolines map the gcc ABI to Go ABI and then calls into the Go equivalent functions.10 // these trampolines map the gcc ABI to Go ABI and then calls into the Go equivalent functions.
11+// R23 is used as temporary register.
11 12
12 TEXT x_cgo_init_trampoline(SB), NOSPLIT, $1613 TEXT x_cgo_init_trampoline(SB), NOSPLIT, $16
13 MOVV R4, 8(R3)14 MOVV R4, 8(R3)
14 MOVV R5, 16(R3)15 MOVV R5, 16(R3)
15- MOVV ·x_cgo_init_call(SB), R616+ MOVV ·x_cgo_init_call(SB), R23
16- MOVV (R6), R717+ MOVV (R23), R23
17- CALL (R7)18+ CALL (R23)
18 RET19 RET
19 20
20 TEXT x_cgo_thread_start_trampoline(SB), NOSPLIT, $821 TEXT x_cgo_thread_start_trampoline(SB), NOSPLIT, $8
21 MOVV R4, 8(R3)22 MOVV R4, 8(R3)
22- MOVV ·x_cgo_thread_start_call(SB), R523+ MOVV ·x_cgo_thread_start_call(SB), R23
23- MOVV (R5), R624+ MOVV (R23), R23
24- CALL (R6)25+ CALL (R23)
25 RET26 RET
26 27
27 TEXT x_cgo_setenv_trampoline(SB), NOSPLIT, $828 TEXT x_cgo_setenv_trampoline(SB), NOSPLIT, $8
28 MOVV R4, 8(R3)29 MOVV R4, 8(R3)
29- MOVV ·x_cgo_setenv_call(SB), R530+ MOVV ·x_cgo_setenv_call(SB), R23
30- MOVV (R5), R631+ MOVV (R23), R23
31- CALL (R6)32+ CALL (R23)
32 RET33 RET
33 34
34 TEXT x_cgo_unsetenv_trampoline(SB), NOSPLIT, $835 TEXT x_cgo_unsetenv_trampoline(SB), NOSPLIT, $8
35 MOVV R4, 8(R3)36 MOVV R4, 8(R3)
36- MOVV ·x_cgo_unsetenv_call(SB), R537+ MOVV ·x_cgo_unsetenv_call(SB), R23
37- MOVV (R5), R638+ MOVV (R23), R23
38- CALL (R6)39+ CALL (R23)
39 RET40 RET
40 41
41 TEXT x_cgo_notify_runtime_init_done_trampoline(SB), NOSPLIT, $042 TEXT x_cgo_notify_runtime_init_done_trampoline(SB), NOSPLIT, $0
@@ -49,8 +50,8 @@ TEXT x_cgo_bindm_trampoline(SB), NOSPLIT, $0
49 // func setg_trampoline(setg uintptr, g uintptr)50 // func setg_trampoline(setg uintptr, g uintptr)
50 TEXT ·setg_trampoline(SB), NOSPLIT, $051 TEXT ·setg_trampoline(SB), NOSPLIT, $0
51 MOVV G+8(FP), R452 MOVV G+8(FP), R4
52- MOVV setg+0(FP), R553+ MOVV setg+0(FP), R23
53- CALL (R5)54+ CALL (R23)
54 RET55 RET
55 56
56 TEXT threadentry_trampoline(SB), NOSPLIT, $057 TEXT threadentry_trampoline(SB), NOSPLIT, $0
@@ -64,9 +65,9 @@ TEXT threadentry_trampoline(SB), NOSPLIT, $0
64 SAVE_F24_TO_F31((14*8))65 SAVE_F24_TO_F31((14*8))
65 MOVV R1, (22*8)(R3)66 MOVV R1, (22*8)(R3)
66 67
67- MOVV ·threadentry_call(SB), R568+ MOVV ·threadentry_call(SB), R23
68- MOVV (R5), R669+ MOVV (R23), R23
69- CALL (R6)70+ CALL (R23)
70 71
71 RESTORE_R22_TO_R31((4*8))72 RESTORE_R22_TO_R31((4*8))
72 RESTORE_F24_TO_F31((14*8))73 RESTORE_F24_TO_F31((14*8))
@@ -76,12 +77,12 @@ TEXT threadentry_trampoline(SB), NOSPLIT, $0
76 RET77 RET
77 78
78 TEXT ·call5(SB), NOSPLIT, $0-079 TEXT ·call5(SB), NOSPLIT, $0-0
79- MOVV fn+0(FP), R980+ MOVV fn+0(FP), R23
80 MOVV a1+8(FP), R481 MOVV a1+8(FP), R4
81 MOVV a2+16(FP), R582 MOVV a2+16(FP), R5
82 MOVV a3+24(FP), R683 MOVV a3+24(FP), R6
83 MOVV a4+32(FP), R784 MOVV a4+32(FP), R7
84 MOVV a5+40(FP), R885 MOVV a5+40(FP), R8
85- CALL (R9)86+ CALL (R23)
86 MOVV R4, ret+48(FP)87 MOVV R4, ret+48(FP)
87 RET88 RET
M internal/fakecgo/trampolines_riscv64.s +13 -12
@@ -7,34 +7,35 @@
77 #include "go_asm.h"
88
99 // these trampolines map the gcc ABI to Go ABI and then calls into the Go equivalent functions.
10+// X5 is used as temporary register.
1011
1112 TEXT x_cgo_init_trampoline(SB), NOSPLIT, $16
1213 MOV X10, 8(SP)
1314 MOV X11, 16(SP)
1415 MOV ·x_cgo_init_call(SB), X5
15- MOV (X5), X6
16- JALR RA, 0(X6)
16+ MOV (X5), X5
17+ JALR RA, 0(X5)
1718 RET
1819
1920 TEXT x_cgo_thread_start_trampoline(SB), NOSPLIT, $8
2021 MOV X10, 8(SP)
2122 MOV ·x_cgo_thread_start_call(SB), X5
22- MOV (X5), X6
23- JALR RA, 0(X6)
23+ MOV (X5), X5
24+ JALR RA, 0(X5)
2425 RET
2526
2627 TEXT x_cgo_setenv_trampoline(SB), NOSPLIT, $8
2728 MOV X10, 8(SP)
2829 MOV ·x_cgo_setenv_call(SB), X5
29- MOV (X5), X6
30- JALR RA, 0(X6)
30+ MOV (X5), X5
31+ JALR RA, 0(X5)
3132 RET
3233
3334 TEXT x_cgo_unsetenv_trampoline(SB), NOSPLIT, $8
3435 MOV X10, 8(SP)
3536 MOV ·x_cgo_unsetenv_call(SB), X5
36- MOV (X5), X6
37- JALR RA, 0(X6)
37+ MOV (X5), X5
38+ JALR RA, 0(X5)
3839 RET
3940
4041 TEXT x_cgo_notify_runtime_init_done_trampoline(SB), NOSPLIT, $0
@@ -55,17 +56,17 @@ TEXT ·setg_trampoline(SB), NOSPLIT, $0
5556 TEXT threadentry_trampoline(SB), NOSPLIT, $16
5657 MOV X10, 8(SP)
5758 MOV ·threadentry_call(SB), X5
58- MOV (X5), X6
59- JALR RA, 0(X6)
59+ MOV (X5), X5
60+ JALR RA, 0(X5)
6061 RET
6162
6263 TEXT ·call5(SB), NOSPLIT, $0-48
63- MOV fn+0(FP), X9
64+ MOV fn+0(FP), X5
6465 MOV a1+8(FP), X10
6566 MOV a2+16(FP), X11
6667 MOV a3+24(FP), X12
6768 MOV a4+32(FP), X13
6869 MOV a5+40(FP), X14
69- JALR RA, 0(X9)
70+ JALR RA, 0(X5)
7071 MOV X10, ret+48(FP)
7172 RET
@@ -7,34 +7,35 @@
7 #include "go_asm.h"7 #include "go_asm.h"
8 8
9 // these trampolines map the gcc ABI to Go ABI and then calls into the Go equivalent functions.9 // these trampolines map the gcc ABI to Go ABI and then calls into the Go equivalent functions.
10+// X5 is used as temporary register.
10 11
11 TEXT x_cgo_init_trampoline(SB), NOSPLIT, $1612 TEXT x_cgo_init_trampoline(SB), NOSPLIT, $16
12 MOV X10, 8(SP)13 MOV X10, 8(SP)
13 MOV X11, 16(SP)14 MOV X11, 16(SP)
14 MOV ·x_cgo_init_call(SB), X515 MOV ·x_cgo_init_call(SB), X5
15- MOV (X5), X616+ MOV (X5), X5
16- JALR RA, 0(X6)17+ JALR RA, 0(X5)
17 RET18 RET
18 19
19 TEXT x_cgo_thread_start_trampoline(SB), NOSPLIT, $820 TEXT x_cgo_thread_start_trampoline(SB), NOSPLIT, $8
20 MOV X10, 8(SP)21 MOV X10, 8(SP)
21 MOV ·x_cgo_thread_start_call(SB), X522 MOV ·x_cgo_thread_start_call(SB), X5
22- MOV (X5), X623+ MOV (X5), X5
23- JALR RA, 0(X6)24+ JALR RA, 0(X5)
24 RET25 RET
25 26
26 TEXT x_cgo_setenv_trampoline(SB), NOSPLIT, $827 TEXT x_cgo_setenv_trampoline(SB), NOSPLIT, $8
27 MOV X10, 8(SP)28 MOV X10, 8(SP)
28 MOV ·x_cgo_setenv_call(SB), X529 MOV ·x_cgo_setenv_call(SB), X5
29- MOV (X5), X630+ MOV (X5), X5
30- JALR RA, 0(X6)31+ JALR RA, 0(X5)
31 RET32 RET
32 33
33 TEXT x_cgo_unsetenv_trampoline(SB), NOSPLIT, $834 TEXT x_cgo_unsetenv_trampoline(SB), NOSPLIT, $8
34 MOV X10, 8(SP)35 MOV X10, 8(SP)
35 MOV ·x_cgo_unsetenv_call(SB), X536 MOV ·x_cgo_unsetenv_call(SB), X5
36- MOV (X5), X637+ MOV (X5), X5
37- JALR RA, 0(X6)38+ JALR RA, 0(X5)
38 RET39 RET
39 40
40 TEXT x_cgo_notify_runtime_init_done_trampoline(SB), NOSPLIT, $041 TEXT x_cgo_notify_runtime_init_done_trampoline(SB), NOSPLIT, $0
@@ -55,17 +56,17 @@ TEXT ·setg_trampoline(SB), NOSPLIT, $0
55 TEXT threadentry_trampoline(SB), NOSPLIT, $1656 TEXT threadentry_trampoline(SB), NOSPLIT, $16
56 MOV X10, 8(SP)57 MOV X10, 8(SP)
57 MOV ·threadentry_call(SB), X558 MOV ·threadentry_call(SB), X5
58- MOV (X5), X659+ MOV (X5), X5
59- JALR RA, 0(X6)60+ JALR RA, 0(X5)
60 RET61 RET
61 62
62 TEXT ·call5(SB), NOSPLIT, $0-4863 TEXT ·call5(SB), NOSPLIT, $0-48
63- MOV fn+0(FP), X964+ MOV fn+0(FP), X5
64 MOV a1+8(FP), X1065 MOV a1+8(FP), X10
65 MOV a2+16(FP), X1166 MOV a2+16(FP), X11
66 MOV a3+24(FP), X1267 MOV a3+24(FP), X12
67 MOV a4+32(FP), X1368 MOV a4+32(FP), X13
68 MOV a5+40(FP), X1469 MOV a5+40(FP), X14
69- JALR RA, 0(X9)70+ JALR RA, 0(X5)
70 MOV X10, ret+48(FP)71 MOV X10, ret+48(FP)
71 RET72 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