tsan: remember 2 stack frames for atomics (caller and atomic itself)

llvm-svn: 174167
This commit is contained in:
Dmitry Vyukov 2013-02-01 11:01:17 +00:00
parent 4b866274c3
commit aa6af4ddd1
1 changed files with 19 additions and 14 deletions

View File

@ -20,25 +20,41 @@
// http://www.hpl.hp.com/personal/Hans_Boehm/c++mm/
#include "sanitizer_common/sanitizer_placement_new.h"
#include "sanitizer_common/sanitizer_stacktrace.h"
#include "tsan_interface_atomic.h"
#include "tsan_flags.h"
#include "tsan_rtl.h"
using namespace __tsan; // NOLINT
#define SCOPED_ATOMIC(func, ...) \
const uptr callpc = (uptr)__builtin_return_address(0); \
const uptr pc = __sanitizer::StackTrace::GetCurrentPc(); \
mo = ConvertOrder(mo); \
mo = flags()->force_seq_cst_atomics ? (morder)mo_seq_cst : mo; \
ThreadState *const thr = cur_thread(); \
AtomicStatInc(thr, sizeof(*a), mo, StatAtomic##func); \
ScopedAtomic sa(thr, callpc, __FUNCTION__); \
return Atomic##func(thr, pc, __VA_ARGS__); \
/**/
class ScopedAtomic {
public:
ScopedAtomic(ThreadState *thr, uptr pc, const char *func)
: thr_(thr) {
CHECK_EQ(thr_->in_rtl, 1); // 1 due to our own ScopedInRtl member.
CHECK_EQ(thr_->in_rtl, 0);
ProcessPendingSignals(thr);
FuncEntry(thr_, pc);
DPrintf("#%d: %s\n", thr_->tid, func);
thr_->in_rtl++;
}
~ScopedAtomic() {
CHECK_EQ(thr_->in_rtl, 1);
thr_->in_rtl--;
CHECK_EQ(thr_->in_rtl, 0);
FuncExit(thr_);
}
private:
ThreadState *thr_;
ScopedInRtl in_rtl_;
};
// Some shortcuts.
@ -212,17 +228,6 @@ a128 func_cas(volatile a128 *v, a128 cmp, a128 xch) {
}
#endif
#define SCOPED_ATOMIC(func, ...) \
mo = ConvertOrder(mo); \
mo = flags()->force_seq_cst_atomics ? (morder)mo_seq_cst : mo; \
ThreadState *const thr = cur_thread(); \
ProcessPendingSignals(thr); \
const uptr pc = (uptr)__builtin_return_address(0); \
AtomicStatInc(thr, sizeof(*a), mo, StatAtomic##func); \
ScopedAtomic sa(thr, pc, __FUNCTION__); \
return Atomic##func(thr, pc, __VA_ARGS__); \
/**/
template<typename T>
static int SizeLog() {
if (sizeof(T) <= 1)