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