15d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines// FIXME: https://code.google.com/p/address-sanitizer/issues/detail?id=316
25d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines// XFAIL: android
35d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines//
4e1353430866fe112de0f52ab6281dbc47e40ef66Kostya Serebryany// RUN: %clangxx      -DFUNC=zzzz %s -shared -o %t.so -fPIC
5e1353430866fe112de0f52ab6281dbc47e40ef66Kostya Serebryany// RUN: %clangxx_asan -DFUNC=main %s         -o %t    -Wl,-R. %t.so
62d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// RUN: %run %t
72d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
82d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// GNU driver doesn't handle .so files properly.
92d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// REQUIRES: Clang
10e1353430866fe112de0f52ab6281dbc47e40ef66Kostya Serebryany
11e1353430866fe112de0f52ab6281dbc47e40ef66Kostya Serebryany// This test ensures that we call __asan_init early enough.
12e1353430866fe112de0f52ab6281dbc47e40ef66Kostya Serebryany// We build a shared library w/o asan instrumentation
13e1353430866fe112de0f52ab6281dbc47e40ef66Kostya Serebryany// and the binary with asan instrumentation.
14e1353430866fe112de0f52ab6281dbc47e40ef66Kostya Serebryany// Both files include the same header (emulated by -DFUNC here)
15e1353430866fe112de0f52ab6281dbc47e40ef66Kostya Serebryany// with C++ template magic which runs global initializer at library load time.
16e1353430866fe112de0f52ab6281dbc47e40ef66Kostya Serebryany// The function get() is instrumented with asan, but called
17e1353430866fe112de0f52ab6281dbc47e40ef66Kostya Serebryany// before the usual constructors are run.
18e1353430866fe112de0f52ab6281dbc47e40ef66Kostya Serebryany// So, we must make sure that __asan_init is executed even earlier.
19e1353430866fe112de0f52ab6281dbc47e40ef66Kostya Serebryany//
20e1353430866fe112de0f52ab6281dbc47e40ef66Kostya Serebryany// See http://gcc.gnu.org/bugzilla/show_bug.cgi?id=56393
21e1353430866fe112de0f52ab6281dbc47e40ef66Kostya Serebryany
22e1353430866fe112de0f52ab6281dbc47e40ef66Kostya Serebryanystruct A {
23e1353430866fe112de0f52ab6281dbc47e40ef66Kostya Serebryany  int foo() const { return 0; }
24e1353430866fe112de0f52ab6281dbc47e40ef66Kostya Serebryany};
25e1353430866fe112de0f52ab6281dbc47e40ef66Kostya SerebryanyA get () { return A(); }
26e1353430866fe112de0f52ab6281dbc47e40ef66Kostya Serebryanytemplate <class> struct O {
27e1353430866fe112de0f52ab6281dbc47e40ef66Kostya Serebryany  static A const e;
28e1353430866fe112de0f52ab6281dbc47e40ef66Kostya Serebryany};
29e1353430866fe112de0f52ab6281dbc47e40ef66Kostya Serebryanytemplate <class T> A const O <T>::e = get();
30e1353430866fe112de0f52ab6281dbc47e40ef66Kostya Serebryanyint FUNC() {
31e1353430866fe112de0f52ab6281dbc47e40ef66Kostya Serebryany  return O<int>::e.foo();
32e1353430866fe112de0f52ab6281dbc47e40ef66Kostya Serebryany}
33e1353430866fe112de0f52ab6281dbc47e40ef66Kostya Serebryany
34