[TSan][libdispatch] Guard test execution on old platforms
authorJulian Lettner <julian.lettner@apple.com>
Fri, 14 Aug 2020 20:42:50 +0000 (13:42 -0700)
committerJulian Lettner <julian.lettner@apple.com>
Wed, 19 Aug 2020 01:34:14 +0000 (18:34 -0700)
`dispatch_async_and_wait()` was introduced in macOS 10.14.  Let's
forward declare it to ensure we can compile the test with older SDKs and
guard execution by checking if the symbol is available.  (We can't use
`__builtin_available()`, because that itself requires a higher minimum
deployment target.)  We also need to specify the `-undefined
dynamic_lookup` compiler flag.

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

compiler-rt/test/tsan/libdispatch/async_and_wait.c

index 5e63c11..b8d2398 100644 (file)
@@ -1,13 +1,25 @@
-// RUN: %clang_tsan %s -o %t
+// RUN: %clang_tsan %s -o %t -undefined dynamic_lookup
 // RUN: %run %t 2>&1 | FileCheck %s --implicit-check-not='ThreadSanitizer'
 
 #include "dispatch/dispatch.h"
 
 #include <stdio.h>
 
+// Allow compilation with pre-macOS 10.14 (and aligned) SDKs
+API_AVAILABLE(macos(10.14), ios(12.0), tvos(12.0), watchos(5.0))
+DISPATCH_EXPORT DISPATCH_NONNULL_ALL DISPATCH_NOTHROW
+void dispatch_async_and_wait(dispatch_queue_t queue,
+           DISPATCH_NOESCAPE dispatch_block_t block);
+
 long global;
 
 int main() {
+  // Guard execution on pre-macOS 10.14 (and aligned) platforms
+  if (dispatch_async_and_wait == NULL) {
+    fprintf(stderr, "Done.\n");
+    return 0;
+  }
+
   dispatch_queue_t q = dispatch_queue_create("my.queue", DISPATCH_QUEUE_SERIAL);
   dispatch_semaphore_t s = dispatch_semaphore_create(0);
 
@@ -26,6 +38,7 @@ int main() {
   global++;
 
   fprintf(stderr, "Done.\n");
+  return 0;
 }
 
 // CHECK: Done.