summaryrefslogtreecommitdiffstats
path: root/compiler-rt/lib/tsan/lit_tests/ignore_lib1.cc
diff options
context:
space:
mode:
authorDmitry Vyukov <dvyukov@google.com>2013-10-03 13:37:17 +0000
committerDmitry Vyukov <dvyukov@google.com>2013-10-03 13:37:17 +0000
commit5ba736457c94580b9cf8a0a65fccf9a89da0b1a6 (patch)
treeafa352b57a63c0e8b42932077375b7c6310a3515 /compiler-rt/lib/tsan/lit_tests/ignore_lib1.cc
parentd2757ba1be2915c8f41dd850ffdda8ff6a673382 (diff)
downloadbcm5719-llvm-5ba736457c94580b9cf8a0a65fccf9a89da0b1a6.tar.gz
bcm5719-llvm-5ba736457c94580b9cf8a0a65fccf9a89da0b1a6.zip
tsan: ignore interceptors coming from specified libraries
LibIgnore allows to ignore all interceptors called from a particular set of dynamic libraries. LibIgnore remembers all "called_from_lib" suppressions from the provided SuppressionContext; finds code ranges for the libraries; and checks whether the provided PC value belongs to the code ranges. Also make malloc and friends interceptors use SCOPED_INTERCEPTOR_RAW instead of SCOPED_TSAN_INTERCEPTOR, because if they are called from an ignored lib, then must call our internal allocator instead of libc malloc. llvm-svn: 191897
Diffstat (limited to 'compiler-rt/lib/tsan/lit_tests/ignore_lib1.cc')
-rw-r--r--compiler-rt/lib/tsan/lit_tests/ignore_lib1.cc42
1 files changed, 42 insertions, 0 deletions
diff --git a/compiler-rt/lib/tsan/lit_tests/ignore_lib1.cc b/compiler-rt/lib/tsan/lit_tests/ignore_lib1.cc
new file mode 100644
index 00000000000..c4f2e734413
--- /dev/null
+++ b/compiler-rt/lib/tsan/lit_tests/ignore_lib1.cc
@@ -0,0 +1,42 @@
+// RUN: %clangxx_tsan -O1 %s -DLIB -fPIC -fno-sanitize=thread -shared -o %T/libignore_lib1.so
+// RUN: %clangxx_tsan -O1 %s -o %t
+// RUN: echo running w/o suppressions:
+// RUN: not %t 2>&1 | FileCheck %s --check-prefix=CHECK-NOSUPP
+// RUN: echo running with suppressions:
+// RUN: TSAN_OPTIONS="$TSAN_OPTIONS suppressions=%s.supp" %t 2>&1 | FileCheck %s --check-prefix=CHECK-WITHSUPP
+
+// Tests that interceptors coming from a dynamically loaded library specified
+// in called_from_lib suppression are ignored.
+
+#ifndef LIB
+
+#include <dlfcn.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <errno.h>
+#include <libgen.h>
+#include <string>
+
+int main(int argc, char **argv) {
+ std::string lib = std::string(dirname(argv[0])) + "/libignore_lib1.so";
+ void *h = dlopen(lib.c_str(), RTLD_GLOBAL | RTLD_NOW);
+ if (h == 0)
+ exit(printf("failed to load the library (%d)\n", errno));
+ void (*f)() = (void(*)())dlsym(h, "libfunc");
+ if (f == 0)
+ exit(printf("failed to find the func (%d)\n", errno));
+ f();
+}
+
+#else // #ifdef LIB
+
+#include "ignore_lib_lib.h"
+
+#endif // #ifdef LIB
+
+// CHECK-NOSUPP: WARNING: ThreadSanitizer: data race
+// CHECK-NOSUPP: OK
+
+// CHECK-WITHSUPP-NOT: WARNING: ThreadSanitizer: data race
+// CHECK-WITHSUPP: OK
+
OpenPOWER on IntegriCloud