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