PR middle-end/87041 - -Wformat reading through null pointer on unreachable code
[official-gcc.git] / libsanitizer / tsan / tsan_rtl_amd64.S
blob4eb1ffdd2b7fa01a6c6ef55d53460455dec51c40
1 // The content of this file is x86_64-only:
2 #if defined(__x86_64__)
4 #include "sanitizer_common/sanitizer_asm.h"
5 #include "cet.h"
7 #if !defined(__APPLE__)
8 .section .text
9 #else
10 .section __TEXT,__text
11 #endif
13 ASM_HIDDEN(__tsan_trace_switch)
14 .globl ASM_TSAN_SYMBOL(__tsan_trace_switch_thunk)
15 ASM_TSAN_SYMBOL(__tsan_trace_switch_thunk):
16   CFI_STARTPROC
17   _CET_ENDBR
18   # Save scratch registers.
19   push %rax
20   CFI_ADJUST_CFA_OFFSET(8)
21   CFI_REL_OFFSET(%rax, 0)
22   push %rcx
23   CFI_ADJUST_CFA_OFFSET(8)
24   CFI_REL_OFFSET(%rcx, 0)
25   push %rdx
26   CFI_ADJUST_CFA_OFFSET(8)
27   CFI_REL_OFFSET(%rdx, 0)
28   push %rsi
29   CFI_ADJUST_CFA_OFFSET(8)
30   CFI_REL_OFFSET(%rsi, 0)
31   push %rdi
32   CFI_ADJUST_CFA_OFFSET(8)
33   CFI_REL_OFFSET(%rdi, 0)
34   push %r8
35   CFI_ADJUST_CFA_OFFSET(8)
36   CFI_REL_OFFSET(%r8, 0)
37   push %r9
38   CFI_ADJUST_CFA_OFFSET(8)
39   CFI_REL_OFFSET(%r9, 0)
40   push %r10
41   CFI_ADJUST_CFA_OFFSET(8)
42   CFI_REL_OFFSET(%r10, 0)
43   push %r11
44   CFI_ADJUST_CFA_OFFSET(8)
45   CFI_REL_OFFSET(%r11, 0)
46   # Align stack frame.
47   push %rbx  # non-scratch
48   CFI_ADJUST_CFA_OFFSET(8)
49   CFI_REL_OFFSET(%rbx, 0)
50   mov %rsp, %rbx  # save current rsp
51   CFI_DEF_CFA_REGISTER(%rbx)
52   shr $4, %rsp  # clear 4 lsb, align to 16
53   shl $4, %rsp
55   call ASM_TSAN_SYMBOL(__tsan_trace_switch)
57   # Unalign stack frame back.
58   mov %rbx, %rsp  # restore the original rsp
59   CFI_DEF_CFA_REGISTER(%rsp)
60   pop %rbx
61   CFI_ADJUST_CFA_OFFSET(-8)
62   # Restore scratch registers.
63   pop %r11
64   CFI_ADJUST_CFA_OFFSET(-8)
65   pop %r10
66   CFI_ADJUST_CFA_OFFSET(-8)
67   pop %r9
68   CFI_ADJUST_CFA_OFFSET(-8)
69   pop %r8
70   CFI_ADJUST_CFA_OFFSET(-8)
71   pop %rdi
72   CFI_ADJUST_CFA_OFFSET(-8)
73   pop %rsi
74   CFI_ADJUST_CFA_OFFSET(-8)
75   pop %rdx
76   CFI_ADJUST_CFA_OFFSET(-8)
77   pop %rcx
78   CFI_ADJUST_CFA_OFFSET(-8)
79   pop %rax
80   CFI_ADJUST_CFA_OFFSET(-8)
81   CFI_RESTORE(%rax)
82   CFI_RESTORE(%rbx)
83   CFI_RESTORE(%rcx)
84   CFI_RESTORE(%rdx)
85   CFI_RESTORE(%rsi)
86   CFI_RESTORE(%rdi)
87   CFI_RESTORE(%r8)
88   CFI_RESTORE(%r9)
89   CFI_RESTORE(%r10)
90   CFI_RESTORE(%r11)
91   ret
92   CFI_ENDPROC
94 ASM_HIDDEN(__tsan_report_race)
95 .globl ASM_TSAN_SYMBOL(__tsan_report_race_thunk)
96 ASM_TSAN_SYMBOL(__tsan_report_race_thunk):
97   CFI_STARTPROC
98   _CET_ENDBR
99   # Save scratch registers.
100   push %rax
101   CFI_ADJUST_CFA_OFFSET(8)
102   CFI_REL_OFFSET(%rax, 0)
103   push %rcx
104   CFI_ADJUST_CFA_OFFSET(8)
105   CFI_REL_OFFSET(%rcx, 0)
106   push %rdx
107   CFI_ADJUST_CFA_OFFSET(8)
108   CFI_REL_OFFSET(%rdx, 0)
109   push %rsi
110   CFI_ADJUST_CFA_OFFSET(8)
111   CFI_REL_OFFSET(%rsi, 0)
112   push %rdi
113   CFI_ADJUST_CFA_OFFSET(8)
114   CFI_REL_OFFSET(%rdi, 0)
115   push %r8
116   CFI_ADJUST_CFA_OFFSET(8)
117   CFI_REL_OFFSET(%r8, 0)
118   push %r9
119   CFI_ADJUST_CFA_OFFSET(8)
120   CFI_REL_OFFSET(%r9, 0)
121   push %r10
122   CFI_ADJUST_CFA_OFFSET(8)
123   CFI_REL_OFFSET(%r10, 0)
124   push %r11
125   CFI_ADJUST_CFA_OFFSET(8)
126   CFI_REL_OFFSET(%r11, 0)
127   # Align stack frame.
128   push %rbx  # non-scratch
129   CFI_ADJUST_CFA_OFFSET(8)
130   CFI_REL_OFFSET(%rbx, 0)
131   mov %rsp, %rbx  # save current rsp
132   CFI_DEF_CFA_REGISTER(%rbx)
133   shr $4, %rsp  # clear 4 lsb, align to 16
134   shl $4, %rsp
136   call ASM_TSAN_SYMBOL(__tsan_report_race)
138   # Unalign stack frame back.
139   mov %rbx, %rsp  # restore the original rsp
140   CFI_DEF_CFA_REGISTER(%rsp)
141   pop %rbx
142   CFI_ADJUST_CFA_OFFSET(-8)
143   # Restore scratch registers.
144   pop %r11
145   CFI_ADJUST_CFA_OFFSET(-8)
146   pop %r10
147   CFI_ADJUST_CFA_OFFSET(-8)
148   pop %r9
149   CFI_ADJUST_CFA_OFFSET(-8)
150   pop %r8
151   CFI_ADJUST_CFA_OFFSET(-8)
152   pop %rdi
153   CFI_ADJUST_CFA_OFFSET(-8)
154   pop %rsi
155   CFI_ADJUST_CFA_OFFSET(-8)
156   pop %rdx
157   CFI_ADJUST_CFA_OFFSET(-8)
158   pop %rcx
159   CFI_ADJUST_CFA_OFFSET(-8)
160   pop %rax
161   CFI_ADJUST_CFA_OFFSET(-8)
162   CFI_RESTORE(%rax)
163   CFI_RESTORE(%rbx)
164   CFI_RESTORE(%rcx)
165   CFI_RESTORE(%rdx)
166   CFI_RESTORE(%rsi)
167   CFI_RESTORE(%rdi)
168   CFI_RESTORE(%r8)
169   CFI_RESTORE(%r9)
170   CFI_RESTORE(%r10)
171   CFI_RESTORE(%r11)
172   ret
173   CFI_ENDPROC
175 ASM_HIDDEN(__tsan_setjmp)
176 #if !defined(__APPLE__)
177 .comm _ZN14__interception11real_setjmpE,8,8
178 #endif
179 .globl ASM_TSAN_SYMBOL_INTERCEPTOR(setjmp)
180 ASM_TYPE_FUNCTION(ASM_TSAN_SYMBOL_INTERCEPTOR(setjmp))
181 ASM_TSAN_SYMBOL_INTERCEPTOR(setjmp):
182   CFI_STARTPROC
183   _CET_ENDBR
184   // save env parameter
185   push %rdi
186   CFI_ADJUST_CFA_OFFSET(8)
187   CFI_REL_OFFSET(%rdi, 0)
188   // obtain %rsp
189 #if defined(__FreeBSD__)
190   lea 8(%rsp), %rdi
191   mov %rdi, %rsi
192 #elif defined(__APPLE__)
193   lea 16(%rsp), %rdi
194   mov %rdi, %rsi
195 #elif defined(__linux__)
196   lea 16(%rsp), %rdi
197   mov %rdi, %rsi
198   xor %fs:0x30, %rsi  // magic mangling of rsp (see libc setjmp)
199   rol $0x11, %rsi
200 #else
201 # error "Unknown platform"
202 #endif
203   // call tsan interceptor
204   call ASM_TSAN_SYMBOL(__tsan_setjmp)
205   // restore env parameter
206   pop %rdi
207   CFI_ADJUST_CFA_OFFSET(-8)
208   CFI_RESTORE(%rdi)
209   // tail jump to libc setjmp
210   movl $0, %eax
211 #if !defined(__APPLE__)
212   movq _ZN14__interception11real_setjmpE@GOTPCREL(%rip), %rdx
213   jmp *(%rdx)
214 #else
215   jmp ASM_TSAN_SYMBOL(setjmp)
216 #endif
217   CFI_ENDPROC
218 ASM_SIZE(ASM_TSAN_SYMBOL_INTERCEPTOR(setjmp))
220 .comm _ZN14__interception12real__setjmpE,8,8
221 .globl ASM_TSAN_SYMBOL_INTERCEPTOR(_setjmp)
222 ASM_TYPE_FUNCTION(ASM_TSAN_SYMBOL_INTERCEPTOR(_setjmp))
223 ASM_TSAN_SYMBOL_INTERCEPTOR(_setjmp):
224   CFI_STARTPROC
225   _CET_ENDBR
226   // save env parameter
227   push %rdi
228   CFI_ADJUST_CFA_OFFSET(8)
229   CFI_REL_OFFSET(%rdi, 0)
230   // obtain %rsp
231 #if defined(__FreeBSD__)
232   lea 8(%rsp), %rdi
233   mov %rdi, %rsi
234 #elif defined(__APPLE__)
235   lea 16(%rsp), %rdi
236   mov %rdi, %rsi
237 #elif defined(__linux__)
238   lea 16(%rsp), %rdi
239   mov %rdi, %rsi
240   xor %fs:0x30, %rsi  // magic mangling of rsp (see libc setjmp)
241   rol $0x11, %rsi
242 #else
243 # error "Unknown platform"
244 #endif
245   // call tsan interceptor
246   call ASM_TSAN_SYMBOL(__tsan_setjmp)
247   // restore env parameter
248   pop %rdi
249   CFI_ADJUST_CFA_OFFSET(-8)
250   CFI_RESTORE(%rdi)
251   // tail jump to libc setjmp
252   movl $0, %eax
253 #if !defined(__APPLE__)
254   movq _ZN14__interception12real__setjmpE@GOTPCREL(%rip), %rdx
255   jmp *(%rdx)
256 #else
257   jmp ASM_TSAN_SYMBOL(_setjmp)
258 #endif
259   CFI_ENDPROC
260 ASM_SIZE(ASM_TSAN_SYMBOL_INTERCEPTOR(_setjmp))
262 .comm _ZN14__interception14real_sigsetjmpE,8,8
263 .globl ASM_TSAN_SYMBOL_INTERCEPTOR(sigsetjmp)
264 ASM_TYPE_FUNCTION(ASM_TSAN_SYMBOL_INTERCEPTOR(sigsetjmp))
265 ASM_TSAN_SYMBOL_INTERCEPTOR(sigsetjmp):
266   CFI_STARTPROC
267   _CET_ENDBR
268   // save env parameter
269   push %rdi
270   CFI_ADJUST_CFA_OFFSET(8)
271   CFI_REL_OFFSET(%rdi, 0)
272   // save savesigs parameter
273   push %rsi
274   CFI_ADJUST_CFA_OFFSET(8)
275   CFI_REL_OFFSET(%rsi, 0)
276   // align stack frame
277   sub $8, %rsp
278   CFI_ADJUST_CFA_OFFSET(8)
279   // obtain %rsp
280 #if defined(__FreeBSD__)
281   lea 24(%rsp), %rdi
282   mov %rdi, %rsi
283 #elif defined(__APPLE__)
284   lea 32(%rsp), %rdi
285   mov %rdi, %rsi
286 #elif defined(__linux__)
287   lea 32(%rsp), %rdi
288   mov %rdi, %rsi
289   xor %fs:0x30, %rsi  // magic mangling of rsp (see libc setjmp)
290   rol $0x11, %rsi
291 #else
292 # error "Unknown platform"
293 #endif
294   // call tsan interceptor
295   call ASM_TSAN_SYMBOL(__tsan_setjmp)
296   // unalign stack frame
297   add $8, %rsp
298   CFI_ADJUST_CFA_OFFSET(-8)
299   // restore savesigs parameter
300   pop %rsi
301   CFI_ADJUST_CFA_OFFSET(-8)
302   CFI_RESTORE(%rsi)
303   // restore env parameter
304   pop %rdi
305   CFI_ADJUST_CFA_OFFSET(-8)
306   CFI_RESTORE(%rdi)
307   // tail jump to libc sigsetjmp
308   movl $0, %eax
309 #if !defined(__APPLE__)
310   movq _ZN14__interception14real_sigsetjmpE@GOTPCREL(%rip), %rdx
311   jmp *(%rdx)
312 #else
313   jmp ASM_TSAN_SYMBOL(sigsetjmp)
314 #endif
315   CFI_ENDPROC
316 ASM_SIZE(ASM_TSAN_SYMBOL_INTERCEPTOR(sigsetjmp))
318 #if !defined(__APPLE__)
319 .comm _ZN14__interception16real___sigsetjmpE,8,8
320 .globl ASM_TSAN_SYMBOL_INTERCEPTOR(__sigsetjmp)
321 ASM_TYPE_FUNCTION(ASM_TSAN_SYMBOL_INTERCEPTOR(__sigsetjmp))
322 ASM_TSAN_SYMBOL_INTERCEPTOR(__sigsetjmp):
323   CFI_STARTPROC
324   _CET_ENDBR
325   // save env parameter
326   push %rdi
327   CFI_ADJUST_CFA_OFFSET(8)
328   CFI_REL_OFFSET(%rdi, 0)
329   // save savesigs parameter
330   push %rsi
331   CFI_ADJUST_CFA_OFFSET(8)
332   CFI_REL_OFFSET(%rsi, 0)
333   // align stack frame
334   sub $8, %rsp
335   CFI_ADJUST_CFA_OFFSET(8)
336   // obtain %rsp
337 #if defined(__FreeBSD__)
338   lea 24(%rsp), %rdi
339   mov %rdi, %rsi
340 #else
341   lea 32(%rsp), %rdi
342   mov %rdi, %rsi
343   xor %fs:0x30, %rsi  // magic mangling of rsp (see libc setjmp)
344   rol $0x11, %rsi
345 #endif
346   // call tsan interceptor
347   call ASM_TSAN_SYMBOL(__tsan_setjmp)
348   // unalign stack frame
349   add $8, %rsp
350   CFI_ADJUST_CFA_OFFSET(-8)
351   // restore savesigs parameter
352   pop %rsi
353   CFI_ADJUST_CFA_OFFSET(-8)
354   CFI_RESTORE(%rsi)
355   // restore env parameter
356   pop %rdi
357   CFI_ADJUST_CFA_OFFSET(-8)
358   CFI_RESTORE(%rdi)
359   // tail jump to libc sigsetjmp
360   movl $0, %eax
361   movq _ZN14__interception16real___sigsetjmpE@GOTPCREL(%rip), %rdx
362   jmp *(%rdx)
363   CFI_ENDPROC
364 ASM_SIZE(ASM_TSAN_SYMBOL_INTERCEPTOR(__sigsetjmp))
365 #endif  // !defined(__APPLE__)
367 #if defined(__FreeBSD__) || defined(__linux__)
368 /* We do not need executable stack.  */
369 .section        .note.GNU-stack,"",@progbits
370 #endif
372 #endif