[compiler-rt] r191898 - tsan: intercept _exit so that we can override exit status

Kostya Serebryany kcc at google.com
Thu Oct 3 07:08:40 PDT 2013


Does this apply to asan and msan?
Can we make this interceptor common?


On Thu, Oct 3, 2013 at 6:00 PM, Dmitry Vyukov <dvyukov at google.com> wrote:

> Author: dvyukov
> Date: Thu Oct  3 09:00:46 2013
> New Revision: 191898
>
> URL: http://llvm.org/viewvc/llvm-project?rev=191898&view=rev
> Log:
> tsan: intercept _exit so that we can override exit status
>
>
> Modified:
>     compiler-rt/trunk/lib/tsan/rtl/tsan_flags.h
>     compiler-rt/trunk/lib/tsan/rtl/tsan_interceptors.cc
>     compiler-rt/trunk/lib/tsan/rtl/tsan_stat.cc
>     compiler-rt/trunk/lib/tsan/rtl/tsan_stat.h
>
> Modified: compiler-rt/trunk/lib/tsan/rtl/tsan_flags.h
> URL:
> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/rtl/tsan_flags.h?rev=191898&r1=191897&r2=191898&view=diff
>
> ==============================================================================
> --- compiler-rt/trunk/lib/tsan/rtl/tsan_flags.h (original)
> +++ compiler-rt/trunk/lib/tsan/rtl/tsan_flags.h Thu Oct  3 09:00:46 2013
> @@ -75,6 +75,9 @@ struct Flags {
>    int flush_memory_ms;
>    // Flush symbolizer caches every X ms.
>    int flush_symbolizer_ms;
> +  // Resident memory limit in MB to aim at.
> +  // If the process consumes more memory, then TSan will flush shadow
> memory.
> +  int memory_limit_mb;
>    // Stops on start until __tsan_resume() is called (for debugging).
>    bool stop_on_start;
>    // Controls whether RunningOnValgrind() returns true or false.
>
> Modified: compiler-rt/trunk/lib/tsan/rtl/tsan_interceptors.cc
> URL:
> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/rtl/tsan_interceptors.cc?rev=191898&r1=191897&r2=191898&view=diff
>
> ==============================================================================
> --- compiler-rt/trunk/lib/tsan/rtl/tsan_interceptors.cc (original)
> +++ compiler-rt/trunk/lib/tsan/rtl/tsan_interceptors.cc Thu Oct  3
> 09:00:46 2013
> @@ -1958,8 +1958,27 @@ static void syscall_post_fork(uptr pc, i
>    syscall_post_fork(GET_CALLER_PC(), res)
>  #include "sanitizer_common/sanitizer_common_syscalls.inc"
>
> +TSAN_INTERCEPTOR(void, _exit, int status) {
> +  ThreadState * thr = cur_thread();
> +  int status1 = Finalize(thr);
> +  REAL(fflush)(0);
> +  if (status == 0)
> +    status = status1;
> +  REAL(_exit)(status);
> +}
> +
>  namespace __tsan {
>
> +static void finalize(void *arg) {
> +  ThreadState * thr = cur_thread();
> +  uptr pc = 0;
> +  atexit_ctx->exit(thr, pc);
> +  int status = Finalize(thr);
> +  REAL(fflush)(0);
> +  if (status)
> +    REAL(_exit)(status);
> +}
> +
>  void ProcessPendingSignals(ThreadState *thr) {
>    CHECK_EQ(thr->in_rtl, 0);
>    SignalContext *sctx = SigCtx(thr);
> @@ -2009,16 +2028,6 @@ void ProcessPendingSignals(ThreadState *
>    thr->in_signal_handler = false;
>  }
>
> -static void finalize(void *arg) {
> -  ThreadState * thr = cur_thread();
> -  uptr pc = 0;
> -  atexit_ctx->exit(thr, pc);
> -  int status = Finalize(cur_thread());
> -  REAL(fflush)(0);
> -  if (status)
> -    _exit(status);
> -}
> -
>  static void unreachable() {
>    Printf("FATAL: ThreadSanitizer: unreachable called\n");
>    Die();
> @@ -2199,6 +2208,7 @@ void InitializeInterceptors() {
>    TSAN_INTERCEPT(dlclose);
>    TSAN_INTERCEPT(on_exit);
>    TSAN_INTERCEPT(__cxa_atexit);
> +  TSAN_INTERCEPT(_exit);
>
>    // Need to setup it, because interceptors check that the function is
> resolved.
>    // But atexit is emitted directly into the module, so can't be resolved.
>
> Modified: compiler-rt/trunk/lib/tsan/rtl/tsan_stat.cc
> URL:
> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/rtl/tsan_stat.cc?rev=191898&r1=191897&r2=191898&view=diff
>
> ==============================================================================
> --- compiler-rt/trunk/lib/tsan/rtl/tsan_stat.cc (original)
> +++ compiler-rt/trunk/lib/tsan/rtl/tsan_stat.cc Thu Oct  3 09:00:46 2013
> @@ -142,6 +142,7 @@ void StatOutput(u64 *stat) {
>    name[StatInt_strcasecmp]               = "  strcasecmp
>      ";
>    name[StatInt_strncasecmp]              = "  strncasecmp
>     ";
>    name[StatInt_atexit]                   = "  atexit
>      ";
> +  name[StatInt__exit]                    = "  _exit
>     ";
>    name[StatInt___cxa_guard_acquire]      = "  __cxa_guard_acquire
>     ";
>    name[StatInt___cxa_guard_release]      = "  __cxa_guard_release
>     ";
>    name[StatInt___cxa_guard_abort]        = "  __cxa_guard_abort
>     ";
>
> Modified: compiler-rt/trunk/lib/tsan/rtl/tsan_stat.h
> URL:
> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/rtl/tsan_stat.h?rev=191898&r1=191897&r2=191898&view=diff
>
> ==============================================================================
> --- compiler-rt/trunk/lib/tsan/rtl/tsan_stat.h (original)
> +++ compiler-rt/trunk/lib/tsan/rtl/tsan_stat.h Thu Oct  3 09:00:46 2013
> @@ -139,6 +139,7 @@ enum StatType {
>    StatInt_strstr,
>    StatInt_strdup,
>    StatInt_atexit,
> +  StatInt__exit,
>    StatInt___cxa_guard_acquire,
>    StatInt___cxa_guard_release,
>    StatInt___cxa_guard_abort,
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20131003/4bae5ec3/attachment.html>


More information about the llvm-commits mailing list