aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitry Vyukov <dvyukov@google.com>2012-09-02 11:24:07 +0000
committerDmitry Vyukov <dvyukov@google.com>2012-09-02 11:24:07 +0000
commit41e8153c4a29b28bc7c80d35bc1d43438acdd4e7 (patch)
treeffb1f5188dd41f6d3a1bac3330d57cc2bc3d2775
parent0542644830da123babea42f58416487be467c72d (diff)
downloadcompiler-rt-41e8153c4a29b28bc7c80d35bc1d43438acdd4e7.tar.gz
tsan: insert cfi directives into assembly (not fully working for now, though)
git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@163090 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/tsan/rtl/tsan_rtl.h7
-rw-r--r--lib/tsan/rtl/tsan_rtl_amd64.S88
2 files changed, 93 insertions, 2 deletions
diff --git a/lib/tsan/rtl/tsan_rtl.h b/lib/tsan/rtl/tsan_rtl.h
index 1e56fd610..a800ad0bf 100644
--- a/lib/tsan/rtl/tsan_rtl.h
+++ b/lib/tsan/rtl/tsan_rtl.h
@@ -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
diff --git a/lib/tsan/rtl/tsan_rtl_amd64.S b/lib/tsan/rtl/tsan_rtl_amd64.S
index a6e2e2955..aee650d9f 100644
--- a/lib/tsan/rtl/tsan_rtl_amd64.S
+++ b/lib/tsan/rtl/tsan_rtl_amd64.S
@@ -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. */