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

Evgeniy Stepanov eugenis at google.com
Thu Oct 3 07:10:54 PDT 2013


msan uses atexit for this. It obviously does not work when _exit is called
directly.

This looks like a good idea, if it works.



On Thu, Oct 3, 2013 at 6:08 PM, Kostya Serebryany <kcc at google.com> wrote:

> 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/a257d9e2/attachment.html>


More information about the llvm-commits mailing list