tsan: provide own implementation of __cxa_guard_xxx functions

that way we allow static linking of libstdc++

llvm-svn: 169376
This commit is contained in:
Dmitry Vyukov 2012-12-05 12:10:22 +00:00
parent 55bccc3702
commit c446aa039a
3 changed files with 24 additions and 15 deletions

View File

@ -619,21 +619,31 @@ TSAN_INTERCEPTOR(int, posix_memalign, void **memptr, uptr align, uptr sz) {
}
// Used in thread-safe function static initialization.
TSAN_INTERCEPTOR(int, __cxa_guard_acquire, char *m) {
SCOPED_TSAN_INTERCEPTOR(__cxa_guard_acquire, m);
int res = REAL(__cxa_guard_acquire)(m);
if (res) {
// This thread does the init.
extern "C" int INTERFACE_ATTRIBUTE __cxa_guard_acquire(atomic_uint32_t *g) {
SCOPED_INTERCEPTOR_RAW(__cxa_guard_acquire, g);
for (;;) {
u32 cmp = atomic_load(g, memory_order_acquire);
if (cmp == 0) {
if (atomic_compare_exchange_strong(g, &cmp, 1<<16, memory_order_relaxed))
return 1;
} else if (cmp == 1) {
Acquire(thr, pc, (uptr)g);
return 0;
} else {
Acquire(thr, pc, (uptr)m);
internal_sched_yield();
}
}
return res;
}
TSAN_INTERCEPTOR(void, __cxa_guard_release, char *m) {
SCOPED_TSAN_INTERCEPTOR(__cxa_guard_release, m);
Release(thr, pc, (uptr)m);
REAL(__cxa_guard_release)(m);
extern "C" void INTERFACE_ATTRIBUTE __cxa_guard_release(atomic_uint32_t *g) {
SCOPED_INTERCEPTOR_RAW(__cxa_guard_release, g);
Release(thr, pc, (uptr)g);
atomic_store(g, 1, memory_order_release);
}
extern "C" void INTERFACE_ATTRIBUTE __cxa_guard_abort(atomic_uint32_t *g) {
SCOPED_INTERCEPTOR_RAW(__cxa_guard_abort, g);
atomic_store(g, 0, memory_order_relaxed);
}
static void thread_finalize(void *v) {
@ -1510,9 +1520,6 @@ void InitializeInterceptors() {
TSAN_INTERCEPT(strncpy);
TSAN_INTERCEPT(strstr);
TSAN_INTERCEPT(__cxa_guard_acquire);
TSAN_INTERCEPT(__cxa_guard_release);
TSAN_INTERCEPT(pthread_create);
TSAN_INTERCEPT(pthread_join);
TSAN_INTERCEPT(pthread_detach);

View File

@ -138,6 +138,7 @@ void StatOutput(u64 *stat) {
name[StatInt_atexit] = " atexit ";
name[StatInt___cxa_guard_acquire] = " __cxa_guard_acquire ";
name[StatInt___cxa_guard_release] = " __cxa_guard_release ";
name[StatInt___cxa_guard_abort] = " __cxa_guard_abort ";
name[StatInt_pthread_create] = " pthread_create ";
name[StatInt_pthread_join] = " pthread_join ";
name[StatInt_pthread_detach] = " pthread_detach ";

View File

@ -135,6 +135,7 @@ enum StatType {
StatInt_atexit,
StatInt___cxa_guard_acquire,
StatInt___cxa_guard_release,
StatInt___cxa_guard_abort,
StatInt_pthread_create,
StatInt_pthread_join,
StatInt_pthread_detach,