<div dir="ltr">msan uses atexit for this. It obviously does not work when _exit is called directly.<div><br></div><div>This looks like a good idea, if it works.<br><div><br></div></div></div><div class="gmail_extra"><br><br>
<div class="gmail_quote">On Thu, Oct 3, 2013 at 6:08 PM, Kostya Serebryany <span dir="ltr"><<a href="mailto:kcc@google.com" target="_blank">kcc@google.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div dir="ltr">Does this apply to asan and msan? <div>Can we make this interceptor common? </div></div><div class="gmail_extra"><br><br><div class="gmail_quote">On Thu, Oct 3, 2013 at 6:00 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: Thu Oct  3 09:00:46 2013<br>
New Revision: 191898<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=191898&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=191898&view=rev</a><br>
Log:<br>
tsan: intercept _exit so that we can override exit status<br>
<br>
<br>
Modified:<br>
    compiler-rt/trunk/lib/tsan/rtl/tsan_flags.h<br>
    compiler-rt/trunk/lib/tsan/rtl/tsan_interceptors.cc<br>
    compiler-rt/trunk/lib/tsan/rtl/tsan_stat.cc<br>
    compiler-rt/trunk/lib/tsan/rtl/tsan_stat.h<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=191898&r1=191897&r2=191898&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/rtl/tsan_flags.h?rev=191898&r1=191897&r2=191898&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 Thu Oct  3 09:00:46 2013<br>
@@ -75,6 +75,9 @@ struct Flags {<br>
   int flush_memory_ms;<br>
   // Flush symbolizer caches every X ms.<br>
   int flush_symbolizer_ms;<br>
+  // Resident memory limit in MB to aim at.<br>
+  // If the process consumes more memory, then TSan will flush shadow memory.<br>
+  int memory_limit_mb;<br>
   // Stops on start until __tsan_resume() is called (for debugging).<br>
   bool stop_on_start;<br>
   // Controls whether RunningOnValgrind() returns true or false.<br>
<br>
Modified: compiler-rt/trunk/lib/tsan/rtl/tsan_interceptors.cc<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/rtl/tsan_interceptors.cc?rev=191898&r1=191897&r2=191898&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/rtl/tsan_interceptors.cc?rev=191898&r1=191897&r2=191898&view=diff</a><br>


==============================================================================<br>
--- compiler-rt/trunk/lib/tsan/rtl/tsan_interceptors.cc (original)<br>
+++ compiler-rt/trunk/lib/tsan/rtl/tsan_interceptors.cc Thu Oct  3 09:00:46 2013<br>
@@ -1958,8 +1958,27 @@ static void syscall_post_fork(uptr pc, i<br>
   syscall_post_fork(GET_CALLER_PC(), res)<br>
 #include "sanitizer_common/sanitizer_common_syscalls.inc"<br>
<br>
+TSAN_INTERCEPTOR(void, _exit, int status) {<br>
+  ThreadState * thr = cur_thread();<br>
+  int status1 = Finalize(thr);<br>
+  REAL(fflush)(0);<br>
+  if (status == 0)<br>
+    status = status1;<br>
+  REAL(_exit)(status);<br>
+}<br>
+<br>
 namespace __tsan {<br>
<br>
+static void finalize(void *arg) {<br>
+  ThreadState * thr = cur_thread();<br>
+  uptr pc = 0;<br>
+  atexit_ctx->exit(thr, pc);<br>
+  int status = Finalize(thr);<br>
+  REAL(fflush)(0);<br>
+  if (status)<br>
+    REAL(_exit)(status);<br>
+}<br>
+<br>
 void ProcessPendingSignals(ThreadState *thr) {<br>
   CHECK_EQ(thr->in_rtl, 0);<br>
   SignalContext *sctx = SigCtx(thr);<br>
@@ -2009,16 +2028,6 @@ void ProcessPendingSignals(ThreadState *<br>
   thr->in_signal_handler = false;<br>
 }<br>
<br>
-static void finalize(void *arg) {<br>
-  ThreadState * thr = cur_thread();<br>
-  uptr pc = 0;<br>
-  atexit_ctx->exit(thr, pc);<br>
-  int status = Finalize(cur_thread());<br>
-  REAL(fflush)(0);<br>
-  if (status)<br>
-    _exit(status);<br>
-}<br>
-<br>
 static void unreachable() {<br>
   Printf("FATAL: ThreadSanitizer: unreachable called\n");<br>
   Die();<br>
@@ -2199,6 +2208,7 @@ void InitializeInterceptors() {<br>
   TSAN_INTERCEPT(dlclose);<br>
   TSAN_INTERCEPT(on_exit);<br>
   TSAN_INTERCEPT(__cxa_atexit);<br>
+  TSAN_INTERCEPT(_exit);<br>
<br>
   // Need to setup it, because interceptors check that the function is resolved.<br>
   // But atexit is emitted directly into the module, so can't be resolved.<br>
<br>
Modified: compiler-rt/trunk/lib/tsan/rtl/tsan_stat.cc<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/rtl/tsan_stat.cc?rev=191898&r1=191897&r2=191898&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/rtl/tsan_stat.cc?rev=191898&r1=191897&r2=191898&view=diff</a><br>


==============================================================================<br>
--- compiler-rt/trunk/lib/tsan/rtl/tsan_stat.cc (original)<br>
+++ compiler-rt/trunk/lib/tsan/rtl/tsan_stat.cc Thu Oct  3 09:00:46 2013<br>
@@ -142,6 +142,7 @@ void StatOutput(u64 *stat) {<br>
   name[StatInt_strcasecmp]               = "  strcasecmp                      ";<br>
   name[StatInt_strncasecmp]              = "  strncasecmp                     ";<br>
   name[StatInt_atexit]                   = "  atexit                          ";<br>
+  name[StatInt__exit]                    = "  _exit                           ";<br>
   name[StatInt___cxa_guard_acquire]      = "  __cxa_guard_acquire             ";<br>
   name[StatInt___cxa_guard_release]      = "  __cxa_guard_release             ";<br>
   name[StatInt___cxa_guard_abort]        = "  __cxa_guard_abort               ";<br>
<br>
Modified: compiler-rt/trunk/lib/tsan/rtl/tsan_stat.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/rtl/tsan_stat.h?rev=191898&r1=191897&r2=191898&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/rtl/tsan_stat.h?rev=191898&r1=191897&r2=191898&view=diff</a><br>


==============================================================================<br>
--- compiler-rt/trunk/lib/tsan/rtl/tsan_stat.h (original)<br>
+++ compiler-rt/trunk/lib/tsan/rtl/tsan_stat.h Thu Oct  3 09:00:46 2013<br>
@@ -139,6 +139,7 @@ enum StatType {<br>
   StatInt_strstr,<br>
   StatInt_strdup,<br>
   StatInt_atexit,<br>
+  StatInt__exit,<br>
   StatInt___cxa_guard_acquire,<br>
   StatInt___cxa_guard_release,<br>
   StatInt___cxa_guard_abort,<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@cs.uiuc.edu" target="_blank">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></div>
</blockquote></div><br></div>