[tsan] Don't delay SIGTRAP handler

Reviewers: eugenis, jfb

Subscribers: #sanitizers, llvm-commits

Tags: #sanitizers, #llvm

Differential Revision: https://reviews.llvm.org/D68604

llvm-svn: 373978
This commit is contained in:
Vitaly Buka 2019-10-07 22:43:17 +00:00
parent 96ac97a421
commit 87dd968849
2 changed files with 34 additions and 4 deletions

View File

@ -114,6 +114,7 @@ const int PTHREAD_MUTEX_RECURSIVE_NP = 2;
const int EPOLL_CTL_ADD = 1;
#endif
const int SIGILL = 4;
const int SIGTRAP = 5;
const int SIGABRT = 6;
const int SIGFPE = 8;
const int SIGSEGV = 11;
@ -1962,10 +1963,10 @@ void ProcessPendingSignals(ThreadState *thr) {
} // namespace __tsan
static bool is_sync_signal(ThreadSignalContext *sctx, int sig) {
return sig == SIGSEGV || sig == SIGBUS || sig == SIGILL ||
sig == SIGABRT || sig == SIGFPE || sig == SIGPIPE || sig == SIGSYS ||
// If we are sending signal to ourselves, we must process it now.
(sctx && sig == sctx->int_signal_send);
return sig == SIGSEGV || sig == SIGBUS || sig == SIGILL || sig == SIGTRAP ||
sig == SIGABRT || sig == SIGFPE || sig == SIGPIPE || sig == SIGSYS ||
// If we are sending signal to ourselves, we must process it now.
(sctx && sig == sctx->int_signal_send);
}
void ALWAYS_INLINE rtl_generic_sighandler(bool sigact, int sig,

View File

@ -0,0 +1,29 @@
// RUN: %clangxx -O1 %s -o %t && %env_tool_opts=handle_sigtrap=1 %run %t 2>&1 | FileCheck %s
#include <assert.h>
#include <signal.h>
#include <stdio.h>
int handled;
void handler(int signo, siginfo_t *info, void *uctx) {
handled = 1;
}
int main() {
struct sigaction a = {}, old = {};
a.sa_sigaction = handler;
a.sa_flags = SA_SIGINFO;
sigaction(SIGTRAP, &a, &old);
a = {};
sigaction(SIGTRAP, 0, &a);
assert(a.sa_sigaction == handler);
assert(a.sa_flags & SA_SIGINFO);
__builtin_debugtrap();
assert(handled);
fprintf(stderr, "HANDLED %d\n", handled);
}
// CHECK: HANDLED 1