Daily bump.
[official-gcc.git] / libsanitizer / tsan / tsan_rtl_amd64.S
blob71a2ecda9ddac8a1dac492b649bde055858b9838
1 #include "sanitizer_common/sanitizer_asm.h"
2 .hidden __tsan_trace_switch
3 .globl __tsan_trace_switch_thunk
4 __tsan_trace_switch_thunk:
5   CFI_STARTPROC
6   # Save scratch registers.
7   push %rax
8   CFI_ADJUST_CFA_OFFSET(8)
9   CFI_REL_OFFSET(%rax, 0)
10   push %rcx
11   CFI_ADJUST_CFA_OFFSET(8)
12   CFI_REL_OFFSET(%rcx, 0)
13   push %rdx
14   CFI_ADJUST_CFA_OFFSET(8)
15   CFI_REL_OFFSET(%rdx, 0)
16   push %rsi
17   CFI_ADJUST_CFA_OFFSET(8)
18   CFI_REL_OFFSET(%rsi, 0)
19   push %rdi
20   CFI_ADJUST_CFA_OFFSET(8)
21   CFI_REL_OFFSET(%rdi, 0)
22   push %r8
23   CFI_ADJUST_CFA_OFFSET(8)
24   CFI_REL_OFFSET(%r8, 0)
25   push %r9
26   CFI_ADJUST_CFA_OFFSET(8)
27   CFI_REL_OFFSET(%r9, 0)
28   push %r10
29   CFI_ADJUST_CFA_OFFSET(8)
30   CFI_REL_OFFSET(%r10, 0)
31   push %r11
32   CFI_ADJUST_CFA_OFFSET(8)
33   CFI_REL_OFFSET(%r11, 0)
34   # Align stack frame.
35   push %rbx  # non-scratch
36   CFI_ADJUST_CFA_OFFSET(8)
37   CFI_REL_OFFSET(%rbx, 0)
38   mov %rsp, %rbx  # save current rsp
39   CFI_DEF_CFA_REGISTER(%rbx)
40   shr $4, %rsp  # clear 4 lsb, align to 16
41   shl $4, %rsp
43   call __tsan_trace_switch
45   # Unalign stack frame back.
46   mov %rbx, %rsp  # restore the original rsp
47   CFI_DEF_CFA_REGISTER(%rsp)
48   pop %rbx
49   CFI_ADJUST_CFA_OFFSET(-8)
50   # Restore scratch registers.
51   pop %r11
52   CFI_ADJUST_CFA_OFFSET(-8)
53   pop %r10
54   CFI_ADJUST_CFA_OFFSET(-8)
55   pop %r9
56   CFI_ADJUST_CFA_OFFSET(-8)
57   pop %r8
58   CFI_ADJUST_CFA_OFFSET(-8)
59   pop %rdi
60   CFI_ADJUST_CFA_OFFSET(-8)
61   pop %rsi
62   CFI_ADJUST_CFA_OFFSET(-8)
63   pop %rdx
64   CFI_ADJUST_CFA_OFFSET(-8)
65   pop %rcx
66   CFI_ADJUST_CFA_OFFSET(-8)
67   pop %rax
68   CFI_ADJUST_CFA_OFFSET(-8)
69   CFI_RESTORE(%rax)
70   CFI_RESTORE(%rbx)
71   CFI_RESTORE(%rcx)
72   CFI_RESTORE(%rdx)
73   CFI_RESTORE(%rsi)
74   CFI_RESTORE(%rdi)
75   CFI_RESTORE(%r8)
76   CFI_RESTORE(%r9)
77   CFI_RESTORE(%r10)
78   CFI_RESTORE(%r11)
79   ret
80   CFI_ENDPROC
82 .hidden __tsan_report_race
83 .globl __tsan_report_race_thunk
84 __tsan_report_race_thunk:
85   CFI_STARTPROC
86   # Save scratch registers.
87   push %rax
88   CFI_ADJUST_CFA_OFFSET(8)
89   CFI_REL_OFFSET(%rax, 0)
90   push %rcx
91   CFI_ADJUST_CFA_OFFSET(8)
92   CFI_REL_OFFSET(%rcx, 0)
93   push %rdx
94   CFI_ADJUST_CFA_OFFSET(8)
95   CFI_REL_OFFSET(%rdx, 0)
96   push %rsi
97   CFI_ADJUST_CFA_OFFSET(8)
98   CFI_REL_OFFSET(%rsi, 0)
99   push %rdi
100   CFI_ADJUST_CFA_OFFSET(8)
101   CFI_REL_OFFSET(%rdi, 0)
102   push %r8
103   CFI_ADJUST_CFA_OFFSET(8)
104   CFI_REL_OFFSET(%r8, 0)
105   push %r9
106   CFI_ADJUST_CFA_OFFSET(8)
107   CFI_REL_OFFSET(%r9, 0)
108   push %r10
109   CFI_ADJUST_CFA_OFFSET(8)
110   CFI_REL_OFFSET(%r10, 0)
111   push %r11
112   CFI_ADJUST_CFA_OFFSET(8)
113   CFI_REL_OFFSET(%r11, 0)
114   # Align stack frame.
115   push %rbx  # non-scratch
116   CFI_ADJUST_CFA_OFFSET(8)
117   CFI_REL_OFFSET(%rbx, 0)
118   mov %rsp, %rbx  # save current rsp
119   CFI_DEF_CFA_REGISTER(%rbx)
120   shr $4, %rsp  # clear 4 lsb, align to 16
121   shl $4, %rsp
123   call __tsan_report_race
125   # Unalign stack frame back.
126   mov %rbx, %rsp  # restore the original rsp
127   CFI_DEF_CFA_REGISTER(%rsp)
128   pop %rbx
129   CFI_ADJUST_CFA_OFFSET(-8)
130   # Restore scratch registers.
131   pop %r11
132   CFI_ADJUST_CFA_OFFSET(-8)
133   pop %r10
134   CFI_ADJUST_CFA_OFFSET(-8)
135   pop %r9
136   CFI_ADJUST_CFA_OFFSET(-8)
137   pop %r8
138   CFI_ADJUST_CFA_OFFSET(-8)
139   pop %rdi
140   CFI_ADJUST_CFA_OFFSET(-8)
141   pop %rsi
142   CFI_ADJUST_CFA_OFFSET(-8)
143   pop %rdx
144   CFI_ADJUST_CFA_OFFSET(-8)
145   pop %rcx
146   CFI_ADJUST_CFA_OFFSET(-8)
147   pop %rax
148   CFI_ADJUST_CFA_OFFSET(-8)
149   CFI_RESTORE(%rax)
150   CFI_RESTORE(%rbx)
151   CFI_RESTORE(%rcx)
152   CFI_RESTORE(%rdx)
153   CFI_RESTORE(%rsi)
154   CFI_RESTORE(%rdi)
155   CFI_RESTORE(%r8)
156   CFI_RESTORE(%r9)
157   CFI_RESTORE(%r10)
158   CFI_RESTORE(%r11)
159   ret
160   CFI_ENDPROC
162 .hidden __tsan_setjmp
163 .comm _ZN14__interception11real_setjmpE,8,8
164 .globl setjmp
165 .type setjmp, @function
166 setjmp:
167   CFI_STARTPROC
168   // save env parameter
169   push %rdi
170   CFI_ADJUST_CFA_OFFSET(8)
171   CFI_REL_OFFSET(%rdi, 0)
172   // obtain %rsp
173   lea 16(%rsp), %rdi
174   mov %rdi, %rsi
175   xor %fs:0x30, %rsi  // magic mangling of rsp (see libc setjmp)
176   rol $0x11, %rsi
177   // call tsan interceptor
178   call __tsan_setjmp
179   // restore env parameter
180   pop %rdi
181   CFI_ADJUST_CFA_OFFSET(-8)
182   CFI_RESTORE(%rdi)
183   // tail jump to libc setjmp
184   movl $0, %eax
185   movq _ZN14__interception11real_setjmpE@GOTPCREL(%rip), %rdx
186   jmp *(%rdx)
187   CFI_ENDPROC
188 .size setjmp, .-setjmp
190 .comm _ZN14__interception12real__setjmpE,8,8
191 .globl _setjmp
192 .type _setjmp, @function
193 _setjmp:
194   CFI_STARTPROC
195   // save env parameter
196   push %rdi
197   CFI_ADJUST_CFA_OFFSET(8)
198   CFI_REL_OFFSET(%rdi, 0)
199   // obtain %rsp
200   lea 16(%rsp), %rdi
201   mov %rdi, %rsi
202   xor %fs:0x30, %rsi  // magic mangling of rsp (see libc setjmp)
203   rol $0x11, %rsi
204   // call tsan interceptor
205   call __tsan_setjmp
206   // restore env parameter
207   pop %rdi
208   CFI_ADJUST_CFA_OFFSET(-8)
209   CFI_RESTORE(%rdi)
210   // tail jump to libc setjmp
211   movl $0, %eax
212   movq _ZN14__interception12real__setjmpE@GOTPCREL(%rip), %rdx
213   jmp *(%rdx)
214   CFI_ENDPROC
215 .size _setjmp, .-_setjmp
217 .comm _ZN14__interception14real_sigsetjmpE,8,8
218 .globl sigsetjmp
219 .type sigsetjmp, @function
220 sigsetjmp:
221   CFI_STARTPROC
222   // save env parameter
223   push %rdi
224   CFI_ADJUST_CFA_OFFSET(8)
225   CFI_REL_OFFSET(%rdi, 0)
226   // save savesigs parameter
227   push %rsi
228   CFI_ADJUST_CFA_OFFSET(8)
229   CFI_REL_OFFSET(%rsi, 0)
230   // align stack frame
231   sub $8, %rsp
232   CFI_ADJUST_CFA_OFFSET(8)
233   // obtain %rsp
234   lea 32(%rsp), %rdi
235   mov %rdi, %rsi
236   xor %fs:0x30, %rsi  // magic mangling of rsp (see libc setjmp)
237   rol $0x11, %rsi
238   // call tsan interceptor
239   call __tsan_setjmp
240   // unalign stack frame
241   add $8, %rsp
242   CFI_ADJUST_CFA_OFFSET(-8)
243   // restore savesigs parameter
244   pop %rsi
245   CFI_ADJUST_CFA_OFFSET(-8)
246   CFI_RESTORE(%rsi)
247   // restore env parameter
248   pop %rdi
249   CFI_ADJUST_CFA_OFFSET(-8)
250   CFI_RESTORE(%rdi)
251   // tail jump to libc sigsetjmp
252   movl $0, %eax
253   movq _ZN14__interception14real_sigsetjmpE@GOTPCREL(%rip), %rdx
254   jmp *(%rdx)
255   CFI_ENDPROC
256 .size sigsetjmp, .-sigsetjmp
258 .comm _ZN14__interception16real___sigsetjmpE,8,8
259 .globl __sigsetjmp
260 .type __sigsetjmp, @function
261 __sigsetjmp:
262   CFI_STARTPROC
263   // save env parameter
264   push %rdi
265   CFI_ADJUST_CFA_OFFSET(8)
266   CFI_REL_OFFSET(%rdi, 0)
267   // save savesigs parameter
268   push %rsi
269   CFI_ADJUST_CFA_OFFSET(8)
270   CFI_REL_OFFSET(%rsi, 0)
271   // align stack frame
272   sub $8, %rsp
273   CFI_ADJUST_CFA_OFFSET(8)
274   // obtain %rsp
275   lea 32(%rsp), %rdi
276   mov %rdi, %rsi
277   xor %fs:0x30, %rsi  // magic mangling of rsp (see libc setjmp)
278   rol $0x11, %rsi
279   // call tsan interceptor
280   call __tsan_setjmp
281   // unalign stack frame
282   add $8, %rsp
283   CFI_ADJUST_CFA_OFFSET(-8)
284   // restore savesigs parameter
285   pop %rsi
286   CFI_ADJUST_CFA_OFFSET(-8)
287   CFI_RESTORE(%rsi)
288   // restore env parameter
289   pop %rdi
290   CFI_ADJUST_CFA_OFFSET(-8)
291   CFI_RESTORE(%rdi)
292   // tail jump to libc sigsetjmp
293   movl $0, %eax
294   movq _ZN14__interception16real___sigsetjmpE@GOTPCREL(%rip), %rdx
295   jmp *(%rdx)
296   CFI_ENDPROC
297 .size __sigsetjmp, .-__sigsetjmp
299 #ifdef __linux__
300 /* We do not need executable stack.  */
301 .section        .note.GNU-stack,"",@progbits
302 #endif