<div dir="ltr"><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Oct 15, 2013 at 4:25 PM, Dmitry Vyukov <span dir="ltr"><<a href="mailto:dvyukov@google.com" target="_blank">dvyukov@google.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: dvyukov<br>
Date: Tue Oct 15 07:25:29 2013<br>
New Revision: 192692<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=192692&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=192692&view=rev</a><br>
Log:<br>
tsan: use sanitizer::CommonFlags in tsan<br>
<br>
<br>
Modified:<br>
    compiler-rt/trunk/lib/sanitizer_common/sanitizer_common.cc<br>
    compiler-rt/trunk/lib/sanitizer_common/sanitizer_flags.cc<br>
    compiler-rt/trunk/lib/sanitizer_common/sanitizer_flags.h<br>
    compiler-rt/trunk/lib/sanitizer_common/sanitizer_internal_defs.h<br>
    compiler-rt/trunk/lib/tsan/rtl/tsan_flags.cc<br>
    compiler-rt/trunk/lib/tsan/rtl/tsan_flags.h<br>
    compiler-rt/trunk/lib/tsan/rtl/tsan_rtl.cc<br>
    compiler-rt/trunk/lib/tsan/rtl/tsan_symbolize_addr2line_linux.cc<br>
<br>
Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_common.cc<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_common.cc?rev=192692&r1=192691&r2=192692&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_common.cc?rev=192692&r1=192691&r2=192692&view=diff</a><br>

