[compiler-rt] r315751 - [scudo] Allow for non-Android Shared TSD platforms, part 2

Kostya Kortchinsky via llvm-commits llvm-commits at lists.llvm.org
Fri Oct 13 13:55:31 PDT 2017


Author: cryptoad
Date: Fri Oct 13 13:55:31 2017
New Revision: 315751

URL: http://llvm.org/viewvc/llvm-project?rev=315751&view=rev
Log:
[scudo] Allow for non-Android Shared TSD platforms, part 2

Summary:
Follow up to D38826.

We introduce `pthread_{get,set}specific` versions of `{get,set}CurrentTSD` to
allow for non Android platforms to use the Shared TSD model.
We now allow `SCUDO_TSD_EXCLUSIVE` to be defined at compile time.

A couple of things:
- I know that `#if SANITIZER_ANDROID` is not ideal within a function, but in
  the end I feel it looks more compact and clean than going the .inc route; I
  am open to an alternative if anyone has one;
- `SCUDO_TSD_EXCLUSIVE=1` requires ELF TLS support (and not emutls as this uses
  malloc). I haven't found anything to enforce that, so it's currently not
  checked.

Reviewers: alekseyshl

Reviewed By: alekseyshl

Subscribers: srhines, llvm-commits

Differential Revision: https://reviews.llvm.org/D38854

Modified:
    compiler-rt/trunk/lib/scudo/scudo_platform.h
    compiler-rt/trunk/lib/scudo/scudo_tsd_shared.cpp
    compiler-rt/trunk/lib/scudo/scudo_tsd_shared.inc

Modified: compiler-rt/trunk/lib/scudo/scudo_platform.h
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/scudo/scudo_platform.h?rev=315751&r1=315750&r2=315751&view=diff
==============================================================================
--- compiler-rt/trunk/lib/scudo/scudo_platform.h (original)
+++ compiler-rt/trunk/lib/scudo/scudo_platform.h Fri Oct 13 13:55:31 2017
@@ -20,15 +20,25 @@
 # error "The Scudo hardened allocator is not supported on this platform."
 #endif
 
-#if SANITIZER_ANDROID || SANITIZER_FUCHSIA
+#define SCUDO_TSD_EXCLUSIVE_SUPPORTED (!SANITIZER_ANDROID && !SANITIZER_FUCHSIA)
+
+#ifndef SCUDO_TSD_EXCLUSIVE
+// SCUDO_TSD_EXCLUSIVE wasn't defined, use a default TSD model for the platform.
+# if SANITIZER_ANDROID || SANITIZER_FUCHSIA
 // Android and Fuchsia use a pool of TSDs shared between threads.
-# define SCUDO_TSD_EXCLUSIVE 0
-#elif SANITIZER_LINUX && !SANITIZER_ANDROID
+#  define SCUDO_TSD_EXCLUSIVE 0
+# elif SANITIZER_LINUX && !SANITIZER_ANDROID
 // Non-Android Linux use an exclusive TSD per thread.
-# define SCUDO_TSD_EXCLUSIVE 1
-#else
-# error "No default TSD model defined for this platform."
-#endif  // SANITIZER_ANDROID || SANITIZER_FUCHSIA
+#  define SCUDO_TSD_EXCLUSIVE 1
+# else
+#  error "No default TSD model defined for this platform."
+# endif  // SANITIZER_ANDROID || SANITIZER_FUCHSIA
+#endif  // SCUDO_TSD_EXCLUSIVE
+
+// If the exclusive TSD model is chosen, make sure the platform supports it.
+#if SCUDO_TSD_EXCLUSIVE && !SCUDO_TSD_EXCLUSIVE_SUPPORTED
+# error "The exclusive TSD model is not supported on this platform."
+#endif
 
 namespace __scudo {
 

Modified: compiler-rt/trunk/lib/scudo/scudo_tsd_shared.cpp
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/scudo/scudo_tsd_shared.cpp?rev=315751&r1=315750&r2=315751&view=diff
==============================================================================
--- compiler-rt/trunk/lib/scudo/scudo_tsd_shared.cpp (original)
+++ compiler-rt/trunk/lib/scudo/scudo_tsd_shared.cpp Fri Oct 13 13:55:31 2017
@@ -18,7 +18,7 @@
 namespace __scudo {
 
 static pthread_once_t GlobalInitialized = PTHREAD_ONCE_INIT;
-static pthread_key_t PThreadKey;
+pthread_key_t PThreadKey;
 
 static atomic_uint32_t CurrentIndex;
 static ScudoTSD *TSDs;
@@ -32,10 +32,6 @@ static uptr getNumberOfCPUs() {
 }
 
 static void initOnce() {
-  // Hack: TLS_SLOT_TSAN was introduced in N. To be able to use it on M for
-  // testing, we create an unused key. Since the key_data array follows the tls
-  // array, it basically gives us the extra entry we need.
-  // TODO(kostyak): remove and restrict to N and above.
   CHECK_EQ(pthread_key_create(&PThreadKey, NULL), 0);
   initScudo();
   NumberOfTSDs = getNumberOfCPUs();
@@ -50,7 +46,11 @@ static void initOnce() {
 }
 
 ALWAYS_INLINE void setCurrentTSD(ScudoTSD *TSD) {
+#if SANITIZER_ANDROID
   *get_android_tls_ptr() = reinterpret_cast<uptr>(TSD);
+#else
+  CHECK_EQ(pthread_setspecific(PThreadKey, reinterpret_cast<void *>(TSD)), 0);
+#endif  // SANITIZER_ANDROID
 }
 
 void initThread(bool MinimalInit) {

Modified: compiler-rt/trunk/lib/scudo/scudo_tsd_shared.inc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/scudo/scudo_tsd_shared.inc?rev=315751&r1=315750&r2=315751&view=diff
==============================================================================
--- compiler-rt/trunk/lib/scudo/scudo_tsd_shared.inc (original)
+++ compiler-rt/trunk/lib/scudo/scudo_tsd_shared.inc Fri Oct 13 13:55:31 2017
@@ -17,8 +17,14 @@
 
 #if !SCUDO_TSD_EXCLUSIVE
 
+extern pthread_key_t PThreadKey;
+
 ALWAYS_INLINE ScudoTSD* getCurrentTSD() {
+#if SANITIZER_ANDROID
   return reinterpret_cast<ScudoTSD *>(*get_android_tls_ptr());
+#else
+  return reinterpret_cast<ScudoTSD *>(pthread_getspecific(PThreadKey));
+#endif  // SANITIZER_ANDROID
 }
 
 ALWAYS_INLINE void initThreadMaybe(bool MinimalInit = false) {




More information about the llvm-commits mailing list