[TSan][libdispatch] Guard test execution on old platforms

`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
This commit is contained in:
Julian Lettner 2020-08-14 13:42:50 -07:00
parent 686fe293e6
commit 40ae296bc3
1 changed files with 14 additions and 1 deletions

View 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.