==============================================================================<br>
--- compiler-rt/trunk/lib/sanitizer_common/sanitizer_common.cc (original)<br>
+++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_common.cc Tue Oct 15 07:25:29 2013<br>
@@ -202,7 +202,8 @@ using namespace __sanitizer;  // NOLINT<br>
<br>
 extern "C" {<br>
 void __sanitizer_set_report_path(const char *path) {<br>
-  if (!path) return;<br>
+  if (!path)<br>
+    return;<br>
   uptr len = internal_strlen(path);<br>
   if (len > sizeof(report_path_prefix) - 100) {<br>
     Report("ERROR: Path is too long: %c%c%c%c%c%c%c%c...\n",<br>
@@ -210,18 +211,21 @@ void __sanitizer_set_report_path(const c<br>
            path[4], path[5], path[6], path[7]);<br>
     Die();<br>
   }<br>
-  internal_strncpy(report_path_prefix, path, sizeof(report_path_prefix));<br>
-  report_path_prefix[len] = '\0';<br>
-  report_fd = kInvalidFd;<br>
-  log_to_file = true;<br>
-}<br>
-<br>
-void __sanitizer_set_report_fd(int fd) {<br></blockquote><div><br></div><div>This is an interface function. If it has no users in the outer world (I think we're unaware of them),</div><div>then it should be also deleted from include/sanitizer/common_interface_defs.h</div>
<div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
   if (report_fd != kStdoutFd &&<br>
       report_fd != kStderrFd &&<br>
       report_fd != kInvalidFd)<br>
     internal_close(report_fd);<br>
-  report_fd = fd;<br>
+  report_fd = kInvalidFd;<br>
+  log_to_file = false;<br>
+  if (internal_strcmp(path, "stdout") == 0) {<br>
+    report_fd = kStdoutFd;<br>
+  } else if (internal_strcmp(path, "stderr") == 0) {<br>
+    report_fd = kStderrFd;<br>
+  } else {<br>
+    internal_strncpy(report_path_prefix, path, sizeof(report_path_prefix));<br>
+    report_path_prefix[len] = '\0';<br>
+    log_to_file = true;<br>
+  }<br>
 }<br>
<br>
 void NOINLINE __sanitizer_sandbox_on_notify(void *reserved) {<br>
<br>
Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_flags.cc<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_flags.cc?rev=192692&r1=192691&r2=192692&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_flags.cc?rev=192692&r1=192691&r2=192692&view=diff</a><br>

==============================================================================<br>
--- compiler-rt/trunk/lib/sanitizer_common/sanitizer_flags.cc (original)<br>
+++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_flags.cc Tue Oct 15 07:25:29 2013<br>
@@ -18,8 +18,6 @@<br>
<br>
 namespace __sanitizer {<br>
<br>
-CommonFlags common_flags_dont_use_directly;<br>
-<br>
 void ParseCommonFlagsFromString(const char *str) {<br>
   CommonFlags *f = common_flags();<br>
   ParseFlag(str, &f->malloc_context_size, "malloc_context_size");<br>
<br>
Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_flags.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_flags.h?rev=192692&r1=192691&r2=192692&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_flags.h?rev=192692&r1=192691&r2=192692&view=diff</a><br>

==============================================================================<br>
--- compiler-rt/trunk/lib/sanitizer_common/sanitizer_flags.h (original)<br>
+++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_flags.h Tue Oct 15 07:25:29 2013<br>
@@ -37,7 +37,9 @@ struct CommonFlags {<br>
   bool handle_ioctl;<br>
   // Max number of stack frames kept for each allocation/deallocation.<br>
   int malloc_context_size;<br>
-  // Write logs to "log_path.pid" instead of stderr.<br>
+  // Write logs to "log_path.pid".<br>
+  // The special values are "stdout" and "stderr".<br>
+  // The default is "stderr".<br>
   const char *log_path;<br>
   // Enable memory leak detection.<br>
   bool detect_leaks;<br>
@@ -49,10 +51,9 @@ struct CommonFlags {<br>
   bool allocator_may_return_null;<br>
 };<br>
<br>
-extern CommonFlags common_flags_dont_use_directly;<br>
-<br>
 inline CommonFlags *common_flags() {<br>
-  return &common_flags_dont_use_directly;<br>
+  static CommonFlags f;<br>
+  return &f;<br>
 }<br>
<br>
 void ParseCommonFlagsFromString(const char *str);<br>
<br>
Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_internal_defs.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_internal_defs.h?rev=192692&r1=192691&r2=192692&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_internal_defs.h?rev=192692&r1=192691&r2=192692&view=diff</a><br>

==============================================================================<br>
--- compiler-rt/trunk/lib/sanitizer_common/sanitizer_internal_defs.h (original)<br>
+++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_internal_defs.h Tue Oct 15 07:25:29 2013<br>
@@ -83,14 +83,10 @@ typedef u64  OFF64_T;<br>
<br>
 extern "C" {<br>
   // Tell the tools to write their reports to "path.<pid>" instead of stderr.<br>
+  // The special values are "stdout" and "stderr".<br>
   SANITIZER_INTERFACE_ATTRIBUTE<br>
   void __sanitizer_set_report_path(const char *path);<br>
<br>
-  // Tell the tools to write their reports to given file descriptor instead of<br>
-  // stderr.<br>
-  SANITIZER_INTERFACE_ATTRIBUTE<br>
-  void __sanitizer_set_report_fd(int fd);<br>
-<br>
   // Notify the tools that the sandbox is going to be turned on. The reserved<br>
   // parameter will be used in the future to hold a structure with functions<br>
   // that the tools may call to bypass the sandbox.<br>
<br>
Modified: compiler-rt/trunk/lib/tsan/rtl/tsan_flags.cc<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/rtl/tsan_flags.cc?rev=192692&r1=192691&r2=192692&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/rtl/tsan_flags.cc?rev=192692&r1=192691&r2=192692&view=diff</a><br>

==============================================================================<br>
--- compiler-rt/trunk/lib/tsan/rtl/tsan_flags.cc (original)<br>
+++ compiler-rt/trunk/lib/tsan/rtl/tsan_flags.cc Tue Oct 15 07:25:29 2013<br>
@@ -47,13 +47,11 @@ void InitializeFlags(Flags *f, const cha<br>
   f->report_signal_unsafe = true;<br>
   f->report_atomic_races = true;<br>
   f->force_seq_cst_atomics = false;<br>
-  f->strip_path_prefix = "";<br>
   f->suppressions = "";<br>
   f->print_suppressions = false;<br>
   f->print_benign = false;<br>
   f->exitcode = 66;<br>
   f->halt_on_error = false;<br>
-  f->log_path = "stderr";<br>
   f->atexit_sleep_ms = 1000;<br>
   f->verbosity = 0;<br>
   f->profile_memory = "";<br>
@@ -62,10 +60,8 @@ void InitializeFlags(Flags *f, const cha<br>
   f->memory_limit_mb = 0;<br>
   f->stop_on_start = false;<br>
   f->running_on_valgrind = false;<br>
-  f->external_symbolizer_path = "";<br>
   f->history_size = kGoMode ? 1 : 2;  // There are a lot of goroutines in Go.<br>
   f->io_sync = 1;<br>
-  f->allocator_may_return_null = false;<br>
<br>
   // Let a frontend override.<br>
   OverrideFlags(f);<br>
@@ -81,13 +77,11 @@ void InitializeFlags(Flags *f, const cha<br>
   ParseFlag(env, &f->report_signal_unsafe, "report_signal_unsafe");<br>
   ParseFlag(env, &f->report_atomic_races, "report_atomic_races");<br>
   ParseFlag(env, &f->force_seq_cst_atomics, "force_seq_cst_atomics");<br>
-  ParseFlag(env, &f->strip_path_prefix, "strip_path_prefix");<br>
   ParseFlag(env, &f->suppressions, "suppressions");<br>
   ParseFlag(env, &f->print_suppressions, "print_suppressions");<br>
   ParseFlag(env, &f->print_benign, "print_benign");<br>
   ParseFlag(env, &f->exitcode, "exitcode");<br>
   ParseFlag(env, &f->halt_on_error, "halt_on_error");<br>
-  ParseFlag(env, &f->log_path, "log_path");<br>
   ParseFlag(env, &f->atexit_sleep_ms, "atexit_sleep_ms");<br>
   ParseFlag(env, &f->verbosity, "verbosity");<br>
   ParseFlag(env, &f->profile_memory, "profile_memory");<br>
@@ -95,10 +89,8 @@ void InitializeFlags(Flags *f, const cha<br>
   ParseFlag(env, &f->flush_symbolizer_ms, "flush_symbolizer_ms");<br>
   ParseFlag(env, &f->memory_limit_mb, "memory_limit_mb");<br>
   ParseFlag(env, &f->stop_on_start, "stop_on_start");<br>
-  ParseFlag(env, &f->external_symbolizer_path, "external_symbolizer_path");<br>
   ParseFlag(env, &f->history_size, "history_size");<br>
   ParseFlag(env, &f->io_sync, "io_sync");<br>
-  ParseFlag(env, &f->allocator_may_return_null, "allocator_may_return_null");<br>
<br>
   if (!f->report_bugs) {<br>
     f->report_thread_leaks = false;<br>
@@ -118,8 +110,13 @@ void InitializeFlags(Flags *f, const cha<br>
     Die();<br>
   }<br>
<br>
-  common_flags()->allocator_may_return_null = f->allocator_may_return_null;<br>
-  common_flags()->strip_path_prefix = f->strip_path_prefix;<br>
+  *common_flags() = *f;<br>
+  ParseCommonFlagsFromString("strip_path_prefix=");<br>
+  ParseCommonFlagsFromString("log_path=stderr");<br>
+  ParseCommonFlagsFromString("external_symbolizer_path=");<br>
+  ParseCommonFlagsFromString("allocator_may_return_null=0");<br>
+  ParseCommonFlagsFromString(env);<br>
+  *static_cast<CommonFlags*>(f) = *common_flags();<br>
 }<br>
<br>
 }  // namespace __tsan<br>
<br>
Modified: compiler-rt/trunk/lib/tsan/rtl/tsan_flags.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/rtl/tsan_flags.h?rev=192692&r1=192691&r2=192692&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/rtl/tsan_flags.h?rev=192692&r1=192691&r2=192692&view=diff</a><br>

==============================================================================<br>
--- compiler-rt/trunk/lib/tsan/rtl/tsan_flags.h (original)<br>
+++ compiler-rt/trunk/lib/tsan/rtl/tsan_flags.h Tue Oct 15 07:25:29 2013<br>
@@ -20,9 +20,11 @@<br>
 // header may be included in the user code, and shouldn't include<br>
 // other headers from TSan or common sanitizer runtime.<br>
<br>
+#include "sanitizer_common/sanitizer_flags.h"<br>
+<br>
 namespace __tsan {<br>
<br>
-struct Flags {<br>
+struct Flags : CommonFlags {<br>
   // Enable dynamic annotations, otherwise they are no-ops.<br>
   bool enable_annotations;<br>
   // Supress a race report if we've already output another race report<br>
@@ -48,8 +50,6 @@ struct Flags {<br>
   // If set, all atomics are effectively sequentially consistent (seq_cst),<br>
   // regardless of what user actually specified.<br>
   bool force_seq_cst_atomics;<br>
-  // Strip that prefix from file paths in reports.<br>
-  const char *strip_path_prefix;<br>
   // Suppressions filename.<br>
   const char *suppressions;<br>
   // Print matched suppressions at exit.<br>
@@ -60,10 +60,6 @@ struct Flags {<br>
   int exitcode;<br>
   // Exit after first reported error.<br>
   bool halt_on_error;<br>
-  // Write logs to "log_path.pid".<br>
-  // The special values are "stdout" and "stderr".<br>
-  // The default is "stderr".<br>
-  const char *log_path;<br>
   // Sleep in main thread before exiting for that many ms<br>
   // (useful to catch "at exit" races).<br>
   int atexit_sleep_ms;<br>
@@ -82,8 +78,6 @@ struct Flags {<br>
   bool stop_on_start;<br>
   // Controls whether RunningOnValgrind() returns true or false.<br>
   bool running_on_valgrind;<br>
-  // Path to external symbolizer.<br>
-  const char *external_symbolizer_path;<br>
   // Per-thread history size, controls how many previous memory accesses<br>
   // are remembered per thread.  Possible values are [0..7].<br>
   // history_size=0 amounts to 32K memory accesses.  Each next value doubles<br>
@@ -95,8 +89,6 @@ struct Flags {<br>
   // 1 - reasonable level of synchronization (write->read)<br>
   // 2 - global synchronization of all IO operations<br>
   int io_sync;<br>
-  // If false, the allocator will crash instead of returning 0 on out-of-memory.<br>
-  bool allocator_may_return_null;<br>
 };<br>
<br>
 Flags *flags();<br>
<br>
Modified: compiler-rt/trunk/lib/tsan/rtl/tsan_rtl.cc<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/rtl/tsan_rtl.cc?rev=192692&r1=192691&r2=192692&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/rtl/tsan_rtl.cc?rev=192692&r1=192691&r2=192692&view=diff</a><br>

==============================================================================<br>
--- compiler-rt/trunk/lib/tsan/rtl/tsan_rtl.cc (original)<br>
+++ compiler-rt/trunk/lib/tsan/rtl/tsan_rtl.cc Tue Oct 15 07:25:29 2013<br>
@@ -231,12 +231,7 @@ void Initialize(ThreadState *thr) {<br>
 #endif<br>
   InitializeFlags(&ctx->flags, env);<br>
   // Setup correct file descriptor for error reports.<br>
-  if (internal_strcmp(flags()->log_path, "stdout") == 0)<br>
-    __sanitizer_set_report_fd(kStdoutFd);<br>
-  else if (internal_strcmp(flags()->log_path, "stderr") == 0)<br>
-    __sanitizer_set_report_fd(kStderrFd);<br>
-  else<br>
-    __sanitizer_set_report_path(flags()->log_path);<br>
+  __sanitizer_set_report_path(flags()->log_path);<br>
   InitializeSuppressions();<br>
 #ifndef TSAN_GO<br>
   InitializeLibIgnore();<br>
<br>
Modified: compiler-rt/trunk/lib/tsan/rtl/tsan_symbolize_addr2line_linux.cc<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/rtl/tsan_symbolize_addr2line_linux.cc?rev=192692&r1=192691&r2=192692&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/rtl/tsan_symbolize_addr2line_linux.cc?rev=192692&r1=192691&r2=192692&view=diff</a><br>

==============================================================================<br>
--- compiler-rt/trunk/lib/tsan/rtl/tsan_symbolize_addr2line_linux.cc (original)<br>
+++ compiler-rt/trunk/lib/tsan/rtl/tsan_symbolize_addr2line_linux.cc Tue Oct 15 07:25:29 2013<br>
@@ -60,7 +60,6 @@ static void NOINLINE InitModule(ModuleDe<br>
   }<br>
   int pid = fork();<br>
   if (pid == 0) {<br>
-    __sanitizer_set_report_fd(STDERR_FILENO);<br>
     internal_close(STDOUT_FILENO);<br>
     internal_close(STDIN_FILENO);<br>
     internal_dup2(outfd[0], STDIN_FILENO);<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@cs.uiuc.edu">llvm-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits</a><br>
</blockquote></div><br><br clear="all"><div><br></div>-- <br><div>Alexey Samsonov, MSK</div>
</div></div>