diff --git a/compiler-rt/test/asan/TestCases/coverage-and-lsan.cpp b/compiler-rt/test/asan/TestCases/coverage-and-lsan.cpp --- a/compiler-rt/test/asan/TestCases/coverage-and-lsan.cpp +++ b/compiler-rt/test/asan/TestCases/coverage-and-lsan.cpp @@ -9,7 +9,8 @@ // RUN: %sancov print %t-dir/*.sancov 2>&1 // // REQUIRES: leak-detection - +// FIXME: sancov paths not work with adb +// UNSUPPORTED: android int *g = new int; int main(int argc, char **argv) { g = 0; diff --git a/compiler-rt/test/asan/lit.cfg.py b/compiler-rt/test/asan/lit.cfg.py --- a/compiler-rt/test/asan/lit.cfg.py +++ b/compiler-rt/test/asan/lit.cfg.py @@ -209,10 +209,11 @@ config.available_features.add('fast-unwinder-works') # Turn on leak detection on 64-bit Linux. -leak_detection_linux = (config.host_os == 'Linux') and (not config.android) and (config.target_arch == 'x86_64' or config.target_arch == 'i386') +leak_detection_android = config.android and 'android-thread-properties-api' in config.available_features and (config.target_arch in ['x86_64', 'i386', 'i686', 'aarch64']) +leak_detection_linux = (config.host_os == 'Linux') and (not config.android) and (config.target_arch in ['x86_64', 'i386']) leak_detection_mac = (config.host_os == 'Darwin') and (config.target_arch == 'x86_64') leak_detection_netbsd = (config.host_os == 'NetBSD') and (config.target_arch in ['x86_64', 'i386']) -if leak_detection_linux or leak_detection_mac or leak_detection_netbsd: +if leak_detection_android or leak_detection_linux or leak_detection_mac or leak_detection_netbsd: config.available_features.add('leak-detection') # Set LD_LIBRARY_PATH to pick dynamic runtime up properly. diff --git a/compiler-rt/test/lit.common.cfg.py b/compiler-rt/test/lit.common.cfg.py --- a/compiler-rt/test/lit.common.cfg.py +++ b/compiler-rt/test/lit.common.cfg.py @@ -357,6 +357,14 @@ config.environment['ANDROID_SERIAL'] = config.android_serial adb = os.environ.get('ADB', 'adb') + + # These are needed for tests to upload/download temp files, such as + # suppression-files, to device. + config.substitutions.append( ('%device_rundir', "/data/local/tmp/Output") ) + config.substitutions.append( ('%push_to_device', "%s -s '%s' push " % (adb, env['ANDROID_SERIAL']) ) ) + config.substitutions.append( ('%pull_from_device', "%s -s '%s' pull " % (adb, env['ANDROID_SERIAL']) ) ) + config.substitutions.append( ('%adb_shell ', "%s -s '%s' shell " % (adb, env['ANDROID_SERIAL']) ) ) + try: android_api_level_str = subprocess.check_output([adb, "shell", "getprop", "ro.build.version.sdk"], env=env).rstrip() except (subprocess.CalledProcessError, OSError): @@ -375,6 +383,11 @@ subprocess.check_call([adb, "shell", "mkdir", "-p", android_tmpdir], env=env) for file in config.android_files_to_push: subprocess.check_call([adb, "push", file, android_tmpdir], env=env) +else: + config.substitutions.append( ('%device_rundir', "") ) + config.substitutions.append( ('%push_to_device', "echo ") ) + config.substitutions.append( ('%pull_from_device', "echo ") ) + config.substitutions.append( ('%adb_shell', "echo ") ) if config.host_os == 'Linux': # detect whether we are using glibc, and which version diff --git a/compiler-rt/test/lsan/TestCases/Linux/cleanup_in_tsd_destructor.c b/compiler-rt/test/lsan/TestCases/Linux/cleanup_in_tsd_destructor.c --- a/compiler-rt/test/lsan/TestCases/Linux/cleanup_in_tsd_destructor.c +++ b/compiler-rt/test/lsan/TestCases/Linux/cleanup_in_tsd_destructor.c @@ -3,7 +3,7 @@ // user-installed TSD destructors have finished running (since they may contain // additional cleanup tasks). LSan doesn't actually meet that goal 100%, but it // makes its best effort. -// RUN: LSAN_BASE="report_objects=1:use_registers=0:use_stacks=0:use_globals=0" +// RUN: LSAN_BASE="report_objects=1:use_registers=0:use_stacks=0" // RUN: %clang_lsan %s -o %t // RUN: %env_lsan_opts=$LSAN_BASE:use_tls=1 %run %t // RUN: %env_lsan_opts=$LSAN_BASE:use_tls=0 not %run %t 2>&1 | FileCheck %s diff --git a/compiler-rt/test/lsan/TestCases/Linux/disabler_in_tsd_destructor.c b/compiler-rt/test/lsan/TestCases/Linux/disabler_in_tsd_destructor.c --- a/compiler-rt/test/lsan/TestCases/Linux/disabler_in_tsd_destructor.c +++ b/compiler-rt/test/lsan/TestCases/Linux/disabler_in_tsd_destructor.c @@ -1,5 +1,5 @@ // Regression test. Disabler should not depend on TSD validity. -// RUN: LSAN_BASE="report_objects=1:use_registers=0:use_stacks=0:use_globals=0:use_tls=1:use_ld_allocations=0" +// RUN: LSAN_BASE="report_objects=1:use_registers=0:use_stacks=0:use_tls=1:use_ld_allocations=0" // RUN: %clang_lsan %s -o %t // RUN: %env_lsan_opts=$LSAN_BASE %run %t diff --git a/compiler-rt/test/lsan/TestCases/Linux/guard-page.c b/compiler-rt/test/lsan/TestCases/Linux/guard-page.c --- a/compiler-rt/test/lsan/TestCases/Linux/guard-page.c +++ b/compiler-rt/test/lsan/TestCases/Linux/guard-page.c @@ -1,6 +1,9 @@ // Check that if LSan finds that SP doesn't point into thread stack (e.g. // if swapcontext is used), LSan will not hit the guard page. // RUN: %clang_lsan %s -o %t && %run %t +// Missing 'getcontext' and 'makecontext' on Android. +// UNSUPPORTED: android + #include #include #include diff --git a/compiler-rt/test/lsan/TestCases/Linux/log-path_test.cpp b/compiler-rt/test/lsan/TestCases/Linux/log-path_test.cpp --- a/compiler-rt/test/lsan/TestCases/Linux/log-path_test.cpp +++ b/compiler-rt/test/lsan/TestCases/Linux/log-path_test.cpp @@ -7,7 +7,11 @@ // Good log_path. // RUN: rm -f %t.log.* -// RUN: %env_lsan_opts="use_stacks=0:log_path='"%t.log"'" not %run %t > %t.out 2>&1 +// RUN: %adb_shell 'rm -f %t.log.*' +// RUN: %env_lsan_opts="use_stacks=0:log_path='"%device_rundir/%t.log"'" not %run %t > %t.out 2>&1 +// adb-pull doesn't support wild cards so we need to rename the log file. +// RUN: %adb_shell 'mv %device_rundir/%t.log.* %device_rundir/%t.log' +// RUN: %pull_from_device %device_rundir/%t.log %t.log.ANDROID // RUN: FileCheck %s --check-prefix=CHECK-ERROR < %t.log.* #include diff --git a/compiler-rt/test/lsan/TestCases/Linux/use_tls_dynamic.cpp b/compiler-rt/test/lsan/TestCases/Linux/use_tls_dynamic.cpp --- a/compiler-rt/test/lsan/TestCases/Linux/use_tls_dynamic.cpp +++ b/compiler-rt/test/lsan/TestCases/Linux/use_tls_dynamic.cpp @@ -1,6 +1,6 @@ // Test that dynamically allocated TLS space is included in the root set. -// This is known to be broken with glibc-2.27+ +// This is known to be broken with glibc-2.27+ but it should pass with Bionic // https://bugs.llvm.org/show_bug.cgi?id=37804 // XFAIL: glibc-2.27 @@ -10,7 +10,7 @@ // RUN: %env_lsan_opts=$LSAN_BASE:"use_tls=0" not %run %t 2>&1 | FileCheck %s // RUN: %env_lsan_opts=$LSAN_BASE:"use_tls=1" %run %t 2>&1 // RUN: %env_lsan_opts="" %run %t 2>&1 -// UNSUPPORTED: i386-linux,arm,powerpc +// UNSUPPORTED: arm,powerpc #ifndef BUILD_DSO #include @@ -27,8 +27,15 @@ assert(handle != 0); typedef void **(* store_t)(void *p); store_t StoreToTLS = (store_t)dlsym(handle, "StoreToTLS"); - assert(dlerror() == 0); + // Sometimes dlerror() occurs when we broke the interceptors. + // Add the message here to make the error more obvious. + const char *dlerror_msg = dlerror(); + assert(dlerror_msg == nullptr); + if (dlerror_msg != nullptr) { + fprintf(stderr, "DLERROR: %s\n", dlerror_msg); + fflush(stderr); + } void *p = malloc(1337); // If we don't know about dynamic TLS, we will return a false leak above. void **p_in_tls = StoreToTLS(p); diff --git a/compiler-rt/test/lsan/TestCases/Linux/use_tls_pthread_specific_static.cpp b/compiler-rt/test/lsan/TestCases/Linux/use_tls_pthread_specific_static.cpp --- a/compiler-rt/test/lsan/TestCases/Linux/use_tls_pthread_specific_static.cpp +++ b/compiler-rt/test/lsan/TestCases/Linux/use_tls_pthread_specific_static.cpp @@ -19,7 +19,10 @@ int res; res = pthread_key_create(&key, NULL); assert(res == 0); +#if !defined(__ANDROID__) && !defined(__BIONIC__) + // Bionic doesn't have specific limit. assert(key < PTHREAD_KEY_2NDLEVEL_SIZE); +#endif void *p = malloc(1337); res = pthread_setspecific(key, p); assert(res == 0); diff --git a/compiler-rt/test/lsan/TestCases/disabler.c b/compiler-rt/test/lsan/TestCases/disabler.c --- a/compiler-rt/test/lsan/TestCases/disabler.c +++ b/compiler-rt/test/lsan/TestCases/disabler.c @@ -1,5 +1,5 @@ // Test for __lsan_disable() / __lsan_enable(). -// RUN: LSAN_BASE="report_objects=1:use_registers=0:use_stacks=0:use_globals=0:use_tls=0" +// RUN: LSAN_BASE="report_objects=1:use_registers=0:use_stacks=0:use_tls=0" // RUN: %clang_lsan %s -o %t // RUN: %env_lsan_opts=$LSAN_BASE not %run %t 2>&1 | FileCheck %s diff --git a/compiler-rt/test/lsan/TestCases/disabler.cpp b/compiler-rt/test/lsan/TestCases/disabler.cpp --- a/compiler-rt/test/lsan/TestCases/disabler.cpp +++ b/compiler-rt/test/lsan/TestCases/disabler.cpp @@ -1,5 +1,5 @@ // Test for ScopedDisabler. -// RUN: LSAN_BASE="report_objects=1:use_registers=0:use_stacks=0:use_globals=0:use_tls=0" +// RUN: LSAN_BASE="report_objects=1:use_registers=0:use_stacks=0:use_tls=0" // RUN: %clangxx_lsan %s -o %t // RUN: %env_lsan_opts=$LSAN_BASE not %run %t 2>&1 | FileCheck %s diff --git a/compiler-rt/test/lsan/TestCases/ignore_object.c b/compiler-rt/test/lsan/TestCases/ignore_object.c --- a/compiler-rt/test/lsan/TestCases/ignore_object.c +++ b/compiler-rt/test/lsan/TestCases/ignore_object.c @@ -1,5 +1,5 @@ // Test for __lsan_ignore_object(). -// RUN: LSAN_BASE="report_objects=1:use_registers=0:use_stacks=0:use_globals=0:use_tls=0" +// RUN: LSAN_BASE="report_objects=1:use_registers=0:use_stacks=0:use_tls=0" // RUN: %clang_lsan %s -o %t // RUN: %env_lsan_opts=$LSAN_BASE not %run %t 2>&1 | FileCheck %s diff --git a/compiler-rt/test/lsan/TestCases/large_allocation_leak.cpp b/compiler-rt/test/lsan/TestCases/large_allocation_leak.cpp --- a/compiler-rt/test/lsan/TestCases/large_allocation_leak.cpp +++ b/compiler-rt/test/lsan/TestCases/large_allocation_leak.cpp @@ -5,7 +5,7 @@ // For 32 bit LSan it's pretty likely that large chunks are "reachable" from some // internal data structures (e.g. Glibc global data). -// UNSUPPORTED: x86, arm +// UNSUPPORTED: x86,i686,arm #include #include diff --git a/compiler-rt/test/lsan/TestCases/many_threads_detach.cpp b/compiler-rt/test/lsan/TestCases/many_threads_detach.cpp --- a/compiler-rt/test/lsan/TestCases/many_threads_detach.cpp +++ b/compiler-rt/test/lsan/TestCases/many_threads_detach.cpp @@ -1,5 +1,7 @@ // Test that threads are reused. -// RUN: %clangxx_lsan %s -o %t -lpthread && %run %t +// On Android, pthread_* are in libc.so. So the `-lpthread` is not supported. +// Use `-pthread` so that its driver will DTRT (ie., ignore it). +// RUN: %clangxx_lsan %s -o %t -pthread && %run %t #include #include diff --git a/compiler-rt/test/lsan/TestCases/stale_stack_leak.cpp b/compiler-rt/test/lsan/TestCases/stale_stack_leak.cpp --- a/compiler-rt/test/lsan/TestCases/stale_stack_leak.cpp +++ b/compiler-rt/test/lsan/TestCases/stale_stack_leak.cpp @@ -6,7 +6,7 @@ // // x86 passes parameters through stack that may lead to false negatives // The same applies to s390x register save areas. -// UNSUPPORTED: x86,powerpc64,arm,s390x +// UNSUPPORTED: x86,i686,powerpc64,arm,s390x #include #include diff --git a/compiler-rt/test/lsan/TestCases/strace_test.cpp b/compiler-rt/test/lsan/TestCases/strace_test.cpp --- a/compiler-rt/test/lsan/TestCases/strace_test.cpp +++ b/compiler-rt/test/lsan/TestCases/strace_test.cpp @@ -2,6 +2,9 @@ // REQUIRES: strace // RUN: %clangxx_lsan %s -o %t // RUN: not strace -o /dev/null %run %t 2>&1 | FileCheck %s +// FIXME: This technically works in practice but cannot be tested because the +// fatal-error caused adb to failed. Could not be captured to stderr to lit-check. +// XFAIL: android #include #include diff --git a/compiler-rt/test/lsan/TestCases/suppressions_file.cpp b/compiler-rt/test/lsan/TestCases/suppressions_file.cpp --- a/compiler-rt/test/lsan/TestCases/suppressions_file.cpp +++ b/compiler-rt/test/lsan/TestCases/suppressions_file.cpp @@ -3,13 +3,16 @@ // RUN: rm -f %t.supp // RUN: touch %t.supp -// RUN: %env_lsan_opts="$LSAN_BASE:suppressions='%t.supp'" not %run %t 2>&1 | FileCheck %s --check-prefix=NOSUPP +// RUN: %push_to_device %t.supp %device_rundir/%t.supp +// RUN: %env_lsan_opts="$LSAN_BASE:suppressions='%device_rundir/%t.supp'" not %run %t 2>&1 | FileCheck %s --check-prefix=NOSUPP // RUN: echo "leak:*LSanTestLeakingFunc*" > %t.supp -// RUN: %env_lsan_opts="$LSAN_BASE:suppressions='%t.supp'" not %run %t 2>&1 | FileCheck %s - +// RUN: %push_to_device %t.supp %device_rundir/%t.supp +// RUN: %env_lsan_opts="$LSAN_BASE:suppressions='%device_rundir/%t.supp'" not %run %t 2>&1 | FileCheck %s +// // RUN: echo "leak:%t" > %t.supp -// RUN: %env_lsan_opts="$LSAN_BASE:suppressions='%t.supp':symbolize=false" %run %t +// RUN: %push_to_device %t.supp %device_rundir/%t.supp +// RUN: %env_lsan_opts="$LSAN_BASE:suppressions='%device_rundir/%t.supp':symbolize=false" %run %t #include #include diff --git a/compiler-rt/test/lsan/TestCases/swapcontext.cpp b/compiler-rt/test/lsan/TestCases/swapcontext.cpp --- a/compiler-rt/test/lsan/TestCases/swapcontext.cpp +++ b/compiler-rt/test/lsan/TestCases/swapcontext.cpp @@ -4,7 +4,8 @@ // RUN: %clangxx_lsan %s -o %t // RUN: %env_lsan_opts= %run %t 2>&1 // RUN: %env_lsan_opts= not %run %t foo 2>&1 | FileCheck %s -// UNSUPPORTED: arm,powerpc64 +// Missing 'getcontext' and 'makecontext' on Android. +// UNSUPPORTED: arm,powerpc64,android #include "sanitizer_common/sanitizer_ucontext.h" #include diff --git a/compiler-rt/test/lsan/TestCases/use_registers.cpp b/compiler-rt/test/lsan/TestCases/use_registers.cpp --- a/compiler-rt/test/lsan/TestCases/use_registers.cpp +++ b/compiler-rt/test/lsan/TestCases/use_registers.cpp @@ -20,8 +20,8 @@ // To store the pointer, choose a register which is unlikely to be reused by // a function call. -#if defined(__i386__) - asm("mov %0, %%esi" +#if defined(__i386__) || defined(__i686__) + asm("mov %0, %%edi" : : "r"(p)); #elif defined(__x86_64__) @@ -36,6 +36,12 @@ asm("mov r5, %0" : : "r"(p)); +#elif defined(__aarch64__) + // x9-10are used. x11-12 are probably used. + // So we pick x13 to be safe. + asm("mov x13, %0" + : + : "r"(p)); #elif defined(__powerpc__) asm("mr 30, %0" : diff --git a/compiler-rt/test/lsan/lit.common.cfg.py b/compiler-rt/test/lsan/lit.common.cfg.py --- a/compiler-rt/test/lsan/lit.common.cfg.py +++ b/compiler-rt/test/lsan/lit.common.cfg.py @@ -21,6 +21,7 @@ # Choose between standalone and LSan+ASan modes. lsan_lit_test_mode = get_required_attr(config, 'lsan_lit_test_mode') + if lsan_lit_test_mode == "Standalone": config.name = "LeakSanitizer-Standalone" lsan_cflags = ["-fsanitize=leak"] @@ -35,7 +36,8 @@ config.name += config.name_suffix # Platform-specific default LSAN_OPTIONS for lit tests. -default_lsan_opts = 'detect_leaks=1' +default_common_opts_str = ':'.join(list(config.default_sanitizer_opts)) +default_lsan_opts = default_common_opts_str + ':detect_leaks=1' if config.host_os == 'Darwin': # On Darwin, we default to `abort_on_error=1`, which would make tests run # much slower. Let's override this and run lit tests with 'abort_on_error=0'. @@ -53,6 +55,8 @@ config.available_features.add('strace') clang_cflags = ["-O0", config.target_cflags] + config.debug_info_flags +if config.android: + clang_cflags = clang_cflags + ["-fno-emulated-tls"] clang_cxxflags = config.cxx_mode_flags + clang_cflags lsan_incdir = config.test_source_root + "/../" clang_lsan_cflags = clang_cflags + lsan_cflags + ["-I%s" % lsan_incdir] @@ -69,11 +73,13 @@ config.substitutions.append( ("%clang_lsan ", build_invocation(clang_lsan_cflags)) ) config.substitutions.append( ("%clangxx_lsan ", build_invocation(clang_lsan_cxxflags)) ) -# LeakSanitizer tests are currently supported on x86-64 Linux, PowerPC64 Linux, arm Linux, mips64 Linux, s390x Linux and x86_64 Darwin. -supported_linux = config.host_os == 'Linux' and config.host_arch in ['x86_64', 'ppc64', 'ppc64le', 'mips64', 'arm', 'armhf', 'armv7l', 's390x'] +# LeakSanitizer tests are currently supported on +# Android{aarch64, x86, x86_64}, x86-64 Linux, PowerPC64 Linux, arm Linux, mips64 Linux, s390x Linux and x86_64 Darwin. +supported_android = config.android and config.target_arch in ['x86_64', 'i386', 'aarch64'] and 'android-thread-properties-api' in config.available_features +supported_linux = (not config.android) and config.host_os == 'Linux' and config.host_arch in ['x86_64', 'ppc64', 'ppc64le', 'mips64', 'arm', 'armhf', 'armv7l', 's390x'] supported_darwin = config.host_os == 'Darwin' and config.target_arch in ['x86_64'] supported_netbsd = config.host_os == 'NetBSD' and config.target_arch in ['x86_64', 'i386'] -if not (supported_linux or supported_darwin or supported_netbsd): +if not (supported_android or supported_linux or supported_darwin or supported_netbsd): config.unsupported = True # Don't support Thumb due to broken fast unwinder