summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFrancis Ricci <francisjricci@gmail.com>2017-02-17 03:23:07 +0000
committerFrancis Ricci <francisjricci@gmail.com>2017-02-17 03:23:07 +0000
commit571c05a55059cc2783aea9ef03e57b253e3107b7 (patch)
tree95e45f3f6754d4f67f51e0c6e1a28102e3854486
parentff266f52362856a9b1c5dd717e5795830823bf43 (diff)
downloadbcm5719-llvm-571c05a55059cc2783aea9ef03e57b253e3107b7.tar.gz
bcm5719-llvm-571c05a55059cc2783aea9ef03e57b253e3107b7.zip
Use pthreads to store current thread id on darwin
Summary: __thread is not supported by all darwin versions and architectures, use pthreads instead to allow for building darwin lsan on iossim. Reviewers: kubamracek, kcc Subscribers: llvm-commits Differential Revision: https://reviews.llvm.org/D29993 llvm-svn: 295405
-rw-r--r--compiler-rt/lib/lsan/lsan_common.h2
-rw-r--r--compiler-rt/lib/lsan/lsan_common_linux.cc4
-rw-r--r--compiler-rt/lib/lsan/lsan_common_mac.cc33
-rw-r--r--compiler-rt/lib/lsan/lsan_thread.cc11
4 files changed, 24 insertions, 26 deletions
diff --git a/compiler-rt/lib/lsan/lsan_common.h b/compiler-rt/lib/lsan/lsan_common.h
index f1ec64785d6..c457d1b84a8 100644
--- a/compiler-rt/lib/lsan/lsan_common.h
+++ b/compiler-rt/lib/lsan/lsan_common.h
@@ -55,6 +55,8 @@ enum ChunkTag {
kIgnored = 3
};
+const u32 kInvalidTid = (u32) -1;
+
struct Flags {
#define LSAN_FLAG(Type, Name, DefaultValue, Description) Type Name;
#include "lsan_flags.inc"
diff --git a/compiler-rt/lib/lsan/lsan_common_linux.cc b/compiler-rt/lib/lsan/lsan_common_linux.cc
index 931b5112a82..0e10d41914e 100644
--- a/compiler-rt/lib/lsan/lsan_common_linux.cc
+++ b/compiler-rt/lib/lsan/lsan_common_linux.cc
@@ -34,6 +34,10 @@ static bool IsLinker(const char* full_name) {
return LibraryNameIs(full_name, kLinkerName);
}
+static THREADLOCAL u32 current_thread_tid = kInvalidTid;
+u32 GetCurrentThread() { return current_thread_tid; }
+void SetCurrentThread(u32 tid) { current_thread_tid = tid; }
+
__attribute__((tls_model("initial-exec")))
THREADLOCAL int disable_counter;
bool DisabledInThisThread() { return disable_counter > 0; }
diff --git a/compiler-rt/lib/lsan/lsan_common_mac.cc b/compiler-rt/lib/lsan/lsan_common_mac.cc
index a58d1cd8fef..7f5e0550dc8 100644
--- a/compiler-rt/lib/lsan/lsan_common_mac.cc
+++ b/compiler-rt/lib/lsan/lsan_common_mac.cc
@@ -22,43 +22,46 @@
namespace __lsan {
+typedef struct {
+ int disable_counter;
+ u32 current_thread_id;
+} thread_local_data_t;
+
static pthread_key_t key;
static pthread_once_t key_once = PTHREAD_ONCE_INIT;
static void make_tls_key() { CHECK_EQ(pthread_key_create(&key, NULL), 0); }
-static int *get_tls_val(bool allocate) {
+static thread_local_data_t *get_tls_val() {
pthread_once(&key_once, make_tls_key);
- int *ptr = (int *)pthread_getspecific(key);
- if (ptr == NULL && allocate) {
- ptr = (int *)InternalAlloc(sizeof(*ptr));
- *ptr = 0;
+ thread_local_data_t *ptr = (thread_local_data_t *)pthread_getspecific(key);
+ if (ptr == NULL) {
+ ptr = (thread_local_data_t *)InternalAlloc(sizeof(*ptr));
+ ptr->disable_counter = 0;
+ ptr->current_thread_id = kInvalidTid;
pthread_setspecific(key, ptr);
}
return ptr;
}
-bool DisabledInThisThread() {
- int *disable_counter = get_tls_val(false);
- return disable_counter ? *disable_counter > 0 : false;
-}
-
-void DisableInThisThread() {
- int *disable_counter = get_tls_val(true);
+bool DisabledInThisThread() { return get_tls_val()->disable_counter > 0; }
- ++*disable_counter;
-}
+void DisableInThisThread() { ++get_tls_val()->disable_counter; }
void EnableInThisThread() {
- int *disable_counter = get_tls_val(true);
+ int *disable_counter = &get_tls_val()->disable_counter;
if (*disable_counter == 0) {
DisableCounterUnderflow();
}
--*disable_counter;
}
+u32 GetCurrentThread() { return get_tls_val()->current_thread_id; }
+
+void SetCurrentThread(u32 tid) { get_tls_val()->current_thread_id = tid; }
+
void InitializePlatformSpecificModules() {
CHECK(0 && "unimplemented");
}
diff --git a/compiler-rt/lib/lsan/lsan_thread.cc b/compiler-rt/lib/lsan/lsan_thread.cc
index f82a04aeeaf..731c97fe2bc 100644
--- a/compiler-rt/lib/lsan/lsan_thread.cc
+++ b/compiler-rt/lib/lsan/lsan_thread.cc
@@ -22,10 +22,7 @@
namespace __lsan {
-const u32 kInvalidTid = (u32) -1;
-
static ThreadRegistry *thread_registry;
-static THREADLOCAL u32 current_thread_tid = kInvalidTid;
static ThreadContextBase *CreateThreadContext(u32 tid) {
void *mem = MmapOrDie(sizeof(ThreadContext), "ThreadContext");
@@ -41,14 +38,6 @@ void InitializeThreadRegistry() {
ThreadRegistry(CreateThreadContext, kMaxThreads, kThreadQuarantineSize);
}
-u32 GetCurrentThread() {
- return current_thread_tid;
-}
-
-void SetCurrentThread(u32 tid) {
- current_thread_tid = tid;
-}
-
ThreadContext::ThreadContext(int tid)
: ThreadContextBase(tid),
stack_begin_(0),
OpenPOWER on IntegriCloud