c++: Prevent overwriting arguments when merging duplicates [PR112588]
[official-gcc.git] / libsanitizer / tsan / tsan_rtl_ppc64.S
blob9e533a71a9c477ecae59f09ab431b2664554d998
1 #include "tsan_ppc_regs.h"
3         .machine altivec
4         .section .text
5         .hidden __tsan_setjmp
6         .globl _setjmp
7         .type _setjmp, @function
8         .align 4
9 #if _CALL_ELF == 2
10 _setjmp:
11 #else
12         .section ".opd","aw"
13         .align 3
14 _setjmp:
15         .quad   .L._setjmp,.TOC.@tocbase,0
16         .previous
17 #endif
18 .L._setjmp:
19         mflr    r0
20         stdu    r1,-48(r1)
21         std     r2,24(r1)
22         std     r3,32(r1)
23         std     r0,40(r1)
24         // r3 is the original stack pointer.
25         addi    r3,r1,48
26         // r4 is the mangled stack pointer (see glibc)
27         ld      r4,-28696(r13)
28         xor     r4,r3,r4
29         // Materialize a TOC in case we were called from libc.
30         // For big-endian, we load the TOC from the OPD.  For little-
31         // endian, we use the .TOC. symbol to find it.
32         nop
33         bcl     20,31,0f
35         mflr    r2
36 #if _CALL_ELF == 2
37         addis   r2,r2,.TOC.-0b@ha
38         addi    r2,r2,.TOC.-0b@l
39 #else
40         addis   r2,r2,_setjmp-0b@ha
41         addi    r2,r2,_setjmp-0b@l
42         ld      r2,8(r2)
43 #endif
44         // Call the interceptor.
45         bl      __tsan_setjmp
46         nop
47         // Restore regs needed for setjmp.
48         ld      r3,32(r1)
49         ld      r0,40(r1)
50         // Emulate the real setjmp function.  We do this because we can't
51         // perform a sibcall:  The real setjmp function trashes the TOC
52         // pointer, and with a sibcall we have no way to restore it.
53         // This way we can make sure our caller's stack pointer and
54         // link register are saved correctly in the jmpbuf.
55         ld      r6,-28696(r13)
56         addi    r5,r1,48  // original stack ptr of caller
57         xor     r5,r6,r5
58         std     r5,0(r3)  // mangled stack ptr of caller
59         ld      r5,24(r1)
60         std     r5,8(r3)  // caller's saved TOC pointer
61         xor     r0,r6,r0
62         std     r0,16(r3) // caller's mangled return address
63         mfcr    r0
64         // Nonvolatiles.
65         std     r14,24(r3)
66         stfd    f14,176(r3)
67         stw     r0,172(r3) // CR
68         std     r15,32(r3)
69         stfd    f15,184(r3)
70         std     r16,40(r3)
71         stfd    f16,192(r3)
72         std     r17,48(r3)
73         stfd    f17,200(r3)
74         std     r18,56(r3)
75         stfd    f18,208(r3)
76         std     r19,64(r3)
77         stfd    f19,216(r3)
78         std     r20,72(r3)
79         stfd    f20,224(r3)
80         std     r21,80(r3)
81         stfd    f21,232(r3)
82         std     r22,88(r3)
83         stfd    f22,240(r3)
84         std     r23,96(r3)
85         stfd    f23,248(r3)
86         std     r24,104(r3)
87         stfd    f24,256(r3)
88         std     r25,112(r3)
89         stfd    f25,264(r3)
90         std     r26,120(r3)
91         stfd    f26,272(r3)
92         std     r27,128(r3)
93         stfd    f27,280(r3)
94         std     r28,136(r3)
95         stfd    f28,288(r3)
96         std     r29,144(r3)
97         stfd    f29,296(r3)
98         std     r30,152(r3)
99         stfd    f30,304(r3)
100         std     r31,160(r3)
101         stfd    f31,312(r3)
102         addi    r5,r3,320
103         mfspr   r0,256
104         stw     r0,168(r3)  // VRSAVE
105         addi    r6,r5,16
106         stvx    v20,0,r5
107         addi    r5,r5,32
108         stvx    v21,0,r6
109         addi    r6,r6,32
110         stvx    v22,0,r5
111         addi    r5,r5,32
112         stvx    v23,0,r6
113         addi    r6,r6,32
114         stvx    v24,0,r5
115         addi    r5,r5,32
116         stvx    v25,0,r6
117         addi    r6,r6,32
118         stvx    v26,0,r5
119         addi    r5,r5,32
120         stvx    v27,0,r6
121         addi    r6,r6,32
122         stvx    v28,0,r5
123         addi    r5,r5,32
124         stvx    v29,0,r6
125         addi    r6,r6,32
126         stvx    v30,0,r5
127         stvx    v31,0,r6
128         // Clear the "mask-saved" slot.
129         li      r4,0
130         stw     r4,512(r3)
131         // Restore TOC, LR, and stack and return to caller.
132         ld      r2,24(r1)
133         ld      r0,40(r1)
134         addi    r1,r1,48
135         li      r3,0  // This is the setjmp return path
136         mtlr    r0
137         blr
138         .size _setjmp, .-.L._setjmp
140         .globl setjmp
141         .type setjmp, @function
142         .align 4
143 setjmp:
144         b       _setjmp
145         .size setjmp, .-setjmp
147         // sigsetjmp is like setjmp, except that the mask in r4 needs
148         // to be saved at offset 512 of the jump buffer.
149         .globl __sigsetjmp
150         .type __sigsetjmp, @function
151         .align 4
152 #if _CALL_ELF == 2
153 __sigsetjmp:
154 #else
155         .section ".opd","aw"
156         .align 3
157 __sigsetjmp:
158         .quad   .L.__sigsetjmp,.TOC.@tocbase,0
159         .previous
160 #endif
161 .L.__sigsetjmp:
162         mflr    r0
163         stdu    r1,-64(r1)
164         std     r2,24(r1)
165         std     r3,32(r1)
166         std     r4,40(r1)
167         std     r0,48(r1)
168         // r3 is the original stack pointer.
169         addi    r3,r1,64
170         // r4 is the mangled stack pointer (see glibc)
171         ld      r4,-28696(r13)
172         xor     r4,r3,r4
173         // Materialize a TOC in case we were called from libc.
174         // For big-endian, we load the TOC from the OPD.  For little-
175         // endian, we use the .TOC. symbol to find it.
176         nop
177         bcl     20,31,1f
179         mflr    r2
180 #if _CALL_ELF == 2
181         addis   r2,r2,.TOC.-1b@ha
182         addi    r2,r2,.TOC.-1b@l
183 #else
184         addis   r2,r2,_setjmp-1b@ha
185         addi    r2,r2,_setjmp-1b@l
186         ld      r2,8(r2)
187 #endif
188         // Call the interceptor.
189         bl      __tsan_setjmp
190         nop
191         // Restore regs needed for __sigsetjmp.
192         ld      r3,32(r1)
193         ld      r4,40(r1)
194         ld      r0,48(r1)
195         // Emulate the real sigsetjmp function.  We do this because we can't
196         // perform a sibcall:  The real sigsetjmp function trashes the TOC
197         // pointer, and with a sibcall we have no way to restore it.
198         // This way we can make sure our caller's stack pointer and
199         // link register are saved correctly in the jmpbuf.
200         ld      r6,-28696(r13)
201         addi    r5,r1,64  // original stack ptr of caller
202         xor     r5,r6,r5
203         std     r5,0(r3)  // mangled stack ptr of caller
204         ld      r5,24(r1)
205         std     r5,8(r3)  // caller's saved TOC pointer
206         xor     r0,r6,r0
207         std     r0,16(r3) // caller's mangled return address
208         mfcr    r0
209         // Nonvolatiles.
210         std     r14,24(r3)
211         stfd    f14,176(r3)
212         stw     r0,172(r3) // CR
213         std     r15,32(r3)
214         stfd    f15,184(r3)
215         std     r16,40(r3)
216         stfd    f16,192(r3)
217         std     r17,48(r3)
218         stfd    f17,200(r3)
219         std     r18,56(r3)
220         stfd    f18,208(r3)
221         std     r19,64(r3)
222         stfd    f19,216(r3)
223         std     r20,72(r3)
224         stfd    f20,224(r3)
225         std     r21,80(r3)
226         stfd    f21,232(r3)
227         std     r22,88(r3)
228         stfd    f22,240(r3)
229         std     r23,96(r3)
230         stfd    f23,248(r3)
231         std     r24,104(r3)
232         stfd    f24,256(r3)
233         std     r25,112(r3)
234         stfd    f25,264(r3)
235         std     r26,120(r3)
236         stfd    f26,272(r3)
237         std     r27,128(r3)
238         stfd    f27,280(r3)
239         std     r28,136(r3)
240         stfd    f28,288(r3)
241         std     r29,144(r3)
242         stfd    f29,296(r3)
243         std     r30,152(r3)
244         stfd    f30,304(r3)
245         std     r31,160(r3)
246         stfd    f31,312(r3)
247         addi    r5,r3,320
248         mfspr   r0,256
249         stw     r0,168(r3) // VRSAVE
250         addi    r6,r5,16
251         stvx    v20,0,r5
252         addi    r5,r5,32
253         stvx    v21,0,r6
254         addi    r6,r6,32
255         stvx    v22,0,r5
256         addi    r5,r5,32
257         stvx    v23,0,r6
258         addi    r6,r6,32
259         stvx    v24,0,r5
260         addi    r5,r5,32
261         stvx    v25,0,r6
262         addi    r6,r6,32
263         stvx    v26,0,r5
264         addi    r5,r5,32
265         stvx    v27,0,r6
266         addi    r6,r6,32
267         stvx    v28,0,r5
268         addi    r5,r5,32
269         stvx    v29,0,r6
270         addi    r6,r6,32
271         stvx    v30,0,r5
272         stvx    v31,0,r6
273         // Save into the "mask-saved" slot.
274         stw     r4,512(r3)
275         // Restore TOC, LR, and stack and return to caller.
276         ld      r2,24(r1)
277         ld      r0,48(r1)
278         addi    r1,r1,64
279         li      r3,0  // This is the sigsetjmp return path
280         mtlr    r0
281         blr
282         .size __sigsetjmp, .-.L.__sigsetjmp
284         .globl sigsetjmp
285         .type sigsetjmp, @function
286         .align 4
287 sigsetjmp:
288         b       __sigsetjmp
289         .size sigsetjmp, .-sigsetjmp