diff options
author | Francis Ricci <francisjricci@gmail.com> | 2017-06-19 14:09:10 +0000 |
---|---|---|
committer | Francis Ricci <francisjricci@gmail.com> | 2017-06-19 14:09:10 +0000 |
commit | 4f1e047a6d2a2abec905a6885c5146966c448cb1 (patch) | |
tree | 878ef8bc2792017f9caa3608ae201b495a42ca8e /compiler-rt/test/lsan | |
parent | fd44ca6c76c1e9ae0a934fc217cdb62504d9dd97 (diff) | |
download | bcm5719-llvm-4f1e047a6d2a2abec905a6885c5146966c448cb1.tar.gz bcm5719-llvm-4f1e047a6d2a2abec905a6885c5146966c448cb1.zip |
Add lsan interceptors for libdispatch functions on darwin
Summary:
This is required for standalone LSan to work with libdispatch worker threads,
and is a slimmed down version of the functionality provided for ASan
in asan_mac.cc.
Reviewers: alekseyshl, kubamracek, glider, kcc
Subscribers: mgorny, llvm-commits
Differential Revision: https://reviews.llvm.org/D34247
llvm-svn: 305695
Diffstat (limited to 'compiler-rt/test/lsan')
-rw-r--r-- | compiler-rt/test/lsan/TestCases/Darwin/dispatch.mm | 59 | ||||
-rw-r--r-- | compiler-rt/test/lsan/TestCases/Darwin/lit.local.cfg | 9 | ||||
-rw-r--r-- | compiler-rt/test/lsan/lit.common.cfg | 2 |
3 files changed, 69 insertions, 1 deletions
diff --git a/compiler-rt/test/lsan/TestCases/Darwin/dispatch.mm b/compiler-rt/test/lsan/TestCases/Darwin/dispatch.mm new file mode 100644 index 00000000000..2472230d7a7 --- /dev/null +++ b/compiler-rt/test/lsan/TestCases/Darwin/dispatch.mm @@ -0,0 +1,59 @@ +// Test for threads spawned with wqthread_start +// RUN: LSAN_BASE="report_objects=1" +// RUN: %clangxx_lsan %s -DDISPATCH_ASYNC -o %t-async -framework Foundation +// RUN: %clangxx_lsan %s -DDISPATCH_SYNC -o %t-sync -framework Foundation +// RUN: %env_lsan_opts=$LSAN_BASE not %run %t-async 2>&1 | FileCheck %s +// RUN: %env_lsan_opts=$LSAN_BASE not %run %t-sync 2>&1 | FileCheck %s + +#include <dispatch/dispatch.h> +#include <pthread.h> +#include <stdlib.h> + +#include "sanitizer_common/print_address.h" + +bool done = false; + +void worker_do_leak(int size) { + void *p = malloc(size); + print_address("Test alloc: ", 1, p); + done = true; +} + +#if DISPATCH_ASYNC +// Tests for the Grand Central Dispatch. See +// http://developer.apple.com/library/mac/#documentation/Performance/Reference/GCD_libdispatch_Ref/Reference/reference.html +// for the reference. +void TestGCDDispatch() { + dispatch_queue_t queue = dispatch_get_global_queue(0, 0); + dispatch_block_t block = ^{ + worker_do_leak(1337); + }; + // dispatch_async() runs the task on a worker thread that does not go through + // pthread_create(). We need to verify that LeakSanitizer notices that the + // thread has started. + dispatch_async(queue, block); + while (!done) + pthread_yield_np(); +} +#elif DISPATCH_SYNC +void TestGCDDispatch() { + dispatch_queue_t queue = dispatch_get_global_queue(2, 0); + dispatch_block_t block = ^{ + worker_do_leak(1337); + }; + // dispatch_sync() runs the task on a worker thread that does not go through + // pthread_create(). We need to verify that LeakSanitizer notices that the + // thread has started. + dispatch_sync(queue, block); +} +#endif + +int main() { + TestGCDDispatch(); + return 0; +} + +// CHECK: Test alloc: [[addr:0x[0-9,a-f]+]] +// CHECK: LeakSanitizer: detected memory leaks +// CHECK: [[addr]] (1337 bytes) +// CHECK: SUMMARY: {{(Leak|Address)}}Sanitizer: diff --git a/compiler-rt/test/lsan/TestCases/Darwin/lit.local.cfg b/compiler-rt/test/lsan/TestCases/Darwin/lit.local.cfg new file mode 100644 index 00000000000..a85dfcd24c0 --- /dev/null +++ b/compiler-rt/test/lsan/TestCases/Darwin/lit.local.cfg @@ -0,0 +1,9 @@ +def getRoot(config): + if not config.parent: + return config + return getRoot(config.parent) + +root = getRoot(config) + +if root.host_os not in ['Darwin']: + config.unsupported = True diff --git a/compiler-rt/test/lsan/lit.common.cfg b/compiler-rt/test/lsan/lit.common.cfg index 309e8f27be6..610b1b1ad95 100644 --- a/compiler-rt/test/lsan/lit.common.cfg +++ b/compiler-rt/test/lsan/lit.common.cfg @@ -77,4 +77,4 @@ if not (supported_linux or supported_darwin): if re.search('mthumb', config.target_cflags) is not None: config.unsupported = True -config.suffixes = ['.c', '.cc', '.cpp'] +config.suffixes = ['.c', '.cc', '.cpp', '.mm'] |