Index: test/asan/TestCases/Linux/throw_invoke_test_libstdcxx.cc =================================================================== --- test/asan/TestCases/Linux/throw_invoke_test_libstdcxx.cc +++ /dev/null @@ -1,48 +0,0 @@ -// This the basically the `throw_invoke_test.cc` test but using libstdc++ -// instead of the default. -// RUN: %clangxx_asan %s -o %t -stdlib=libstdc++ -static-libstdc++ && %run %t - -#include -static volatile int zero = 0; -inline void pretend_to_do_something(void *x) { - __asm__ __volatile__("" : : "r"(x) : "memory"); -} - -__attribute__((noinline)) void ReallyThrow() { - fprintf(stderr, "ReallyThrow\n"); - try { - if (zero == 0) - throw 42; - else if (zero == 1) - throw 1.; - } catch (double x) { - } -} - -__attribute__((noinline)) void Throw() { - int a, b, c, d, e; - pretend_to_do_something(&a); - pretend_to_do_something(&b); - pretend_to_do_something(&c); - pretend_to_do_something(&d); - pretend_to_do_something(&e); - fprintf(stderr, "Throw stack = %p\n", &a); - ReallyThrow(); -} - -__attribute__((noinline)) void CheckStack() { - int ar[100]; - pretend_to_do_something(ar); - for (int i = 0; i < 100; i++) - ar[i] = i; - fprintf(stderr, "CheckStack stack = %p, %p\n", ar, ar + 100); -} - -int main(int argc, char **argv) { - try { - Throw(); - } catch (int a) { - fprintf(stderr, "a = %d\n", a); - } - CheckStack(); -} Index: test/asan/TestCases/throw_invoke_test.cc =================================================================== --- test/asan/TestCases/throw_invoke_test.cc +++ test/asan/TestCases/throw_invoke_test.cc @@ -1,4 +1,5 @@ // RUN: %clangxx_asan %s -o %t && %run %t +// RUN: %clangxx_asan %s -o %t %linux_static_libstdcplusplus && %run %t #include static volatile int zero = 0; Index: test/lit.common.cfg =================================================================== --- test/lit.common.cfg +++ test/lit.common.cfg @@ -322,6 +322,14 @@ config.substitutions.append( ("%ld_flags_rpath_exe", "-Wl,-R\$ORIGIN -L%T -l%xdynamiclib_namespec") ) config.substitutions.append( ("%ld_flags_rpath_so", '') ) +# Provide a substituion that can be used to tell Clang to use a static libstdc++. +# The substitution expands to nothing on non Linux platforms. +# FIXME: This should check the target OS, not the host OS. +if config.host_os == 'Linux': + config.substitutions.append( ("%linux_static_libstdcplusplus", "-stdlib=libstdc++ -static-libstdc++") ) +else: + config.substitutions.append( ("%linux_static_libstdcplusplus", "") ) + # Must be defined after the substitutions that use %dynamiclib. config.substitutions.append( ("%dynamiclib", '%T/%xdynamiclib_filename') ) config.substitutions.append( ("%xdynamiclib_filename", 'lib%xdynamiclib_namespec.so') ) Index: test/tsan/static_init6.cc =================================================================== --- test/tsan/static_init6.cc +++ test/tsan/static_init6.cc @@ -1,4 +1,5 @@ -// RUN: %clangxx_tsan -stdlib=libstdc++ -static-libstdc++ -O1 %s -o %t && %run %t 2>&1 | FileCheck %s +// RUN: %clangxx_tsan %linux_static_libstdcplusplus -O1 %s -o %t && %run %t 2>&1 \ +// RUN: | FileCheck %s #include #include #include