xref: /llvm-project/compiler-rt/test/sanitizer_common/TestCases/Linux/signal_trap_handler.cpp (revision 975fa725063fe33aba02164a53c4ef66662e68d8)
187dd9688SVitaly Buka // RUN: %clangxx -O1 %s -o %t && %env_tool_opts=handle_sigtrap=1 %run %t 2>&1 | FileCheck %s
287dd9688SVitaly Buka 
3ff5a7c4cSVitaly Buka // __builtin_debugtrap() does not raise SIGTRAP on these platforms.
4*975fa725SPaul Robinson // UNSUPPORTED: target=s390{{.*}}
53afc77dbSVitaly Buka 
687dd9688SVitaly Buka #include <assert.h>
787dd9688SVitaly Buka #include <signal.h>
887dd9688SVitaly Buka #include <stdio.h>
954d767f5SVitaly Buka #include <stdlib.h>
1087dd9688SVitaly Buka 
1154d767f5SVitaly Buka int in_handler;
1287dd9688SVitaly Buka 
handler(int signo,siginfo_t * info,void * uctx)1387dd9688SVitaly Buka void handler(int signo, siginfo_t *info, void *uctx) {
1454d767f5SVitaly Buka   fprintf(stderr, "in_handler: %d\n", in_handler);
1554d767f5SVitaly Buka   fflush(stderr);
1654d767f5SVitaly Buka   // CHECK: in_handler: 1
1754d767f5SVitaly Buka   _Exit(0);
1887dd9688SVitaly Buka }
1987dd9688SVitaly Buka 
main()2087dd9688SVitaly Buka int main() {
2187dd9688SVitaly Buka   struct sigaction a = {}, old = {};
2287dd9688SVitaly Buka   a.sa_sigaction = handler;
2387dd9688SVitaly Buka   a.sa_flags = SA_SIGINFO;
2487dd9688SVitaly Buka   sigaction(SIGTRAP, &a, &old);
2587dd9688SVitaly Buka 
2687dd9688SVitaly Buka   a = {};
2787dd9688SVitaly Buka   sigaction(SIGTRAP, 0, &a);
2887dd9688SVitaly Buka   assert(a.sa_sigaction == handler);
2987dd9688SVitaly Buka   assert(a.sa_flags & SA_SIGINFO);
3087dd9688SVitaly Buka 
3154d767f5SVitaly Buka   in_handler = 1;
323afc77dbSVitaly Buka   // Check that signal handler is not postponed by sanitizer.
333afc77dbSVitaly Buka   // Don't use raise here as it calls any signal handler immediately.
3487dd9688SVitaly Buka   __builtin_debugtrap();
3554d767f5SVitaly Buka   in_handler = 0;
3687dd9688SVitaly Buka 
3754d767f5SVitaly Buka   fprintf(stderr, "UNREACHABLE\n");
3854d767f5SVitaly Buka   return 1;
3954d767f5SVitaly Buka }
40