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