This reverts commit 05e31438ac9491cfc72c48664480796de874c860. There was quite a bit of churn with this patch, everytime related to the executable no longer being in the same directory as the shared objects. This reland ensures that all of the executables in the tests touched are in the same directory as the shared objects in the substitutions.
32 lines
1005 B
C++
32 lines
1005 B
C++
// RUN: mkdir -p %t.dir && cd %t.dir
|
|
// RUN: %clangxx -DFUNC=zzzz %s -shared -o %dynamiclib -fPIC
|
|
// RUN: %clangxx_asan -DFUNC=main %s -o %t.dir/EXE %ld_flags_rpath_exe
|
|
// RUN: %run %t.dir/EXE
|
|
|
|
// GNU driver doesn't handle .so files properly.
|
|
// REQUIRES: Clang
|
|
|
|
// This test ensures that we call __asan_init early enough.
|
|
// We build a shared library w/o asan instrumentation
|
|
// and the binary with asan instrumentation.
|
|
// Both files include the same header (emulated by -DFUNC here)
|
|
// with C++ template magic which runs global initializer at library load time.
|
|
// The function get() is instrumented with asan, but called
|
|
// before the usual constructors are run.
|
|
// So, we must make sure that __asan_init is executed even earlier.
|
|
//
|
|
// See http://gcc.gnu.org/bugzilla/show_bug.cgi?id=56393
|
|
|
|
struct A {
|
|
int foo() const { return 0; }
|
|
};
|
|
A get () { return A(); }
|
|
template <class> struct O {
|
|
static A const e;
|
|
};
|
|
template <class T> A const O <T>::e = get();
|
|
int FUNC() {
|
|
return O<int>::e.foo();
|
|
}
|
|
|