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