tsan: insert cfi directives into assembly (not fully working for now, though)
llvm-svn: 163090
This commit is contained in:
parent
72cddf33d9
commit
b7f1852140
|
@ -510,9 +510,12 @@ void AfterSleep(ThreadState *thr, uptr pc);
|
|||
// The caller may not create the stack frame for itself at all,
|
||||
// so we create a reserve stack frame for it (1024b must be enough).
|
||||
#define HACKY_CALL(f) \
|
||||
__asm__ __volatile__("sub $0x400, %%rsp;" \
|
||||
__asm__ __volatile__("sub $1024, %%rsp;" \
|
||||
"/*.cfi_adjust_cfa_offset 1024;*/" \
|
||||
"call " #f "_thunk;" \
|
||||
"add $0x400, %%rsp;" ::: "memory");
|
||||
"add $1024, %%rsp;" \
|
||||
"/*.cfi_adjust_cfa_offset -1024;*/" \
|
||||
::: "memory", "cc");
|
||||
#else
|
||||
#define HACKY_CALL(f) f()
|
||||
#endif
|
||||
|
|
|
@ -2,19 +2,41 @@
|
|||
|
||||
.globl __tsan_trace_switch_thunk
|
||||
__tsan_trace_switch_thunk:
|
||||
.cfi_startproc
|
||||
# Save scratch registers.
|
||||
push %rax
|
||||
.cfi_adjust_cfa_offset 8
|
||||
.cfi_rel_offset %rax, 0
|
||||
push %rcx
|
||||
.cfi_adjust_cfa_offset 8
|
||||
.cfi_rel_offset %rcx, 0
|
||||
push %rdx
|
||||
.cfi_adjust_cfa_offset 8
|
||||
.cfi_rel_offset %rdx, 0
|
||||
push %rsi
|
||||
.cfi_adjust_cfa_offset 8
|
||||
.cfi_rel_offset %rsi, 0
|
||||
push %rdi
|
||||
.cfi_adjust_cfa_offset 8
|
||||
.cfi_rel_offset %rdi, 0
|
||||
push %r8
|
||||
.cfi_adjust_cfa_offset 8
|
||||
.cfi_rel_offset %r8, 0
|
||||
push %r9
|
||||
.cfi_adjust_cfa_offset 8
|
||||
.cfi_rel_offset %r9, 0
|
||||
push %r10
|
||||
.cfi_adjust_cfa_offset 8
|
||||
.cfi_rel_offset %r10, 0
|
||||
push %r11
|
||||
.cfi_adjust_cfa_offset 8
|
||||
.cfi_rel_offset %r11, 0
|
||||
# Align stack frame.
|
||||
push %rbx # non-scratch
|
||||
.cfi_adjust_cfa_offset 8
|
||||
.cfi_rel_offset %rbx, 0
|
||||
mov %rsp, %rbx # save current rsp
|
||||
.cfi_def_cfa_register %rbx
|
||||
shr $4, %rsp # clear 4 lsb, align to 16
|
||||
shl $4, %rsp
|
||||
|
||||
|
@ -22,34 +44,78 @@ __tsan_trace_switch_thunk:
|
|||
|
||||
# Unalign stack frame back.
|
||||
mov %rbx, %rsp # restore the original rsp
|
||||
.cfi_def_cfa_register %rsp
|
||||
pop %rbx
|
||||
.cfi_adjust_cfa_offset -8
|
||||
# Restore scratch registers.
|
||||
pop %r11
|
||||
.cfi_adjust_cfa_offset -8
|
||||
pop %r10
|
||||
.cfi_adjust_cfa_offset -8
|
||||
pop %r9
|
||||
.cfi_adjust_cfa_offset -8
|
||||
pop %r8
|
||||
.cfi_adjust_cfa_offset -8
|
||||
pop %rdi
|
||||
.cfi_adjust_cfa_offset -8
|
||||
pop %rsi
|
||||
.cfi_adjust_cfa_offset -8
|
||||
pop %rdx
|
||||
.cfi_adjust_cfa_offset -8
|
||||
pop %rcx
|
||||
.cfi_adjust_cfa_offset -8
|
||||
pop %rax
|
||||
.cfi_adjust_cfa_offset -8
|
||||
.cfi_restore %rax
|
||||
.cfi_restore %rbx
|
||||
.cfi_restore %rcx
|
||||
.cfi_restore %rdx
|
||||
.cfi_restore %rsi
|
||||
.cfi_restore %rdi
|
||||
.cfi_restore %r8
|
||||
.cfi_restore %r9
|
||||
.cfi_restore %r10
|
||||
.cfi_restore %r11
|
||||
ret
|
||||
.cfi_endproc
|
||||
|
||||
.globl __tsan_report_race_thunk
|
||||
__tsan_report_race_thunk:
|
||||
.cfi_startproc
|
||||
# Save scratch registers.
|
||||
push %rax
|
||||
.cfi_adjust_cfa_offset 8
|
||||
.cfi_rel_offset %rax, 0
|
||||
push %rcx
|
||||
.cfi_adjust_cfa_offset 8
|
||||
.cfi_rel_offset %rcx, 0
|
||||
push %rdx
|
||||
.cfi_adjust_cfa_offset 8
|
||||
.cfi_rel_offset %rdx, 0
|
||||
push %rsi
|
||||
.cfi_adjust_cfa_offset 8
|
||||
.cfi_rel_offset %rsi, 0
|
||||
push %rdi
|
||||
.cfi_adjust_cfa_offset 8
|
||||
.cfi_rel_offset %rdi, 0
|
||||
push %r8
|
||||
.cfi_adjust_cfa_offset 8
|
||||
.cfi_rel_offset %r8, 0
|
||||
push %r9
|
||||
.cfi_adjust_cfa_offset 8
|
||||
.cfi_rel_offset %r9, 0
|
||||
push %r10
|
||||
.cfi_adjust_cfa_offset 8
|
||||
.cfi_rel_offset %r10, 0
|
||||
push %r11
|
||||
.cfi_adjust_cfa_offset 8
|
||||
.cfi_rel_offset %r11, 0
|
||||
# Align stack frame.
|
||||
push %rbx # non-scratch
|
||||
.cfi_adjust_cfa_offset 8
|
||||
.cfi_rel_offset %rbx, 0
|
||||
mov %rsp, %rbx # save current rsp
|
||||
.cfi_def_cfa_register %rbx
|
||||
shr $4, %rsp # clear 4 lsb, align to 16
|
||||
shl $4, %rsp
|
||||
|
||||
|
@ -57,18 +123,40 @@ __tsan_report_race_thunk:
|
|||
|
||||
# Unalign stack frame back.
|
||||
mov %rbx, %rsp # restore the original rsp
|
||||
.cfi_def_cfa_register %rsp
|
||||
pop %rbx
|
||||
.cfi_adjust_cfa_offset -8
|
||||
# Restore scratch registers.
|
||||
pop %r11
|
||||
.cfi_adjust_cfa_offset -8
|
||||
pop %r10
|
||||
.cfi_adjust_cfa_offset -8
|
||||
pop %r9
|
||||
.cfi_adjust_cfa_offset -8
|
||||
pop %r8
|
||||
.cfi_adjust_cfa_offset -8
|
||||
pop %rdi
|
||||
.cfi_adjust_cfa_offset -8
|
||||
pop %rsi
|
||||
.cfi_adjust_cfa_offset -8
|
||||
pop %rdx
|
||||
.cfi_adjust_cfa_offset -8
|
||||
pop %rcx
|
||||
.cfi_adjust_cfa_offset -8
|
||||
pop %rax
|
||||
.cfi_adjust_cfa_offset -8
|
||||
.cfi_restore %rax
|
||||
.cfi_restore %rbx
|
||||
.cfi_restore %rcx
|
||||
.cfi_restore %rdx
|
||||
.cfi_restore %rsi
|
||||
.cfi_restore %rdi
|
||||
.cfi_restore %r8
|
||||
.cfi_restore %r9
|
||||
.cfi_restore %r10
|
||||
.cfi_restore %r11
|
||||
ret
|
||||
.cfi_endproc
|
||||
|
||||
#ifdef __linux__
|
||||
/* We do not need executable stack. */
|
||||
|
|
Loading…
Reference in New Issue