summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexey Samsonov <samsonov@google.com>2012-11-02 09:23:36 +0000
committerAlexey Samsonov <samsonov@google.com>2012-11-02 09:23:36 +0000
commitac8564e7ce11e31b1d29e92dbbcfa1a5d36bc596 (patch)
treeacd0de55e1439f2699c5b8c7ad5518d9cedee36c
parentea0177e2b8bb5d1dbd22c7e2776f6299fa712799 (diff)
downloadcompiler-rt-ac8564e7ce11e31b1d29e92dbbcfa1a5d36bc596.tar.gz
[Sanitizer]: add __sanitizer_set_report_fd function to alter file descriptor for error reports
git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@167290 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--include/sanitizer/common_interface_defs.h5
-rw-r--r--lib/sanitizer_common/sanitizer_common.cc16
2 files changed, 20 insertions, 1 deletions
diff --git a/include/sanitizer/common_interface_defs.h b/include/sanitizer/common_interface_defs.h
index cbce63f1c..466631802 100644
--- a/include/sanitizer/common_interface_defs.h
+++ b/include/sanitizer/common_interface_defs.h
@@ -63,6 +63,11 @@ extern "C" {
// Tell the tools to write their reports to "path.<pid>" instead of stderr.
void __sanitizer_set_report_path(const char *path)
SANITIZER_INTERFACE_ATTRIBUTE;
+
+ // Tell the tools to write their reports to given file descriptor instead of
+ // stderr.
+ void __sanitizer_set_report_fd(int fd)
+ SANITIZER_INTERFACE_ATTRIBUTE;
} // extern "C"
#endif // SANITIZER_COMMON_INTERFACE_DEFS_H
diff --git a/lib/sanitizer_common/sanitizer_common.cc b/lib/sanitizer_common/sanitizer_common.cc
index 614b7b9d4..e6526f524 100644
--- a/lib/sanitizer_common/sanitizer_common.cc
+++ b/lib/sanitizer_common/sanitizer_common.cc
@@ -16,7 +16,9 @@
namespace __sanitizer {
-static fd_t report_fd = 2; // By default, dump to stderr.
+// By default, dump to stderr. If report_fd is kInvalidFd, try to obtain file
+// descriptor by opening file in report_path.
+static fd_t report_fd = 2;
static char report_path[4096]; // Set via __sanitizer_set_report_path.
static void (*DieCallback)(void);
@@ -138,6 +140,10 @@ void SortArray(uptr *array, uptr size) {
} // namespace __sanitizer
+using namespace __sanitizer; // NOLINT
+
+extern "C" {
+
void __sanitizer_set_report_path(const char *path) {
if (!path) return;
uptr len = internal_strlen(path);
@@ -151,3 +157,11 @@ void __sanitizer_set_report_path(const char *path) {
sizeof(__sanitizer::report_path), "%s.%d", path, GetPid());
__sanitizer::report_fd = kInvalidFd;
}
+
+void __sanitizer_set_report_fd(int fd) {
+ if (__sanitizer::report_fd > 2 && __sanitizer::report_fd != kInvalidFd)
+ internal_close(__sanitizer::report_fd);
+ __sanitizer::report_fd = fd;
+}
+
+} // extern "C"