forked from OSchip/llvm-project
[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:
parent
96ac97a421
commit
87dd968849
|
@ -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,
|
||||
|
|
|
@ -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
|
Loading…
Reference in New Issue