summaryrefslogtreecommitdiffstats
path: root/compiler-rt/test/lsan
diff options
context:
space:
mode:
authorFrancis Ricci <francisjricci@gmail.com>2017-06-19 14:09:10 +0000
committerFrancis Ricci <francisjricci@gmail.com>2017-06-19 14:09:10 +0000
commit4f1e047a6d2a2abec905a6885c5146966c448cb1 (patch)
tree878ef8bc2792017f9caa3608ae201b495a42ca8e /compiler-rt/test/lsan
parentfd44ca6c76c1e9ae0a934fc217cdb62504d9dd97 (diff)
downloadbcm5719-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.mm59
-rw-r--r--compiler-rt/test/lsan/TestCases/Darwin/lit.local.cfg9
-rw-r--r--compiler-rt/test/lsan/lit.common.cfg2
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']
OpenPOWER on IntegriCloud