1799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar// Test the handle_sigfpe option.
2799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar// RUN: %clang %s -o %t
3799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar// RUN:                               not         %run %t 2>&1 | FileCheck --check-prefix=CHECK1 %s
4799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar// RUN: %env_tool_opts=handle_sigfpe=0 not --crash %run %t 2>&1 | FileCheck --check-prefix=CHECK0 %s
5799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar// RUN: %env_tool_opts=handle_sigfpe=1 not         %run %t 2>&1 | FileCheck --check-prefix=CHECK1 %s
6799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar// FIXME: implement in other sanitizers, not just asan.
7799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar// XFAIL: msan
8799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar// XFAIL: lsan
9799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar// XFAIL: tsan
10799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar//
11799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar// FIXME: seems to fail on ARM
12c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar// REQUIRES: x86_64-target-arch
13799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#include <assert.h>
14799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#include <stdio.h>
15799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#include <sanitizer/asan_interface.h>
16799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar
17799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainarvoid death() {
18799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar  fprintf(stderr, "DEATH CALLBACK\n");
19799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar}
20799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar
21799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainarint main(int argc, char **argv) {
22799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar  __sanitizer_set_death_callback(death);
23799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar  volatile int one = 1;
24799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar  volatile int zero = 0;
25799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar  volatile int sink;
26799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar  sink = one / zero;
27799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar}
28799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar// CHECK1: ERROR: {{.*}}Sanitizer:
29799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar// CHECK1: DEATH CALLBACK
30799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar// CHECK0-NOT: Sanitizer
31