[compiler-rt] r192695 - tsan: move kernel struct definition from sanitizer_linux.h to sanitizer_platform_limits_posix.h

Dmitry Vyukov dvyukov at google.com
Tue Oct 15 07:08:06 PDT 2013


On Tue, Oct 15, 2013 at 5:19 PM, Alexey Samsonov <samsonov at google.com> wrote:
>
> On Tue, Oct 15, 2013 at 4:57 PM, Dmitry Vyukov <dvyukov at google.com> wrote:
>>
>> Author: dvyukov
>> Date: Tue Oct 15 07:57:59 2013
>> New Revision: 192695
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=192695&view=rev
>> Log:
>> tsan: move kernel struct definition from sanitizer_linux.h to
>> sanitizer_platform_limits_posix.h
>>
>>
>> Modified:
>>     compiler-rt/trunk/lib/sanitizer_common/sanitizer_common_syscalls.inc
>>     compiler-rt/trunk/lib/sanitizer_common/sanitizer_linux.cc
>>     compiler-rt/trunk/lib/sanitizer_common/sanitizer_linux.h
>>
>> compiler-rt/trunk/lib/sanitizer_common/sanitizer_platform_limits_posix.h
>>
>> compiler-rt/trunk/lib/sanitizer_common/sanitizer_stoptheworld_linux_libcdep.cc
>>
>> Modified:
>> compiler-rt/trunk/lib/sanitizer_common/sanitizer_common_syscalls.inc
>> URL:
>> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_common_syscalls.inc?rev=192695&r1=192694&r2=192695&view=diff
>>
>> ==============================================================================
>> --- compiler-rt/trunk/lib/sanitizer_common/sanitizer_common_syscalls.inc
>> (original)
>> +++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_common_syscalls.inc
>> Tue Oct 15 07:57:59 2013
>> @@ -37,7 +37,6 @@
>>  #if SANITIZER_LINUX
>>
>>  #include "sanitizer_libc.h"
>> -#include "sanitizer_linux.h"
>>
>>  #define PRE_SYSCALL(name)
>> \
>>    SANITIZER_INTERFACE_ATTRIBUTE void __sanitizer_syscall_pre_impl_##name
>> @@ -104,6 +103,10 @@ struct sanitizer_kernel_sockaddr {
>>    char sa_data[14];
>>  };
>>
>> +// Real sigset size is always passed as a syscall argument.
>> +// Declare it "void" to catch sizeof(kernel_sigset_t).
>> +typedef void kernel_sigset_t;
>
>
> Do we still need this now?

It's used in this file.


