summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEvgeniy Stepanov <eugeni.stepanov@gmail.com>2013-09-27 12:40:23 +0000
committerEvgeniy Stepanov <eugeni.stepanov@gmail.com>2013-09-27 12:40:23 +0000
commit01781722b6938d6d28677108e52dedb20347f47b (patch)
tree4e191827f93cff97367173229ac72d1fb3784c16
parenta515070eb3f8610beaf18ca9b3ee19cd71fc5704 (diff)
downloadbcm5719-llvm-01781722b6938d6d28677108e52dedb20347f47b.tar.gz
bcm5719-llvm-01781722b6938d6d28677108e52dedb20347f47b.zip
[sanitizer] Intercept backtrace, backtrace_symbols.
llvm-svn: 191516
-rw-r--r--compiler-rt/lib/msan/lit_tests/backtrace.cc26
-rw-r--r--compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors.inc33
-rw-r--r--compiler-rt/lib/sanitizer_common/sanitizer_platform_interceptors.h1
-rw-r--r--compiler-rt/lib/tsan/rtl/tsan_stat.cc2
-rw-r--r--compiler-rt/lib/tsan/rtl/tsan_stat.h2
5 files changed, 63 insertions, 1 deletions
diff --git a/compiler-rt/lib/msan/lit_tests/backtrace.cc b/compiler-rt/lib/msan/lit_tests/backtrace.cc
new file mode 100644
index 00000000000..48684c29c60
--- /dev/null
+++ b/compiler-rt/lib/msan/lit_tests/backtrace.cc
@@ -0,0 +1,26 @@
+// RUN: %clangxx_msan -m64 -O0 %s -o %t && %t
+
+#include <assert.h>
+#include <execinfo.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+__attribute__((noinline))
+void f() {
+ void *buf[10];
+ int sz = backtrace(buf, sizeof(buf) / sizeof(*buf));
+ assert(sz > 0);
+ for (int i = 0; i < sz; ++i)
+ if (!buf[i])
+ exit(1);
+ char **s = backtrace_symbols(buf, sz);
+ assert(s > 0);
+ for (int i = 0; i < sz; ++i)
+ printf("%d\n", strlen(s[i]));
+}
+
+int main(void) {
+ f();
+ return 0;
+}
diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors.inc b/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors.inc
index 453a80b3561..43eadb8e608 100644
--- a/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors.inc
+++ b/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors.inc
@@ -2114,6 +2114,36 @@ INTERCEPTOR(int, sigprocmask, int how, __sanitizer_sigset_t *set,
#define INIT_SIGPROCMASK
#endif
+#if SANITIZER_INTERCEPT_BACKTRACE
+INTERCEPTOR(int, backtrace, void **buffer, int size) {
+ void *ctx;
+ COMMON_INTERCEPTOR_ENTER(ctx, backtrace, buffer, size);
+ int res = REAL(backtrace)(buffer, size);
+ if (res && buffer)
+ COMMON_INTERCEPTOR_WRITE_RANGE(ctx, buffer, res * sizeof(*buffer));
+ return res;
+}
+
+INTERCEPTOR(char **, backtrace_symbols, void **buffer, int size) {
+ void *ctx;
+ COMMON_INTERCEPTOR_ENTER(ctx, backtrace_symbols, buffer, size);
+ if (buffer && size)
+ COMMON_INTERCEPTOR_READ_RANGE(ctx, buffer, size * sizeof(*buffer));
+ char ** res = REAL(backtrace_symbols)(buffer, size);
+ if (res && size) {
+ COMMON_INTERCEPTOR_WRITE_RANGE(ctx, res, size * sizeof(*res));
+ for (int i = 0; i < size; ++i)
+ COMMON_INTERCEPTOR_WRITE_RANGE(ctx, res[i], REAL(strlen(res[i])) + 1);
+ }
+ return res;
+}
+#define INIT_BACKTRACE \
+ INTERCEPT_FUNCTION(backtrace); \
+ INTERCEPT_FUNCTION(backtrace_symbols);
+#else
+#define INIT_BACKTRACE
+#endif
+
#define SANITIZER_COMMON_INTERCEPTORS_INIT \
INIT_STRCMP; \
INIT_STRNCMP; \
@@ -2189,4 +2219,5 @@ INTERCEPTOR(int, sigprocmask, int how, __sanitizer_sigset_t *set,
INIT_SIGTIMEDWAIT; \
INIT_SIGSETOPS; \
INIT_SIGPENDING; \
- INIT_SIGPROCMASK;
+ INIT_SIGPROCMASK; \
+ INIT_BACKTRACE;
diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_platform_interceptors.h b/compiler-rt/lib/sanitizer_common/sanitizer_platform_interceptors.h
index 059fb695b65..ce69ce094ef 100644
--- a/compiler-rt/lib/sanitizer_common/sanitizer_platform_interceptors.h
+++ b/compiler-rt/lib/sanitizer_common/sanitizer_platform_interceptors.h
@@ -125,5 +125,6 @@
# define SANITIZER_INTERCEPT_SIGSETOPS SI_NOT_WINDOWS
# define SANITIZER_INTERCEPT_SIGPENDING SI_NOT_WINDOWS
# define SANITIZER_INTERCEPT_SIGPROCMASK SI_NOT_WINDOWS
+# define SANITIZER_INTERCEPT_BACKTRACE SI_LINUX_NOT_ANDROID
#endif // #ifndef SANITIZER_PLATFORM_INTERCEPTORS_H
diff --git a/compiler-rt/lib/tsan/rtl/tsan_stat.cc b/compiler-rt/lib/tsan/rtl/tsan_stat.cc
index 522c477c9ba..3a2173e2806 100644
--- a/compiler-rt/lib/tsan/rtl/tsan_stat.cc
+++ b/compiler-rt/lib/tsan/rtl/tsan_stat.cc
@@ -369,6 +369,8 @@ void StatOutput(u64 *stat) {
name[StatInt_sigfillset] = " sigfillset ";
name[StatInt_sigpending] = " sigpending ";
name[StatInt_sigprocmask] = " sigprocmask ";
+ name[StatInt_backtrace] = " backtrace ";
+ name[StatInt_backtrace_symbols] = " backtrace_symbols ";
name[StatAnnotation] = "Dynamic annotations ";
name[StatAnnotateHappensBefore] = " HappensBefore ";
diff --git a/compiler-rt/lib/tsan/rtl/tsan_stat.h b/compiler-rt/lib/tsan/rtl/tsan_stat.h
index 6cac0286493..526190c2d28 100644
--- a/compiler-rt/lib/tsan/rtl/tsan_stat.h
+++ b/compiler-rt/lib/tsan/rtl/tsan_stat.h
@@ -364,6 +364,8 @@ enum StatType {
StatInt_sigfillset,
StatInt_sigpending,
StatInt_sigprocmask,
+ StatInt_backtrace,
+ StatInt_backtrace_symbols,
// Dynamic annotations.
StatAnnotation,
OpenPOWER on IntegriCloud