40 lines · cpp
1// RUN: %clangxx -O1 %s -o %t && %env_tool_opts=handle_sigtrap=1 %run %t 2>&1 | FileCheck %s2 3// __builtin_debugtrap() does not raise SIGTRAP on these platforms.4// UNSUPPORTED: target=s390{{.*}}5 6#include <assert.h>7#include <signal.h>8#include <stdio.h>9#include <stdlib.h>10 11int in_handler;12 13void handler(int signo, siginfo_t *info, void *uctx) {14 fprintf(stderr, "in_handler: %d\n", in_handler);15 fflush(stderr);16 // CHECK: in_handler: 117 _Exit(0);18}19 20int main() {21 struct sigaction a = {}, old = {};22 a.sa_sigaction = handler;23 a.sa_flags = SA_SIGINFO;24 sigaction(SIGTRAP, &a, &old);25 26 a = {};27 sigaction(SIGTRAP, 0, &a);28 assert(a.sa_sigaction == handler);29 assert(a.sa_flags & SA_SIGINFO);30 31 in_handler = 1;32 // Check that signal handler is not postponed by sanitizer.33 // Don't use raise here as it calls any signal handler immediately.34 __builtin_debugtrap();35 in_handler = 0;36 37 fprintf(stderr, "UNREACHABLE\n");38 return 1;39}40