12d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// RUN: %clangxx_asan %s -o %t && %run %t
2a1b5c09e608933cb2a9edef1488f45f5a94c91a3Kostya Serebryany// http://code.google.com/p/address-sanitizer/issues/detail?id=147 (not fixed).
32d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// BROKEN: %clangxx_asan %s -o %t -static-libstdc++ && %run %t
42d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines//
52d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// Android builds with static libstdc++ by default.
62d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// XFAIL: android
72d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
85d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines// Clang doesn't support exceptions on Windows yet.
95d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines// XFAIL: win32
105d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines
11a1b5c09e608933cb2a9edef1488f45f5a94c91a3Kostya Serebryany#include <stdio.h>
12a1b5c09e608933cb2a9edef1488f45f5a94c91a3Kostya Serebryanystatic volatile int zero = 0;
13a1b5c09e608933cb2a9edef1488f45f5a94c91a3Kostya Serebryanyinline void pretend_to_do_something(void *x) {
14a1b5c09e608933cb2a9edef1488f45f5a94c91a3Kostya Serebryany  __asm__ __volatile__("" : : "r" (x) : "memory");
15a1b5c09e608933cb2a9edef1488f45f5a94c91a3Kostya Serebryany}
16a1b5c09e608933cb2a9edef1488f45f5a94c91a3Kostya Serebryany
1700b8a34250e9f6c1c0211c33f4fe4da15d0fb24aKostya Serebryany__attribute__((noinline, no_sanitize_address))
18a1b5c09e608933cb2a9edef1488f45f5a94c91a3Kostya Serebryanyvoid ReallyThrow() {
19a1b5c09e608933cb2a9edef1488f45f5a94c91a3Kostya Serebryany  fprintf(stderr, "ReallyThrow\n");
20a1b5c09e608933cb2a9edef1488f45f5a94c91a3Kostya Serebryany  if (zero == 0)
21a1b5c09e608933cb2a9edef1488f45f5a94c91a3Kostya Serebryany    throw 42;
22a1b5c09e608933cb2a9edef1488f45f5a94c91a3Kostya Serebryany}
23a1b5c09e608933cb2a9edef1488f45f5a94c91a3Kostya Serebryany
24a1b5c09e608933cb2a9edef1488f45f5a94c91a3Kostya Serebryany__attribute__((noinline))
25a1b5c09e608933cb2a9edef1488f45f5a94c91a3Kostya Serebryanyvoid Throw() {
26a1b5c09e608933cb2a9edef1488f45f5a94c91a3Kostya Serebryany  int a, b, c, d, e;
27a1b5c09e608933cb2a9edef1488f45f5a94c91a3Kostya Serebryany  pretend_to_do_something(&a);
28a1b5c09e608933cb2a9edef1488f45f5a94c91a3Kostya Serebryany  pretend_to_do_something(&b);
29a1b5c09e608933cb2a9edef1488f45f5a94c91a3Kostya Serebryany  pretend_to_do_something(&c);
30a1b5c09e608933cb2a9edef1488f45f5a94c91a3Kostya Serebryany  pretend_to_do_something(&d);
31a1b5c09e608933cb2a9edef1488f45f5a94c91a3Kostya Serebryany  pretend_to_do_something(&e);
32a1b5c09e608933cb2a9edef1488f45f5a94c91a3Kostya Serebryany  fprintf(stderr, "Throw stack = %p\n", &a);
33a1b5c09e608933cb2a9edef1488f45f5a94c91a3Kostya Serebryany  ReallyThrow();
34a1b5c09e608933cb2a9edef1488f45f5a94c91a3Kostya Serebryany}
35a1b5c09e608933cb2a9edef1488f45f5a94c91a3Kostya Serebryany
36a1b5c09e608933cb2a9edef1488f45f5a94c91a3Kostya Serebryany__attribute__((noinline))
37a1b5c09e608933cb2a9edef1488f45f5a94c91a3Kostya Serebryanyvoid CheckStack() {
38a1b5c09e608933cb2a9edef1488f45f5a94c91a3Kostya Serebryany  int ar[100];
39a1b5c09e608933cb2a9edef1488f45f5a94c91a3Kostya Serebryany  pretend_to_do_something(ar);
40a1b5c09e608933cb2a9edef1488f45f5a94c91a3Kostya Serebryany  for (int i = 0; i < 100; i++)
41a1b5c09e608933cb2a9edef1488f45f5a94c91a3Kostya Serebryany    ar[i] = i;
42a1b5c09e608933cb2a9edef1488f45f5a94c91a3Kostya Serebryany  fprintf(stderr, "CheckStack stack = %p, %p\n", ar, ar + 100);
43a1b5c09e608933cb2a9edef1488f45f5a94c91a3Kostya Serebryany}
44a1b5c09e608933cb2a9edef1488f45f5a94c91a3Kostya Serebryany
45a1b5c09e608933cb2a9edef1488f45f5a94c91a3Kostya Serebryanyint main(int argc, char** argv) {
46a1b5c09e608933cb2a9edef1488f45f5a94c91a3Kostya Serebryany  try {
47a1b5c09e608933cb2a9edef1488f45f5a94c91a3Kostya Serebryany    Throw();
4869b109a665247d424874253b412fe9b5253d1702Evgeniy Stepanov  } catch(int a) {
49a1b5c09e608933cb2a9edef1488f45f5a94c91a3Kostya Serebryany    fprintf(stderr, "a = %d\n", a);
50a1b5c09e608933cb2a9edef1488f45f5a94c91a3Kostya Serebryany  }
51a1b5c09e608933cb2a9edef1488f45f5a94c91a3Kostya Serebryany  CheckStack();
52a1b5c09e608933cb2a9edef1488f45f5a94c91a3Kostya Serebryany}
53