[PATCH] [ASan] Make BlockingMutex really linker initialized.
David Blaikie
dblaikie at gmail.com
Mon Jan 26 10:22:36 PST 2015
On Mon, Jan 26, 2015 at 10:20 AM, Yuri Gribov <tetra2005 at gmail.com> wrote:
> On Mon, Jan 26, 2015 at 7:21 PM, David Blaikie <dblaikie at gmail.com> wrote:
> >
> >
> > On Mon, Jan 26, 2015 at 12:52 AM, Yury Gribov <tetra2005 at gmail.com>
> wrote:
> >>
> >> Hi kcc, samsonov,
> >>
> >> This patch adds constexpr to BlockingMutex which instructs compiler to
> >> never generate global constructors (and thus fixes -Wglobal-constructors
> >> warnings about BlockingMutex globals in sanitizer_common). I could do
> the
> >> same fixes to other LinkerInitialized classes (Allocator, etc.) and
> enable
> >> -Wglobal-constructors for ASan but I wasn't sure whether anyone needs
> this.
> >>
> >> REPOSITORY
> >> rL LLVM
> >>
> >> http://reviews.llvm.org/D7171
> >>
> >> Files:
> >> lib/sanitizer_common/sanitizer_linux.cc
> >> lib/sanitizer_common/sanitizer_mac.cc
> >> lib/sanitizer_common/sanitizer_mutex.h
> >>
> >> Index: lib/sanitizer_common/sanitizer_linux.cc
> >> ===================================================================
> >> --- lib/sanitizer_common/sanitizer_linux.cc
> >> +++ lib/sanitizer_common/sanitizer_linux.cc
> >> @@ -493,15 +493,10 @@
> >> MtxSleeping = 2
> >> };
> >>
> >> -BlockingMutex::BlockingMutex(LinkerInitialized) {
> >> - CHECK_EQ(owner_, 0);
> >> -}
> >> -
> >> -BlockingMutex::BlockingMutex() {
> >> - internal_memset(this, 0, sizeof(*this));
> >> -}
> >> +BlockingMutex::BlockingMutex() {}
> >>
> >> void BlockingMutex::Lock() {
> >> + CHECK_EQ(owner_, 0);
> >> atomic_uint32_t *m = reinterpret_cast<atomic_uint32_t
> >> *>(&opaque_storage_);
> >> if (atomic_exchange(m, MtxLocked, memory_order_acquire) ==
> MtxUnlocked)
> >> return;
> >> Index: lib/sanitizer_common/sanitizer_mac.cc
> >> ===================================================================
> >> --- lib/sanitizer_common/sanitizer_mac.cc
> >> +++ lib/sanitizer_common/sanitizer_mac.cc
> >> @@ -217,13 +217,7 @@
> >> return sysconf(_SC_PAGESIZE);
> >> }
> >>
> >> -BlockingMutex::BlockingMutex(LinkerInitialized) {
> >> - // We assume that OS_SPINLOCK_INIT is zero
> >> -}
> >> -
> >> -BlockingMutex::BlockingMutex() {
> >> - internal_memset(this, 0, sizeof(*this));
> >> -}
> >> +BlockingMutex::BlockingMutex() {}
> >>
> >> void BlockingMutex::Lock() {
> >> CHECK(sizeof(OSSpinLock) <= sizeof(opaque_storage_));
> >> Index: lib/sanitizer_common/sanitizer_mutex.h
> >> ===================================================================
> >> --- lib/sanitizer_common/sanitizer_mutex.h
> >> +++ lib/sanitizer_common/sanitizer_mutex.h
> >> @@ -73,14 +73,18 @@
> >>
> >> class BlockingMutex {
> >> public:
> >> +#if SANITIZER_WINDOWS
> >
> >
> > Should this be instead based on detecting constexpr support?
>
> Actually this one isn't related to constexpr. Windows implementation
> of BlockingMutex does not really support LinkerInitialized (due to
> some MS linker weirdness - see comments in sanitizer_win.cc). It has a
> completely different constructor so I decided to leave as is.
>
> >> explicit BlockingMutex(LinkerInitialized);
> >> +#else
> >> + explicit constexpr BlockingMutex(LinkerInitialized) {}
> >> +#endif
> >> BlockingMutex();
> >> void Lock();
> >> void Unlock();
> >> void CheckLocked();
> >> private:
> >> - uptr opaque_storage_[10];
> >> - uptr owner_; // for debugging
> >> + uptr opaque_storage_[10] = {};
> >
> >
> > I imagine these might not compile on the oldest version of MSVC we
> support
> > (not sure about other compilers in the support matrix)... might be worth
> > checking their respective documentation (linked from the LLVM coding
> style
> > guide)
>
> Indeed:
> http://stackoverflow.com/questions/18518761/visual-studio-2012-2013-in-class-member-initialization
>
> I could throw in more preprocessing or perhaps you see a better solution?
>
Nope, I don't know of any particularly better solution. I imagine just
conditionalizing this on the same property as the dtor is all there is to
do here.
>
> -Y
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20150126/743e2548/attachment.html>
More information about the llvm-commits
mailing list