[compiler-rt] r286693 - [tsan] Test that false races from ObjC's dealloc, .cxx_destruct, and initialize are ignored

Vedant Kumar via llvm-commits llvm-commits at lists.llvm.org
Mon Nov 14 12:21:25 PST 2016


Hi Anna,

This is failing on our internal bots because the clang invocation picks the
DarwinClang toolchain, instead of the MachO toolchain.

The DarwinClang toolchain's override of AddLinkARCArgs() forces the linker to
load in libarclite_osx.a, which doesn't ship with clang. That causes a
link-time failure.

Could you please revert this commit until I can work out what the right fix is?

An easy fix may be to somehow force clang to use the MachO toolchain, but that
doesn't sound correct..

thanks
vedant
 
> On Nov 11, 2016, at 4:46 PM, Anna Zaks via llvm-commits <llvm-commits at lists.llvm.org> wrote:
> 
> Author: zaks
> Date: Fri Nov 11 18:46:07 2016
> New Revision: 286693
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=286693&view=rev
> Log:
> [tsan] Test that false races from ObjC's dealloc, .cxx_destruct, and initialize are ignored
> 
> Differential Revision: https://reviews.llvm.org/D26228
> 
> Added:
>    compiler-rt/trunk/test/tsan/Darwin/norace-objcxx-run-time.mm
> 
> Added: compiler-rt/trunk/test/tsan/Darwin/norace-objcxx-run-time.mm
> URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/tsan/Darwin/norace-objcxx-run-time.mm?rev=286693&view=auto
> ==============================================================================
> --- compiler-rt/trunk/test/tsan/Darwin/norace-objcxx-run-time.mm (added)
> +++ compiler-rt/trunk/test/tsan/Darwin/norace-objcxx-run-time.mm Fri Nov 11 18:46:07 2016
> @@ -0,0 +1,113 @@
> +// RUN: %clang_tsan %s -lc++ -fobjc-arc -lobjc -o %t -framework Foundation
> +// RUN: %env_tsan_opts=ignore_interceptors_accesses=1 %run %t 2>&1 | FileCheck %s
> +
> +// Check that we do not report races between:
> +// - Object retain and initialize
> +// - Object release and dealloc
> +// - Object release and .cxx_destruct
> +
> +#import <Foundation/Foundation.h>
> +#include "../test.h"
> +invisible_barrier_t barrier2;
> +
> +class NeedCleanup {
> +  public:
> +    int x;
> +    NeedCleanup() {
> +      x = 1;
> +    }
> +    ~NeedCleanup() {
> +      x = 0;
> +    }
> +};
> +
> + at interface TestDeallocObject : NSObject {
> +  @public
> +    int v;
> +  }
> +  - (id)init;
> +  - (void)accessMember;
> +  - (void)dealloc;
> + at end
> +
> + at implementation TestDeallocObject
> +  - (id)init {
> +    if ([super self]) {
> +      v = 1;
> +      return self;
> +    }
> +    return nil;
> +  }
> +  - (void)accessMember {
> +    int local = v;
> +    local++;
> +  }
> +  - (void)dealloc {
> +    v = 0;
> +  }
> + at end
> +
> + at interface TestCXXDestructObject : NSObject {
> +  @public
> +    NeedCleanup cxxMemberWithCleanup;
> +  }
> +  - (void)accessMember;
> + at end
> +
> + at implementation TestCXXDestructObject
> +  - (void)accessMember {
> +    int local = cxxMemberWithCleanup.x;
> +    local++;
> +  }
> + at end
> +
> + at interface TestInitializeObject : NSObject
> + at end
> +
> + at implementation TestInitializeObject
> +  static long InitializerAccessedGlobal = 0;
> +  + (void)initialize {
> +      InitializerAccessedGlobal = 42;
> +  }
> + at end
> +
> +int main(int argc, const char *argv[]) {
> +  // Ensure that there is no race when calling initialize on TestInitializeObject;
> +  // otherwise, the locking from ObjC runtime becomes observable. Also ensures that
> +  // blocks are dispatched to 2 different threads.
> +  barrier_init(&barrier, 2);
> +  // Ensure that objects are destructed during block object release.
> +  barrier_init(&barrier2, 3);
> +
> +  TestDeallocObject *tdo = [[TestDeallocObject alloc] init];
> +  TestCXXDestructObject *tcxxdo = [[TestCXXDestructObject alloc] init];
> +  [tdo accessMember];
> +  [tcxxdo accessMember];
> +  {
> +    dispatch_queue_t q = dispatch_queue_create(NULL, DISPATCH_QUEUE_CONCURRENT);
> +    dispatch_async(q, ^{
> +        [TestInitializeObject new];
> +        barrier_wait(&barrier);
> +        long local = InitializerAccessedGlobal;
> +        local++;
> +        [tdo accessMember];
> +        [tcxxdo accessMember];
> +        barrier_wait(&barrier2);
> +    });
> +    dispatch_async(q, ^{
> +        barrier_wait(&barrier);
> +        [TestInitializeObject new];
> +        long local = InitializerAccessedGlobal;
> +        local++;
> +        [tdo accessMember];
> +        [tcxxdo accessMember];
> +        barrier_wait(&barrier2);
> +    });
> +  }
> +  barrier_wait(&barrier2);
> +  NSLog(@"Done.");
> +  return 0;
> +}
> +
> +// CHECK: Done.
> +// CHECK-NOT: ThreadSanitizer: data race
> 
> 
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits



More information about the llvm-commits mailing list