[llvm-commits] [compiler-rt] r147878 - in /compiler-rt/trunk/lib/asan: asan_interceptors.cc asan_linux.cc asan_lock.h asan_mac.cc asan_thread_registry.cc

Chad Rosier mcrosier at apple.com
Tue Jan 10 15:55:20 PST 2012


On Jan 10, 2012, at 3:43 PM, Kostya Serebryany wrote:

> r147896 will hopefully fix the build on 10.6. 

I believe the builders are happy once again. :)

> I am sorry for the breakage, the code I am refactoring now is highly OS-dependent and I have no easy way of testing it on 10.6 (only on 10.7).

Things break, it's unavoidable.  Your quick turn around times is greatly appreciated.

 Chad

> I'll try to hold on with other OS-dependent code until I have a more reliable way to test it. 
> 
> --kcc 
> 
> On Tue, Jan 10, 2012 at 3:37 PM, Kostya Serebryany <kcc at google.com> wrote:
> 
> 
> On Tue, Jan 10, 2012 at 3:36 PM, Chad Rosier <mcrosier at apple.com> wrote:
> It's 10.6.8, which is Snow Leopard.
> 
> Ah, so it's the other way around. The box I am testing on is 10.8.0. 
> I'll have a fix shortly. 
> 
> --kcc 
>  
> 
> On Jan 10, 2012, at 3:27 PM, Kostya Serebryany wrote:
> 
>> OMG. Looking... 
>> Which version of MAcOS is that? 
>> I am, sure I've tested it on MacOS 10.6. 
>> 
>> --kcc 
>> 
>> On Tue, Jan 10, 2012 at 3:26 PM, Chad Rosier <mcrosier at apple.com> wrote:
>> Hi Kostya,
>> I believe we're seeing failures on our internal buildbots due to this commit.  Clang is failing to build due to the following error:
>> 
>> /Users/buildslave/zorg/buildbot/smooshlab/slave-0.8/build.clang-x86_64-darwin10-gcc42-RA/llvm/projects/compiler-rt/lib/asan/asan_interceptors.cc:226:5: error: conflicting types for 'pthread_create'
>> int pthread_create(void *thread, const void *attr,
>>     ^
>> /usr/include/pthread.h:298:11: note: previous declaration is here
>> int       pthread_create(pthread_t * __restrict,
>>           ^
>> 1 error generated.
>>  Chad
>> 
>> On Jan 10, 2012, at 1:24 PM, Kostya Serebryany wrote:
>> 
>>> Author: kcc
>>> Date: Tue Jan 10 15:24:40 2012
>>> New Revision: 147878
>>> 
>>> URL: http://llvm.org/viewvc/llvm-project?rev=147878&view=rev
>>> Log:
>>> [asan] move OS-dependent code away from asan_lock.h
>>> 
>>> Modified:
>>>    compiler-rt/trunk/lib/asan/asan_interceptors.cc
>>>    compiler-rt/trunk/lib/asan/asan_linux.cc
>>>    compiler-rt/trunk/lib/asan/asan_lock.h
>>>    compiler-rt/trunk/lib/asan/asan_mac.cc
>>>    compiler-rt/trunk/lib/asan/asan_thread_registry.cc
>>> 
>>> Modified: compiler-rt/trunk/lib/asan/asan_interceptors.cc
>>> URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/asan/asan_interceptors.cc?rev=147878&r1=147877&r2=147878&view=diff
>>> ==============================================================================
>>> --- compiler-rt/trunk/lib/asan/asan_interceptors.cc (original)
>>> +++ compiler-rt/trunk/lib/asan/asan_interceptors.cc Tue Jan 10 15:24:40 2012
>>> @@ -35,7 +35,7 @@
>>> typedef longjmp_f _longjmp_f;
>>> typedef longjmp_f siglongjmp_f;
>>> typedef void (*__cxa_throw_f)(void *, void *, void *);
>>> -typedef int (*pthread_create_f)(pthread_t *thread, const pthread_attr_t *attr,
>>> +typedef int (*pthread_create_f)(void *thread, const void *attr,
>>>                                 void *(*start_routine) (void *), void *arg);
>>> #ifdef __APPLE__
>>> dispatch_async_f_f real_dispatch_async_f;
>>> @@ -223,10 +223,13 @@
>>> }
>>> 
>>> extern "C"
>>> +int pthread_create(void *thread, const void *attr,
>>> +                   void *(*start_routine) (void *), void *arg);
>>> +extern "C"
>>> #ifndef __APPLE__
>>> __attribute__((visibility("default")))
>>> #endif
>>> -int WRAP(pthread_create)(pthread_t *thread, const pthread_attr_t *attr,
>>> +int WRAP(pthread_create)(void *thread, const void *attr,
>>>                          void *(*start_routine) (void *), void *arg) {
>>>   GET_STACK_TRACE_HERE(kStackTraceMax, /*fast_unwind*/false);
>>>   AsanThread *curr_thread = asanThreadRegistry().GetCurrent();
>>> 
>>> Modified: compiler-rt/trunk/lib/asan/asan_linux.cc
>>> URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/asan/asan_linux.cc?rev=147878&r1=147877&r2=147878&view=diff
>>> ==============================================================================
>>> --- compiler-rt/trunk/lib/asan/asan_linux.cc (original)
>>> +++ compiler-rt/trunk/lib/asan/asan_linux.cc Tue Jan 10 15:24:40 2012
>>> @@ -15,6 +15,7 @@
>>> 
>>> #include "asan_interceptors.h"
>>> #include "asan_internal.h"
>>> +#include "asan_lock.h"
>>> #include "asan_procmaps.h"
>>> #include "asan_thread.h"
>>> 
>>> @@ -276,6 +277,26 @@
>>>   CHECK(AddrIsInStack((uintptr_t)&attr));
>>> }
>>> 
>>> +AsanLock::AsanLock(LinkerInitialized) {
>>> +  // We assume that pthread_mutex_t initialized to all zeroes is a valid
>>> +  // unlocked mutex. We can not use PTHREAD_MUTEX_INITIALIZER as it triggers
>>> +  // a gcc warning:
>>> +  // extended initializer lists only available with -std=c++0x or -std=gnu++0x
>>> +}
>>> +
>>> +void AsanLock::Lock() {
>>> +  CHECK(sizeof(pthread_mutex_t) <= sizeof(opaque_storage_));
>>> +  pthread_mutex_lock((pthread_mutex_t*)&opaque_storage_);
>>> +  CHECK(!owner_);
>>> +  owner_ = (uintptr_t)pthread_self();
>>> +}
>>> +
>>> +void AsanLock::Unlock() {
>>> +  CHECK(owner_ == (uintptr_t)pthread_self());
>>> +  owner_ = 0;
>>> +  pthread_mutex_unlock((pthread_mutex_t*)&opaque_storage_);
>>> +}
>>> +
>>> }  // namespace __asan
>>> 
>>> #endif  // __linux__
>>> 
>>> Modified: compiler-rt/trunk/lib/asan/asan_lock.h
>>> URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/asan/asan_lock.h?rev=147878&r1=147877&r2=147878&view=diff
>>> ==============================================================================
>>> --- compiler-rt/trunk/lib/asan/asan_lock.h (original)
>>> +++ compiler-rt/trunk/lib/asan/asan_lock.h Tue Jan 10 15:24:40 2012
>>> @@ -19,70 +19,21 @@
>>> // The locks in ASan are global objects and they are never destroyed to avoid
>>> // at-exit races (that is, a lock is being used by other threads while the main
>>> // thread is doing atexit destructors).
>>> +// We define the class using opaque storage to avoid including system headers.
>>> 
>>> -#ifdef __APPLE__
>>> -#include <pthread.h>
>>> -
>>> -#include <libkern/OSAtomic.h>
>>> namespace __asan {
>>> -class AsanLock {
>>> - public:
>>> -  explicit AsanLock(LinkerInitialized) :
>>> -    mu_(OS_SPINLOCK_INIT),
>>> -    owner_(0),
>>> -    is_locked_(false) {}
>>> 
>>> -  void Lock() {
>>> -    CHECK(owner_ != pthread_self());
>>> -    OSSpinLockLock(&mu_);
>>> -    is_locked_ = true;
>>> -    owner_ = pthread_self();
>>> -  }
>>> -  void Unlock() {
>>> -    owner_ = 0;
>>> -    is_locked_ = false;
>>> -    OSSpinLockUnlock(&mu_);
>>> -  }
>>> -
>>> -  bool IsLocked() {
>>> -    // This is not atomic, e.g. one thread may get different values if another
>>> -    // one is about to release the lock.
>>> -    return is_locked_;
>>> -  }
>>> - private:
>>> -  OSSpinLock mu_;
>>> -  volatile pthread_t owner_;  // for debugging purposes
>>> -  bool is_locked_;  // for silly malloc_introspection_t interface
>>> -};
>>> -}  // namespace __asan
>>> -
>>> -#else  // assume linux
>>> -#include <pthread.h>
>>> -namespace __asan {
>>> class AsanLock {
>>>  public:
>>> -  explicit AsanLock(LinkerInitialized) {
>>> -    // We assume that pthread_mutex_t initialized to all zeroes is a valid
>>> -    // unlocked mutex. We can not use PTHREAD_MUTEX_INITIALIZER as it triggers
>>> -    // a gcc warning:
>>> -    // extended initializer lists only available with -std=c++0x or -std=gnu++0x
>>> -  }
>>> -  void Lock() {
>>> -    pthread_mutex_lock(&mu_);
>>> -    // pthread_spin_lock(&mu_);
>>> -  }
>>> -  void Unlock() {
>>> -    pthread_mutex_unlock(&mu_);
>>> -    // pthread_spin_unlock(&mu_);
>>> -  }
>>> +  explicit AsanLock(LinkerInitialized);
>>> +  void Lock();
>>> +  void Unlock();
>>> +  bool IsLocked() { return owner_ != 0; }
>>>  private:
>>> -  pthread_mutex_t mu_;
>>> -  // pthread_spinlock_t mu_;
>>> +  uintptr_t opaque_storage_[10];
>>> +  uintptr_t owner_;  // for debugging and for malloc_introspection_t interface
>>> };
>>> -}  // namespace __asan
>>> -#endif
>>> 
>>> -namespace __asan {
>>> class ScopedLock {
>>>  public:
>>>   explicit ScopedLock(AsanLock *mu) : mu_(mu) {
>>> 
>>> Modified: compiler-rt/trunk/lib/asan/asan_mac.cc
>>> URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/asan/asan_mac.cc?rev=147878&r1=147877&r2=147878&view=diff
>>> ==============================================================================
>>> --- compiler-rt/trunk/lib/asan/asan_mac.cc (original)
>>> +++ compiler-rt/trunk/lib/asan/asan_mac.cc Tue Jan 10 15:24:40 2012
>>> @@ -27,6 +27,7 @@
>>> #include <pthread.h>
>>> #include <fcntl.h>
>>> #include <unistd.h>
>>> +#include <libkern/OSAtomic.h>
>>> 
>>> namespace __asan {
>>> 
>>> @@ -130,6 +131,27 @@
>>>   CHECK(AddrIsInStack((uintptr_t)&local));
>>> }
>>> 
>>> +
>>> +AsanLock::AsanLock(LinkerInitialized) {
>>> +  // We assume that OS_SPINLOCK_INIT is zero
>>> +}
>>> +
>>> +void AsanLock::Lock() {
>>> +  CHECK(sizeof(OSSpinLock) <= sizeof(opaque_storage_));
>>> +  CHECK(OS_SPINLOCK_INIT == 0);
>>> +  CHECK(owner_ != (uintptr_t)pthread_self());
>>> +  OSSpinLockLock((OSSpinLock*)&opaque_storage_);
>>> +  CHECK(!owner_);
>>> +  owner_ = (uintptr_t)pthread_self();
>>> +}
>>> +
>>> +void AsanLock::Unlock() {
>>> +  CHECK(owner_ == (uintptr_t)pthread_self());
>>> +  owner_ = 0;
>>> +  OSSpinLockUnlock((OSSpinLock*)&opaque_storage_);
>>> +}
>>> +
>>> +
>>> // Support for the following functions from libdispatch on Mac OS:
>>> //   dispatch_async_f()
>>> //   dispatch_async()
>>> 
>>> Modified: compiler-rt/trunk/lib/asan/asan_thread_registry.cc
>>> URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/asan/asan_thread_registry.cc?rev=147878&r1=147877&r2=147878&view=diff
>>> ==============================================================================
>>> --- compiler-rt/trunk/lib/asan/asan_thread_registry.cc (original)
>>> +++ compiler-rt/trunk/lib/asan/asan_thread_registry.cc Tue Jan 10 15:24:40 2012
>>> @@ -18,6 +18,7 @@
>>> #include "asan_thread_registry.h"
>>> 
>>> #include <limits.h>
>>> +#include <pthread.h>
>>> 
>>> namespace __asan {
>>> 
>>> 
>>> 
>>> _______________________________________________
>>> llvm-commits mailing list
>>> llvm-commits at cs.uiuc.edu
>>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>> 
>> 
> 
> 
> 

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20120110/2df4002c/attachment.html>


More information about the llvm-commits mailing list