1 // Copyright 2021 The Go Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style
3 // license that can be found in the LICENSE file.
4
5 // Test to make sure that if we use R15 after it is clobbered by
6 // a global variable access while dynamic linking, we get an error.
7 // See issue 43661.
8
9 TEXT ·a1(SB), 0, $0-0
10 CMPL runtime·writeBarrier(SB), $0
11 MOVL $0, R15
12 RET
13 TEXT ·a2(SB), 0, $0-0
14 CMPL runtime·writeBarrier(SB), $0
15 MOVQ $0, R15
16 RET
17 TEXT ·a3(SB), 0, $0-0
18 CMPL runtime·writeBarrier(SB), $0
19 XORL R15, R15
20 RET
21 TEXT ·a4(SB), 0, $0-0
22 CMPL runtime·writeBarrier(SB), $0
23 XORQ R15, R15
24 RET
25 TEXT ·a5(SB), 0, $0-0
26 CMPL runtime·writeBarrier(SB), $0
27 XORL R15, R15
28 RET
29 TEXT ·a6(SB), 0, $0-0
30 CMPL runtime·writeBarrier(SB), $0
31 POPQ R15
32 PUSHQ R15
33 RET
34 TEXT ·a7(SB), 0, $0-0
35 CMPL runtime·writeBarrier(SB), $0
36 MOVQ R15, AX // ERROR "when dynamic linking, R15 is clobbered by a global variable access and is used here"
37 RET
38 TEXT ·a8(SB), 0, $0-0
39 CMPL runtime·writeBarrier(SB), $0
40 ADDQ AX, R15 // ERROR "when dynamic linking, R15 is clobbered by a global variable access and is used here"
41 RET
42 TEXT ·a9(SB), 0, $0-0
43 CMPL runtime·writeBarrier(SB), $0
44 ORQ R15, R15 // ERROR "when dynamic linking, R15 is clobbered by a global variable access and is used here"
45 RET
46 TEXT ·a10(SB), 0, $0-0
47 CMPL runtime·writeBarrier(SB), $0
48 JEQ one
49 ORQ R15, R15 // ERROR "when dynamic linking, R15 is clobbered by a global variable access and is used here"
50 one:
51 RET
52 TEXT ·a11(SB), 0, $0-0
53 CMPL runtime·writeBarrier(SB), $0
54 JEQ one
55 JMP two
56 one:
57 ORQ R15, R15 // ERROR "when dynamic linking, R15 is clobbered by a global variable access and is used here"
58 two:
59 RET
60 TEXT ·a12(SB), 0, $0-0
61 CMPL runtime·writeBarrier(SB), $0
62 JMP one
63 two:
64 ORQ R15, R15
65 RET
66 one:
67 MOVL $0, R15
68 JMP two
69
70 // Ensure 3-arg instructions get GOT-rewritten without errors.
71 // See issue 58735.
72 TEXT ·a13(SB), 0, $0-0
73 MULXQ runtime·writeBarrier(SB), AX, CX
74 RET
75
76 // Various special cases in the use-R15-after-global-access-when-dynlinking check.
77 // See issue 58632.
78 TEXT ·a14(SB), 0, $0-0
79 CMPL runtime·writeBarrier(SB), $0
80 MULXQ R15, AX, BX // ERROR "when dynamic linking, R15 is clobbered by a global variable access and is used here"
81 RET
82 TEXT ·a15(SB), 0, $0-0
83 CMPL runtime·writeBarrier(SB), $0
84 MULXQ AX, R15, BX
85 ADDQ $1, R15
86 RET
87 TEXT ·a16(SB), 0, $0-0
88 CMPL runtime·writeBarrier(SB), $0
89 MULXQ AX, BX, R15
90 ADDQ $1, R15
91 RET
92 TEXT ·a17(SB), 0, $0-0
93 CMPL runtime·writeBarrier(SB), $0
94 MOVQ (R15), AX // ERROR "when dynamic linking, R15 is clobbered by a global variable access and is used here"
95 RET
96 TEXT ·a18(SB), 0, $0-0
97 CMPL runtime·writeBarrier(SB), $0
98 MOVQ (CX)(R15*1), AX // ERROR "when dynamic linking, R15 is clobbered by a global variable access and is used here"
99 RET
100 TEXT ·a19(SB), 0, $0-0
101 CMPL runtime·writeBarrier(SB), $0
102 MOVQ AX, (R15) // ERROR "when dynamic linking, R15 is clobbered by a global variable access and is used here"
103 RET
104 TEXT ·a20(SB), 0, $0-0
105 CMPL runtime·writeBarrier(SB), $0
106 MOVQ AX, (CX)(R15*1) // ERROR "when dynamic linking, R15 is clobbered by a global variable access and is used here"
107 RET
108 TEXT ·a21(SB), 0, $0-0
109 CMPL runtime·writeBarrier(SB), $0
110 MOVBLSX AX, R15
111 ADDQ $1, R15
112 RET
113 TEXT ·a22(SB), 0, $0-0
114 CMPL runtime·writeBarrier(SB), $0
115 PMOVMSKB X0, R15
116 ADDQ $1, R15
117 RET
118 TEXT ·a23(SB), 0, $0-0
119 CMPL runtime·writeBarrier(SB), $0
120 LEAQ (AX)(CX*1), R15
121 RET
122 TEXT ·a24(SB), 0, $0-0
123 CMPL runtime·writeBarrier(SB), $0
124 LEAQ (R15)(AX*1), AX // ERROR "when dynamic linking, R15 is clobbered by a global variable access and is used here"
125 RET
126 TEXT ·a25(SB), 0, $0-0
127 CMPL runtime·writeBarrier(SB), $0
128 LEAQ (AX)(R15*1), AX // ERROR "when dynamic linking, R15 is clobbered by a global variable access and is used here"
129 RET
130 TEXT ·a26(SB), 0, $0-0
131 CMPL runtime·writeBarrier(SB), $0
132 IMUL3Q $33, AX, R15
133 ADDQ $1, R15
134 RET
135 TEXT ·a27(SB), 0, $0-0
136 CMPL runtime·writeBarrier(SB), $0
137 IMUL3Q $33, R15, AX // ERROR "when dynamic linking, R15 is clobbered by a global variable access and is used here"
138 RET
139 TEXT ·a28(SB), 0, $0-0
140 CMPL runtime·writeBarrier(SB), $0
141 PEXTRD $0, X0, R15
142 ADDQ $1, R15
143 RET
144 TEXT ·a29(SB), 0, $0-0
145 CMPL runtime·writeBarrier(SB), $0
146 VPEXTRD $0, X0, R15
147 ADDQ $1, R15
148 RET
149 TEXT ·a30(SB), 0, $0-0
150 CMPL runtime·writeBarrier(SB), $0
151 BSFQ R15, AX // ERROR "when dynamic linking, R15 is clobbered by a global variable access and is used here"
152 RET
153 TEXT ·a31(SB), 0, $0-0
154 CMPL runtime·writeBarrier(SB), $0
155 BSFQ AX, R15
156 ADDQ $1, R15
157 RET
158 TEXT ·a32(SB), 0, $0-0
159 CMPL runtime·writeBarrier(SB), $0
160 POPCNTL R15, AX // ERROR "when dynamic linking, R15 is clobbered by a global variable access and is used here"
161 RET
162 TEXT ·a33(SB), 0, $0-0
163 CMPL runtime·writeBarrier(SB), $0
164 POPCNTL AX, R15
165 ADDQ $1, R15
166 RET
167 TEXT ·a34(SB), 0, $0-0
168 CMPL runtime·writeBarrier(SB), $0
169 SHLXQ AX, CX, R15
170 ADDQ $1, R15
171 RET
172
View as plain text