>>  static void kernel_write_iovec(const __sanitizer_iovec *iovec,
>>                          SIZE_T iovlen, SIZE_T maxlen) {
>>    for (SIZE_T i = 0; i < iovlen && maxlen; ++i) {
>>
>> Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_linux.cc
>> URL:
>> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_linux.cc?rev=192695&r1=192694&r2=192695&view=diff
>>
>> ==============================================================================
>> --- compiler-rt/trunk/lib/sanitizer_common/sanitizer_linux.cc (original)
>> +++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_linux.cc Tue Oct 15
>> 07:57:59 2013
>> @@ -602,23 +602,23 @@ uptr internal_sigaltstack(const struct s
>>    return internal_syscall(__NR_sigaltstack, ss, oss);
>>  }
>>
>> -uptr internal_sigaction(int signum, const kernel_sigaction_t *act,
>> -    struct kernel_sigaction_t *oldact) {
>> +uptr internal_sigaction(int signum, const __sanitizer_kernel_sigaction_t
>> *act,
>> +    __sanitizer_kernel_sigaction_t *oldact) {
>>    return internal_syscall(__NR_rt_sigaction, signum, act, oldact,
>> -      sizeof(kernel_sigset_t));
>> +      sizeof(__sanitizer_kernel_sigset_t));
>>  }
>>
>> -uptr internal_sigprocmask(int how, kernel_sigset_t *set,
>> -    kernel_sigset_t *oldset) {
>> +uptr internal_sigprocmask(int how, __sanitizer_kernel_sigset_t *set,
>> +    __sanitizer_kernel_sigset_t *oldset) {
>>    return internal_syscall(__NR_rt_sigprocmask, (uptr)how, &set->sig[0],
>> -      &oldset->sig[0], sizeof(kernel_sigset_t));
>> +      &oldset->sig[0], sizeof(__sanitizer_kernel_sigset_t));
>>  }
>>
>> -void internal_sigfillset(kernel_sigset_t *set) {
>> +void internal_sigfillset(__sanitizer_kernel_sigset_t *set) {
>>    internal_memset(set, 0xff, sizeof(*set));
>>  }
>>
>> -void internal_sigdelset(kernel_sigset_t *set, int signum) {
>> +void internal_sigdelset(__sanitizer_kernel_sigset_t *set, int signum) {
>>    signum -= 1;
>>    CHECK_GE(signum, 0);
>>    CHECK_LT(signum, sizeof(*set) * 8);
>>
>> Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_linux.h
>> URL:
>> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_linux.h?rev=192695&r1=192694&r2=192695&view=diff
>>
>> ==============================================================================
>> --- compiler-rt/trunk/lib/sanitizer_common/sanitizer_linux.h (original)
>> +++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_linux.h Tue Oct 15
>> 07:57:59 2013
>> @@ -17,41 +17,27 @@
>>  #if SANITIZER_LINUX
>>  #include "sanitizer_common.h"
>>  #include "sanitizer_internal_defs.h"
>> +#include "sanitizer_platform_limits_posix.h"
>>
>>  struct link_map;  // Opaque type returned by dlopen().
>>  struct sigaltstack;
>> -typedef struct siginfo siginfo_t;
>>
>>  namespace __sanitizer {
>>  // Dirent structure for getdents(). Note that this structure is different
>> from
>>  // the one in <dirent.h>, which is used by readdir().
>>  struct linux_dirent;
>>
>> -struct kernel_sigset_t {
>> -  u8 sig[FIRST_32_SECOND_64(16, 8)];
>> -};
>> -
>> -struct kernel_sigaction_t {
>> -  union {
>> -    void (*sigaction)(int signo, siginfo_t *info, void *ctx);
>> -    void (*handler)(int signo);
>> -  };
>> -  unsigned long sa_flags;
>> -  void (*sa_restorer)(void);
>> -  kernel_sigset_t sa_mask;
>> -};
>> -
>>  // Syscall wrappers.
>>  uptr internal_getdents(fd_t fd, struct linux_dirent *dirp, unsigned int
>> count);
>>  uptr internal_prctl(int option, uptr arg2, uptr arg3, uptr arg4, uptr
>> arg5);
>>  uptr internal_sigaltstack(const struct sigaltstack* ss,
>>                            struct sigaltstack* oss);
>> -uptr internal_sigaction(int signum, const kernel_sigaction_t *act,
>> -    kernel_sigaction_t *oldact);
>> -uptr internal_sigprocmask(int how, kernel_sigset_t *set,
>> -    kernel_sigset_t *oldset);
>> -void internal_sigfillset(kernel_sigset_t *set);
>> -void internal_sigdelset(kernel_sigset_t *set, int signum);
>> +uptr internal_sigaction(int signum, const __sanitizer_kernel_sigaction_t
>> *act,
>> +    __sanitizer_kernel_sigaction_t *oldact);
>> +uptr internal_sigprocmask(int how, __sanitizer_kernel_sigset_t *set,
>> +    __sanitizer_kernel_sigset_t *oldset);
>> +void internal_sigfillset(__sanitizer_kernel_sigset_t *set);
>> +void internal_sigdelset(__sanitizer_kernel_sigset_t *set, int signum);
>>
>>  #ifdef __x86_64__
>>  uptr internal_clone(int (*fn)(void *), void *child_stack, int flags, void
>> *arg,
>>
>> Modified:
>> compiler-rt/trunk/lib/sanitizer_common/sanitizer_platform_limits_posix.h
>> URL:
>> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_platform_limits_posix.h?rev=192695&r1=192694&r2=192695&view=diff
>>
>> ==============================================================================
>> ---
>> compiler-rt/trunk/lib/sanitizer_common/sanitizer_platform_limits_posix.h
>> (original)
>> +++
>> compiler-rt/trunk/lib/sanitizer_common/sanitizer_platform_limits_posix.h Tue
>> Oct 15 07:57:59 2013
>> @@ -222,6 +222,20 @@ namespace __sanitizer {
>>  #endif
>>    };
>>
>> +  struct __sanitizer_kernel_sigset_t {
>> +    u8 sig[8];
>> +  };
>> +
>> +  struct __sanitizer_kernel_sigaction_t {
>> +    union {
>> +      void (*sigaction)(int signo, void *info, void *ctx);
>> +      void (*handler)(int signo);
>> +    };
>> +    unsigned long sa_flags;
>> +    void (*sa_restorer)(void);
>> +    __sanitizer_kernel_sigset_t sa_mask;
>> +  };
>> +
>>    extern uptr sig_ign;
>>    extern uptr sig_dfl;
>>    extern uptr sa_siginfo;
>>
>> Modified:
>> compiler-rt/trunk/lib/sanitizer_common/sanitizer_stoptheworld_linux_libcdep.cc
>> URL:
>> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_stoptheworld_linux_libcdep.cc?rev=192695&r1=192694&r2=192695&view=diff
>>
>> ==============================================================================
>> ---
>> compiler-rt/trunk/lib/sanitizer_common/sanitizer_stoptheworld_linux_libcdep.cc
>> (original)
>> +++
>> compiler-rt/trunk/lib/sanitizer_common/sanitizer_stoptheworld_linux_libcdep.cc
>> Tue Oct 15 07:57:59 2013
>> @@ -18,6 +18,8 @@
>>
>>  #include "sanitizer_stoptheworld.h"
>>
>> +#include "sanitizer_platform_limits_posix.h"
>> +
>>  #include <errno.h>
>>  #include <sched.h> // for CLONE_* definitions
>>  #include <stddef.h>
>> @@ -31,6 +33,14 @@
>>  #endif
>>  #include <sys/wait.h> // for signal-related stuff
>>
>> +#ifdef sa_handler
>> +# undef sa_handler
>> +#endif
>> +
>> +#ifdef sa_sigaction
>> +# undef sa_sigaction
>> +#endif
>> +
>>  #include "sanitizer_common.h"
>>  #include "sanitizer_libc.h"
>>  #include "sanitizer_linux.h"
>> @@ -178,7 +188,7 @@ struct TracerThreadArgument {
>>  static DieCallbackType old_die_callback;
>>
>>  // Signal handler to wake up suspended threads when the tracer thread
>> dies.
>> -void TracerThreadSignalHandler(int signum, siginfo_t *siginfo, void *) {
>> +void TracerThreadSignalHandler(int signum, void *siginfo, void *) {
>>    if (thread_suspender_instance != NULL) {
>>      if (signum == SIGABRT)
>>        thread_suspender_instance->KillAllThreads();
>> @@ -236,7 +246,7 @@ static int TracerThread(void* argument)
>>    // the mask we inherited from the caller thread.
>>    for (uptr signal_index = 0; signal_index <
>> ARRAY_SIZE(kUnblockedSignals);
>>         signal_index++) {
>> -    kernel_sigaction_t new_sigaction;
>> +    __sanitizer_kernel_sigaction_t new_sigaction;
>>      internal_memset(&new_sigaction, 0, sizeof(new_sigaction));
>>      new_sigaction.sigaction = TracerThreadSignalHandler;
>>      new_sigaction.sa_flags = SA_ONSTACK | SA_SIGINFO;
>> @@ -286,9 +296,10 @@ class ScopedStackSpaceWithGuard {
>>
>>  // We have a limitation on the stack frame size, so some stuff had to be
>> moved
>>  // into globals.
>> -static kernel_sigset_t blocked_sigset;
>> -static kernel_sigset_t old_sigset;
>> -static kernel_sigaction_t old_sigactions[ARRAY_SIZE(kUnblockedSignals)];
>> +static __sanitizer_kernel_sigset_t blocked_sigset;
>> +static __sanitizer_kernel_sigset_t old_sigset;
>> +static __sanitizer_kernel_sigaction_t old_sigactions
>> +    [ARRAY_SIZE(kUnblockedSignals)];
>>
>>  class StopTheWorldScope {
>>   public:
>> @@ -304,7 +315,7 @@ class StopTheWorldScope {
>>        // Remove the signal from the set of blocked signals.
>>        internal_sigdelset(&blocked_sigset,
>> kUnblockedSignals[signal_index]);
>>        // Install the default handler.
>> -      kernel_sigaction_t new_sigaction;
>> +      __sanitizer_kernel_sigaction_t new_sigaction;
>>        internal_memset(&new_sigaction, 0, sizeof(new_sigaction));
>>        new_sigaction.handler = SIG_DFL;
>>        internal_sigfillset(&new_sigaction.sa_mask);
>>
>>
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
>
>
>
> --
> Alexey Samsonov, MSK



More information about the llvm-commits mailing list