tsan_rtl_amd64.S revision 1.3
1.section .text
2
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
42
43#ifdef __PIC__
44  call __tsan_trace_switch@PLT
45#else
46  call __tsan_trace_switch
47#endif
48
49  # Unalign stack frame back.
50  mov %rbx, %rsp  # restore the original rsp
51  .cfi_def_cfa_register %rsp
52  pop %rbx
53  .cfi_adjust_cfa_offset -8
54  # Restore scratch registers.
55  pop %r11
56  .cfi_adjust_cfa_offset -8
57  pop %r10
58  .cfi_adjust_cfa_offset -8
59  pop %r9
60  .cfi_adjust_cfa_offset -8
61  pop %r8
62  .cfi_adjust_cfa_offset -8
63  pop %rdi
64  .cfi_adjust_cfa_offset -8
65  pop %rsi
66  .cfi_adjust_cfa_offset -8
67  pop %rdx
68  .cfi_adjust_cfa_offset -8
69  pop %rcx
70  .cfi_adjust_cfa_offset -8
71  pop %rax
72  .cfi_adjust_cfa_offset -8
73  .cfi_restore %rax
74  .cfi_restore %rbx
75  .cfi_restore %rcx
76  .cfi_restore %rdx
77  .cfi_restore %rsi
78  .cfi_restore %rdi
79  .cfi_restore %r8
80  .cfi_restore %r9
81  .cfi_restore %r10
82  .cfi_restore %r11
83  ret
84  .cfi_endproc
85
86.globl __tsan_report_race_thunk
87__tsan_report_race_thunk:
88  .cfi_startproc
89  # Save scratch registers.
90  push %rax
91  .cfi_adjust_cfa_offset 8
92  .cfi_rel_offset %rax, 0
93  push %rcx
94  .cfi_adjust_cfa_offset 8
95  .cfi_rel_offset %rcx, 0
96  push %rdx
97  .cfi_adjust_cfa_offset 8
98  .cfi_rel_offset %rdx, 0
99  push %rsi
100  .cfi_adjust_cfa_offset 8
101  .cfi_rel_offset %rsi, 0
102  push %rdi
103  .cfi_adjust_cfa_offset 8
104  .cfi_rel_offset %rdi, 0
105  push %r8
106  .cfi_adjust_cfa_offset 8
107  .cfi_rel_offset %r8, 0
108  push %r9
109  .cfi_adjust_cfa_offset 8
110  .cfi_rel_offset %r9, 0
111  push %r10
112  .cfi_adjust_cfa_offset 8
113  .cfi_rel_offset %r10, 0
114  push %r11
115  .cfi_adjust_cfa_offset 8
116  .cfi_rel_offset %r11, 0
117  # Align stack frame.
118  push %rbx  # non-scratch
119  .cfi_adjust_cfa_offset 8
120  .cfi_rel_offset %rbx, 0
121  mov %rsp, %rbx  # save current rsp
122  .cfi_def_cfa_register %rbx
123  shr $4, %rsp  # clear 4 lsb, align to 16
124  shl $4, %rsp
125
126#ifdef __PIC__
127  call __tsan_report_race@PLT
128#else
129  call __tsan_report_race
130#endif
131
132  # Unalign stack frame back.
133  mov %rbx, %rsp  # restore the original rsp
134  .cfi_def_cfa_register %rsp
135  pop %rbx
136  .cfi_adjust_cfa_offset -8
137  # Restore scratch registers.
138  pop %r11
139  .cfi_adjust_cfa_offset -8
140  pop %r10
141  .cfi_adjust_cfa_offset -8
142  pop %r9
143  .cfi_adjust_cfa_offset -8
144  pop %r8
145  .cfi_adjust_cfa_offset -8
146  pop %rdi
147  .cfi_adjust_cfa_offset -8
148  pop %rsi
149  .cfi_adjust_cfa_offset -8
150  pop %rdx
151  .cfi_adjust_cfa_offset -8
152  pop %rcx
153  .cfi_adjust_cfa_offset -8
154  pop %rax
155  .cfi_adjust_cfa_offset -8
156  .cfi_restore %rax
157  .cfi_restore %rbx
158  .cfi_restore %rcx
159  .cfi_restore %rdx
160  .cfi_restore %rsi
161  .cfi_restore %rdi
162  .cfi_restore %r8
163  .cfi_restore %r9
164  .cfi_restore %r10
165  .cfi_restore %r11
166  ret
167  .cfi_endproc
168
169#if defined(__ELF__) && defined(__linux__)
170/* We do not need executable stack.  */
171.section        .note.GNU-stack,"",@progbits
172#endif
173