aboutsummaryrefslogtreecommitdiff
path: root/compiler-rt/test
diff options
context:
space:
mode:
Diffstat (limited to 'compiler-rt/test')
-rw-r--r--compiler-rt/test/CMakeLists.txt12
-rwxr-xr-xcompiler-rt/test/asan/TestCases/Darwin/Inputs/check-syslog.sh6
-rw-r--r--compiler-rt/test/asan/TestCases/Darwin/asan-verify-module-map.cpp25
-rw-r--r--compiler-rt/test/asan/TestCases/Darwin/atos-symbolizer-dyld-root-path.cpp3
-rw-r--r--compiler-rt/test/asan/TestCases/Darwin/atos-symbolizer.cpp3
-rw-r--r--compiler-rt/test/asan/TestCases/Darwin/duplicate_os_log_reports.cpp10
-rw-r--r--compiler-rt/test/asan/TestCases/Darwin/dyld_insert_libraries_reexec.cpp18
-rw-r--r--compiler-rt/test/asan/TestCases/Darwin/dyld_insert_libraries_remove.cpp26
-rw-r--r--compiler-rt/test/asan/TestCases/Darwin/init_for_dlopen.cpp2
-rw-r--r--compiler-rt/test/asan/TestCases/Darwin/interface_symbols_darwin.cpp18
-rw-r--r--compiler-rt/test/asan/TestCases/Darwin/lit.local.cfg.py26
-rw-r--r--compiler-rt/test/asan/TestCases/Darwin/malloc_zone-protected.cpp3
-rw-r--r--compiler-rt/test/asan/TestCases/Linux/allocator_oom_test.cpp28
-rw-r--r--compiler-rt/test/asan/TestCases/Posix/deep_call_stack.cpp4
-rw-r--r--compiler-rt/test/asan/TestCases/disable_container_overflow_checks.cpp51
-rw-r--r--compiler-rt/test/asan/TestCases/log-path_test.cpp3
-rw-r--r--compiler-rt/test/asan/TestCases/scariness_score_test.cpp4
-rw-r--r--compiler-rt/test/asan/TestCases/stack_container_dynamic_lib.cpp120
-rw-r--r--compiler-rt/test/asan/TestCases/strcmp.c4
-rw-r--r--compiler-rt/test/asan/TestCases/suppress_fake_stack.cpp39
-rw-r--r--compiler-rt/test/asan/TestCases/suppress_fake_stack_force_disabled.cpp40
-rw-r--r--compiler-rt/test/asan/TestCases/verbose-log-path_test.cpp4
-rw-r--r--compiler-rt/test/asan_abi/TestCases/Darwin/llvm_interface_symbols.cpp3
-rw-r--r--compiler-rt/test/builtins/CMakeLists.txt34
-rw-r--r--compiler-rt/test/builtins/Unit/divsf3_test.c503
-rw-r--r--compiler-rt/test/builtins/Unit/mulsf3_test.c616
-rw-r--r--compiler-rt/test/dfsan/origin_endianness.c37
-rw-r--r--compiler-rt/test/fuzzer/big-file-copy.test5
-rw-r--r--compiler-rt/test/fuzzer/merge-posix.test4
-rw-r--r--compiler-rt/test/fuzzer/reduce_inputs.test2
-rw-r--r--compiler-rt/test/hwasan/TestCases/Linux/fixed-shadow.c16
-rw-r--r--compiler-rt/test/lit.common.cfg.py41
-rw-r--r--compiler-rt/test/orc/TestCases/Darwin/arm64/objc-imageinfo.S4
-rw-r--r--compiler-rt/test/orc/TestCases/Darwin/x86-64/objc-imageinfo.S4
-rw-r--r--compiler-rt/test/orc/TestCases/Linux/systemz/ehframe-default.cpp14
-rw-r--r--compiler-rt/test/orc/TestCases/Linux/systemz/ehframe-libunwind.cpp15
-rw-r--r--compiler-rt/test/orc/TestCases/Linux/systemz/lit.local.cfg.py5
-rw-r--r--compiler-rt/test/orc/TestCases/Linux/systemz/lljit-ehframe.cpp15
-rw-r--r--compiler-rt/test/orc/TestCases/Linux/systemz/lljit-initialize-deinitialize.ll32
-rw-r--r--compiler-rt/test/orc/TestCases/Linux/systemz/priority-static-initializer.S100
-rw-r--r--compiler-rt/test/orc/TestCases/Linux/systemz/trivial-atexit.S42
-rw-r--r--compiler-rt/test/orc/TestCases/Linux/systemz/trivial-cxa-atexit.S41
-rw-r--r--compiler-rt/test/orc/TestCases/Linux/systemz/trivial-static-initializer.S35
-rw-r--r--compiler-rt/test/profile/Darwin/instrprof-debug-info-correlate.c16
-rw-r--r--compiler-rt/test/profile/Linux/instrprof-debug-info-correlate-debuginfod.c7
-rw-r--r--compiler-rt/test/profile/Linux/instrprof-debug-info-correlate-warnings.c13
-rw-r--r--compiler-rt/test/profile/Linux/instrprof-debug-info-correlate-warnings.ll183
-rw-r--r--compiler-rt/test/profile/instrprof-tmpdir.c8
-rw-r--r--compiler-rt/test/rtsan/Darwin/dlopen.cpp9
-rw-r--r--compiler-rt/test/sanitizer_common/TestCases/Linux/soft_rss_limit_mb_test.cpp6
-rw-r--r--compiler-rt/test/sanitizer_common/TestCases/Posix/posix_spawn.c17
-rw-r--r--compiler-rt/test/sanitizer_common/TestCases/Posix/sanitizer_set_report_fd_test.cpp2
-rw-r--r--compiler-rt/test/sanitizer_common/TestCases/printf-ldbl.c3
-rw-r--r--compiler-rt/test/sanitizer_common/TestCases/scanf-ldbl.c3
-rw-r--r--compiler-rt/test/tsan/Darwin/dlopen.cpp7
-rw-r--r--compiler-rt/test/tsan/Darwin/external-ignore-noninstrumented.cpp6
-rw-r--r--compiler-rt/test/tsan/Darwin/external.cpp9
-rw-r--r--compiler-rt/test/tsan/Darwin/malloc-stack-logging.cpp2
-rw-r--r--compiler-rt/test/tsan/cxa_guard_acquire.cpp13
-rw-r--r--compiler-rt/test/tsan/target_clones_segfault.c11
-rw-r--r--compiler-rt/test/ubsan/CMakeLists.txt7
-rw-r--r--compiler-rt/test/ubsan/TestCases/Float/cast-overflow.cpp3
-rw-r--r--compiler-rt/test/ubsan/TestCases/Misc/Posix/print_stack_trace.cpp7
-rw-r--r--compiler-rt/test/ubsan/TestCases/Misc/Posix/sigaction.cpp3
-rw-r--r--compiler-rt/test/ubsan/TestCases/Misc/coverage-levels.cpp3
-rw-r--r--compiler-rt/test/ubsan/TestCases/Misc/log-path_test.cpp3
-rw-r--r--compiler-rt/test/ubsan/lit.common.cfg.py3
-rw-r--r--compiler-rt/test/ubsan_minimal/TestCases/misalignment.cpp2
-rw-r--r--compiler-rt/test/ubsan_minimal/TestCases/null.cpp2
-rw-r--r--compiler-rt/test/ubsan_minimal/TestCases/override-callback.c21
-rw-r--r--compiler-rt/test/ubsan_minimal/TestCases/test-darwin-interface.c13
-rw-r--r--compiler-rt/test/xray/TestCases/Posix/always-never-instrument.cpp2
-rw-r--r--compiler-rt/test/xray/TestCases/Posix/basic-filtering.cpp14
-rw-r--r--compiler-rt/test/xray/TestCases/Posix/basic-mode-dso.cpp5
-rw-r--r--compiler-rt/test/xray/TestCases/Posix/c-test.cpp2
-rw-r--r--compiler-rt/test/xray/TestCases/Posix/common-trampoline-alignment.cpp2
-rw-r--r--compiler-rt/test/xray/TestCases/Posix/custom-event-handler-alignment.cpp2
-rw-r--r--compiler-rt/test/xray/TestCases/Posix/custom-event-logging.cpp4
-rw-r--r--compiler-rt/test/xray/TestCases/Posix/default-options.cpp2
-rw-r--r--compiler-rt/test/xray/TestCases/Posix/fdr-mode-inmemory.cpp8
-rw-r--r--compiler-rt/test/xray/TestCases/Posix/fdr-mode-multiple.cpp8
-rw-r--r--compiler-rt/test/xray/TestCases/Posix/fdr-mode.cpp15
-rw-r--r--compiler-rt/test/xray/TestCases/Posix/fdr-thread-order.cpp2
-rw-r--r--compiler-rt/test/xray/TestCases/Posix/fork_basic_logging.cpp5
-rw-r--r--compiler-rt/test/xray/TestCases/Posix/profiling-multi-threaded.cpp8
-rw-r--r--compiler-rt/test/xray/TestCases/Posix/profiling-single-threaded.cpp8
-rw-r--r--compiler-rt/test/xray/TestCases/Posix/quiet-start.cpp6
-rw-r--r--compiler-rt/test/xray/lit.site.cfg.py.in2
88 files changed, 2194 insertions, 300 deletions
diff --git a/compiler-rt/test/CMakeLists.txt b/compiler-rt/test/CMakeLists.txt
index a2e4c8c..749f244 100644
--- a/compiler-rt/test/CMakeLists.txt
+++ b/compiler-rt/test/CMakeLists.txt
@@ -16,6 +16,13 @@ pythonize_bool(COMPILER_RT_HAS_AARCH64_SME)
pythonize_bool(COMPILER_RT_HAS_NO_DEFAULT_CONFIG_FLAG)
+if(LLVM_TREE_AVAILABLE OR NOT COMPILER_RT_STANDALONE_BUILD)
+ set(COMPILER_RT_BUILT_WITH_LLVM TRUE)
+else()
+ set(COMPILER_RT_BUILT_WITH_LLVM FALSE)
+endif()
+pythonize_bool(COMPILER_RT_BUILT_WITH_LLVM)
+
configure_compiler_rt_lit_site_cfg(
${CMAKE_CURRENT_SOURCE_DIR}/lit.common.configured.in
${CMAKE_CURRENT_BINARY_DIR}/lit.common.configured)
@@ -66,7 +73,10 @@ endfunction()
# Run sanitizer tests only if we're sure that clang would produce
# working binaries.
if(COMPILER_RT_CAN_EXECUTE_TESTS)
- if(COMPILER_RT_BUILD_BUILTINS)
+ # COMPILER_RT_TEST_BUILTINS_DIR allows running tests against builtins built
+ # in an independent build. This option is only indended to be used by
+ # LLVM_ENABLE_RUNTIMES-based builds.
+ if(COMPILER_RT_BUILD_BUILTINS OR COMPILER_RT_TEST_BUILTINS_DIR)
add_subdirectory(builtins)
endif()
if(COMPILER_RT_BUILD_SANITIZERS)
diff --git a/compiler-rt/test/asan/TestCases/Darwin/Inputs/check-syslog.sh b/compiler-rt/test/asan/TestCases/Darwin/Inputs/check-syslog.sh
new file mode 100755
index 0000000..8939ca7
--- /dev/null
+++ b/compiler-rt/test/asan/TestCases/Darwin/Inputs/check-syslog.sh
@@ -0,0 +1,6 @@
+#!/bin/sh
+for I in {1..3}; do \
+ log show --debug --last $((SECONDS + 30))s --predicate "processID == $1" --style syslog > $2; \
+ if grep -q "use-after-poison" $2; then break; fi; \
+ sleep 5; \
+done
diff --git a/compiler-rt/test/asan/TestCases/Darwin/asan-verify-module-map.cpp b/compiler-rt/test/asan/TestCases/Darwin/asan-verify-module-map.cpp
new file mode 100644
index 0000000..15be1cd
--- /dev/null
+++ b/compiler-rt/test/asan/TestCases/Darwin/asan-verify-module-map.cpp
@@ -0,0 +1,25 @@
+// This test simply checks that the "Invalid dyld module map" warning is not printed
+// in the output of a backtrace.
+
+// RUN: %clangxx_asan -DSHARED_LIB -g %s -dynamiclib -o %t.dylib
+// RUN: %clangxx_asan -O0 -g %s %t.dylib -o %t.executable
+// RUN: %env_asan_opts="print_module_map=2" not %run %t.executable 2>&1 | FileCheck %s -DDYLIB=%{t:stem}.tmp.dylib
+
+// CHECK-NOT: WARN: Invalid dyld module map
+// CHECK-DAG: 0x{{.*}}-0x{{.*}} {{.*}}[[DYLIB]]
+// CHECK-DAG: 0x{{.*}}-0x{{.*}} {{.*}}libsystem
+
+#ifdef SHARED_LIB
+extern "C" void foo(int *a) { *a = 5; }
+#else
+# include <cstdlib>
+
+extern "C" void foo(int *a);
+
+int main() {
+ int *a = (int *)malloc(sizeof(int));
+ free(a);
+ foo(a);
+ return 0;
+}
+#endif \ No newline at end of file
diff --git a/compiler-rt/test/asan/TestCases/Darwin/atos-symbolizer-dyld-root-path.cpp b/compiler-rt/test/asan/TestCases/Darwin/atos-symbolizer-dyld-root-path.cpp
index 664471b..4201d49 100644
--- a/compiler-rt/test/asan/TestCases/Darwin/atos-symbolizer-dyld-root-path.cpp
+++ b/compiler-rt/test/asan/TestCases/Darwin/atos-symbolizer-dyld-root-path.cpp
@@ -1,6 +1,7 @@
// Check that when having a DYLD_ROOT_PATH set, the symbolizer still works.
// RUN: %clangxx_asan -O0 %s -o %t
-// RUN: %env_asan_opts=verbosity=2 DYLD_ROOT_PATH="/" ASAN_SYMBOLIZER_PATH=$(which atos) \
+// RUN: which atos | tr -d '\n' > %t.symbolizer_path
+// RUN: %env_asan_opts=verbosity=2 DYLD_ROOT_PATH="/" ASAN_SYMBOLIZER_PATH=%{readfile:%t.symbolizer_path} \
// RUN: not %run %t 2>&1 | FileCheck %s
//
// Due to a bug in atos, this only works on x86_64.
diff --git a/compiler-rt/test/asan/TestCases/Darwin/atos-symbolizer.cpp b/compiler-rt/test/asan/TestCases/Darwin/atos-symbolizer.cpp
index bab4e4f..7487bd4 100644
--- a/compiler-rt/test/asan/TestCases/Darwin/atos-symbolizer.cpp
+++ b/compiler-rt/test/asan/TestCases/Darwin/atos-symbolizer.cpp
@@ -1,7 +1,8 @@
// Check that the `atos` symbolizer works.
// RUN: %clangxx_asan -O0 %s -o %t
-// RUN: %env_asan_opts=verbosity=2 ASAN_SYMBOLIZER_PATH=$(which atos) not %run %t 2>&1 | FileCheck %s
+// RUN: which atos | tr -d '\n' > %t.symbolizer_path
+// RUN: %env_asan_opts=verbosity=2 ASAN_SYMBOLIZER_PATH=%{readfile:%t.symbolizer_path} not %run %t 2>&1 | FileCheck %s
// Path returned by `which atos` is invalid on iOS.
// UNSUPPORTED: ios, i386-darwin
diff --git a/compiler-rt/test/asan/TestCases/Darwin/duplicate_os_log_reports.cpp b/compiler-rt/test/asan/TestCases/Darwin/duplicate_os_log_reports.cpp
index 5a0353b..40a168b 100644
--- a/compiler-rt/test/asan/TestCases/Darwin/duplicate_os_log_reports.cpp
+++ b/compiler-rt/test/asan/TestCases/Darwin/duplicate_os_log_reports.cpp
@@ -1,8 +1,8 @@
// UNSUPPORTED: ios
// REQUIRES: darwin_log_cmd
// RUN: %clangxx_asan -fsanitize-recover=address %s -o %t
-// RUN: { %env_asan_opts=halt_on_error=0,log_to_syslog=1 %run %t > %t.process_output.txt 2>&1 & } \
-// RUN: ; export TEST_PID=$! ; wait ${TEST_PID}
+// RUN: bash -c '{ %env_asan_opts=halt_on_error=0,log_to_syslog=1 %run %t > %t.process_output.txt 2>&1 & } \
+// RUN: ; export TEST_PID=$! ; wait ${TEST_PID}; echo -n ${TEST_PID} > %t.test_pid'
// Check process output.
// RUN: FileCheck %s --check-prefixes CHECK,CHECK-PROC -input-file=%t.process_output.txt
@@ -10,11 +10,7 @@
// Check syslog output. We filter recent system logs based on PID to avoid
// getting the logs of previous test runs. Make some reattempts in case there
// is a delay.
-// RUN: for I in {1..3}; do \
-// RUN: log show --debug --last $((SECONDS + 30))s --predicate "processID == ${TEST_PID}" --style syslog > %t.process_syslog_output.txt; \
-// RUN: if grep -q "use-after-poison" %t.process_syslog_output.txt; then break; fi; \
-// RUN: sleep 5; \
-// RUN: done
+// RUN: %S/Inputs/check-syslog.sh %{readfile:%t.test_pid} %t.process_syslog_output.txt
// RUN: FileCheck %s -input-file=%t.process_syslog_output.txt
#include <cassert>
#include <cstdio>
diff --git a/compiler-rt/test/asan/TestCases/Darwin/dyld_insert_libraries_reexec.cpp b/compiler-rt/test/asan/TestCases/Darwin/dyld_insert_libraries_reexec.cpp
index 0fec18b..89ee7a1 100644
--- a/compiler-rt/test/asan/TestCases/Darwin/dyld_insert_libraries_reexec.cpp
+++ b/compiler-rt/test/asan/TestCases/Darwin/dyld_insert_libraries_reexec.cpp
@@ -4,7 +4,8 @@
// UNSUPPORTED: ios
// RUN: rm -rf %t && mkdir -p %t
-// RUN: cp `%clang_asan -print-file-name=lib`/darwin/libclang_rt.asan_osx_dynamic.dylib \
+// RUN: %clang_asan -print-file-name=lib | tr -d '\n' > %t.lib_name
+// RUN: cp %{readfile:%t.lib_name}/darwin/libclang_rt.asan_osx_dynamic.dylib \
// RUN: %t/libclang_rt.asan_osx_dynamic.dylib
// RUN: %clangxx_asan %s -o %t/a.out
@@ -13,23 +14,12 @@
// RUN: %run %t/a.out 2>&1 \
// RUN: | FileCheck %s
-// RUN: MACOS_MAJOR=$(sw_vers -productVersion | cut -d'.' -f1)
-// RUN: MACOS_MINOR=$(sw_vers -productVersion | cut -d'.' -f2)
-
-// RUN: IS_MACOS_10_11_OR_HIGHER=$([ $MACOS_MAJOR -eq 10 ] && [ $MACOS_MINOR -lt 11 ]; echo $?)
-
// On OS X 10.10 and lower, if the dylib is not DYLD-inserted, ASan will re-exec.
-// RUN: if [ $IS_MACOS_10_11_OR_HIGHER == 0 ]; then \
-// RUN: %env_asan_opts=verbosity=1 %run %t/a.out 2>&1 \
-// RUN: | FileCheck --check-prefix=CHECK-NOINSERT %s; \
-// RUN: fi
+// RUN: %if mac-os-10-11-or-higher %{ %env_asan_opts=verbosity=1 %run %t/a.out 2>&1 | FileCheck --check-prefix=CHECK-NOINSERT %s %}
// On OS X 10.11 and higher, we don't need to DYLD-insert anymore, and the interceptors
// still installed correctly. Let's just check that things work and we don't try to re-exec.
-// RUN: if [ $IS_MACOS_10_11_OR_HIGHER == 1 ]; then \
-// RUN: %env_asan_opts=verbosity=1 %run %t/a.out 2>&1 \
-// RUN: | FileCheck %s; \
-// RUN: fi
+// RUN: %if mac-os-10-10-or-lower %{ %env_asan_opts=verbosity=1 %run %t/a.out 2>&1 | FileCheck %s %}
#include <stdio.h>
diff --git a/compiler-rt/test/asan/TestCases/Darwin/dyld_insert_libraries_remove.cpp b/compiler-rt/test/asan/TestCases/Darwin/dyld_insert_libraries_remove.cpp
index 0672e06..872848d 100644
--- a/compiler-rt/test/asan/TestCases/Darwin/dyld_insert_libraries_remove.cpp
+++ b/compiler-rt/test/asan/TestCases/Darwin/dyld_insert_libraries_remove.cpp
@@ -5,29 +5,27 @@
// UNSUPPORTED: ios
// RUN: rm -rf %t && mkdir -p %t
-// RUN: cp `%clang_asan -print-file-name=lib`/darwin/libclang_rt.asan_osx_dynamic.dylib \
+// RUN: %clang_asan -print-file-name=lib | tr -d '\n' > %t.lib_name
+// RUN: cp %{readfile:%t.lib_name}/darwin/libclang_rt.asan_osx_dynamic.dylib \
// RUN: %t/libclang_rt.asan_osx_dynamic.dylib
// RUN: %clangxx_asan %s -o %t/a.out
// RUN: %clangxx -DSHARED_LIB %s \
// RUN: -dynamiclib -o %t/dummy-so.dylib
-// RUN: ( cd %t && \
-// RUN: DYLD_INSERT_LIBRARIES=@executable_path/libclang_rt.asan_osx_dynamic.dylib:dummy-so.dylib \
-// RUN: %run ./a.out 2>&1 ) | FileCheck %s || exit 1
+// RUN: cd %t
+// RUN: env DYLD_INSERT_LIBRARIES=@executable_path/libclang_rt.asan_osx_dynamic.dylib:dummy-so.dylib \
+// RUN: %run ./a.out 2>&1 | FileCheck %s
-// RUN: ( cd %t && \
-// RUN: DYLD_INSERT_LIBRARIES=libclang_rt.asan_osx_dynamic.dylib:dummy-so.dylib \
-// RUN: %run ./a.out 2>&1 ) | FileCheck %s || exit 1
+// RUN: env DYLD_INSERT_LIBRARIES=libclang_rt.asan_osx_dynamic.dylib:dummy-so.dylib \
+// RUN: %run ./a.out 2>&1 | FileCheck %s
-// RUN: ( cd %t && \
-// RUN: %env_asan_opts=strip_env=0 \
-// RUN: DYLD_INSERT_LIBRARIES=libclang_rt.asan_osx_dynamic.dylib:dummy-so.dylib \
-// RUN: %run ./a.out 2>&1 ) | FileCheck %s --check-prefix=CHECK-KEEP || exit 1
+// RUN: %env_asan_opts=strip_env=0 \
+// RUN: DYLD_INSERT_LIBRARIES=libclang_rt.asan_osx_dynamic.dylib:dummy-so.dylib \
+// RUN: %run ./a.out 2>&1 | FileCheck %s --check-prefix=CHECK-KEEP
-// RUN: ( cd %t && \
-// RUN: DYLD_INSERT_LIBRARIES=%t/libclang_rt.asan_osx_dynamic.dylib:dummy-so.dylib \
-// RUN: %run ./a.out 2>&1 ) | FileCheck %s || exit 1
+// RUN: env DYLD_INSERT_LIBRARIES=%t/libclang_rt.asan_osx_dynamic.dylib:dummy-so.dylib \
+// RUN: %run ./a.out 2>&1 | FileCheck %s
#if !defined(SHARED_LIB)
#include <stdio.h>
diff --git a/compiler-rt/test/asan/TestCases/Darwin/init_for_dlopen.cpp b/compiler-rt/test/asan/TestCases/Darwin/init_for_dlopen.cpp
index 3bf8e99..9bb652c 100644
--- a/compiler-rt/test/asan/TestCases/Darwin/init_for_dlopen.cpp
+++ b/compiler-rt/test/asan/TestCases/Darwin/init_for_dlopen.cpp
@@ -5,7 +5,7 @@
// - By default the lit config sets this but we don't want this
// test to implicitly depend on this.
// - It avoids requiring `--crash` to be passed to `not`.
-// RUN: APPLE_ASAN_INIT_FOR_DLOPEN=0 %env_asan_opts=abort_on_error=0 not \
+// RUN: %env_asan_opts=abort_on_error=0 APPLE_ASAN_INIT_FOR_DLOPEN=0 not \
// RUN: %run %t %shared_libasan 2>&1 | \
// RUN: FileCheck -check-prefix=CHECK-DL-OPEN-FAIL %s
// RUN: env -u APPLE_ASAN_INIT_FOR_DLOPEN %env_asan_opts=abort_on_error=0 not \
diff --git a/compiler-rt/test/asan/TestCases/Darwin/interface_symbols_darwin.cpp b/compiler-rt/test/asan/TestCases/Darwin/interface_symbols_darwin.cpp
index 59dca32..ddf9388 100644
--- a/compiler-rt/test/asan/TestCases/Darwin/interface_symbols_darwin.cpp
+++ b/compiler-rt/test/asan/TestCases/Darwin/interface_symbols_darwin.cpp
@@ -9,13 +9,17 @@
// RUN: %clangxx_asan -dead_strip -O2 %s -o %t.exe
//
// note: we can not use -D on Darwin.
-// RUN: nm -g `%clang_asan %s -fsanitize=address -### 2>&1 | grep "libclang_rt.asan_osx_dynamic.dylib" | sed -e 's/.*"\(.*libclang_rt.asan_osx_dynamic.dylib\)".*/\1/'` \
-// RUN: | grep " [TU] " \
-// RUN: | grep -o "\(__asan_\|__ubsan_\|__sancov_\|__sanitizer_\)[^ ]*" \
-// RUN: | grep -v "__sanitizer_syscall" \
-// RUN: | grep -v "__sanitizer_weak_hook" \
-// RUN: | grep -v "__sanitizer_mz" \
-// RUN: | grep -v "__sancov_lowest_stack" \
+// RUN: %clang_asan %s -fsanitize=address -### 2>&1 \
+// RUN: | grep "libclang_rt.asan_osx_dynamic.dylib" \
+// RUN: | sed -e 's/.*"\(.*libclang_rt.asan_osx_dynamic.dylib\)".*/\1/' \
+// RUN: | tr -d '\n' > %t.compiler_runtime_path
+// RUN: nm -g %{readfile:%t.compiler_runtime_path} \
+// RUN: | grep " [TU] " \
+// RUN: | grep -o "\(__asan_\|__ubsan_\|__sancov_\|__sanitizer_\)[^ ]*" \
+// RUN: | grep -v "__sanitizer_syscall" \
+// RUN: | grep -v "__sanitizer_weak_hook" \
+// RUN: | grep -v "__sanitizer_mz" \
+// RUN: | grep -v "__sancov_lowest_stack" \
// RUN: | sed -e "s/__asan_version_mismatch_check_v[0-9]+/__asan_version_mismatch_check/" \
// RUN: > %t.exports
//
diff --git a/compiler-rt/test/asan/TestCases/Darwin/lit.local.cfg.py b/compiler-rt/test/asan/TestCases/Darwin/lit.local.cfg.py
index af82d30..fc99cd7 100644
--- a/compiler-rt/test/asan/TestCases/Darwin/lit.local.cfg.py
+++ b/compiler-rt/test/asan/TestCases/Darwin/lit.local.cfg.py
@@ -1,3 +1,6 @@
+import subprocess
+
+
def getRoot(config):
if not config.parent:
return config
@@ -8,3 +11,26 @@ root = getRoot(config)
if root.target_os not in ["Darwin"]:
config.unsupported = True
+
+
+def get_product_version():
+ try:
+ version_process = subprocess.run(
+ ["sw_vers", "-productVersion"],
+ check=True,
+ stdout=subprocess.PIPE,
+ stderr=subprocess.PIPE,
+ )
+ version_string = version_process.stdout.decode("utf-8").split("\n")[0]
+ version_split = version_string.split(".")
+ return (int(version_split[0]), int(version_split[1]))
+ except:
+ return (0, 0)
+
+
+macos_version_major, macos_version_minor = get_product_version()
+if config.apple_platform == "osx":
+ if macos_version_major > 10 and macos_version_minor > 11:
+ config.available_features.add("mac-os-10-11-or-higher")
+ else:
+ config.available_features.add("mac-os-10-10-or-lower")
diff --git a/compiler-rt/test/asan/TestCases/Darwin/malloc_zone-protected.cpp b/compiler-rt/test/asan/TestCases/Darwin/malloc_zone-protected.cpp
index 125b544..ac3c589 100644
--- a/compiler-rt/test/asan/TestCases/Darwin/malloc_zone-protected.cpp
+++ b/compiler-rt/test/asan/TestCases/Darwin/malloc_zone-protected.cpp
@@ -3,8 +3,7 @@
#include <stdio.h>
// RUN: %clangxx_asan %s -o %t
-// RUN: ASAN_OPTIONS="abort_on_error=1" not --crash %run %t 2>&1 | FileCheck %s
-
+// RUN: env ASAN_OPTIONS="abort_on_error=1" not --crash %run %t 2>&1 | FileCheck %s
void *pwn(malloc_zone_t *unused_zone, size_t unused_size) {
printf("PWNED\n");
diff --git a/compiler-rt/test/asan/TestCases/Linux/allocator_oom_test.cpp b/compiler-rt/test/asan/TestCases/Linux/allocator_oom_test.cpp
index f60a6a4..c51e11f 100644
--- a/compiler-rt/test/asan/TestCases/Linux/allocator_oom_test.cpp
+++ b/compiler-rt/test/asan/TestCases/Linux/allocator_oom_test.cpp
@@ -7,25 +7,37 @@
// Limit this test to Linux since we're relying on allocator internal
// limits (shadow memory size, allocation limits etc.)
+// TODO(boomanaiden154): Switch back to using env options instead of explicitly
+// exporting when the underlying bug causing ulimits to not apply to run lines
+// that use env options is fixed.
+
// RUN: %clangxx_asan -O0 %s -o %t
// RUN: ulimit -v 22024290304
// RUN: not %run %t malloc 2>&1 \
// RUN: | FileCheck %s --check-prefixes=CHECK-MALLOC,CHECK-CRASH
-// RUN: %env_asan_opts=allocator_may_return_null=0 not %run %t malloc 2>&1 \
+// RUN: %export_asan_opts=allocator_may_return_null=0
+// RUN: not %run %t malloc 2>&1 \
// RUN: | FileCheck %s --check-prefixes=CHECK-MALLOC,CHECK-CRASH
-// RUN: %env_asan_opts=allocator_may_return_null=1 %run %t malloc 2>&1 \
+// RUN: %export_asan_opts=allocator_may_return_null=1
+// RUN: %run %t malloc 2>&1 \
// RUN: | FileCheck %s --check-prefixes=CHECK-MALLOC,CHECK-NULL
-// RUN: %env_asan_opts=allocator_may_return_null=0 not %run %t calloc 2>&1 \
+// RUN: %export_asan_opts=allocator_may_return_null=0
+// RUN: not %run %t calloc 2>&1 \
// RUN: | FileCheck %s --check-prefixes=CHECK-CALLOC,CHECK-CRASH
-// RUN: %env_asan_opts=allocator_may_return_null=1 %run %t calloc 2>&1 \
+// RUN: %export_asan_opts=allocator_may_return_null=1
+// RUN: %run %t calloc 2>&1 \
// RUN: | FileCheck %s --check-prefixes=CHECK-CALLOC,CHECK-NULL
-// RUN: %env_asan_opts=allocator_may_return_null=0 not %run %t realloc 2>&1 \
+// RUN: %export_asan_opts=allocator_may_return_null=0
+// RUN: not %run %t realloc 2>&1 \
// RUN: | FileCheck %s --check-prefixes=CHECK-REALLOC,CHECK-CRASH
-// RUN: %env_asan_opts=allocator_may_return_null=1 %run %t realloc 2>&1 \
+// RUN: %export_asan_opts=allocator_may_return_null=1
+// RUN: %run %t realloc 2>&1 \
// RUN: | FileCheck %s --check-prefixes=CHECK-REALLOC,CHECK-NULL
-// RUN: %env_asan_opts=allocator_may_return_null=0 not %run %t realloc-after-malloc 2>&1 \
+// RUN: %export_asan_opts=allocator_may_return_null=0
+// RUN: not %run %t realloc-after-malloc 2>&1 \
// RUN: | FileCheck %s --check-prefixes=CHECK-MALLOC-REALLOC,CHECK-CRASH
-// RUN: %env_asan_opts=allocator_may_return_null=1 %run %t realloc-after-malloc 2>&1 \
+// RUN: %export_asan_opts=allocator_may_return_null=1
+// RUN: %run %t realloc-after-malloc 2>&1 \
// RUN: | FileCheck %s --check-prefixes=CHECK-MALLOC-REALLOC,CHECK-NULL
// ASan shadow memory on s390 is too large for this test.
diff --git a/compiler-rt/test/asan/TestCases/Posix/deep_call_stack.cpp b/compiler-rt/test/asan/TestCases/Posix/deep_call_stack.cpp
index 1342eae..c4e519f 100644
--- a/compiler-rt/test/asan/TestCases/Posix/deep_call_stack.cpp
+++ b/compiler-rt/test/asan/TestCases/Posix/deep_call_stack.cpp
@@ -1,5 +1,9 @@
// Check that UAR mode can handle very deep recursion.
// REQUIRES: shell
+// TODO(boomanaiden154): This test currently fails with the internal
+// shell because python is not able to set RLIMIT_STACK. We should
+// reenable this when the behavior is fixed.
+// UNSUPPORTED: system-darwin
// RUN: %clangxx_asan -O2 %s -o %t
// RUN: ulimit -s 4096
// RUN: %env_asan_opts=detect_stack_use_after_return=1 %run %t 2>&1 | FileCheck %s
diff --git a/compiler-rt/test/asan/TestCases/disable_container_overflow_checks.cpp b/compiler-rt/test/asan/TestCases/disable_container_overflow_checks.cpp
new file mode 100644
index 0000000..9e1e428
--- /dev/null
+++ b/compiler-rt/test/asan/TestCases/disable_container_overflow_checks.cpp
@@ -0,0 +1,51 @@
+// Test crash gives guidance on -D__SANITIZER_DISABLE_CONTAINER_OVERFLOW__ and
+// ASAN_OPTIONS=detect_container_overflow=0
+// RUN: %clangxx_asan -O %s -o %t
+// RUN: not %run %t 2>&1 | FileCheck --check-prefix=CHECK-CRASH %s
+//
+// Test overflow checks can be disabled at runtime with
+// ASAN_OPTIONS=detect_container_overflow=0
+// RUN: %env_asan_opts=detect_container_overflow=0 %run %t 2>&1 | FileCheck --check-prefix=CHECK-NOCRASH %s
+//
+// Illustrate use of -D__SANITIZER_DISABLE_CONTAINER_OVERFLOW__ flag to suppress
+// overflow checks at compile time.
+// RUN: %clangxx_asan -D__SANITIZER_DISABLE_CONTAINER_OVERFLOW__ -O %s -o %t-no-overflow
+// RUN: %run %t-no-overflow 2>&1 | FileCheck --check-prefix=CHECK-NOCRASH %s
+//
+// UNSUPPORTED: true
+
+#include <assert.h>
+#include <stdio.h>
+#include <string.h>
+
+// public definition of __sanitizer_annotate_contiguous_container
+#include "sanitizer/common_interface_defs.h"
+
+static volatile int one = 1;
+
+int TestCrash() {
+ long t[100];
+ t[60] = 0;
+#if __has_feature(address_sanitizer)
+ __sanitizer_annotate_contiguous_container(&t[0], &t[0] + 100, &t[0] + 100,
+ &t[0] + 50);
+#endif
+ // CHECK-CRASH: AddressSanitizer: container-overflow
+ // CHECK-CRASH: ASAN_OPTIONS=detect_container_overflow=0
+ // CHECK-CRASH: __SANITIZER_DISABLE_CONTAINER_OVERFLOW__
+ // CHECK-NOCRASH-NOT: AddressSanitizer: container-overflow
+ // CHECK-NOCRASH-NOT: ASAN_OPTIONS=detect_container_overflow=0
+ // CHECK-NOCRASH-NOT: __SANITIZER_DISABLE_CONTAINER_OVERFLOW__
+ return (int)t[60 * one]; // Touches the poisoned memory.
+}
+
+int main(int argc, char **argv) {
+
+ int retval = 0;
+
+ retval = TestCrash();
+
+ printf("Exiting main\n");
+
+ return retval;
+}
diff --git a/compiler-rt/test/asan/TestCases/log-path_test.cpp b/compiler-rt/test/asan/TestCases/log-path_test.cpp
index 6875d57..22f077f 100644
--- a/compiler-rt/test/asan/TestCases/log-path_test.cpp
+++ b/compiler-rt/test/asan/TestCases/log-path_test.cpp
@@ -1,6 +1,5 @@
// FIXME: https://code.google.com/p/address-sanitizer/issues/detail?id=316
-// XFAIL: android
-// UNSUPPORTED: ios
+// UNSUPPORTED: ios, android
//
// The for loop in the backticks below requires bash.
// REQUIRES: shell
diff --git a/compiler-rt/test/asan/TestCases/scariness_score_test.cpp b/compiler-rt/test/asan/TestCases/scariness_score_test.cpp
index 5d229cf..51ae040 100644
--- a/compiler-rt/test/asan/TestCases/scariness_score_test.cpp
+++ b/compiler-rt/test/asan/TestCases/scariness_score_test.cpp
@@ -74,6 +74,10 @@
// Parts of the test are too platform-specific:
// REQUIRES: x86_64-target-arch
// REQUIRES: shell
+// TODO(boomanaiden154): This test currently fails with the internal
+// shell because python is not able to set RLIMIT_STACK. We should
+// reenable this when the behavior is fixed.
+// UNSUPPORTED: system-darwin
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
diff --git a/compiler-rt/test/asan/TestCases/stack_container_dynamic_lib.cpp b/compiler-rt/test/asan/TestCases/stack_container_dynamic_lib.cpp
new file mode 100644
index 0000000..e14d946
--- /dev/null
+++ b/compiler-rt/test/asan/TestCases/stack_container_dynamic_lib.cpp
@@ -0,0 +1,120 @@
+// Test to demonstrate compile-time disabling of container-overflow checks
+// in order to handle uninstrumented libraries
+// UNSUPPORTED: target={{.*windows-.*}}
+
+// Mimic a closed-source library compiled without ASan
+// RUN: %clangxx_asan -fno-sanitize=address -DSHARED_LIB %s %fPIC -shared -o %t-so.so
+
+// Mimic multiple files being linked into a single executable,
+// %t-object.o and %t-main compiled seperately and then linked together
+// RUN: %clangxx_asan -DMULTI_SOURCE %s -c -o %t-object.o
+// RUN: %clangxx_asan %s -c -o %t-main.o
+// RUN: %clangxx_asan -o %t %t-main.o %t-object.o %libdl
+// RUN: not %run %t 2>&1 | FileCheck %s
+
+// Disable container overflow checks at runtime using ASAN_OPTIONS=detect_container_overflow=0
+// RUN: %env_asan_opts=detect_container_overflow=0 %run %t 2>&1 | FileCheck --check-prefix=CHECK-NO-CONTAINER-OVERFLOW %s
+
+// RUN: %clangxx_asan -D__SANITIZER_DISABLE_CONTAINER_OVERFLOW__ -DMULTI_SOURCE %s -c -o %t-object.o
+// RUN: %clangxx_asan -D__SANITIZER_DISABLE_CONTAINER_OVERFLOW__ %s -c -o %t-main.o
+// RUN: %clangxx_asan -D__SANITIZER_DISABLE_CONTAINER_OVERFLOW__ -o %t %t-main.o %t-object.o %libdl
+// RUN: %run %t 2>&1 | FileCheck --check-prefix=CHECK-NO-CONTAINER-OVERFLOW %s
+//
+// UNSUPPORTED: true
+
+#include <assert.h>
+#include <sanitizer/common_interface_defs.h>
+#include <stdio.h>
+
+template <typename T> class Stack {
+private:
+ T data[5];
+ size_t size;
+
+public:
+ Stack() : size(0) {
+#if __has_feature(address_sanitizer) && !__ASAN_DISABLE_CONTAINER_OVERFLOW__
+ // Mark entire storage as unaddressable initially
+ __sanitizer_annotate_contiguous_container(data, data + 5, data + 5, data);
+#endif
+ }
+
+ ~Stack() {
+#if __has_feature(address_sanitizer) && !__ASAN_DISABLE_CONTAINER_OVERFLOW__
+ __sanitizer_annotate_contiguous_container(data, data + 5, data + size,
+ data + 5);
+#endif
+ }
+
+ void push(const T &value) {
+ assert(size < 5 && "Stack overflow");
+#if __has_feature(address_sanitizer) && !__ASAN_DISABLE_CONTAINER_OVERFLOW__
+ __sanitizer_annotate_contiguous_container(data, data + 5, data + size,
+ data + size + 1);
+#endif
+ data[size++] = value;
+ }
+
+ T pop() {
+ assert(size > 0 && "Cannot pop from empty stack");
+ T result = data[--size];
+#if __has_feature(address_sanitizer) && !__ASAN_DISABLE_CONTAINER_OVERFLOW__
+ __sanitizer_annotate_contiguous_container(data, data + 5, data + size + 1,
+ data + size);
+#endif
+ return result;
+ }
+};
+
+#ifdef SHARED_LIB
+// Mimics a closed-source library compiled without ASan
+
+extern "C" void push_value_to_stack(Stack<int> &stack) { stack.push(42); }
+#else // SHARED_LIB
+
+# include <dlfcn.h>
+# include <string>
+
+typedef void (*push_func_t)(Stack<int> &);
+
+# if defined(MULTI_SOURCE)
+extern push_func_t push_value;
+
+extern "C" void do_push_value_to_stack(Stack<int> &stack) {
+ assert(push_value);
+ push_value(stack);
+}
+
+# else
+push_func_t push_value = nullptr;
+
+extern "C" void do_push_value_to_stack(Stack<int> &stack);
+
+int main(int argc, char *argv[]) {
+ std::string path = std::string(argv[0]) + "-so.so";
+ printf("Loading library: %s\n", path.c_str());
+
+ void *lib = dlopen(path.c_str(), RTLD_NOW);
+ assert(lib);
+
+ push_value = (push_func_t)dlsym(lib, "push_value_to_stack");
+ assert(push_value);
+
+ Stack<int> stack;
+ do_push_value_to_stack(stack);
+
+ // BOOM! uninstrumented library didn't update container bounds
+ int value = stack.pop();
+ // CHECK: AddressSanitizer: container-overflow
+ printf("Popped value: %d\n", value);
+ assert(value == 42 && "Expected value 42");
+
+ dlclose(lib);
+ printf("SUCCESS\n");
+ // CHECK-NO-CONTAINER-OVERFLOW: SUCCESS
+ return 0;
+}
+
+# endif // MULTI_SOURCE
+
+#endif // SHARED_LIB
diff --git a/compiler-rt/test/asan/TestCases/strcmp.c b/compiler-rt/test/asan/TestCases/strcmp.c
index 417bd49..2b31e64 100644
--- a/compiler-rt/test/asan/TestCases/strcmp.c
+++ b/compiler-rt/test/asan/TestCases/strcmp.c
@@ -14,6 +14,8 @@ int main(int argc, char **argv) {
assert(strcmp(s1 - 1, s2));
// CHECK: {{.*ERROR: AddressSanitizer: stack-buffer-underflow on address}}
- // CHECK: READ of size 1
+ // Very rarely `s1[-1]` happens to be '1', resulting in `strcmp` needing to
+ // check 2 bytes before failing, rather than 1 - this should still pass
+ // CHECK: READ of size {{[12]}}
return 0;
}
diff --git a/compiler-rt/test/asan/TestCases/suppress_fake_stack.cpp b/compiler-rt/test/asan/TestCases/suppress_fake_stack.cpp
new file mode 100644
index 0000000..f072c6a
--- /dev/null
+++ b/compiler-rt/test/asan/TestCases/suppress_fake_stack.cpp
@@ -0,0 +1,39 @@
+// RUN: %clangxx_asan %s -o %t && env ASAN_OPTIONS=detect_stack_use_after_return=1 %run %t
+// RUN: %clangxx_asan %s -mllvm -asan-use-after-return=runtime -o %t && env ASAN_OPTIONS=detect_stack_use_after_return=1 %run %t
+// RUN: %clangxx_asan %s -mllvm -asan-use-after-return=always -o %t && %run %t
+
+#include "defines.h"
+
+#include <cassert>
+#include <sanitizer/asan_interface.h>
+
+volatile uintptr_t saved;
+
+ATTRIBUTE_NOINLINE bool IsOnRealStack(uintptr_t parent_frame,
+ uintptr_t var_addr) {
+ uintptr_t this_frame =
+ reinterpret_cast<uintptr_t>(__builtin_frame_address(0));
+ return this_frame <= var_addr && var_addr <= parent_frame;
+}
+
+ATTRIBUTE_NOINLINE bool IsOnRealStack(uintptr_t parent_frame) {
+ volatile char temp = ' ';
+ saved = reinterpret_cast<uintptr_t>(&temp);
+ return IsOnRealStack(parent_frame, saved);
+}
+
+ATTRIBUTE_NOINLINE bool IsOnRealStack() {
+ return IsOnRealStack(reinterpret_cast<uintptr_t>(__builtin_frame_address(0)));
+}
+
+int main(int argc, char *argv[]) {
+ assert(!IsOnRealStack());
+
+ __asan_suppress_fake_stack();
+ assert(IsOnRealStack());
+
+ __asan_unsuppress_fake_stack();
+ assert(!IsOnRealStack());
+
+ return 0;
+}
diff --git a/compiler-rt/test/asan/TestCases/suppress_fake_stack_force_disabled.cpp b/compiler-rt/test/asan/TestCases/suppress_fake_stack_force_disabled.cpp
new file mode 100644
index 0000000..c549f08
--- /dev/null
+++ b/compiler-rt/test/asan/TestCases/suppress_fake_stack_force_disabled.cpp
@@ -0,0 +1,40 @@
+// Check unsuppressing fake stack does not reenable it if disabled via compile or runtime options.
+//
+// RUN: %clangxx_asan %s -mllvm -asan-use-after-return=never -o %t && %run %t
+// RUN: %clangxx_asan %s -mllvm -asan-use-after-return=runtime -o %t && env ASAN_OPTIONS=detect_stack_use_after_return=0 %run %t
+
+#include "defines.h"
+
+#include <cassert>
+#include <sanitizer/asan_interface.h>
+
+volatile uintptr_t saved;
+
+ATTRIBUTE_NOINLINE bool IsOnRealStack(uintptr_t parent_frame,
+ uintptr_t var_addr) {
+ uintptr_t this_frame =
+ reinterpret_cast<uintptr_t>(__builtin_frame_address(0));
+ return this_frame <= var_addr && var_addr <= parent_frame;
+}
+
+ATTRIBUTE_NOINLINE bool IsOnRealStack(uintptr_t parent_frame) {
+ volatile char temp = ' ';
+ saved = reinterpret_cast<uintptr_t>(&temp);
+ return IsOnRealStack(parent_frame, saved);
+}
+
+ATTRIBUTE_NOINLINE bool IsOnRealStack() {
+ return IsOnRealStack(reinterpret_cast<uintptr_t>(__builtin_frame_address(0)));
+}
+
+int main(int argc, char *argv[]) {
+ assert(IsOnRealStack());
+
+ __asan_suppress_fake_stack();
+ assert(IsOnRealStack());
+
+ __asan_unsuppress_fake_stack();
+ assert(IsOnRealStack());
+
+ return 0;
+}
diff --git a/compiler-rt/test/asan/TestCases/verbose-log-path_test.cpp b/compiler-rt/test/asan/TestCases/verbose-log-path_test.cpp
index 53166cc..f4781a7 100644
--- a/compiler-rt/test/asan/TestCases/verbose-log-path_test.cpp
+++ b/compiler-rt/test/asan/TestCases/verbose-log-path_test.cpp
@@ -9,8 +9,8 @@
// RUN: FileCheck %s --check-prefix=CHECK-ERROR < %t-dir/asan.log.verbose-log-path_test-binary.*
// FIXME: only FreeBSD, NetBSD and Linux have verbose log paths now.
-// XFAIL: target={{.*windows-msvc.*}},android
-// UNSUPPORTED: ios
+// XFAIL: target={{.*windows-msvc.*}}
+// UNSUPPORTED: ios, android
#include <stdlib.h>
#include <string.h>
diff --git a/compiler-rt/test/asan_abi/TestCases/Darwin/llvm_interface_symbols.cpp b/compiler-rt/test/asan_abi/TestCases/Darwin/llvm_interface_symbols.cpp
index 5da18aa..ba7b5e5 100644
--- a/compiler-rt/test/asan_abi/TestCases/Darwin/llvm_interface_symbols.cpp
+++ b/compiler-rt/test/asan_abi/TestCases/Darwin/llvm_interface_symbols.cpp
@@ -24,7 +24,8 @@
// RUN: diff %t.imports-sorted %t.exports-sorted
// Ensure that there is no dynamic dylib linked.
-// RUN: otool -L %t | (! grep -q "dynamic.dylib")
+// RUN: otool -L %t > %t.libs
+// RUN: not grep -q "dynamic.dylib" < %t.libs
// UNSUPPORTED: ios
diff --git a/compiler-rt/test/builtins/CMakeLists.txt b/compiler-rt/test/builtins/CMakeLists.txt
index 63f4c94..64545a7 100644
--- a/compiler-rt/test/builtins/CMakeLists.txt
+++ b/compiler-rt/test/builtins/CMakeLists.txt
@@ -1,6 +1,16 @@
set(BUILTINS_LIT_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR})
-set(BUILTINS_TEST_DEPS ${SANITIZER_COMMON_LIT_TEST_DEPS} builtins)
+# If COMPILER_RT_TEST_BUILTINS_DIR is set, the builtins
+# were already built and we are just going to test them.
+# NOTE: This is currently an LLVM-internal option which should
+# only be used by the LLVM_ENABLE_RUNTIMES build configured
+# in llvm/runtimes/CMakeLists.txt
+if(COMPILER_RT_TEST_BUILTINS_DIR)
+ set(BUILTINS_TEST_DEPS ${SANITIZER_COMMON_LIT_TEST_DEPS})
+else()
+ set(BUILTINS_TEST_DEPS ${SANITIZER_COMMON_LIT_TEST_DEPS} builtins)
+endif()
+
set(BUILTINS_TESTSUITES ${CMAKE_CURRENT_BINARY_DIR}/TestCases)
# Test cases.
@@ -35,6 +45,10 @@ if(APPLE)
darwin_filter_host_archs(BUILTIN_SUPPORTED_ARCH BUILTIN_TEST_ARCH)
endif()
+if(COMPILER_RT_ARM_OPTIMIZED_FP)
+ list(APPEND BUILTINS_TEST_TARGET_CFLAGS -DCOMPILER_RT_ARM_OPTIMIZED_FP)
+endif()
+
foreach(arch ${BUILTIN_TEST_ARCH})
set(BUILTINS_TEST_TARGET_ARCH ${arch})
string(TOLOWER "-${arch}-${OS_NAME}" BUILTINS_TEST_CONFIG_SUFFIX)
@@ -44,7 +58,8 @@ foreach(arch ${BUILTIN_TEST_ARCH})
string(REPLACE ";" " " BUILTINS_TEST_TARGET_CFLAGS "${BUILTINS_TEST_TARGET_CFLAGS}")
endif()
- if (COMPILER_RT_ENABLE_SOFTWARE_INT128 OR ${arch} STREQUAL "riscv32")
+ if (COMPILER_RT_ENABLE_SOFTWARE_INT128 OR ("${arch}" MATCHES "riscv32|sparc$"
+ AND NOT CMAKE_COMPILER_IS_GNUCC))
list(APPEND BUILTINS_TEST_TARGET_CFLAGS -fforce-enable-int128)
string(REPLACE ";" " " BUILTINS_TEST_TARGET_CFLAGS "${BUILTINS_TEST_TARGET_CFLAGS}")
endif()
@@ -79,10 +94,19 @@ foreach(arch ${BUILTIN_TEST_ARCH})
else()
set(BUILTIN_LIB_TARGET_NAME "clang_rt.builtins-${arch}")
endif()
- if (NOT TARGET "${BUILTIN_LIB_TARGET_NAME}")
- message(FATAL_ERROR "Target ${BUILTIN_LIB_TARGET_NAME} does not exist")
+ # Normally, we can just inspect the target directly to get the sources, but if
+ # we are testing an externally-built builtins library, we expect
+ # COMPILER_RT_TEST_BUILTINS_DIR to be set and contain a file named
+ # ${BUILTIN_LIB_TARGET_NAME}.sources.txt from the builtins build. This file
+ # is created by compiler-rt/lib/builtins/CMakeLists.txt
+ if(NOT COMPILER_RT_TEST_BUILTINS_DIR)
+ if (NOT TARGET "${BUILTIN_LIB_TARGET_NAME}")
+ message(FATAL_ERROR "Target ${BUILTIN_LIB_TARGET_NAME} does not exist")
+ endif()
+ get_target_property(BUILTIN_LIB_SOURCES "${BUILTIN_LIB_TARGET_NAME}" SOURCES)
+ else()
+ file(READ "${COMPILER_RT_TEST_BUILTINS_DIR}/${BUILTIN_LIB_TARGET_NAME}.sources.txt" BUILTIN_LIB_SOURCES)
endif()
- get_target_property(BUILTIN_LIB_SOURCES "${BUILTIN_LIB_TARGET_NAME}" SOURCES)
list(LENGTH BUILTIN_LIB_SOURCES BUILTIN_LIB_SOURCES_LENGTH)
if (BUILTIN_LIB_SOURCES_LENGTH EQUAL 0)
message(FATAL_ERROR "Failed to find source files for ${arch} builtin library")
diff --git a/compiler-rt/test/builtins/Unit/divsf3_test.c b/compiler-rt/test/builtins/Unit/divsf3_test.c
index f8cb616..12c5df5 100644
--- a/compiler-rt/test/builtins/Unit/divsf3_test.c
+++ b/compiler-rt/test/builtins/Unit/divsf3_test.c
@@ -1,115 +1,428 @@
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+
// RUN: %clang_builtins %s %librt -o %t && %run %t
// REQUIRES: librt_has_divsf3
#include "int_lib.h"
+#include <inttypes.h>
#include <stdio.h>
#include "fp_test.h"
+// By default this test uses compareResultF to check the returned floats, which
+// accepts any returned NaN if the expected result is the canonical NaN value
+// 0x7fc00000. For the Arm optimized FP implementation, which commits to a more
+// detailed handling of NaNs, we tighten up the check and include some extra
+// test cases specific to that NaN policy.
+#if (__arm__ && !(__thumb__ && !__thumb2__)) && COMPILER_RT_ARM_OPTIMIZED_FP
+# define EXPECT_EXACT_RESULTS
+# define ARM_NAN_HANDLING
+#endif
+
// Returns: a / b
COMPILER_RT_ABI float __divsf3(float a, float b);
-int test__divsf3(float a, float b, uint32_t expected)
-{
- float x = __divsf3(a, b);
- int ret = compareResultF(x, expected);
+int test__divsf3(uint32_t a_rep, uint32_t b_rep, uint32_t expected_rep) {
+ float a = fromRep32(a_rep), b = fromRep32(b_rep);
+ float x = __divsf3(a, b);
+#ifdef EXPECT_EXACT_RESULTS
+ int ret = toRep32(x) == expected_rep;
+#else
+ int ret = compareResultF(x, expected_rep);
+#endif
- if (ret){
- printf("error in test__divsf3(%.20e, %.20e) = %.20e, "
- "expected %.20e\n", a, b, x,
- fromRep32(expected));
- }
- return ret;
+ if (ret) {
+ printf("error in test__divsf3(%08" PRIx32 ", %08" PRIx32 ") = %08" PRIx32
+ ", expected %08" PRIx32 "\n",
+ a_rep, b_rep, toRep32(x), expected_rep);
+ }
+ return ret;
}
-int main()
-{
- // Returned NaNs are assumed to be qNaN by default
-
- // qNaN / any = qNaN
- if (test__divsf3(makeQNaN32(), 3.F, UINT32_C(0x7fc00000)))
- return 1;
- // NaN / any = NaN
- if (test__divsf3(makeNaN32(UINT32_C(0x123)), 3.F, UINT32_C(0x7fc00000)))
- return 1;
- // any / qNaN = qNaN
- if (test__divsf3(3.F, makeQNaN32(), UINT32_C(0x7fc00000)))
- return 1;
- // any / NaN = NaN
- if (test__divsf3(3.F, makeNaN32(UINT32_C(0x123)), UINT32_C(0x7fc00000)))
- return 1;
-
- // +Inf / positive = +Inf
- if (test__divsf3(makeInf32(), 3.F, UINT32_C(0x7f800000)))
- return 1;
- // +Inf / negative = -Inf
- if (test__divsf3(makeInf32(), -3.F, UINT32_C(0xff800000)))
- return 1;
- // -Inf / positive = -Inf
- if (test__divsf3(makeNegativeInf32(), 3.F, UINT32_C(0xff800000)))
- return 1;
- // -Inf / negative = +Inf
- if (test__divsf3(makeNegativeInf32(), -3.F, UINT32_C(0x7f800000)))
- return 1;
-
- // Inf / Inf = NaN
- if (test__divsf3(makeInf32(), makeInf32(), UINT32_C(0x7fc00000)))
- return 1;
- // 0.0 / 0.0 = NaN
- if (test__divsf3(+0x0.0p+0F, +0x0.0p+0F, UINT32_C(0x7fc00000)))
- return 1;
- // +0.0 / +Inf = +0.0
- if (test__divsf3(+0x0.0p+0F, makeInf32(), UINT32_C(0x0)))
- return 1;
- // +Inf / +0.0 = +Inf
- if (test__divsf3(makeInf32(), +0x0.0p+0F, UINT32_C(0x7f800000)))
- return 1;
-
- // positive / +0.0 = +Inf
- if (test__divsf3(+1.F, +0x0.0p+0F, UINT32_C(0x7f800000)))
- return 1;
- // positive / -0.0 = -Inf
- if (test__divsf3(+1.F, -0x0.0p+0F, UINT32_C(0xff800000)))
- return 1;
- // negative / +0.0 = -Inf
- if (test__divsf3(-1.F, +0x0.0p+0F, UINT32_C(0xff800000)))
- return 1;
- // negative / -0.0 = +Inf
- if (test__divsf3(-1.F, -0x0.0p+0F, UINT32_C(0x7f800000)))
- return 1;
-
- // 1/3
- if (test__divsf3(1.F, 3.F, UINT32_C(0x3eaaaaab)))
- return 1;
- // smallest normal result
- if (test__divsf3(0x1.0p-125F, 2.F, UINT32_C(0x00800000)))
- return 1;
+int main(void) {
+ int status = 0;
- // divisor is exactly 1.0
- if (test__divsf3(0x1.0p+0F, 0x1.0p+0F, UINT32_C(0x3f800000)))
- return 1;
- // divisor is truncated to exactly 1.0 in UQ1.15
- if (test__divsf3(0x1.0p+0F, 0x1.0001p+0F, UINT32_C(0x3f7fff00)))
- return 1;
+ status |= test__divsf3(0x00000000, 0x00000001, 0x00000000);
+ status |= test__divsf3(0x00000000, 0x007fffff, 0x00000000);
+ status |= test__divsf3(0x00000000, 0x00800000, 0x00000000);
+ status |= test__divsf3(0x00000000, 0x00ffffff, 0x00000000);
+ status |= test__divsf3(0x00000000, 0x3f800000, 0x00000000);
+ status |= test__divsf3(0x00000000, 0x40a00000, 0x00000000);
+ status |= test__divsf3(0x00000000, 0x7effffff, 0x00000000);
+ status |= test__divsf3(0x00000000, 0x7f000000, 0x00000000);
+ status |= test__divsf3(0x00000000, 0x7f800000, 0x00000000);
+ status |= test__divsf3(0x00000000, 0x80000002, 0x80000000);
+ status |= test__divsf3(0x00000000, 0x807fffff, 0x80000000);
+ status |= test__divsf3(0x00000000, 0x80800001, 0x80000000);
+ status |= test__divsf3(0x00000000, 0x81000000, 0x80000000);
+ status |= test__divsf3(0x00000000, 0xc0400000, 0x80000000);
+ status |= test__divsf3(0x00000000, 0xc0e00000, 0x80000000);
+ status |= test__divsf3(0x00000000, 0xfe7fffff, 0x80000000);
+ status |= test__divsf3(0x00000000, 0xff000000, 0x80000000);
+ status |= test__divsf3(0x00000000, 0xff800000, 0x80000000);
+ status |= test__divsf3(0x00000001, 0x00000000, 0x7f800000);
+ status |= test__divsf3(0x00000001, 0x3e000000, 0x00000008);
+ status |= test__divsf3(0x00000001, 0x3f000000, 0x00000002);
+ status |= test__divsf3(0x00000001, 0x40000000, 0x00000000);
+ status |= test__divsf3(0x00000001, 0x7f7fffff, 0x00000000);
+ status |= test__divsf3(0x00000001, 0x7f800000, 0x00000000);
+ status |= test__divsf3(0x00000001, 0xc0000000, 0x80000000);
+ status |= test__divsf3(0x00000001, 0xff7fffff, 0x80000000);
+ status |= test__divsf3(0x00000002, 0x80000000, 0xff800000);
+ status |= test__divsf3(0x00000002, 0xff800000, 0x80000000);
+ status |= test__divsf3(0x00000009, 0x41100000, 0x00000001);
+ status |= test__divsf3(0x00000009, 0xc1100000, 0x80000001);
+ status |= test__divsf3(0x007ffff7, 0x3f7ffffe, 0x007ffff8);
+ status |= test__divsf3(0x007ffffe, 0x3f7ffffe, 0x007fffff);
+ status |= test__divsf3(0x007fffff, 0x00000000, 0x7f800000);
+ status |= test__divsf3(0x007fffff, 0x3b000000, 0x04fffffe);
+ status |= test__divsf3(0x007fffff, 0x3f000000, 0x00fffffe);
+ status |= test__divsf3(0x007fffff, 0x3f800000, 0x007fffff);
+ status |= test__divsf3(0x007fffff, 0x3f800002, 0x007ffffd);
+ status |= test__divsf3(0x007fffff, 0x7f800000, 0x00000000);
+ status |= test__divsf3(0x007fffff, 0x80000000, 0xff800000);
+ status |= test__divsf3(0x007fffff, 0xbf800000, 0x807fffff);
+ status |= test__divsf3(0x007fffff, 0xff800000, 0x80000000);
+ status |= test__divsf3(0x00800000, 0x00000000, 0x7f800000);
+ status |= test__divsf3(0x00800000, 0x3f800001, 0x007fffff);
+ status |= test__divsf3(0x00800000, 0x7f800000, 0x00000000);
+ status |= test__divsf3(0x00800001, 0x3f800002, 0x007fffff);
+ status |= test__divsf3(0x00800001, 0x80000000, 0xff800000);
+ status |= test__divsf3(0x00800001, 0xff800000, 0x80000000);
+ status |= test__divsf3(0x00800002, 0x3f800006, 0x007ffffc);
+ status |= test__divsf3(0x00fffffe, 0x40000000, 0x007fffff);
+ status |= test__divsf3(0x00ffffff, 0x00000000, 0x7f800000);
+ status |= test__divsf3(0x00ffffff, 0x40000000, 0x00800000);
+ status |= test__divsf3(0x00ffffff, 0x7f800000, 0x00000000);
+ status |= test__divsf3(0x01000000, 0x00800000, 0x40000000);
+ status |= test__divsf3(0x01000000, 0x80000000, 0xff800000);
+ status |= test__divsf3(0x01000000, 0xc0000000, 0x80800000);
+ status |= test__divsf3(0x01000000, 0xff800000, 0x80000000);
+ status |= test__divsf3(0x01000001, 0x00800001, 0x40000000);
+ status |= test__divsf3(0x01000001, 0xc0000000, 0x80800001);
+ status |= test__divsf3(0x01000003, 0x80800003, 0xc0000000);
+ status |= test__divsf3(0x01000003, 0xc0000000, 0x80800003);
+ status |= test__divsf3(0x3f7ffff7, 0x3f7ffffb, 0x3f7ffffc);
+ status |= test__divsf3(0x3f7ffff7, 0x3f7ffffe, 0x3f7ffff9);
+ status |= test__divsf3(0x3f7ffff8, 0x3f7ffffc, 0x3f7ffffc);
+ status |= test__divsf3(0x3f7ffff8, 0x3f7ffffd, 0x3f7ffffb);
+ status |= test__divsf3(0x3f7ffffa, 0x3f7ffff9, 0x3f800001);
+ status |= test__divsf3(0x3f7ffffb, 0x3f7ffff9, 0x3f800001);
+ status |= test__divsf3(0x3f7ffffc, 0x3f7ffff9, 0x3f800002);
+ status |= test__divsf3(0x3f7ffffc, 0x3f7ffffd, 0x3f7fffff);
+ status |= test__divsf3(0x3f7ffffc, 0x3f7ffffe, 0x3f7ffffe);
+ status |= test__divsf3(0x3f7ffffc, 0x3f7fffff, 0x3f7ffffd);
+ status |= test__divsf3(0x3f7ffffc, 0x3f800001, 0x3f7ffffa);
+ status |= test__divsf3(0x3f7ffffd, 0x3f7ffff9, 0x3f800002);
+ status |= test__divsf3(0x3f7ffffd, 0x3f7ffffc, 0x3f800001);
+ status |= test__divsf3(0x3f7ffffd, 0x3f7ffffe, 0x3f7fffff);
+ status |= test__divsf3(0x3f7ffffd, 0x3f7fffff, 0x3f7ffffe);
+ status |= test__divsf3(0x3f7ffffd, 0x3f800001, 0x3f7ffffb);
+ status |= test__divsf3(0x3f7ffffd, 0x3f800002, 0x3f7ffff9);
+ status |= test__divsf3(0x3f7ffffe, 0x3f7ffff9, 0x3f800003);
+ status |= test__divsf3(0x3f7ffffe, 0x3f7ffffc, 0x3f800001);
+ status |= test__divsf3(0x3f7ffffe, 0x3f7ffffd, 0x3f800001);
+ status |= test__divsf3(0x3f7ffffe, 0x3f7fffff, 0x3f7fffff);
+ status |= test__divsf3(0x3f7ffffe, 0x3f800001, 0x3f7ffffc);
+ status |= test__divsf3(0x3f7ffffe, 0x3f800002, 0x3f7ffffa);
+ status |= test__divsf3(0x3f7ffffe, 0x3f800003, 0x3f7ffff8);
+ status |= test__divsf3(0x3f7fffff, 0x3f7ffff9, 0x3f800003);
+ status |= test__divsf3(0x3f7fffff, 0x3f7ffffc, 0x3f800002);
+ status |= test__divsf3(0x3f7fffff, 0x3f7ffffd, 0x3f800001);
+ status |= test__divsf3(0x3f7fffff, 0x3f7ffffe, 0x3f800001);
+ status |= test__divsf3(0x3f7fffff, 0x3f800001, 0x3f7ffffd);
+ status |= test__divsf3(0x3f7fffff, 0x3f800002, 0x3f7ffffb);
+ status |= test__divsf3(0x3f7fffff, 0x3f800003, 0x3f7ffff9);
+ status |= test__divsf3(0x3f7fffff, 0x3f800004, 0x3f7ffff7);
+ status |= test__divsf3(0x3f800000, 0x00000000, 0x7f800000);
+ status |= test__divsf3(0x3f800000, 0x3f7ffff7, 0x3f800005);
+ status |= test__divsf3(0x3f800000, 0x3f7ffff8, 0x3f800004);
+ status |= test__divsf3(0x3f800000, 0x3f7ffffb, 0x3f800003);
+ status |= test__divsf3(0x3f800000, 0x3f7ffffc, 0x3f800002);
+ status |= test__divsf3(0x3f800000, 0x3f7ffffd, 0x3f800002);
+ status |= test__divsf3(0x3f800000, 0x3f7ffffe, 0x3f800001);
+ status |= test__divsf3(0x3f800000, 0x3f7fffff, 0x3f800001);
+ status |= test__divsf3(0x3f800000, 0x3f800000, 0x3f800000);
+ status |= test__divsf3(0x3f800000, 0x3f800001, 0x3f7ffffe);
+ status |= test__divsf3(0x3f800000, 0x3f800002, 0x3f7ffffc);
+ status |= test__divsf3(0x3f800000, 0x3f800003, 0x3f7ffffa);
+ status |= test__divsf3(0x3f800000, 0x3f800004, 0x3f7ffff8);
+ status |= test__divsf3(0x3f800000, 0x7f800000, 0x00000000);
+ status |= test__divsf3(0x3f800001, 0x3f7ffffb, 0x3f800004);
+ status |= test__divsf3(0x3f800001, 0x3f7ffffd, 0x3f800003);
+ status |= test__divsf3(0x3f800001, 0x3f7ffffe, 0x3f800002);
+ status |= test__divsf3(0x3f800001, 0x3f7fffff, 0x3f800002);
+ status |= test__divsf3(0x3f800001, 0x3f800002, 0x3f7ffffe);
+ status |= test__divsf3(0x3f800001, 0x3f800003, 0x3f7ffffc);
+ status |= test__divsf3(0x3f800002, 0x3f7ffffc, 0x3f800004);
+ status |= test__divsf3(0x3f800002, 0x3f7ffffd, 0x3f800004);
+ status |= test__divsf3(0x3f800002, 0x3f7ffffe, 0x3f800003);
+ status |= test__divsf3(0x3f800002, 0x3f7fffff, 0x3f800003);
+ status |= test__divsf3(0x3f800002, 0x3f800001, 0x3f800001);
+ status |= test__divsf3(0x3f800002, 0x3f800003, 0x3f7ffffe);
+ status |= test__divsf3(0x3f800003, 0x3f7ffffd, 0x3f800005);
+ status |= test__divsf3(0x3f800003, 0x3f7ffffe, 0x3f800004);
+ status |= test__divsf3(0x3f800003, 0x3f7fffff, 0x3f800004);
+ status |= test__divsf3(0x3f800003, 0x3f800001, 0x3f800002);
+ status |= test__divsf3(0x3f800004, 0x3f7ffffe, 0x3f800005);
+ status |= test__divsf3(0x3f800004, 0x3f800001, 0x3f800003);
+ status |= test__divsf3(0x3f800004, 0x3f800007, 0x3f7ffffa);
+ status |= test__divsf3(0x3f800005, 0x3f7fffff, 0x3f800006);
+ status |= test__divsf3(0x3f800006, 0x3f800008, 0x3f7ffffc);
+ status |= test__divsf3(0x3f800007, 0x3f800002, 0x3f800005);
+ status |= test__divsf3(0x3f800009, 0x3f800008, 0x3f800001);
+ status |= test__divsf3(0x40000000, 0x3f800000, 0x40000000);
+ status |= test__divsf3(0x40000000, 0xbf800000, 0xc0000000);
+ status |= test__divsf3(0x40400000, 0x80000000, 0xff800000);
+ status |= test__divsf3(0x40400000, 0xc0400000, 0xbf800000);
+ status |= test__divsf3(0x40400000, 0xff800000, 0x80000000);
+ status |= test__divsf3(0x40a00000, 0x00000000, 0x7f800000);
+ status |= test__divsf3(0x40a00000, 0x40a00000, 0x3f800000);
+ status |= test__divsf3(0x40a00000, 0x7f800000, 0x00000000);
+ status |= test__divsf3(0x40e00000, 0x80000000, 0xff800000);
+ status |= test__divsf3(0x40e00000, 0xff800000, 0x80000000);
+ status |= test__divsf3(0x41000000, 0x40000000, 0x40800000);
+ status |= test__divsf3(0x41100000, 0x40400000, 0x40400000);
+ status |= test__divsf3(0x7b000000, 0x05000000, 0x7f800000);
+ status |= test__divsf3(0x7e7fffff, 0x80000000, 0xff800000);
+ status |= test__divsf3(0x7efffffd, 0xc0000000, 0xfe7ffffd);
+ status |= test__divsf3(0x7effffff, 0x00000000, 0x7f800000);
+ status |= test__divsf3(0x7effffff, 0x7f800000, 0x00000000);
+ status |= test__divsf3(0x7f000000, 0x00000000, 0x7f800000);
+ status |= test__divsf3(0x7f000000, 0x007fffff, 0x7f800000);
+ status |= test__divsf3(0x7f000000, 0x3f000000, 0x7f800000);
+ status |= test__divsf3(0x7f000000, 0x40000000, 0x7e800000);
+ status |= test__divsf3(0x7f000000, 0x7f800000, 0x00000000);
+ status |= test__divsf3(0x7f000000, 0x80000000, 0xff800000);
+ status |= test__divsf3(0x7f000000, 0xbf000000, 0xff800000);
+ status |= test__divsf3(0x7f000000, 0xc0000000, 0xfe800000);
+ status |= test__divsf3(0x7f000000, 0xff800000, 0x80000000);
+ status |= test__divsf3(0x7f000003, 0xfe800003, 0xc0000000);
+ status |= test__divsf3(0x7f7ffffd, 0x40800000, 0x7e7ffffd);
+ status |= test__divsf3(0x7f7ffffd, 0xc0800000, 0xfe7ffffd);
+ status |= test__divsf3(0x7f7fffff, 0x00000001, 0x7f800000);
+ status |= test__divsf3(0x7f7fffff, 0x3f7fffff, 0x7f800000);
+ status |= test__divsf3(0x7f7fffff, 0x7e7fffff, 0x40800000);
+ status |= test__divsf3(0x7f7fffff, 0x7effffff, 0x40000000);
+ status |= test__divsf3(0x7f7fffff, 0xc0000000, 0xfeffffff);
+ status |= test__divsf3(0x7f7fffff, 0xfe7fffff, 0xc0800000);
+ status |= test__divsf3(0x7f7fffff, 0xff800000, 0x80000000);
+ status |= test__divsf3(0x7f800000, 0x00000000, 0x7f800000);
+ status |= test__divsf3(0x7f800000, 0x00000001, 0x7f800000);
+ status |= test__divsf3(0x7f800000, 0x007fffff, 0x7f800000);
+ status |= test__divsf3(0x7f800000, 0x00800000, 0x7f800000);
+ status |= test__divsf3(0x7f800000, 0x00ffffff, 0x7f800000);
+ status |= test__divsf3(0x7f800000, 0x3f800000, 0x7f800000);
+ status |= test__divsf3(0x7f800000, 0x40a00000, 0x7f800000);
+ status |= test__divsf3(0x7f800000, 0x7effffff, 0x7f800000);
+ status |= test__divsf3(0x7f800000, 0x7f000000, 0x7f800000);
+ status |= test__divsf3(0x7f800000, 0x80000000, 0xff800000);
+ status |= test__divsf3(0x7f800000, 0x80000002, 0xff800000);
+ status |= test__divsf3(0x7f800000, 0x807fffff, 0xff800000);
+ status |= test__divsf3(0x7f800000, 0x80800001, 0xff800000);
+ status |= test__divsf3(0x7f800000, 0x81000000, 0xff800000);
+ status |= test__divsf3(0x7f800000, 0xc0400000, 0xff800000);
+ status |= test__divsf3(0x7f800000, 0xc0e00000, 0xff800000);
+ status |= test__divsf3(0x7f800000, 0xfe7fffff, 0xff800000);
+ status |= test__divsf3(0x7f800000, 0xff000000, 0xff800000);
+ status |= test__divsf3(0x7f800000, 0xff7fffff, 0xff800000);
+ status |= test__divsf3(0x80000000, 0x00000003, 0x80000000);
+ status |= test__divsf3(0x80000000, 0x007fffff, 0x80000000);
+ status |= test__divsf3(0x80000000, 0x00800001, 0x80000000);
+ status |= test__divsf3(0x80000000, 0x01000000, 0x80000000);
+ status |= test__divsf3(0x80000000, 0x40000000, 0x80000000);
+ status |= test__divsf3(0x80000000, 0x40c00000, 0x80000000);
+ status |= test__divsf3(0x80000000, 0x7e7fffff, 0x80000000);
+ status |= test__divsf3(0x80000000, 0x7e800000, 0x80000000);
+ status |= test__divsf3(0x80000000, 0x7f800000, 0x80000000);
+ status |= test__divsf3(0x80000000, 0x80000004, 0x00000000);
+ status |= test__divsf3(0x80000000, 0x807fffff, 0x00000000);
+ status |= test__divsf3(0x80000000, 0x80800000, 0x00000000);
+ status |= test__divsf3(0x80000000, 0x80ffffff, 0x00000000);
+ status |= test__divsf3(0x80000000, 0xc0800000, 0x00000000);
+ status |= test__divsf3(0x80000000, 0xc1000000, 0x00000000);
+ status |= test__divsf3(0x80000000, 0xfe800000, 0x00000000);
+ status |= test__divsf3(0x80000000, 0xfeffffff, 0x00000000);
+ status |= test__divsf3(0x80000000, 0xff800000, 0x00000000);
+ status |= test__divsf3(0x80000001, 0x3f000000, 0x80000002);
+ status |= test__divsf3(0x80000001, 0x40000000, 0x80000000);
+ status |= test__divsf3(0x80000001, 0x7f7fffff, 0x80000000);
+ status |= test__divsf3(0x80000001, 0xc0000000, 0x00000000);
+ status |= test__divsf3(0x80000001, 0xff7fffff, 0x00000000);
+ status |= test__divsf3(0x80000003, 0x00000000, 0xff800000);
+ status |= test__divsf3(0x80000003, 0x7f800000, 0x80000000);
+ status |= test__divsf3(0x80000004, 0x80000000, 0x7f800000);
+ status |= test__divsf3(0x80000004, 0xff800000, 0x00000000);
+ status |= test__divsf3(0x807ffff8, 0x3f7ffffe, 0x807ffff9);
+ status |= test__divsf3(0x807fffff, 0x00000000, 0xff800000);
+ status |= test__divsf3(0x807fffff, 0x7f800000, 0x80000000);
+ status |= test__divsf3(0x807fffff, 0x80000000, 0x7f800000);
+ status |= test__divsf3(0x807fffff, 0xff800000, 0x00000000);
+ status |= test__divsf3(0x80800000, 0x3f800001, 0x807fffff);
+ status |= test__divsf3(0x80800000, 0x80000000, 0x7f800000);
+ status |= test__divsf3(0x80800000, 0xff800000, 0x00000000);
+ status |= test__divsf3(0x80800001, 0x00000000, 0xff800000);
+ status |= test__divsf3(0x80800001, 0x7f800000, 0x80000000);
+ status |= test__divsf3(0x80ffffff, 0x80000000, 0x7f800000);
+ status |= test__divsf3(0x80ffffff, 0xff800000, 0x00000000);
+ status |= test__divsf3(0x81000000, 0x00000000, 0xff800000);
+ status |= test__divsf3(0x81000000, 0x7f800000, 0x80000000);
+ status |= test__divsf3(0x81000001, 0x00800001, 0xc0000000);
+ status |= test__divsf3(0x81000005, 0x00800005, 0xc0000000);
+ status |= test__divsf3(0xbf800000, 0x3f800000, 0xbf800000);
+ status |= test__divsf3(0xbf800000, 0xbf800000, 0x3f800000);
+ status |= test__divsf3(0xc0000000, 0x00000000, 0xff800000);
+ status |= test__divsf3(0xc0000000, 0x3f800000, 0xc0000000);
+ status |= test__divsf3(0xc0000000, 0x7f800000, 0x80000000);
+ status |= test__divsf3(0xc0000000, 0xbf800000, 0x40000000);
+ status |= test__divsf3(0xc0800000, 0x80000000, 0x7f800000);
+ status |= test__divsf3(0xc0800000, 0xff800000, 0x00000000);
+ status |= test__divsf3(0xc0c00000, 0x00000000, 0xff800000);
+ status |= test__divsf3(0xc0c00000, 0x7f800000, 0x80000000);
+ status |= test__divsf3(0xc0c00000, 0xc0400000, 0x40000000);
+ status |= test__divsf3(0xc0e00000, 0x40e00000, 0xbf800000);
+ status |= test__divsf3(0xc1000000, 0x40000000, 0xc0800000);
+ status |= test__divsf3(0xc1000000, 0x80000000, 0x7f800000);
+ status |= test__divsf3(0xc1000000, 0xff800000, 0x00000000);
+ status |= test__divsf3(0xc1100000, 0xc0400000, 0x40400000);
+ status |= test__divsf3(0xfe7fffff, 0x00000000, 0xff800000);
+ status |= test__divsf3(0xfe7fffff, 0x7f800000, 0x80000000);
+ status |= test__divsf3(0xfe800000, 0x00000000, 0xff800000);
+ status |= test__divsf3(0xfe800000, 0x7f800000, 0x80000000);
+ status |= test__divsf3(0xfe800000, 0x80000000, 0x7f800000);
+ status |= test__divsf3(0xfe800000, 0xff800000, 0x00000000);
+ status |= test__divsf3(0xfeffffff, 0x40000000, 0xfe7fffff);
+ status |= test__divsf3(0xfeffffff, 0x80000000, 0x7f800000);
+ status |= test__divsf3(0xff000000, 0x3f000000, 0xff800000);
+ status |= test__divsf3(0xff000000, 0xbf000000, 0x7f800000);
+ status |= test__divsf3(0xff000001, 0x7e800001, 0xc0000000);
+ status |= test__divsf3(0xff7ffffd, 0x40800000, 0xfe7ffffd);
+ status |= test__divsf3(0xff7ffffd, 0xc0800000, 0x7e7ffffd);
+ status |= test__divsf3(0xff7fffff, 0x7e7fffff, 0xc0800000);
+ status |= test__divsf3(0xff7fffff, 0xfe7fffff, 0x40800000);
+ status |= test__divsf3(0xff7fffff, 0xff800000, 0x00000000);
+ status |= test__divsf3(0xff800000, 0x00000000, 0xff800000);
+ status |= test__divsf3(0xff800000, 0x00000003, 0xff800000);
+ status |= test__divsf3(0xff800000, 0x007fffff, 0xff800000);
+ status |= test__divsf3(0xff800000, 0x00800001, 0xff800000);
+ status |= test__divsf3(0xff800000, 0x01000000, 0xff800000);
+ status |= test__divsf3(0xff800000, 0x40000000, 0xff800000);
+ status |= test__divsf3(0xff800000, 0x40c00000, 0xff800000);
+ status |= test__divsf3(0xff800000, 0x7e800000, 0xff800000);
+ status |= test__divsf3(0xff800000, 0x80000000, 0x7f800000);
+ status |= test__divsf3(0xff800000, 0x80000004, 0x7f800000);
+ status |= test__divsf3(0xff800000, 0x807fffff, 0x7f800000);
+ status |= test__divsf3(0xff800000, 0x80800000, 0x7f800000);
+ status |= test__divsf3(0xff800000, 0x80ffffff, 0x7f800000);
+ status |= test__divsf3(0xff800000, 0xc0800000, 0x7f800000);
+ status |= test__divsf3(0xff800000, 0xc1000000, 0x7f800000);
+ status |= test__divsf3(0xff800000, 0xfe800000, 0x7f800000);
+ status |= test__divsf3(0xff800000, 0xff7fffff, 0x7f800000);
+ status |= test__divsf3(0x2cbed883, 0x333f6113, 0x38ff4953);
+ status |= test__divsf3(0x3f87ffff, 0x7f001000, 0x0043f781);
- // smallest normal value divided by 2.0
- if (test__divsf3(0x1.0p-126F, 2.0F, UINT32_C(0x00400000)))
- return 1;
- // smallest subnormal result
- if (test__divsf3(0x1.0p-126F, 0x1p+23F, UINT32_C(0x00000001)))
- return 1;
+ // Test that the result of an operation is a NaN at all when it should be.
+ //
+ // In most configurations these tests' results are checked compared using
+ // compareResultF, so we set all the answers to the canonical NaN 0x7fc00000,
+ // which causes compareResultF to accept any NaN encoding. We also use the
+ // same value as the input NaN in tests that have one, so that even in
+ // EXPECT_EXACT_RESULTS mode these tests should pass, because 0x7fc00000 is
+ // still the exact expected NaN.
+ status |= test__divsf3(0x00000000, 0x00000000, 0x7fc00000);
+ status |= test__divsf3(0x00000000, 0x80000000, 0x7fc00000);
+ status |= test__divsf3(0x7f800000, 0x7f800000, 0x7fc00000);
+ status |= test__divsf3(0x7f800000, 0xff800000, 0x7fc00000);
+ status |= test__divsf3(0x80000000, 0x00000000, 0x7fc00000);
+ status |= test__divsf3(0x80000000, 0x80000000, 0x7fc00000);
+ status |= test__divsf3(0xff800000, 0x7f800000, 0x7fc00000);
+ status |= test__divsf3(0xff800000, 0xff800000, 0x7fc00000);
+ status |= test__divsf3(0x3f800000, 0x7fc00000, 0x7fc00000);
+ status |= test__divsf3(0x7fc00000, 0x3f800000, 0x7fc00000);
+ status |= test__divsf3(0x7fc00000, 0x7fc00000, 0x7fc00000);
- // some misc test cases obtained by fuzzing against h/w implementation
- if (test__divsf3(-0x1.3e75e6p-108F, -0x1.cf372p+38F, UINT32_C(0x00000006)))
- return 1;
- if (test__divsf3(0x1.e77c54p+81F, -0x1.e77c52p-47F, UINT32_C(0xff800000)))
- return 1;
- if (test__divsf3(0x1.fffffep-126F, 2.F, UINT32_C(0x00800000)))
- return 1;
+#ifdef ARM_NAN_HANDLING
+ // Tests specific to the NaN handling of Arm hardware, mimicked by
+ // arm/divsf3.S:
+ //
+ // - a quiet NaN is distinguished by the top mantissa bit being 1
+ //
+ // - if a signalling NaN appears in the input, the output quiet NaN is
+ // obtained by setting its top mantissa bit and leaving everything else
+ // unchanged
+ //
+ // - if both operands are signalling NaNs then the output NaN is derived
+ // from the first operand
+ //
+ // - if both operands are quiet NaNs then the output NaN is the first
+ // operand
+ //
+ // - invalid operations not involving an input NaN return the quiet
+ // NaN with fewest bits set, 0x7fc00000.
- // test 1 / (1 - eps(0.5)) = 1 + eps(1)
- if (test__divsf3(1.0F, 0x1.fffffep-1F, UINT32_C(0x3f800001)))
- return 1;
+ status |= test__divsf3(0x00000000, 0x00000000, 0x7fc00000);
+ status |= test__divsf3(0x00000000, 0x7fad4be3, 0x7fed4be3);
+ status |= test__divsf3(0x00000000, 0x7fdf48c7, 0x7fdf48c7);
+ status |= test__divsf3(0x00000000, 0x80000000, 0x7fc00000);
+ status |= test__divsf3(0x00000001, 0x7f970eba, 0x7fd70eba);
+ status |= test__divsf3(0x00000001, 0x7fc35716, 0x7fc35716);
+ status |= test__divsf3(0x007fffff, 0x7fbf52d6, 0x7fff52d6);
+ status |= test__divsf3(0x007fffff, 0x7fc7a2df, 0x7fc7a2df);
+ status |= test__divsf3(0x3f800000, 0x7f987a85, 0x7fd87a85);
+ status |= test__divsf3(0x3f800000, 0x7fc50124, 0x7fc50124);
+ status |= test__divsf3(0x7f7fffff, 0x7f95fd6f, 0x7fd5fd6f);
+ status |= test__divsf3(0x7f7fffff, 0x7ffc28dc, 0x7ffc28dc);
+ status |= test__divsf3(0x7f800000, 0x7f800000, 0x7fc00000);
+ status |= test__divsf3(0x7f800000, 0x7f8dd790, 0x7fcdd790);
+ status |= test__divsf3(0x7f800000, 0x7fd2ef2b, 0x7fd2ef2b);
+ status |= test__divsf3(0x7f800000, 0xff800000, 0x7fc00000);
+ status |= test__divsf3(0x7f99b09d, 0x00000000, 0x7fd9b09d);
+ status |= test__divsf3(0x7f93541e, 0x00000001, 0x7fd3541e);
+ status |= test__divsf3(0x7f9fc002, 0x007fffff, 0x7fdfc002);
+ status |= test__divsf3(0x7fb5db77, 0x3f800000, 0x7ff5db77);
+ status |= test__divsf3(0x7f9f5d92, 0x7f7fffff, 0x7fdf5d92);
+ status |= test__divsf3(0x7fac7a36, 0x7f800000, 0x7fec7a36);
+ status |= test__divsf3(0x7fb42008, 0x7fb0ee07, 0x7ff42008);
+ status |= test__divsf3(0x7f8bd740, 0x7fc7aaf1, 0x7fcbd740);
+ status |= test__divsf3(0x7f9bb57b, 0x80000000, 0x7fdbb57b);
+ status |= test__divsf3(0x7f951a78, 0x80000001, 0x7fd51a78);
+ status |= test__divsf3(0x7f9ba63b, 0x807fffff, 0x7fdba63b);
+ status |= test__divsf3(0x7f89463c, 0xbf800000, 0x7fc9463c);
+ status |= test__divsf3(0x7fb63563, 0xff7fffff, 0x7ff63563);
+ status |= test__divsf3(0x7f90886e, 0xff800000, 0x7fd0886e);
+ status |= test__divsf3(0x7fe8c15e, 0x00000000, 0x7fe8c15e);
+ status |= test__divsf3(0x7fe915ae, 0x00000001, 0x7fe915ae);
+ status |= test__divsf3(0x7ffa9b42, 0x007fffff, 0x7ffa9b42);
+ status |= test__divsf3(0x7fdad0f5, 0x3f800000, 0x7fdad0f5);
+ status |= test__divsf3(0x7fd10dcb, 0x7f7fffff, 0x7fd10dcb);
+ status |= test__divsf3(0x7fd08e8a, 0x7f800000, 0x7fd08e8a);
+ status |= test__divsf3(0x7fc3a9e6, 0x7f91a816, 0x7fd1a816);
+ status |= test__divsf3(0x7fdb229c, 0x7fc26c68, 0x7fdb229c);
+ status |= test__divsf3(0x7fc9f6bb, 0x80000000, 0x7fc9f6bb);
+ status |= test__divsf3(0x7ffa178b, 0x80000001, 0x7ffa178b);
+ status |= test__divsf3(0x7fef2a0b, 0x807fffff, 0x7fef2a0b);
+ status |= test__divsf3(0x7ffc885b, 0xbf800000, 0x7ffc885b);
+ status |= test__divsf3(0x7fd26e8c, 0xff7fffff, 0x7fd26e8c);
+ status |= test__divsf3(0x7fc55329, 0xff800000, 0x7fc55329);
+ status |= test__divsf3(0x80000000, 0x00000000, 0x7fc00000);
+ status |= test__divsf3(0x80000000, 0x7fa833ae, 0x7fe833ae);
+ status |= test__divsf3(0x80000000, 0x7fc4df63, 0x7fc4df63);
+ status |= test__divsf3(0x80000000, 0x80000000, 0x7fc00000);
+ status |= test__divsf3(0x80000001, 0x7f98827d, 0x7fd8827d);
+ status |= test__divsf3(0x80000001, 0x7fd7acc5, 0x7fd7acc5);
+ status |= test__divsf3(0x807fffff, 0x7fad19c0, 0x7fed19c0);
+ status |= test__divsf3(0x807fffff, 0x7ffe1907, 0x7ffe1907);
+ status |= test__divsf3(0xbf800000, 0x7fa95487, 0x7fe95487);
+ status |= test__divsf3(0xbf800000, 0x7fd2bbee, 0x7fd2bbee);
+ status |= test__divsf3(0xff7fffff, 0x7f86ba21, 0x7fc6ba21);
+ status |= test__divsf3(0xff7fffff, 0x7feb00d7, 0x7feb00d7);
+ status |= test__divsf3(0xff800000, 0x7f800000, 0x7fc00000);
+ status |= test__divsf3(0xff800000, 0x7f857fdc, 0x7fc57fdc);
+ status |= test__divsf3(0xff800000, 0x7fde0397, 0x7fde0397);
+ status |= test__divsf3(0xff800000, 0xff800000, 0x7fc00000);
+#endif // ARM_NAN_HANDLING
- return 0;
+ return status;
}
diff --git a/compiler-rt/test/builtins/Unit/mulsf3_test.c b/compiler-rt/test/builtins/Unit/mulsf3_test.c
new file mode 100644
index 0000000..7dc7c8a
--- /dev/null
+++ b/compiler-rt/test/builtins/Unit/mulsf3_test.c
@@ -0,0 +1,616 @@
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+
+// RUN: %clang_builtins %s %librt -o %t && %run %t
+// REQUIRES: librt_has_mulsf3
+
+#include "int_lib.h"
+#include <inttypes.h>
+#include <stdio.h>
+
+#include "fp_test.h"
+
+// By default this test uses compareResultF to check the returned floats, which
+// accepts any returned NaN if the expected result is the canonical NaN value
+// 0x7fc00000. For the Arm optimized FP implementation, which commits to a more
+// detailed handling of NaNs, we tighten up the check and include some extra
+// test cases specific to that NaN policy.
+#if (__arm__ && !(__thumb__ && !__thumb2__)) && COMPILER_RT_ARM_OPTIMIZED_FP
+# define EXPECT_EXACT_RESULTS
+# define ARM_NAN_HANDLING
+#endif
+
+// Returns: a * b
+COMPILER_RT_ABI float __mulsf3(float a, float b);
+
+int test__mulsf3(uint32_t a_rep, uint32_t b_rep, uint32_t expected_rep) {
+ float a = fromRep32(a_rep), b = fromRep32(b_rep);
+ float x = __mulsf3(a, b);
+#ifdef EXPECT_EXACT_RESULTS
+ int ret = toRep32(x) == expected_rep;
+#else
+ int ret = compareResultF(x, expected_rep);
+#endif
+
+ if (ret) {
+ printf("error in test__mulsf3(%08" PRIx32 ", %08" PRIx32 ") = %08" PRIx32
+ ", expected %08" PRIx32 "\n",
+ a_rep, b_rep, toRep32(x), expected_rep);
+ }
+ return ret;
+}
+
+int main(void) {
+ int status = 0;
+
+ status |= test__mulsf3(0x00000000, 0x00000000, 0x00000000);
+ status |= test__mulsf3(0x00000000, 0x007fffff, 0x00000000);
+ status |= test__mulsf3(0x00000000, 0x00ffffff, 0x00000000);
+ status |= test__mulsf3(0x00000000, 0x3f800000, 0x00000000);
+ status |= test__mulsf3(0x00000000, 0x7effffff, 0x00000000);
+ status |= test__mulsf3(0x00000000, 0x80000000, 0x80000000);
+ status |= test__mulsf3(0x00000000, 0x80000002, 0x80000000);
+ status |= test__mulsf3(0x00000000, 0x807fffff, 0x80000000);
+ status |= test__mulsf3(0x00000000, 0x80800001, 0x80000000);
+ status |= test__mulsf3(0x00000000, 0x81000000, 0x80000000);
+ status |= test__mulsf3(0x00000000, 0xc0400000, 0x80000000);
+ status |= test__mulsf3(0x00000000, 0xfe7fffff, 0x80000000);
+ status |= test__mulsf3(0x00000000, 0xff000000, 0x80000000);
+ status |= test__mulsf3(0x00000000, 0xff7fffff, 0x80000000);
+ status |= test__mulsf3(0x00000001, 0x00000000, 0x00000000);
+ status |= test__mulsf3(0x00000001, 0x00000001, 0x00000000);
+ status |= test__mulsf3(0x00000001, 0x3f000000, 0x00000000);
+ status |= test__mulsf3(0x00000001, 0x3f7fffff, 0x00000001);
+ status |= test__mulsf3(0x00000001, 0x3f800000, 0x00000001);
+ status |= test__mulsf3(0x00000001, 0x40000000, 0x00000002);
+ status |= test__mulsf3(0x00000001, 0x7f800000, 0x7f800000);
+ status |= test__mulsf3(0x00000001, 0xbf7fffff, 0x80000001);
+ status |= test__mulsf3(0x00000006, 0x3f000000, 0x00000003);
+ status |= test__mulsf3(0x00000006, 0xbf000000, 0x80000003);
+ status |= test__mulsf3(0x00000008, 0x3e000000, 0x00000001);
+ status |= test__mulsf3(0x007ffff7, 0x81000003, 0x80000000);
+ status |= test__mulsf3(0x007ffff8, 0x3f800001, 0x007ffff9);
+ status |= test__mulsf3(0x007ffff8, 0x3f800008, 0x00800000);
+ status |= test__mulsf3(0x007ffff8, 0xbf800001, 0x807ffff9);
+ status |= test__mulsf3(0x007ffff8, 0xbf800008, 0x80800000);
+ status |= test__mulsf3(0x007ffffc, 0x40000000, 0x00fffff8);
+ status |= test__mulsf3(0x007ffffe, 0x3f7ffffc, 0x007ffffc);
+ status |= test__mulsf3(0x007ffffe, 0x3f800001, 0x007fffff);
+ status |= test__mulsf3(0x007ffffe, 0xbf800001, 0x807fffff);
+ status |= test__mulsf3(0x007fffff, 0x007ffffe, 0x00000000);
+ status |= test__mulsf3(0x007fffff, 0x3f800001, 0x00800000);
+ status |= test__mulsf3(0x007fffff, 0x40000000, 0x00fffffe);
+ status |= test__mulsf3(0x00800000, 0x00000000, 0x00000000);
+ status |= test__mulsf3(0x00800000, 0x00800000, 0x00000000);
+ status |= test__mulsf3(0x00800000, 0x3f7ffffe, 0x007fffff);
+ status |= test__mulsf3(0x00800000, 0x7f800000, 0x7f800000);
+ status |= test__mulsf3(0x00800000, 0x80800000, 0x80000000);
+ status |= test__mulsf3(0x00800000, 0xc0000000, 0x81000000);
+ status |= test__mulsf3(0x00800001, 0x3f7ffffa, 0x007ffffe);
+ status |= test__mulsf3(0x00800001, 0x3f7ffffe, 0x00800000);
+ status |= test__mulsf3(0x00800001, 0xc0000000, 0x81000001);
+ status |= test__mulsf3(0x00800002, 0x3f7ffffc, 0x00800000);
+ status |= test__mulsf3(0x00fffff8, 0x3f000000, 0x007ffffc);
+ status |= test__mulsf3(0x00fffffe, 0x3f000000, 0x007fffff);
+ status |= test__mulsf3(0x00fffffe, 0xbf000000, 0x807fffff);
+ status |= test__mulsf3(0x00ffffff, 0x3f000000, 0x00800000);
+ status |= test__mulsf3(0x00ffffff, 0xbf000000, 0x80800000);
+ status |= test__mulsf3(0x3f000000, 0x80000001, 0x80000000);
+ status |= test__mulsf3(0x3f800000, 0x007ffffd, 0x007ffffd);
+ status |= test__mulsf3(0x3f800000, 0x01000003, 0x01000003);
+ status |= test__mulsf3(0x3f800000, 0x3f800000, 0x3f800000);
+ status |= test__mulsf3(0x3f800000, 0x40000000, 0x40000000);
+ status |= test__mulsf3(0x3f800000, 0x80000001, 0x80000001);
+ status |= test__mulsf3(0x3f800000, 0x80000009, 0x80000009);
+ status |= test__mulsf3(0x3f800001, 0x3f800001, 0x3f800002);
+ status |= test__mulsf3(0x3f800001, 0xbf800001, 0xbf800002);
+ status |= test__mulsf3(0x3f800001, 0xbf800002, 0xbf800003);
+ status |= test__mulsf3(0x3f800002, 0x3f800001, 0x3f800003);
+ status |= test__mulsf3(0x3f800002, 0x7f7ffffe, 0x7f800000);
+ status |= test__mulsf3(0x3f800001, 0x7f7ffffe, 0x7f800000);
+ status |= test__mulsf3(0x40000000, 0x00800000, 0x01000000);
+ status |= test__mulsf3(0x40000000, 0x00800001, 0x01000001);
+ status |= test__mulsf3(0x40000000, 0x3f800000, 0x40000000);
+ status |= test__mulsf3(0x40000000, 0x40400000, 0x40c00000);
+ status |= test__mulsf3(0x40000000, 0x7e800000, 0x7f000000);
+ status |= test__mulsf3(0x40000000, 0x7effffff, 0x7f7fffff);
+ status |= test__mulsf3(0x40000000, 0x807ffffd, 0x80fffffa);
+ status |= test__mulsf3(0x40000000, 0x80800003, 0x81000003);
+ status |= test__mulsf3(0x40000000, 0x80800005, 0x81000005);
+ status |= test__mulsf3(0x40000000, 0xbf800000, 0xc0000000);
+ status |= test__mulsf3(0x40000000, 0xfe7ffffd, 0xfefffffd);
+ status |= test__mulsf3(0x40000000, 0xfe800003, 0xff000003);
+ status |= test__mulsf3(0x403fffff, 0x3f7ffffd, 0x403ffffd);
+ status |= test__mulsf3(0x403fffff, 0x3f7ffffe, 0x403ffffe);
+ status |= test__mulsf3(0x403fffff, 0x3f7fffff, 0x403ffffe);
+ status |= test__mulsf3(0x403fffff, 0xbf7ffffd, 0xc03ffffd);
+ status |= test__mulsf3(0x40400000, 0x00000002, 0x00000006);
+ status |= test__mulsf3(0x40400000, 0x40000000, 0x40c00000);
+ status |= test__mulsf3(0x40400000, 0x40400000, 0x41100000);
+ status |= test__mulsf3(0x40400000, 0xc0000000, 0xc0c00000);
+ status |= test__mulsf3(0x40400001, 0x3f800001, 0x40400003);
+ status |= test__mulsf3(0x40400001, 0x3f800003, 0x40400006);
+ status |= test__mulsf3(0x40400001, 0xbf800003, 0xc0400006);
+ status |= test__mulsf3(0x40800000, 0x00000002, 0x00000008);
+ status |= test__mulsf3(0x40800000, 0x7e7fffff, 0x7f7fffff);
+ status |= test__mulsf3(0x40800000, 0xfe7fffff, 0xff7fffff);
+ status |= test__mulsf3(0x409fffff, 0x3f7fffff, 0x409ffffe);
+ status |= test__mulsf3(0x40a00000, 0x00000000, 0x00000000);
+ status |= test__mulsf3(0x40a00000, 0x7f800000, 0x7f800000);
+ status |= test__mulsf3(0x40a00001, 0x3f800001, 0x40a00002);
+ status |= test__mulsf3(0x40dfffff, 0x3f7ffffc, 0x40dffffc);
+ status |= test__mulsf3(0x40dfffff, 0x3f7fffff, 0x40dffffe);
+ status |= test__mulsf3(0x40e00000, 0x80000000, 0x80000000);
+ status |= test__mulsf3(0x40e00000, 0xff800000, 0xff800000);
+ status |= test__mulsf3(0x40e00001, 0x3f800001, 0x40e00003);
+ status |= test__mulsf3(0x7e7ffffd, 0x40800000, 0x7f7ffffd);
+ status |= test__mulsf3(0x7e7ffffd, 0xc0800000, 0xff7ffffd);
+ status |= test__mulsf3(0x7e800000, 0xc0000000, 0xff000000);
+ status |= test__mulsf3(0x7efffffd, 0xc0000008, 0xff800000);
+ status |= test__mulsf3(0x7effffff, 0xc0000000, 0xff7fffff);
+ status |= test__mulsf3(0x7f000000, 0x00000000, 0x00000000);
+ status |= test__mulsf3(0x7f000000, 0x40000000, 0x7f800000);
+ status |= test__mulsf3(0x7f000000, 0x7f000000, 0x7f800000);
+ status |= test__mulsf3(0x7f000000, 0x7f7ffffe, 0x7f800000);
+ status |= test__mulsf3(0x7f000000, 0x7f800000, 0x7f800000);
+ status |= test__mulsf3(0x7f000000, 0xfe800000, 0xff800000);
+ status |= test__mulsf3(0x7f000000, 0xfe800004, 0xff800000);
+ status |= test__mulsf3(0x7f000000, 0xff000000, 0xff800000);
+ status |= test__mulsf3(0x7f000009, 0x7f7ffffa, 0x7f800000);
+ status |= test__mulsf3(0x7f000009, 0xc0c00002, 0xff800000);
+ status |= test__mulsf3(0x7f7fffff, 0x00000000, 0x00000000);
+ status |= test__mulsf3(0x7f800000, 0x007fffff, 0x7f800000);
+ status |= test__mulsf3(0x7f800000, 0x00ffffff, 0x7f800000);
+ status |= test__mulsf3(0x7f800000, 0x3f800000, 0x7f800000);
+ status |= test__mulsf3(0x7f800000, 0x7effffff, 0x7f800000);
+ status |= test__mulsf3(0x7f800000, 0x7f800000, 0x7f800000);
+ status |= test__mulsf3(0x7f800000, 0x80000002, 0xff800000);
+ status |= test__mulsf3(0x7f800000, 0x807fffff, 0xff800000);
+ status |= test__mulsf3(0x7f800000, 0x80800001, 0xff800000);
+ status |= test__mulsf3(0x7f800000, 0x81000000, 0xff800000);
+ status |= test__mulsf3(0x7f800000, 0xc0400000, 0xff800000);
+ status |= test__mulsf3(0x7f800000, 0xff000000, 0xff800000);
+ status |= test__mulsf3(0x7f800000, 0xff7fffff, 0xff800000);
+ status |= test__mulsf3(0x7f800000, 0xff800000, 0xff800000);
+ status |= test__mulsf3(0x80000000, 0x00000000, 0x80000000);
+ status |= test__mulsf3(0x80000000, 0x40c00000, 0x80000000);
+ status |= test__mulsf3(0x80000000, 0x7f7fffff, 0x80000000);
+ status |= test__mulsf3(0x80000000, 0x80000000, 0x00000000);
+ status |= test__mulsf3(0x80000000, 0x80000004, 0x00000000);
+ status |= test__mulsf3(0x80000000, 0x80800000, 0x00000000);
+ status |= test__mulsf3(0x80000000, 0xc1000000, 0x00000000);
+ status |= test__mulsf3(0x80000000, 0xfe800000, 0x00000000);
+ status |= test__mulsf3(0x80000001, 0x00000001, 0x80000000);
+ status |= test__mulsf3(0x80000001, 0x40a00000, 0x80000005);
+ status |= test__mulsf3(0x80000002, 0x3f800000, 0x80000002);
+ status |= test__mulsf3(0x80000003, 0x00000000, 0x80000000);
+ status |= test__mulsf3(0x80000003, 0x7f800000, 0xff800000);
+ status |= test__mulsf3(0x80000004, 0xbf800000, 0x00000004);
+ status |= test__mulsf3(0x80000008, 0x3e000000, 0x80000001);
+ status |= test__mulsf3(0x807ffff7, 0x01000003, 0x80000000);
+ status |= test__mulsf3(0x807ffff7, 0x3f800001, 0x807ffff8);
+ status |= test__mulsf3(0x807ffffd, 0xc0000000, 0x00fffffa);
+ status |= test__mulsf3(0x807fffff, 0x00000000, 0x80000000);
+ status |= test__mulsf3(0x807fffff, 0x3f800001, 0x80800000);
+ status |= test__mulsf3(0x807fffff, 0x7f800000, 0xff800000);
+ status |= test__mulsf3(0x807fffff, 0x80000000, 0x00000000);
+ status |= test__mulsf3(0x807fffff, 0x807ffffe, 0x00000000);
+ status |= test__mulsf3(0x807fffff, 0xbf800000, 0x007fffff);
+ status |= test__mulsf3(0x807fffff, 0xff800000, 0x7f800000);
+ status |= test__mulsf3(0x80800000, 0x00800000, 0x80000000);
+ status |= test__mulsf3(0x80800000, 0x80800000, 0x00000000);
+ status |= test__mulsf3(0x80800001, 0x00000000, 0x80000000);
+ status |= test__mulsf3(0x80800001, 0x7f800000, 0xff800000);
+ status |= test__mulsf3(0x80800001, 0xbf800000, 0x00800001);
+ status |= test__mulsf3(0x80fffffc, 0x3f000000, 0x807ffffe);
+ status |= test__mulsf3(0x80fffffc, 0xbf000000, 0x007ffffe);
+ status |= test__mulsf3(0x80fffffe, 0x3f800000, 0x80fffffe);
+ status |= test__mulsf3(0x80ffffff, 0x80000000, 0x00000000);
+ status |= test__mulsf3(0x80ffffff, 0xff800000, 0x7f800000);
+ status |= test__mulsf3(0x81000000, 0x00000000, 0x80000000);
+ status |= test__mulsf3(0x81000000, 0x7f800000, 0xff800000);
+ status |= test__mulsf3(0xbf7fffff, 0xff7fffff, 0x7f7ffffe);
+ status |= test__mulsf3(0xbf800000, 0x00000009, 0x80000009);
+ status |= test__mulsf3(0xbf800000, 0x00800009, 0x80800009);
+ status |= test__mulsf3(0xbf800000, 0x3f800000, 0xbf800000);
+ status |= test__mulsf3(0xbf800000, 0x40000000, 0xc0000000);
+ status |= test__mulsf3(0xbf800000, 0xbf800000, 0x3f800000);
+ status |= test__mulsf3(0xbf800000, 0xc0000000, 0x40000000);
+ status |= test__mulsf3(0xbf800001, 0x3f800001, 0xbf800002);
+ status |= test__mulsf3(0xbf800001, 0xbf800001, 0x3f800002);
+ status |= test__mulsf3(0xbf800001, 0xbf800002, 0x3f800003);
+ status |= test__mulsf3(0xbf800002, 0x3f800001, 0xbf800003);
+ status |= test__mulsf3(0xbf800002, 0xbf800001, 0x3f800003);
+ status |= test__mulsf3(0xc0000000, 0x00000000, 0x80000000);
+ status |= test__mulsf3(0xc0000000, 0x007ffffd, 0x80fffffa);
+ status |= test__mulsf3(0xc0000000, 0x00800001, 0x81000001);
+ status |= test__mulsf3(0xc0000000, 0x00800005, 0x81000005);
+ status |= test__mulsf3(0xc0000000, 0x00800009, 0x81000009);
+ status |= test__mulsf3(0xc0000000, 0x40400000, 0xc0c00000);
+ status |= test__mulsf3(0xc0000000, 0x7e7fffff, 0xfeffffff);
+ status |= test__mulsf3(0xc0000000, 0x7e800001, 0xff000001);
+ status |= test__mulsf3(0xc0000000, 0x7f800000, 0xff800000);
+ status |= test__mulsf3(0xc0000000, 0xbf800000, 0x40000000);
+ status |= test__mulsf3(0xc0000000, 0xc0400000, 0x40c00000);
+ status |= test__mulsf3(0xc03ffffe, 0x7f000000, 0xff800000);
+ status |= test__mulsf3(0xc03fffff, 0x3f7fffff, 0xc03ffffe);
+ status |= test__mulsf3(0xc0400000, 0x40400000, 0xc1100000);
+ status |= test__mulsf3(0xc0400000, 0xc0000000, 0x40c00000);
+ status |= test__mulsf3(0xc0400000, 0xc0400000, 0x41100000);
+ status |= test__mulsf3(0xc0400000, 0xff000000, 0x7f800000);
+ status |= test__mulsf3(0xc0400001, 0x3f800001, 0xc0400003);
+ status |= test__mulsf3(0xc0800000, 0x7e7fffff, 0xff7fffff);
+ status |= test__mulsf3(0xc0800000, 0x80000000, 0x00000000);
+ status |= test__mulsf3(0xc0800000, 0xfe7fffff, 0x7f7fffff);
+ status |= test__mulsf3(0xc0800000, 0xff800000, 0x7f800000);
+ status |= test__mulsf3(0xc09ffffe, 0xff000000, 0x7f800000);
+ status |= test__mulsf3(0xc09fffff, 0xbf7fffff, 0x409ffffe);
+ status |= test__mulsf3(0xc0a00001, 0xbf800001, 0x40a00002);
+ status |= test__mulsf3(0xc0dffff9, 0x7f000000, 0xff800000);
+ status |= test__mulsf3(0xc1100000, 0x7f000000, 0xff800000);
+ status |= test__mulsf3(0xc1100001, 0xff000000, 0x7f800000);
+ status |= test__mulsf3(0xfe7ffff9, 0x7f000000, 0xff800000);
+ status |= test__mulsf3(0xfe7ffff9, 0xc07fffff, 0x7f7ffff8);
+ status |= test__mulsf3(0xfe7ffffd, 0x40800000, 0xff7ffffd);
+ status |= test__mulsf3(0xfe7ffffd, 0xc0800000, 0x7f7ffffd);
+ status |= test__mulsf3(0xfe7fffff, 0x00000000, 0x80000000);
+ status |= test__mulsf3(0xfe7fffff, 0x40000001, 0xff000000);
+ status |= test__mulsf3(0xfe7fffff, 0x7f800000, 0xff800000);
+ status |= test__mulsf3(0xfe800000, 0x00000000, 0x80000000);
+ status |= test__mulsf3(0xfe800000, 0x7f800000, 0xff800000);
+ status |= test__mulsf3(0xfefffff7, 0x7e800001, 0xff800000);
+ status |= test__mulsf3(0xfeffffff, 0x3f800001, 0xff000000);
+ status |= test__mulsf3(0xfeffffff, 0x80000000, 0x00000000);
+ status |= test__mulsf3(0xff000005, 0xff000001, 0x7f800000);
+ status |= test__mulsf3(0xff7ffffd, 0x7f000000, 0xff800000);
+ status |= test__mulsf3(0xff7ffffd, 0xc0400001, 0x7f800000);
+ status |= test__mulsf3(0xff7ffffd, 0xff000001, 0x7f800000);
+ status |= test__mulsf3(0xff7fffff, 0x80000000, 0x00000000);
+ status |= test__mulsf3(0xff7fffff, 0xff7fffff, 0x7f800000);
+ status |= test__mulsf3(0xff7fffff, 0xff800000, 0x7f800000);
+ status |= test__mulsf3(0xff800000, 0x40c00000, 0xff800000);
+ status |= test__mulsf3(0xff800000, 0x7f800000, 0xff800000);
+ status |= test__mulsf3(0xff800000, 0x80000004, 0x7f800000);
+ status |= test__mulsf3(0xff800000, 0x80800000, 0x7f800000);
+ status |= test__mulsf3(0xff800000, 0xc1000000, 0x7f800000);
+ status |= test__mulsf3(0xff800000, 0xfe800000, 0x7f800000);
+ status |= test__mulsf3(0xff800000, 0xff800000, 0x7f800000);
+ status |= test__mulsf3(0x3089705f, 0x0ef36390, 0x0041558f);
+ status |= test__mulsf3(0x3089705f, 0x0e936390, 0x0027907d);
+ status |= test__mulsf3(0x3109705f, 0x0ef36390, 0x0082ab1e);
+ status |= test__mulsf3(0x3109705f, 0x0e936390, 0x004f20fa);
+ status |= test__mulsf3(0x3189705f, 0x0ef36390, 0x0102ab1e);
+ status |= test__mulsf3(0x3189705f, 0x0e936390, 0x009e41f5);
+ status |= test__mulsf3(0xb089705f, 0x0ef36390, 0x8041558f);
+ status |= test__mulsf3(0xb089705f, 0x0e936390, 0x8027907d);
+ status |= test__mulsf3(0xb109705f, 0x0ef36390, 0x8082ab1e);
+ status |= test__mulsf3(0xb109705f, 0x0e936390, 0x804f20fa);
+ status |= test__mulsf3(0xb189705f, 0x0ef36390, 0x8102ab1e);
+ status |= test__mulsf3(0xb189705f, 0x0e936390, 0x809e41f5);
+ status |= test__mulsf3(0x3089705f, 0x8ef36390, 0x8041558f);
+ status |= test__mulsf3(0x3089705f, 0x8e936390, 0x8027907d);
+ status |= test__mulsf3(0x3109705f, 0x8ef36390, 0x8082ab1e);
+ status |= test__mulsf3(0x3109705f, 0x8e936390, 0x804f20fa);
+ status |= test__mulsf3(0x3189705f, 0x8ef36390, 0x8102ab1e);
+ status |= test__mulsf3(0x3189705f, 0x8e936390, 0x809e41f5);
+ status |= test__mulsf3(0xb089705f, 0x8ef36390, 0x0041558f);
+ status |= test__mulsf3(0xb089705f, 0x8e936390, 0x0027907d);
+ status |= test__mulsf3(0xb109705f, 0x8ef36390, 0x0082ab1e);
+ status |= test__mulsf3(0xb109705f, 0x8e936390, 0x004f20fa);
+ status |= test__mulsf3(0xb189705f, 0x8ef36390, 0x0102ab1e);
+ status |= test__mulsf3(0xb189705f, 0x8e936390, 0x009e41f5);
+ status |= test__mulsf3(0x1f800001, 0x1fc00000, 0x00300000);
+ status |= test__mulsf3(0x1f800003, 0x1fc00000, 0x00300001);
+ status |= test__mulsf3(0x1f800001, 0x1fc00800, 0x00300200);
+ status |= test__mulsf3(0x1f800003, 0x1fc00800, 0x00300201);
+ status |= test__mulsf3(0x36e4588a, 0x29b47cbd, 0x2120fd85);
+ status |= test__mulsf3(0x3fea3b26, 0x3f400000, 0x3fafac5c);
+ status |= test__mulsf3(0x6fea3b26, 0x4f400000, 0x7f800000);
+ status |= test__mulsf3(0x20ea3b26, 0x1ec00000, 0x0057d62e);
+ status |= test__mulsf3(0x3f8f11bb, 0x3fc00000, 0x3fd69a98);
+ status |= test__mulsf3(0x6f8f11bb, 0x4fc00000, 0x7f800000);
+ status |= test__mulsf3(0x208f11bb, 0x1f400000, 0x006b4d4c);
+ status |= test__mulsf3(0x3f8f11bb, 0x3f800000, 0x3f8f11bb);
+ status |= test__mulsf3(0x6f8f11bb, 0x4f800000, 0x7f800000);
+ status |= test__mulsf3(0x208f11bb, 0x1f000000, 0x004788de);
+ status |= test__mulsf3(0x3f8f11bb, 0x3fd7f48d, 0x3ff1611f);
+ status |= test__mulsf3(0x6f8f11bb, 0x4fd7f48d, 0x7f800000);
+ status |= test__mulsf3(0x208f11bb, 0x1f57f48d, 0x0078b090);
+ status |= test__mulsf3(0x3f8f11bb, 0x3fa80b73, 0x3fbbd412);
+ status |= test__mulsf3(0x6f8f11bb, 0x4fa80b73, 0x7f800000);
+ status |= test__mulsf3(0x208f11bb, 0x1f280b73, 0x005dea09);
+ status |= test__mulsf3(0x3f8f11bb, 0x3f97f48d, 0x3fa9d842);
+ status |= test__mulsf3(0x6f8f11bb, 0x4f97f48d, 0x7f800000);
+ status |= test__mulsf3(0x208f11bb, 0x1f17f48d, 0x0054ec21);
+ status |= test__mulsf3(0x3f8f11bb, 0x3f680b73, 0x3f81ae78);
+ status |= test__mulsf3(0x6f8f11bb, 0x4f680b73, 0x7f800000);
+ status |= test__mulsf3(0x208f11bb, 0x1ee80b73, 0x0040d73c);
+ status |= test__mulsf3(0x3fff5dd8, 0x3f600000, 0x3fdf721d);
+ status |= test__mulsf3(0x6fff5dd8, 0x4f600000, 0x7f800000);
+ status |= test__mulsf3(0x20ff5dd8, 0x1ee00000, 0x006fb90e);
+ status |= test__mulsf3(0x3fff5dd8, 0x3f100000, 0x3f8fa4ca);
+ status |= test__mulsf3(0x6fff5dd8, 0x4f100000, 0x7f800000);
+ status |= test__mulsf3(0x20ff5dd8, 0x1e900000, 0x0047d265);
+ status |= test__mulsf3(0x3fffe96b, 0x3f7efb43, 0x3ffee4c5);
+ status |= test__mulsf3(0x6fffe96b, 0x4f7efb43, 0x7f800000);
+ status |= test__mulsf3(0x20ffe96b, 0x1efefb43, 0x007f7263);
+ status |= test__mulsf3(0x3fffe96b, 0x3f0104bd, 0x3f80f95b);
+ status |= test__mulsf3(0x6fffe96b, 0x4f0104bd, 0x7f800000);
+ status |= test__mulsf3(0x20ffe96b, 0x1e8104bd, 0x00407cae);
+ status |= test__mulsf3(0x3f8fbbb7, 0x3fa6edf9, 0x3fbb72aa);
+ status |= test__mulsf3(0x6f8fbbb7, 0x4fa6edf9, 0x7f800000);
+ status |= test__mulsf3(0x208fbbb7, 0x1f26edf9, 0x005db955);
+ status |= test__mulsf3(0x3f8fbbb7, 0x3fd91207, 0x3ff3c07b);
+ status |= test__mulsf3(0x6f8fbbb7, 0x4fd91207, 0x7f800000);
+ status |= test__mulsf3(0x208fbbb7, 0x1f591207, 0x0079e03d);
+ status |= test__mulsf3(0x3f8fbbb7, 0x3f991207, 0x3fabe29f);
+ status |= test__mulsf3(0x6f8fbbb7, 0x4f991207, 0x7f800000);
+ status |= test__mulsf3(0x208fbbb7, 0x1f191207, 0x0055f150);
+ status |= test__mulsf3(0x3f8fbbb7, 0x3f66edf9, 0x3f81a843);
+ status |= test__mulsf3(0x6f8fbbb7, 0x4f66edf9, 0x7f800000);
+ status |= test__mulsf3(0x208fbbb7, 0x1ee6edf9, 0x0040d421);
+ status |= test__mulsf3(0x3fdb62f3, 0x3f7879c5, 0x3fd4f036);
+ status |= test__mulsf3(0x6fdb62f3, 0x4f7879c5, 0x7f800000);
+ status |= test__mulsf3(0x20db62f3, 0x1ef879c5, 0x006a781b);
+ status |= test__mulsf3(0x3faaea45, 0x3f8b6773, 0x3fba2489);
+ status |= test__mulsf3(0x6faaea45, 0x4f8b6773, 0x7f800000);
+ status |= test__mulsf3(0x20aaea45, 0x1f0b6773, 0x005d1244);
+ status |= test__mulsf3(0x3fafa7ec, 0x3f900000, 0x3fc59cea);
+ status |= test__mulsf3(0x6fafa7ec, 0x4f900000, 0x7f800000);
+ status |= test__mulsf3(0x20afa7ec, 0x1f100000, 0x0062ce75);
+ status |= test__mulsf3(0x3fcf8c8d, 0x3f271645, 0x3f8776be);
+ status |= test__mulsf3(0x6fcf8c8d, 0x4f271645, 0x7f800000);
+ status |= test__mulsf3(0x20cf8c8d, 0x1ea71645, 0x0043bb5f);
+ status |= test__mulsf3(0x3fc173ef, 0x3f901b0f, 0x3fd9cb52);
+ status |= test__mulsf3(0x6fc173ef, 0x4f901b0f, 0x7f800000);
+ status |= test__mulsf3(0x20c173ef, 0x1f101b0f, 0x006ce5a9);
+ status |= test__mulsf3(0x3fb48d33, 0x3f4a35fb, 0x3f8e9d7d);
+ status |= test__mulsf3(0x6fb48d33, 0x4f4a35fb, 0x7f800000);
+ status |= test__mulsf3(0x20b48d33, 0x1eca35fb, 0x00474ebe);
+ status |= test__mulsf3(0x3fc6f87b, 0x3f65d94d, 0x3fb2a52a);
+ status |= test__mulsf3(0x6fc6f87b, 0x4f65d94d, 0x7f800000);
+ status |= test__mulsf3(0x20c6f87b, 0x1ee5d94d, 0x00595295);
+ status |= test__mulsf3(0x3f860ae7, 0x3f969729, 0x3f9db312);
+ status |= test__mulsf3(0x6f860ae7, 0x4f969729, 0x7f800000);
+ status |= test__mulsf3(0x20860ae7, 0x1f169729, 0x004ed989);
+ status |= test__mulsf3(0x3f860ae7, 0x3fc00000, 0x3fc9105a);
+ status |= test__mulsf3(0x6f860ae7, 0x4fc00000, 0x7f800000);
+ status |= test__mulsf3(0x20860ae7, 0x1f400000, 0x0064882d);
+ status |= test__mulsf3(0x3f860ae7, 0x3fe968d7, 0x3ff46da3);
+ status |= test__mulsf3(0x6f860ae7, 0x4fe968d7, 0x7f800000);
+ status |= test__mulsf3(0x20860ae7, 0x1f6968d7, 0x007a36d1);
+ status |= test__mulsf3(0x3f860ae7, 0x3f800000, 0x3f860ae7);
+ status |= test__mulsf3(0x6f860ae7, 0x4f800000, 0x7f800000);
+ status |= test__mulsf3(0x20860ae7, 0x1f000000, 0x00430574);
+ status |= test__mulsf3(0x3f860ae7, 0x3fa968d7, 0x3fb1682f);
+ status |= test__mulsf3(0x6f860ae7, 0x4fa968d7, 0x7f800000);
+ status |= test__mulsf3(0x20860ae7, 0x1f2968d7, 0x0058b418);
+ status |= test__mulsf3(0x3f860ae7, 0x3fd69729, 0x3fe0b886);
+ status |= test__mulsf3(0x6f860ae7, 0x4fd69729, 0x7f800000);
+ status |= test__mulsf3(0x20860ae7, 0x1f569729, 0x00705c43);
+ status |= test__mulsf3(0x3f9aecdd, 0x3fb14b75, 0x3fd696de);
+ status |= test__mulsf3(0x6f9aecdd, 0x4fb14b75, 0x7f800000);
+ status |= test__mulsf3(0x209aecdd, 0x1f314b75, 0x006b4b6f);
+ status |= test__mulsf3(0x3f9aecdd, 0x3fceb48b, 0x3ffa2fb9);
+ status |= test__mulsf3(0x6f9aecdd, 0x4fceb48b, 0x7f800000);
+ status |= test__mulsf3(0x209aecdd, 0x1f4eb48b, 0x007d17dc);
+ status |= test__mulsf3(0x3f9aecdd, 0x3fc00000, 0x3fe8634c);
+ status |= test__mulsf3(0x6f9aecdd, 0x4fc00000, 0x7f800000);
+ status |= test__mulsf3(0x209aecdd, 0x1f400000, 0x007431a6);
+ status |= test__mulsf3(0x3fd65dc6, 0x3f400000, 0x3fa0c654);
+ status |= test__mulsf3(0x6fd65dc6, 0x4f400000, 0x7f800000);
+ status |= test__mulsf3(0x20d65dc6, 0x1ec00000, 0x0050632a);
+ status |= test__mulsf3(0x3feecf03, 0x3f5f93ab, 0x3fd09014);
+ status |= test__mulsf3(0x6feecf03, 0x4f5f93ab, 0x7f800000);
+ status |= test__mulsf3(0x20eecf03, 0x1edf93ab, 0x0068480a);
+ status |= test__mulsf3(0x3feecf03, 0x3f206c55, 0x3f95a670);
+ status |= test__mulsf3(0x6feecf03, 0x4f206c55, 0x7f800000);
+ status |= test__mulsf3(0x20eecf03, 0x1ea06c55, 0x004ad338);
+ status |= test__mulsf3(0x3f98feed, 0x3f60f11b, 0x3f866f27);
+ status |= test__mulsf3(0x6f98feed, 0x4f60f11b, 0x7f800000);
+ status |= test__mulsf3(0x2098feed, 0x1ee0f11b, 0x00433794);
+ status |= test__mulsf3(0x3f9a1b9d, 0x3f9c42b5, 0x3fbc21f8);
+ status |= test__mulsf3(0x6f9a1b9d, 0x4f9c42b5, 0x7f800000);
+ status |= test__mulsf3(0x209a1b9d, 0x1f1c42b5, 0x005e10fc);
+ status |= test__mulsf3(0x3f9a1b9d, 0x3f5c42b5, 0x3f8497e3);
+ status |= test__mulsf3(0x6f9a1b9d, 0x4f5c42b5, 0x7f800000);
+ status |= test__mulsf3(0x209a1b9d, 0x1edc42b5, 0x00424bf2);
+ status |= test__mulsf3(0x3f947044, 0x3f600000, 0x3f81e23c);
+ status |= test__mulsf3(0x6f947044, 0x4f600000, 0x7f800000);
+ status |= test__mulsf3(0x20947044, 0x1ee00000, 0x0040f11e);
+ status |= test__mulsf3(0x3fa3fb77, 0x3f6eb1b9, 0x3f98e5a0);
+ status |= test__mulsf3(0x6fa3fb77, 0x4f6eb1b9, 0x7f800000);
+ status |= test__mulsf3(0x20a3fb77, 0x1eeeb1b9, 0x004c72d0);
+ status |= test__mulsf3(0x3fb291df, 0x3f466a1f, 0x3f8a66d9);
+ status |= test__mulsf3(0x6fb291df, 0x4f466a1f, 0x7f800000);
+ status |= test__mulsf3(0x20b291df, 0x1ec66a1f, 0x0045336c);
+ status |= test__mulsf3(0x3fde13d5, 0x3f6b7283, 0x3fcc3f8b);
+ status |= test__mulsf3(0x6fde13d5, 0x4f6b7283, 0x7f800000);
+ status |= test__mulsf3(0x20de13d5, 0x1eeb7283, 0x00661fc5);
+ status |= test__mulsf3(0x3fd5b211, 0x3f80810f, 0x3fd68987);
+ status |= test__mulsf3(0x6fd5b211, 0x4f80810f, 0x7f800000);
+ status |= test__mulsf3(0x20d5b211, 0x1f00810f, 0x006b44c4);
+ status |= test__mulsf3(0x3fd5b211, 0x3f3f7ef1, 0x3f9fd9d2);
+ status |= test__mulsf3(0x6fd5b211, 0x4f3f7ef1, 0x7f800000);
+ status |= test__mulsf3(0x20d5b211, 0x1ebf7ef1, 0x004fece9);
+ status |= test__mulsf3(0x3fadfbc4, 0x3f400000, 0x3f827cd3);
+ status |= test__mulsf3(0x6fadfbc4, 0x4f400000, 0x7f800000);
+ status |= test__mulsf3(0x20adfbc4, 0x1ec00000, 0x00413e6a);
+ status |= test__mulsf3(0x3fd0ef03, 0x3f800000, 0x3fd0ef03);
+ status |= test__mulsf3(0x6fd0ef03, 0x4f800000, 0x7f800000);
+ status |= test__mulsf3(0x20d0ef03, 0x1f000000, 0x00687782);
+ status |= test__mulsf3(0x3fd0ef03, 0x3f8673ab, 0x3fdb7705);
+ status |= test__mulsf3(0x6fd0ef03, 0x4f8673ab, 0x7f800000);
+ status |= test__mulsf3(0x20d0ef03, 0x1f0673ab, 0x006dbb83);
+ status |= test__mulsf3(0x3fd0ef03, 0x3f798c55, 0x3fcbab02);
+ status |= test__mulsf3(0x6fd0ef03, 0x4f798c55, 0x7f800000);
+ status |= test__mulsf3(0x20d0ef03, 0x1ef98c55, 0x0065d581);
+ status |= test__mulsf3(0x3fdd1181, 0x3f8ad17f, 0x3fefc0b1);
+ status |= test__mulsf3(0x6fdd1181, 0x4f8ad17f, 0x7f800000);
+ status |= test__mulsf3(0x20dd1181, 0x1f0ad17f, 0x0077e058);
+ status |= test__mulsf3(0x3fdd1181, 0x3f752e81, 0x3fd3b9e9);
+ status |= test__mulsf3(0x6fdd1181, 0x4f752e81, 0x7f800000);
+ status |= test__mulsf3(0x20dd1181, 0x1ef52e81, 0x0069dcf5);
+ status |= test__mulsf3(0x3f92efc6, 0x3fa00000, 0x3fb7abb8);
+ status |= test__mulsf3(0x6f92efc6, 0x4fa00000, 0x7f800000);
+ status |= test__mulsf3(0x2092efc6, 0x1f200000, 0x005bd5dc);
+ status |= test__mulsf3(0x3fdcefe6, 0x3f400000, 0x3fa5b3ec);
+ status |= test__mulsf3(0x6fdcefe6, 0x4f400000, 0x7f800000);
+ status |= test__mulsf3(0x20dcefe6, 0x1ec00000, 0x0052d9f6);
+ status |= test__mulsf3(0x3fad6507, 0x3fa2f8b7, 0x3fdcc4c9);
+ status |= test__mulsf3(0x6fad6507, 0x4fa2f8b7, 0x7f800000);
+ status |= test__mulsf3(0x20ad6507, 0x1f22f8b7, 0x006e6264);
+ status |= test__mulsf3(0x3fad6507, 0x3f62f8b7, 0x3f99bba6);
+ status |= test__mulsf3(0x6fad6507, 0x4f62f8b7, 0x7f800000);
+ status |= test__mulsf3(0x20ad6507, 0x1ee2f8b7, 0x004cddd3);
+ status |= test__mulsf3(0x3fbfde6b, 0x3f8721bd, 0x3fca8f27);
+ status |= test__mulsf3(0x6fbfde6b, 0x4f8721bd, 0x7f800000);
+ status |= test__mulsf3(0x20bfde6b, 0x1f0721bd, 0x00654794);
+ status |= test__mulsf3(0x3fbfde6b, 0x3f4721bd, 0x3f953f2e);
+ status |= test__mulsf3(0x6fbfde6b, 0x4f4721bd, 0x7f800000);
+ status |= test__mulsf3(0x20bfde6b, 0x1ec721bd, 0x004a9f97);
+ status |= test__mulsf3(0x3ff40db4, 0x3f400000, 0x3fb70a47);
+ status |= test__mulsf3(0x6ff40db4, 0x4f400000, 0x7f800000);
+ status |= test__mulsf3(0x20f40db4, 0x1ec00000, 0x005b8524);
+ status |= test__mulsf3(0x3ff40db4, 0x3f600000, 0x3fd58bfe);
+ status |= test__mulsf3(0x6ff40db4, 0x4f600000, 0x7f800000);
+ status |= test__mulsf3(0x20f40db4, 0x1ee00000, 0x006ac5ff);
+ status |= test__mulsf3(0x3f9e20d3, 0x3f90c8a5, 0x3fb2dccc);
+ status |= test__mulsf3(0x6f9e20d3, 0x4f90c8a5, 0x7f800000);
+ status |= test__mulsf3(0x209e20d3, 0x1f10c8a5, 0x00596e66);
+ status |= test__mulsf3(0x3f9e20d3, 0x3fc00000, 0x3fed313c);
+ status |= test__mulsf3(0x6f9e20d3, 0x4fc00000, 0x7f800000);
+ status |= test__mulsf3(0x209e20d3, 0x1f400000, 0x0076989e);
+ status |= test__mulsf3(0x3f9e20d3, 0x3f50c8a5, 0x3f80f69b);
+ status |= test__mulsf3(0x6f9e20d3, 0x4f50c8a5, 0x7f800000);
+ status |= test__mulsf3(0x209e20d3, 0x1ed0c8a5, 0x00407b4d);
+ status |= test__mulsf3(0x3f82e641, 0x3f8fd63f, 0x3f931856);
+ status |= test__mulsf3(0x6f82e641, 0x4f8fd63f, 0x7f800000);
+ status |= test__mulsf3(0x2082e641, 0x1f0fd63f, 0x00498c2b);
+ status |= test__mulsf3(0x3f9a1901, 0x3f96e701, 0x3fb5ab68);
+ status |= test__mulsf3(0x6f9a1901, 0x4f96e701, 0x7f800000);
+ status |= test__mulsf3(0x209a1901, 0x1f16e701, 0x005ad5b4);
+ status |= test__mulsf3(0x3fa21aa1, 0x3f7c4961, 0x3f9fc0ae);
+ status |= test__mulsf3(0x6fa21aa1, 0x4f7c4961, 0x7f800000);
+ status |= test__mulsf3(0x20a21aa1, 0x1efc4961, 0x004fe057);
+ status |= test__mulsf3(0x3fcd0767, 0x3f782457, 0x3fc6bc47);
+ status |= test__mulsf3(0x6fcd0767, 0x4f782457, 0x7f800000);
+ status |= test__mulsf3(0x20cd0767, 0x1ef82457, 0x00635e23);
+ status |= test__mulsf3(0x3fb875e1, 0x3f968e21, 0x3fd8f6f6);
+ status |= test__mulsf3(0x6fb875e1, 0x4f968e21, 0x7f800000);
+ status |= test__mulsf3(0x20b875e1, 0x1f168e21, 0x006c7b7b);
+ status |= test__mulsf3(0x3fc2f0d7, 0x3f5efd19, 0x3fa9cd95);
+ status |= test__mulsf3(0x6fc2f0d7, 0x4f5efd19, 0x7f800000);
+ status |= test__mulsf3(0x20c2f0d7, 0x1edefd19, 0x0054e6cb);
+ status |= test__mulsf3(0x7f7ffffe, 0x3f800001, 0x7f800000);
+ status |= test__mulsf3(0x00000003, 0xc00fffff, 0x80000007);
+ status |= test__mulsf3(0x00000003, 0x400fffff, 0x00000007);
+ status |= test__mulsf3(0x80000003, 0xc00fffff, 0x00000007);
+ status |= test__mulsf3(0x80000003, 0x400fffff, 0x80000007);
+ status |= test__mulsf3(0x00000003, 0xc00ffffd, 0x80000007);
+ status |= test__mulsf3(0x00000003, 0x400ffffd, 0x00000007);
+ status |= test__mulsf3(0x80000003, 0xc00ffffd, 0x00000007);
+ status |= test__mulsf3(0x80000003, 0x400ffffd, 0x80000007);
+ status |= test__mulsf3(0x3e00007f, 0x017c0000, 0x003f003f);
+ status |= test__mulsf3(0xcf7fff00, 0xc0ffff00, 0x50fffe00);
+ status |= test__mulsf3(0x3fdf7f00, 0x3fffff00, 0x405f7e21);
+ status |= test__mulsf3(0x19b92144, 0x1a310000, 0x00000001);
+ status |= test__mulsf3(0x19ffc008, 0x1a002004, 0x00000001);
+ status |= test__mulsf3(0x7f7ffff0, 0xc0000008, 0xff800000);
+
+ // Test that the result of an operation is a NaN at all when it should be.
+ //
+ // In most configurations these tests' results are checked compared using
+ // compareResultF, so we set all the answers to the canonical NaN 0x7fc00000,
+ // which causes compareResultF to accept any NaN encoding. We also use the
+ // same value as the input NaN in tests that have one, so that even in
+ // EXPECT_EXACT_RESULTS mode these tests should pass, because 0x7fc00000 is
+ // still the exact expected NaN.
+ status |= test__mulsf3(0x7f800000, 0x00000000, 0x7fc00000);
+ status |= test__mulsf3(0x7f800000, 0x80000000, 0x7fc00000);
+ status |= test__mulsf3(0x80000000, 0x7f800000, 0x7fc00000);
+ status |= test__mulsf3(0x80000000, 0xff800000, 0x7fc00000);
+ status |= test__mulsf3(0x3f800000, 0x7fc00000, 0x7fc00000);
+ status |= test__mulsf3(0x7fc00000, 0x3f800000, 0x7fc00000);
+ status |= test__mulsf3(0x7fc00000, 0x7fc00000, 0x7fc00000);
+
+#ifdef ARM_NAN_HANDLING
+ // Tests specific to the NaN handling of Arm hardware, mimicked by
+ // arm/mulsf3.S:
+ //
+ // - a quiet NaN is distinguished by the top mantissa bit being 1
+ //
+ // - if a signalling NaN appears in the input, the output quiet NaN is
+ // obtained by setting its top mantissa bit and leaving everything else
+ // unchanged
+ //
+ // - if both operands are signalling NaNs then the output NaN is derived
+ // from the first operand
+ //
+ // - if both operands are quiet NaNs then the output NaN is the first
+ // operand
+ //
+ // - invalid operations not involving an input NaN return the quiet
+ // NaN with fewest bits set, 0x7fc00000.
+
+ status |= test__mulsf3(0x00000000, 0x7fad4be3, 0x7fed4be3);
+ status |= test__mulsf3(0x00000000, 0x7fdf48c7, 0x7fdf48c7);
+ status |= test__mulsf3(0x00000001, 0x7f970eba, 0x7fd70eba);
+ status |= test__mulsf3(0x00000001, 0x7fc35716, 0x7fc35716);
+ status |= test__mulsf3(0x007fffff, 0x7fbf52d6, 0x7fff52d6);
+ status |= test__mulsf3(0x007fffff, 0x7fc7a2df, 0x7fc7a2df);
+ status |= test__mulsf3(0x3f800000, 0x7f987a85, 0x7fd87a85);
+ status |= test__mulsf3(0x3f800000, 0x7fc50124, 0x7fc50124);
+ status |= test__mulsf3(0x7f7fffff, 0x7f95fd6f, 0x7fd5fd6f);
+ status |= test__mulsf3(0x7f7fffff, 0x7ffc28dc, 0x7ffc28dc);
+ status |= test__mulsf3(0x7f800000, 0x00000000, 0x7fc00000);
+ status |= test__mulsf3(0x7f800000, 0x7f8dd790, 0x7fcdd790);
+ status |= test__mulsf3(0x7f800000, 0x7fd2ef2b, 0x7fd2ef2b);
+ status |= test__mulsf3(0x7f800000, 0x80000000, 0x7fc00000);
+ status |= test__mulsf3(0x7f99b09d, 0x00000000, 0x7fd9b09d);
+ status |= test__mulsf3(0x7f93541e, 0x00000001, 0x7fd3541e);
+ status |= test__mulsf3(0x7f9fc002, 0x007fffff, 0x7fdfc002);
+ status |= test__mulsf3(0x7fb5db77, 0x3f800000, 0x7ff5db77);
+ status |= test__mulsf3(0x7f9f5d92, 0x7f7fffff, 0x7fdf5d92);
+ status |= test__mulsf3(0x7fac7a36, 0x7f800000, 0x7fec7a36);
+ status |= test__mulsf3(0x7fb42008, 0x7fb0ee07, 0x7ff42008);
+ status |= test__mulsf3(0x7f8bd740, 0x7fc7aaf1, 0x7fcbd740);
+ status |= test__mulsf3(0x7f9bb57b, 0x80000000, 0x7fdbb57b);
+ status |= test__mulsf3(0x7f951a78, 0x80000001, 0x7fd51a78);
+ status |= test__mulsf3(0x7f9ba63b, 0x807fffff, 0x7fdba63b);
+ status |= test__mulsf3(0x7f89463c, 0xbf800000, 0x7fc9463c);
+ status |= test__mulsf3(0x7fb63563, 0xff7fffff, 0x7ff63563);
+ status |= test__mulsf3(0x7f90886e, 0xff800000, 0x7fd0886e);
+ status |= test__mulsf3(0x7fe8c15e, 0x00000000, 0x7fe8c15e);
+ status |= test__mulsf3(0x7fe915ae, 0x00000001, 0x7fe915ae);
+ status |= test__mulsf3(0x7ffa9b42, 0x007fffff, 0x7ffa9b42);
+ status |= test__mulsf3(0x7fdad0f5, 0x3f800000, 0x7fdad0f5);
+ status |= test__mulsf3(0x7fd10dcb, 0x7f7fffff, 0x7fd10dcb);
+ status |= test__mulsf3(0x7fd08e8a, 0x7f800000, 0x7fd08e8a);
+ status |= test__mulsf3(0x7fc3a9e6, 0x7f91a816, 0x7fd1a816);
+ status |= test__mulsf3(0x7fdb229c, 0x7fc26c68, 0x7fdb229c);
+ status |= test__mulsf3(0x7fc9f6bb, 0x80000000, 0x7fc9f6bb);
+ status |= test__mulsf3(0x7ffa178b, 0x80000001, 0x7ffa178b);
+ status |= test__mulsf3(0x7fef2a0b, 0x807fffff, 0x7fef2a0b);
+ status |= test__mulsf3(0x7ffc885b, 0xbf800000, 0x7ffc885b);
+ status |= test__mulsf3(0x7fd26e8c, 0xff7fffff, 0x7fd26e8c);
+ status |= test__mulsf3(0x7fc55329, 0xff800000, 0x7fc55329);
+ status |= test__mulsf3(0x80000000, 0x7f800000, 0x7fc00000);
+ status |= test__mulsf3(0x80000000, 0x7fa833ae, 0x7fe833ae);
+ status |= test__mulsf3(0x80000000, 0x7fc4df63, 0x7fc4df63);
+ status |= test__mulsf3(0x80000000, 0xff800000, 0x7fc00000);
+ status |= test__mulsf3(0x80000001, 0x7f98827d, 0x7fd8827d);
+ status |= test__mulsf3(0x80000001, 0x7fd7acc5, 0x7fd7acc5);
+ status |= test__mulsf3(0x807fffff, 0x7fad19c0, 0x7fed19c0);
+ status |= test__mulsf3(0x807fffff, 0x7ffe1907, 0x7ffe1907);
+ status |= test__mulsf3(0xbf800000, 0x7fa95487, 0x7fe95487);
+ status |= test__mulsf3(0xbf800000, 0x7fd2bbee, 0x7fd2bbee);
+ status |= test__mulsf3(0xff7fffff, 0x7f86ba21, 0x7fc6ba21);
+ status |= test__mulsf3(0xff7fffff, 0x7feb00d7, 0x7feb00d7);
+ status |= test__mulsf3(0xff800000, 0x7f857fdc, 0x7fc57fdc);
+ status |= test__mulsf3(0xff800000, 0x7fde0397, 0x7fde0397);
+#endif // ARM_NAN_HANDLING
+
+ return status;
+}
diff --git a/compiler-rt/test/dfsan/origin_endianness.c b/compiler-rt/test/dfsan/origin_endianness.c
new file mode 100644
index 0000000..a73dcda
--- /dev/null
+++ b/compiler-rt/test/dfsan/origin_endianness.c
@@ -0,0 +1,37 @@
+// RUN: %clang_dfsan -gmlt -mllvm -dfsan-track-origins=1 %s -o %t && \
+// RUN: %run %t >%t.out 2>&1
+// RUN: FileCheck %s < %t.out
+//
+// Test origin tracking is accurate in terms of endianness.
+
+#include <sanitizer/dfsan_interface.h>
+
+typedef uint64_t FULL_TYPE;
+typedef uint32_t HALF_TYPE;
+
+__attribute__((noinline)) FULL_TYPE foo(FULL_TYPE a, FULL_TYPE b) {
+ return a + b;
+}
+
+int main(int argc, char *argv[]) {
+ FULL_TYPE a = 1;
+ FULL_TYPE b = 10;
+ dfsan_set_label(4, (HALF_TYPE *)&a, sizeof(HALF_TYPE));
+ FULL_TYPE c = foo(a, b);
+ dfsan_print_origin_trace(&c, NULL);
+ dfsan_print_origin_trace((HALF_TYPE *)&c, NULL);
+}
+
+// CHECK: Taint value 0x4 {{.*}} origin tracking ()
+// CHECK: Origin value: {{.*}}, Taint value was stored to memory at
+// CHECK: #0 {{.*}} in main {{.*}}origin_endianness.c:[[@LINE-7]]
+
+// CHECK: Origin value: {{.*}}, Taint value was created at
+// CHECK: #0 {{.*}} in main {{.*}}origin_endianness.c:[[@LINE-11]]
+
+// CHECK: Taint value 0x4 {{.*}} origin tracking ()
+// CHECK: Origin value: {{.*}}, Taint value was stored to memory at
+// CHECK: #0 {{.*}} in main {{.*}}origin_endianness.c:[[@LINE-14]]
+
+// CHECK: Origin value: {{.*}}, Taint value was created at
+// CHECK: #0 {{.*}} in main {{.*}}origin_endianness.c:[[@LINE-18]]
diff --git a/compiler-rt/test/fuzzer/big-file-copy.test b/compiler-rt/test/fuzzer/big-file-copy.test
index 9565ed4..b923794 100644
--- a/compiler-rt/test/fuzzer/big-file-copy.test
+++ b/compiler-rt/test/fuzzer/big-file-copy.test
@@ -1,6 +1,5 @@
REQUIRES: darwin
UNSUPPORTED: ios
RUN: %cpp_compiler %S/BigFileCopy.cpp -o %t
-RUN: %run %t -runs=1 -rss_limit_mb=4096 2>big-file-out.txt; result=$?
-RUN: %run rm -f big-file.txt big-file-out.txt
-RUN: (exit $result)
+RUN: bash -c '%run %t -runs=1 -rss_limit_mb=4096 2>big-file-out.txt; result=$? \
+RUN: %run rm -f big-file.txt big-file-out.txt && exit $result'
diff --git a/compiler-rt/test/fuzzer/merge-posix.test b/compiler-rt/test/fuzzer/merge-posix.test
index 2721668f..6e37651 100644
--- a/compiler-rt/test/fuzzer/merge-posix.test
+++ b/compiler-rt/test/fuzzer/merge-posix.test
@@ -14,10 +14,10 @@ RUN: echo ....U. > %tmp/T2/2
RUN: echo ...Z.. > %tmp/T2/3
RUN: echo ...Z.. > %tmp/T2/4
RUN: echo ....E. > %tmp/T2/5
-RUN: echo .....R > %tmp/T2/6
+RUN: %python -c "print('.....R' + 'X' * 4096, end='')" > %tmp/T2/6
# Check that we can report an error if file size exceeded
-RUN: (ulimit -f 1; not %run %t-FullCoverageSetTest -merge=1 %tmp/T1 %tmp/T2 2>&1 | FileCheck %s --check-prefix=SIGXFSZ)
+RUN: (ulimit -f 4; not %run %t-FullCoverageSetTest -merge=1 %tmp/T1 %tmp/T2 2>&1 | FileCheck %s --check-prefix=SIGXFSZ)
SIGXFSZ: ERROR: libFuzzer: file size exceeded
# Check that we honor TMPDIR
diff --git a/compiler-rt/test/fuzzer/reduce_inputs.test b/compiler-rt/test/fuzzer/reduce_inputs.test
index d296fa4..af9d3f3 100644
--- a/compiler-rt/test/fuzzer/reduce_inputs.test
+++ b/compiler-rt/test/fuzzer/reduce_inputs.test
@@ -4,7 +4,7 @@ RUN: rm -rf %t/C
RUN: mkdir -p %t/C
RUN: %cpp_compiler %S/ShrinkControlFlowSimpleTest.cpp -o %t-ShrinkControlFlowSimpleTest
RUN: %cpp_compiler %S/ShrinkControlFlowTest.cpp -o %t-ShrinkControlFlowTest
-RUN: %run %t-ShrinkControlFlowSimpleTest -exit_on_item=0eb8e4ed029b774d80f2b66408203801cb982a60 -runs=1000000 %t/C 2>&1 | FileCheck %s
+RUN: %run %t-ShrinkControlFlowSimpleTest -exit_on_item=0eb8e4ed029b774d80f2b66408203801cb982a60 -runs=10000000 %t/C 2>&1 | FileCheck %s
CHECK: INFO: found item with checksum '0eb8e4ed029b774d80f2b66408203801cb982a60'
# Test that reduce_inputs deletes redundant files in the corpus.
diff --git a/compiler-rt/test/hwasan/TestCases/Linux/fixed-shadow.c b/compiler-rt/test/hwasan/TestCases/Linux/fixed-shadow.c
index 421d2339..353c5fb 100644
--- a/compiler-rt/test/hwasan/TestCases/Linux/fixed-shadow.c
+++ b/compiler-rt/test/hwasan/TestCases/Linux/fixed-shadow.c
@@ -3,17 +3,17 @@
// Default compiler instrumentation works with any shadow base (dynamic or fixed).
// RUN: %clang_hwasan %s -o %t
// RUN: %run %t
-// RUN: HWASAN_OPTIONS=fixed_shadow_base=263878495698944 %run %t 2>%t.out || (cat %t.out | FileCheck %s)
-// RUN: HWASAN_OPTIONS=fixed_shadow_base=4398046511104 %run %t
+// RUN: env HWASAN_OPTIONS=fixed_shadow_base=17592186044416 %run %t
+// RUN: env HWASAN_OPTIONS=fixed_shadow_base=4398046511104 %run %t
//
// If -hwasan-mapping-offset is set, then the fixed_shadow_base needs to match.
-// RUN: %clang_hwasan %s -mllvm -hwasan-mapping-offset=263878495698944 -o %t
-// RUN: HWASAN_OPTIONS=fixed_shadow_base=263878495698944 %run %t 2>%t.out || (cat %t.out | FileCheck %s)
-// RUN: HWASAN_OPTIONS=fixed_shadow_base=4398046511104 not %run %t
+// RUN: %clang_hwasan %s -mllvm -hwasan-mapping-offset=17592186044416 -o %t
+// RUN: env HWASAN_OPTIONS=fixed_shadow_base=17592186044416 %run %t
+// RUN: env HWASAN_OPTIONS=fixed_shadow_base=4398046511104 not %run %t
// RUN: %clang_hwasan %s -mllvm -hwasan-mapping-offset=4398046511104 -o %t
-// RUN: HWASAN_OPTIONS=fixed_shadow_base=4398046511104 %run %t
-// RUN: HWASAN_OPTIONS=fixed_shadow_base=263878495698944 not %run %t
+// RUN: env HWASAN_OPTIONS=fixed_shadow_base=4398046511104 %run %t
+// RUN: env HWASAN_OPTIONS=fixed_shadow_base=263878495698944 not %run %t
//
// Note: if fixed_shadow_base is not set, compiler-rt will dynamically choose a
// shadow base, which has a tiny but non-zero probability of matching the
@@ -26,8 +26,6 @@
//
// UNSUPPORTED: android
-// CHECK: FATAL: HWAddressSanitizer: Shadow range {{.*}} is not available
-
#include <assert.h>
#include <sanitizer/allocator_interface.h>
#include <sanitizer/hwasan_interface.h>
diff --git a/compiler-rt/test/lit.common.cfg.py b/compiler-rt/test/lit.common.cfg.py
index 9d2f021..395b540 100644
--- a/compiler-rt/test/lit.common.cfg.py
+++ b/compiler-rt/test/lit.common.cfg.py
@@ -113,16 +113,13 @@ def push_dynamic_library_lookup_path(config, new_path):
config.environment[dynamic_library_lookup_var] = new_ld_library_path_64
+# TODO: Consolidate the logic for turning on the internal shell by default for all LLVM test suites.
+# See https://github.com/llvm/llvm-project/issues/106636 for more details.
+#
# Choose between lit's internal shell pipeline runner and a real shell. If
# LIT_USE_INTERNAL_SHELL is in the environment, we use that as an override.
use_lit_shell = os.environ.get("LIT_USE_INTERNAL_SHELL")
-if use_lit_shell:
- # 0 is external, "" is default, and everything else is internal.
- execute_external = use_lit_shell == "0"
-else:
- # Otherwise we default to internal on Windows and external elsewhere, as
- # bash on Windows is usually very slow.
- execute_external = not sys.platform in ["win32"]
+execute_external = use_lit_shell == "0"
# Allow expanding substitutions that are based on other substitutions
config.recursiveExpansionLimit = 10
@@ -195,16 +192,14 @@ test_cc_resource_dir, _ = get_path_from_clang(
# Normalize the path for comparison
if test_cc_resource_dir is not None:
test_cc_resource_dir = os.path.realpath(test_cc_resource_dir)
-if lit_config.debug:
- lit_config.note(f"Resource dir for {config.clang} is {test_cc_resource_dir}")
+lit_config.dbg(f"Resource dir for {config.clang} is {test_cc_resource_dir}")
local_build_resource_dir = os.path.realpath(config.compiler_rt_output_dir)
if test_cc_resource_dir != local_build_resource_dir and config.test_standalone_build_libs:
if config.compiler_id == "Clang":
- if lit_config.debug:
- lit_config.note(
- f"Overriding test compiler resource dir to use "
- f'libraries in "{config.compiler_rt_libdir}"'
- )
+ lit_config.dbg(
+ f"Overriding test compiler resource dir to use "
+ f'libraries in "{config.compiler_rt_libdir}"'
+ )
# Ensure that we use the just-built static libraries when linking by
# overriding the Clang resource directory. Additionally, we want to use
# the builtin headers shipped with clang (e.g. stdint.h), so we
@@ -877,7 +872,7 @@ for postfix in ["2", "1", ""]:
config.substitutions.append(
(
"%ld_flags_rpath_so" + postfix,
- "-install_name @rpath/`basename %dynamiclib{}`".format(postfix),
+ "-install_name @rpath/%base_dynamiclib{}".format(postfix),
)
)
elif config.target_os in ("FreeBSD", "NetBSD", "OpenBSD"):
@@ -911,6 +906,9 @@ for postfix in ["2", "1", ""]:
("%dynamiclib" + postfix, "%t.dir/%xdynamiclib_filename" + postfix)
)
config.substitutions.append(
+ ("%base_dynamiclib" + postfix, "%xdynamiclib_filename" + postfix)
+ )
+ config.substitutions.append(
(
"%xdynamiclib_filename" + postfix,
"lib%xdynamiclib_namespec{}.so".format(postfix),
@@ -970,7 +968,18 @@ def target_page_size():
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
)
- out, err = proc.communicate(b'import os; print(os.sysconf("SC_PAGESIZE"))')
+ # UNIX (except WASI) and Windows can use mmap.PAGESIZE,
+ # attempt to use os.sysconf for other targets.
+ out, err = proc.communicate(
+ b"""
+try:
+ from mmap import PAGESIZE
+ print(PAGESIZE)
+except ImportError:
+ from os import sysconf
+ print(sysconf("SC_PAGESIZE"))
+"""
+ )
return int(out)
except:
return 4096
diff --git a/compiler-rt/test/orc/TestCases/Darwin/arm64/objc-imageinfo.S b/compiler-rt/test/orc/TestCases/Darwin/arm64/objc-imageinfo.S
index 78454e3..d552402 100644
--- a/compiler-rt/test/orc/TestCases/Darwin/arm64/objc-imageinfo.S
+++ b/compiler-rt/test/orc/TestCases/Darwin/arm64/objc-imageinfo.S
@@ -5,7 +5,9 @@
// RUN: rm -rf %t
// RUN: split-file %s %t
-// RUN: (cd %t; %clang -c *.S)
+// RUN: pushd %t
+// RUN: %clang -c *.S
+// RUN: popd
// Check individual versions are loadable.
diff --git a/compiler-rt/test/orc/TestCases/Darwin/x86-64/objc-imageinfo.S b/compiler-rt/test/orc/TestCases/Darwin/x86-64/objc-imageinfo.S
index ae02ada..1cab9e2 100644
--- a/compiler-rt/test/orc/TestCases/Darwin/x86-64/objc-imageinfo.S
+++ b/compiler-rt/test/orc/TestCases/Darwin/x86-64/objc-imageinfo.S
@@ -5,7 +5,9 @@
// RUN: rm -rf %t
// RUN: split-file %s %t
-// RUN: (cd %t; %clang -c *.S)
+// RUN: pushd %t
+// RUN: %clang -c *.S
+// RUN: popd
// Check individual versions are loadable.
diff --git a/compiler-rt/test/orc/TestCases/Linux/systemz/ehframe-default.cpp b/compiler-rt/test/orc/TestCases/Linux/systemz/ehframe-default.cpp
new file mode 100644
index 0000000..0f7dcec
--- /dev/null
+++ b/compiler-rt/test/orc/TestCases/Linux/systemz/ehframe-default.cpp
@@ -0,0 +1,14 @@
+// RUN: %clangxx -fexceptions -fPIC -c -o %t %s
+// RUN: %llvm_jitlink %t
+
+extern "C" void llvm_jitlink_setTestResultOverride(long Value);
+
+int main(int argc, char *argv[]) {
+ llvm_jitlink_setTestResultOverride(1);
+ try {
+ throw 0;
+ } catch (int X) {
+ llvm_jitlink_setTestResultOverride(X);
+ }
+ return 0;
+}
diff --git a/compiler-rt/test/orc/TestCases/Linux/systemz/ehframe-libunwind.cpp b/compiler-rt/test/orc/TestCases/Linux/systemz/ehframe-libunwind.cpp
new file mode 100644
index 0000000..f56aa8fba
--- /dev/null
+++ b/compiler-rt/test/orc/TestCases/Linux/systemz/ehframe-libunwind.cpp
@@ -0,0 +1,15 @@
+// REQUIRES: libunwind-available
+// RUN: %clangxx -fexceptions -fPIC -c -o %t %s
+// RUN: env LD_PRELOAD=%shared_libunwind %llvm_jitlink %t
+
+extern "C" void llvm_jitlink_setTestResultOverride(long Value);
+
+int main(int argc, char *argv[]) {
+ llvm_jitlink_setTestResultOverride(1);
+ try {
+ throw 0;
+ } catch (int X) {
+ llvm_jitlink_setTestResultOverride(X);
+ }
+ return 0;
+}
diff --git a/compiler-rt/test/orc/TestCases/Linux/systemz/lit.local.cfg.py b/compiler-rt/test/orc/TestCases/Linux/systemz/lit.local.cfg.py
new file mode 100644
index 0000000..493eeca
--- /dev/null
+++ b/compiler-rt/test/orc/TestCases/Linux/systemz/lit.local.cfg.py
@@ -0,0 +1,5 @@
+if config.root.host_arch != "s390x":
+ config.unsupported = True
+
+if config.target_arch != "s390x":
+ config.unsupported = True
diff --git a/compiler-rt/test/orc/TestCases/Linux/systemz/lljit-ehframe.cpp b/compiler-rt/test/orc/TestCases/Linux/systemz/lljit-ehframe.cpp
new file mode 100644
index 0000000..b73ec23
--- /dev/null
+++ b/compiler-rt/test/orc/TestCases/Linux/systemz/lljit-ehframe.cpp
@@ -0,0 +1,15 @@
+// RUN: %clangxx -fPIC -emit-llvm -c -o %t %s
+// RUN: %lli_orc_jitlink -relocation-model=pic %t | FileCheck %s
+
+// CHECK: catch
+
+#include <stdio.h>
+
+int main(int argc, char *argv[]) {
+ try {
+ throw 0;
+ } catch (int X) {
+ puts("catch");
+ }
+ return 0;
+}
diff --git a/compiler-rt/test/orc/TestCases/Linux/systemz/lljit-initialize-deinitialize.ll b/compiler-rt/test/orc/TestCases/Linux/systemz/lljit-initialize-deinitialize.ll
new file mode 100644
index 0000000..34bfc10
--- /dev/null
+++ b/compiler-rt/test/orc/TestCases/Linux/systemz/lljit-initialize-deinitialize.ll
@@ -0,0 +1,32 @@
+; RUN: %lli_orc_jitlink %s | FileCheck %s
+
+; CHECK: constructor
+; CHECK-NEXT: main
+; CHECK-NEXT: destructor
+
+@__dso_handle = external hidden global i8
+@.str = private unnamed_addr constant [5 x i8] c"main\00", align 1
+@.str.1 = private unnamed_addr constant [12 x i8] c"constructor\00", align 1
+@.str.2 = private unnamed_addr constant [11 x i8] c"destructor\00", align 1
+@llvm.global_ctors = appending global [1 x { i32, void ()*, i8* }] [{ i32, void ()*, i8* } { i32 65535, void ()* @constructor, i8* null }]
+
+define dso_local void @destructor(i8* %0) {
+ %2 = tail call i32 @puts(i8* nonnull dereferenceable(1) getelementptr inbounds ([11 x i8], [11 x i8]* @.str.2, i64 0, i64 0))
+ ret void
+}
+
+declare i32 @__cxa_atexit(void (i8*)*, i8*, i8*)
+
+; Function Attrs: nofree norecurse nounwind uwtable
+define dso_local i32 @main(i32 %0, i8** nocapture readnone %1) local_unnamed_addr #2 {
+ %3 = tail call i32 @puts(i8* nonnull dereferenceable(1) getelementptr inbounds ([5 x i8], [5 x i8]* @.str, i64 0, i64 0))
+ ret i32 0
+}
+
+declare i32 @puts(i8* nocapture readonly)
+
+define internal void @constructor() {
+ %1 = tail call i32 @puts(i8* nonnull dereferenceable(1) getelementptr inbounds ([12 x i8], [12 x i8]* @.str.1, i64 0, i64 0)) #5
+ %2 = tail call i32 @__cxa_atexit(void (i8*)* @destructor, i8* null, i8* nonnull @__dso_handle) #5
+ ret void
+}
diff --git a/compiler-rt/test/orc/TestCases/Linux/systemz/priority-static-initializer.S b/compiler-rt/test/orc/TestCases/Linux/systemz/priority-static-initializer.S
new file mode 100644
index 0000000..24db1fb
--- /dev/null
+++ b/compiler-rt/test/orc/TestCases/Linux/systemz/priority-static-initializer.S
@@ -0,0 +1,100 @@
+// Test that ELF static initializers with different constructor priorities work
+// and are executed in the proper order.
+//
+// RUN: %clang -c -o %t %s
+// RUN: %llvm_jitlink %t | FileCheck %s
+
+// CHECK: constructor 100
+// CHECK-NEXT: constructor 200
+// CHECK-NEXT: constructor 65535
+// CHECK-NEXT: main
+// CHECK-NEXT: destructor
+
+ .text
+
+ .globl destructor
+ .p2align 4, 0x90
+ .type destructor,@function
+destructor:
+.Ldestructor$local:
+ larl %r2, .Lstr.d
+ jg puts@PLT
+
+ .globl main
+ .p2align 4, 0x90
+ .type main,@function
+main:
+.Lmain$local:
+ stmg %r14, %r15, 112(%r15)
+ aghi %r15, -160
+ larl %r2, .Lstr
+ brasl %r14, puts@PLT
+ lghi %r2, 0
+ lmg %r14, %r15, 272(%r15)
+ br %r14
+
+ .p2align 4
+ .type constructor.65535,@function
+constructor.65535:
+ stmg %r14, %r15, 112(%r15)
+ aghi %r15, -160
+ larl %r2, .Lstr.65535
+ brasl %r14, puts@PLT
+ lgrl %r4, __dso_handle
+ lgrl %r2, .Ldestructor$local@GOT
+ lghi %r3, 0
+ lmg %r14, %r15, 272(%r15)
+ jg __cxa_atexit@PLT
+
+ .p2align 4
+ .type constructor.200,@function
+constructor.200:
+ larl %r2, .Lstr.200
+ jg puts@PLT
+
+ .p2align 4
+ .type constructor.100,@function
+constructor.100:
+ larl %r2, .Lstr.100
+ jg puts@PLT
+
+ .hidden __dso_handle
+ .section .init_array.101,"aw",@init_array
+ .p2align 3, 0x0
+ .quad constructor.100
+ .section .init_array.200,"aw",@init_array
+ .p2align 3, 0x0
+ .quad constructor.200
+ .section .init_array,"aw",@init_array
+ .p2align 3, 0x0
+ .quad constructor.65535
+ .type .Lstr.d,@object
+ .section .rodata.str1.2,"aMS",@progbits,1
+ .p2align 1, 0x0
+.Lstr.d:
+ .asciz "destructor"
+ .size .Lstr.d, 11
+
+ .type .Lstr.100,@object
+ .p2align 1, 0x0
+.Lstr.100:
+ .asciz "constructor 100"
+ .size .Lstr.100, 16
+
+ .type .Lstr.200,@object
+ .p2align 1, 0x0
+.Lstr.200:
+ .asciz "constructor 200"
+ .size .Lstr.200, 16
+
+ .type .Lstr.65535,@object
+ .p2align 1, 0x0
+.Lstr.65535:
+ .asciz "constructor 65535"
+ .size .Lstr.65535, 18
+
+ .type .Lstr,@object
+ .p2align 1, 0x0
+.Lstr:
+ .asciz "main"
+ .size .Lstr, 5
diff --git a/compiler-rt/test/orc/TestCases/Linux/systemz/trivial-atexit.S b/compiler-rt/test/orc/TestCases/Linux/systemz/trivial-atexit.S
new file mode 100644
index 0000000..36b3575
--- /dev/null
+++ b/compiler-rt/test/orc/TestCases/Linux/systemz/trivial-atexit.S
@@ -0,0 +1,42 @@
+// REQUIRES: disabled
+// This test is disabled until a proper atexit interpose can be implemented:
+// the current one assumes that atexit is defined in the dylib that calls it,
+// which is not true in general. See
+// https://github.com/llvm/llvm-project/issues/74641
+//
+// RUN: %clang -c -o %t %s
+// RUN: %llvm_jitlink %t
+
+ .text
+// OnExit destructor resets the test result override to zero.
+ .section .text._ZN6OnExitD2Ev,"axG",@progbits,_ZN6OnExitD2Ev,comdat
+ .p2align 4
+ .type _ZN6OnExitD2Ev,@function
+_ZN6OnExitD2Ev:
+ .cfi_startproc
+ lghi %r2, 0
+ jg llvm_jitlink_setTestResultOverride@PLT
+ .cfi_endproc
+
+// main registers the atexit and sets the test result to one.
+ .globl main
+ .p2align 4
+ .type main,@function
+main:
+ .cfi_startproc
+# %bb.0:
+ stmg %r14, %r15, 48(%r15)
+ lgrl %r2, _ZN6OnExitD2Ev@GOT
+ brasl %r14, atexit@PLT
+ lghi %r2, 1
+ brasl %r14, llvm_jitlink_setTestResultOverride@PLT
+ lghi %r2, 0
+ lmg %r14, %r15, 48(%r15)
+ br %r14
+.Lfunc_end1:
+ .size main, .Lfunc_end1-main
+ .cfi_endproc
+
+ .type _ZL6onExit,@object
+ .local _ZL6onExit
+ .comm _ZL6onExit,1,2
diff --git a/compiler-rt/test/orc/TestCases/Linux/systemz/trivial-cxa-atexit.S b/compiler-rt/test/orc/TestCases/Linux/systemz/trivial-cxa-atexit.S
new file mode 100644
index 0000000..e5d5191
--- /dev/null
+++ b/compiler-rt/test/orc/TestCases/Linux/systemz/trivial-cxa-atexit.S
@@ -0,0 +1,41 @@
+// Test that the runtime correctly interposes ___cxa_atexit.
+//
+// RUN: %clang -c -o %t %s
+// RUN: %llvm_jitlink %t
+
+ .text
+// OnExit destructor resets the test result override to zero.
+ .section .text._ZN6OnExitD2Ev,"axG",@progbits,_ZN6OnExitD2Ev,comdat
+ .p2align 4
+ .type _ZN6OnExitD2Ev,@function
+_ZN6OnExitD2Ev:
+ .cfi_startproc
+ lghi %r2, 0
+ jg llvm_jitlink_setTestResultOverride@PLT
+ .cfi_endproc
+
+// main registers the atexit and sets the test result to one.
+ .globl main
+ .p2align 4
+ .type main,@function
+main:
+ .cfi_startproc
+# %bb.0:
+ stmg %r14, %r15, 48(%r15)
+ lgrl %r2, _ZN6OnExitD2Ev@GOT
+ lgrl %r4, __dso_handle@GOT
+ larl %r3, _ZL6onExit
+ brasl %r14, __cxa_atexit@PLT
+ lghi %r2, 1
+ brasl %r14, llvm_jitlink_setTestResultOverride@PLT
+ lghi %r2, 0
+ lmg %r14, %r15, 48(%r15)
+ br %r14
+.Lfunc_end1:
+ .size main, .Lfunc_end1-main
+ .cfi_endproc
+
+ .type _ZL6onExit,@object
+ .local _ZL6onExit
+ .comm _ZL6onExit,1,2
+ .hidden __dso_handle
diff --git a/compiler-rt/test/orc/TestCases/Linux/systemz/trivial-static-initializer.S b/compiler-rt/test/orc/TestCases/Linux/systemz/trivial-static-initializer.S
new file mode 100644
index 0000000..872a70a
--- /dev/null
+++ b/compiler-rt/test/orc/TestCases/Linux/systemz/trivial-static-initializer.S
@@ -0,0 +1,35 @@
+// Test that basic ELF static initializers work. The main function in this
+// test returns the value of 'x', which is initially 1 in the data section,
+// and reset to 0 if the _static_init function is run. If the static initializer
+// does not run then main will return 1, causing the test to be treated as a
+// failure.
+//
+// RUN: %clang -c -o %t %s
+// RUN: %llvm_jitlink %t
+
+ .text
+
+ .globl main
+ .p2align 4
+main:
+ lgrl %r1, x@GOT
+ lgf %r2, 0(%r1)
+ br %r14
+
+# static initializer sets the value of 'x' to zero.
+ .p2align 4
+_static_init:
+ lgrl %r1, x@GOT
+ mvhi 0(%r1), 0
+ br %r14
+
+ .data
+ .globl x
+ .p2align 2, 0x0
+x:
+ .long 1
+ .size x, 4
+
+ .section .init_array,"aw",@init_array
+ .p2align 3, 0x0
+ .quad _static_init
diff --git a/compiler-rt/test/profile/Darwin/instrprof-debug-info-correlate.c b/compiler-rt/test/profile/Darwin/instrprof-debug-info-correlate.c
index 46d25a4..1e9bd11 100644
--- a/compiler-rt/test/profile/Darwin/instrprof-debug-info-correlate.c
+++ b/compiler-rt/test/profile/Darwin/instrprof-debug-info-correlate.c
@@ -7,7 +7,9 @@
// RUN: env LLVM_PROFILE_FILE=%t.profraw %run %t.normal
// RUN: llvm-profdata merge -o %t.normal.profdata %t.profraw
-// RUN: diff <(llvm-profdata show --all-functions --counts %t.normal.profdata) <(llvm-profdata show --all-functions --counts %t.profdata)
+// RUN: llvm-profdata show --all-functions --counts %t.normal.profdata > %t.normal.functions
+// RUN: llvm-profdata show --all-functions --counts %t.profdata > %t.functions
+// RUN: diff %t.normal.functions %t.functions
// RUN: %clang_pgogen -o %t.cov -g -mllvm --profile-correlate=debug-info -mllvm -pgo-function-entry-coverage -mllvm --disable-vp=true %S/../Inputs/instrprof-debug-info-correlate-main.cpp %S/../Inputs/instrprof-debug-info-correlate-foo.cpp
// RUN: env LLVM_PROFILE_FILE=%t.cov.proflite %run %t.cov
@@ -17,7 +19,9 @@
// RUN: env LLVM_PROFILE_FILE=%t.cov.profraw %run %t.cov.normal
// RUN: llvm-profdata merge -o %t.cov.normal.profdata %t.cov.profraw
-// RUN: diff <(llvm-profdata show --all-functions --counts %t.cov.normal.profdata) <(llvm-profdata show --all-functions --counts %t.cov.profdata)
+// RUN: llvm-profdata show --all-functions --counts %t.cov.normal.profdata > %t.cov.normal.functions
+// RUN: llvm-profdata show --all-functions --counts %t.cov.profdata > %t.cov.functions
+// RUN: diff %t.cov.normal.functions %t.cov.functions
// Test debug info correlate with online merging.
@@ -30,11 +34,15 @@
// RUN: env LLVM_PROFILE_FILE=%t.profdir/%m.proflite %run %t
// RUN: llvm-profdata merge -o %t.profdata --debug-info=%t.dSYM %t.profdir/
-// RUN: diff <(llvm-profdata show --all-functions --counts %t.normal.profdata) <(llvm-profdata show --all-functions --counts %t.profdata)
+// RUN: llvm-profdata show --all-functions --counts %t.normal.profdata > %t.normal.functions
+// RUN: llvm-profdata show --all-functions --counts %t.profdata > %t.functions
+// RUN: diff %t.normal.functions %t.functions
// RUN: rm -rf %t.profdir && mkdir %t.profdir
// RUN: env LLVM_PROFILE_FILE=%t.profdir/%m.cov.proflite %run %t.cov
// RUN: env LLVM_PROFILE_FILE=%t.profdir/%m.cov.proflite %run %t.cov
// RUN: llvm-profdata merge -o %t.cov.profdata --debug-info=%t.cov.dSYM %t.profdir/
-// RUN: diff <(llvm-profdata show --all-functions --counts %t.cov.normal.profdata) <(llvm-profdata show --all-functions --counts %t.cov.profdata)
+// RUN: llvm-profdata show --all-functions --counts %t.cov.normal.profdata > %t.cov.normal.functions
+// RUN: llvm-profdata show --all-functions --counts %t.cov.profdata > %t.cov.functions
+// RUN: diff %t.cov.normal.functions %t.cov.functions
diff --git a/compiler-rt/test/profile/Linux/instrprof-debug-info-correlate-debuginfod.c b/compiler-rt/test/profile/Linux/instrprof-debug-info-correlate-debuginfod.c
index 903ead3..a4e9855 100644
--- a/compiler-rt/test/profile/Linux/instrprof-debug-info-correlate-debuginfod.c
+++ b/compiler-rt/test/profile/Linux/instrprof-debug-info-correlate-debuginfod.c
@@ -15,10 +15,13 @@
// RUN: cp %t.correlate.exe %t/buildid/12345678/debuginfo
// RUN: mkdir -p %t/debuginfod-cache
// RUN: env DEBUGINFOD_CACHE_PATH=%t/debuginfod-cache DEBUGINFOD_URLS=file://%t llvm-profdata merge -o %t.correlate-debuginfod.profdata --debuginfod --correlate=debug-info %t.debug-info-correlate.proflite
-// RUN: diff <(llvm-profdata show --all-functions --counts %t.default.profdata) <(llvm-profdata show --all-functions --counts %t.correlate-debuginfod.profdata)
+// RUN: llvm-profdata show --all-functions --counts %t.default.profdata > %t.default_counts
+// RUN: llvm-profdata show --all-functions --counts %t.correlate-debuginfod.profdata > %t.correlated_counts
+// RUN: diff %t.default_counts %t.correlated_counts
// Test llvm-profdata merge profile correlation with --debug-file-directory option.
// RUN: mkdir -p %t/.build-id/12
// RUN: cp %t.correlate.exe %t/.build-id/12/345678.debug
// RUN: llvm-profdata merge -o %t.correlate-debug-file-dir.profdata --debug-file-directory %t --correlate=debug-info %t.debug-info-correlate.proflite
-// RUN: diff <(llvm-profdata show --all-functions --counts %t.default.profdata) <(llvm-profdata show --all-functions --counts %t.correlate-debug-file-dir.profdata)
+// RUN: llvm-profdata show --all-functions --counts %t.correlate-debug-file-dir.profdata > %t.correlated_debug_file_dir_counts
+// RUN: diff %t.default_counts %t.correlated_debug_file_dir_counts
diff --git a/compiler-rt/test/profile/Linux/instrprof-debug-info-correlate-warnings.c b/compiler-rt/test/profile/Linux/instrprof-debug-info-correlate-warnings.c
deleted file mode 100644
index 25022f2..0000000
--- a/compiler-rt/test/profile/Linux/instrprof-debug-info-correlate-warnings.c
+++ /dev/null
@@ -1,13 +0,0 @@
-// Disable full debug info and verify that we get warnings during merging
-
-// RUN: %clang_pgogen -o %t -gline-tables-only -mllvm --profile-correlate=debug-info -mllvm --disable-vp=true %S/../Inputs/instrprof-debug-info-correlate-main.cpp %S/../Inputs/instrprof-debug-info-correlate-foo.cpp
-// RUN: env LLVM_PROFILE_FILE=%t.proflite %run %t
-// RUN: llvm-profdata merge -o %t.profdata --debug-info=%t %t.proflite --max-debug-info-correlation-warnings=2 2>&1 >/dev/null | FileCheck %s --check-prefixes=CHECK,LIMIT --implicit-check-not=warning
-// RUN: llvm-profdata merge -o %t.profdata --debug-info=%t %t.proflite --max-debug-info-correlation-warnings=0 2>&1 >/dev/null | FileCheck %s --check-prefixes=CHECK,NOLIMIT --implicit-check-not=warning
-
-// CHECK: warning: Could not find address of function
-// CHECK: warning: Could not find address of function
-// NOLIMIT: warning: Could not find address of function
-// NOLIMIT: warning: Could not find address of function
-// NOLIMIT: warning: Could not find address of function
-// LIMIT: warning: Suppressed 3 additional warnings
diff --git a/compiler-rt/test/profile/Linux/instrprof-debug-info-correlate-warnings.ll b/compiler-rt/test/profile/Linux/instrprof-debug-info-correlate-warnings.ll
new file mode 100644
index 0000000..7a85699
--- /dev/null
+++ b/compiler-rt/test/profile/Linux/instrprof-debug-info-correlate-warnings.ll
@@ -0,0 +1,183 @@
+; RUN: split-file %s %t
+; RUN: %clang %t/a.ll -o %t/a.out
+; RUN: llvm-profdata merge --debug-info=%t/a.out %t/a.proftext --max-debug-info-correlation-warnings=2 -o %t/a.profdata 2>&1 | FileCheck %s --implicit-check-not=warning --check-prefixes=CHECK,LIMIT
+; RUN: llvm-profdata merge --debug-info=%t/a.out %t/a.proftext --max-debug-info-correlation-warnings=0 -o %t/a.profdata 2>&1 | FileCheck %s --implicit-check-not=warning --check-prefixes=CHECK,NOLIMIT
+
+; CHECK: warning: Incomplete DIE for function None:
+; CHECK: warning: Incomplete DIE for function no_cfg: CFGHash=None
+; NOLIMIT: warning: Incomplete DIE for function no_counter: {{.*}} NumCounters=None
+; NOLIMIT: warning: Incomplete DIE for function no_profc: {{.*}} CounterPtr=None
+; NOLIMIT: warning: Could not find address of function no_func
+; LIMIT: warning: Suppressed 3 additional warnings
+
+;--- a.proftext
+:ir
+
+;--- a.c
+int main() { return 0; }
+
+void removed() {}
+void no_name() {}
+void no_cfg() {}
+void no_counter() {}
+void no_profc() {}
+void no_func() {}
+
+// NOTE: After generating the IR below, manually remove the follwing pieces
+// 1. Remove "@removed" function and "@__profc_removed" global
+// 2. Remove "Function Name" annotation for "@no_name"
+// 3. Remove "CFG Hash" annotation for "@no_cfg"
+// 4. Remove "Num Counters" annotation for "@no_counter"
+// 5. Remove "@__profc_no_profc"
+// 6. Remove "@no_func"
+;--- gen
+clang --target=x86_64-unknown-linux-gnu -fprofile-generate -mllvm -profile-correlate=debug-info -S -emit-llvm -g a.c -o -
+
+;--- a.ll
+; ModuleID = 'a.c'
+source_filename = "a.c"
+target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128"
+target triple = "x86_64-unknown-linux-gnu"
+
+$__llvm_profile_raw_version = comdat any
+
+$__profc_main = comdat nodeduplicate
+
+$__profc_removed = comdat nodeduplicate
+
+$__profc_no_name = comdat nodeduplicate
+
+$__profc_no_cfg = comdat nodeduplicate
+
+$__profc_no_counter = comdat nodeduplicate
+
+$__profc_no_profc = comdat nodeduplicate
+
+$__profc_no_func = comdat nodeduplicate
+
+$__llvm_profile_filename = comdat any
+
+@__llvm_profile_raw_version = hidden constant i64 648518346341351434, comdat
+@__profn_main = private constant [4 x i8] c"main"
+@__profn_removed = private constant [7 x i8] c"removed"
+@__profn_no_name = private constant [7 x i8] c"no_name"
+@__profn_no_cfg = private constant [6 x i8] c"no_cfg"
+@__profn_no_counter = private constant [10 x i8] c"no_counter"
+@__profn_no_profc = private constant [8 x i8] c"no_profc"
+@__profn_no_func = private constant [7 x i8] c"no_func"
+@__profc_main = private global [1 x i64] zeroinitializer, section "__llvm_prf_cnts", comdat, align 8, !dbg !0
+@__profc_no_name = private global [1 x i64] zeroinitializer, section "__llvm_prf_cnts", comdat, align 8, !dbg !19
+@__profc_no_cfg = private global [1 x i64] zeroinitializer, section "__llvm_prf_cnts", comdat, align 8, !dbg !24
+@__profc_no_counter = private global [1 x i64] zeroinitializer, section "__llvm_prf_cnts", comdat, align 8, !dbg !29
+@__profc_no_func = private global [1 x i64] zeroinitializer, section "__llvm_prf_cnts", comdat, align 8, !dbg !39
+@llvm.compiler.used = appending global [5 x ptr] [ptr @__profc_main, ptr @__profc_no_name, ptr @__profc_no_cfg, ptr @__profc_no_counter, ptr @__profc_no_func], section "llvm.metadata"
+@__llvm_profile_filename = hidden constant [20 x i8] c"default_%m.proflite\00", comdat
+
+; Function Attrs: noinline nounwind optnone uwtable
+define dso_local i32 @main() #0 !dbg !2 {
+ %1 = alloca i32, align 4
+ %2 = load i64, ptr @__profc_main, align 8
+ %3 = add i64 %2, 1
+ store i64 %3, ptr @__profc_main, align 8
+ store i32 0, ptr %1, align 4
+ ret i32 0, !dbg !53
+}
+
+; Function Attrs: noinline nounwind optnone uwtable
+define dso_local void @no_name() #0 !dbg !21 {
+ %1 = load i64, ptr @__profc_no_name, align 8, !dbg !55
+ %2 = add i64 %1, 1, !dbg !55
+ store i64 %2, ptr @__profc_no_name, align 8, !dbg !55
+ ret void, !dbg !55
+}
+
+; Function Attrs: noinline nounwind optnone uwtable
+define dso_local void @no_cfg() #0 !dbg !26 {
+ %1 = load i64, ptr @__profc_no_cfg, align 8, !dbg !56
+ %2 = add i64 %1, 1, !dbg !56
+ store i64 %2, ptr @__profc_no_cfg, align 8, !dbg !56
+ ret void, !dbg !56
+}
+
+; Function Attrs: noinline nounwind optnone uwtable
+define dso_local void @no_counter() #0 !dbg !31 {
+ %1 = load i64, ptr @__profc_no_counter, align 8, !dbg !57
+ %2 = add i64 %1, 1, !dbg !57
+ store i64 %2, ptr @__profc_no_counter, align 8, !dbg !57
+ ret void, !dbg !57
+}
+
+; Function Attrs: noinline nounwind optnone uwtable
+define dso_local void @no_profc() #0 !dbg !36 {
+ ret void, !dbg !58
+}
+
+; Function Attrs: nounwind
+declare void @llvm.instrprof.increment(ptr, i64, i32, i32) #1
+
+attributes #0 = { noinline nounwind optnone uwtable "frame-pointer"="all" "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
+attributes #1 = { nounwind }
+
+!llvm.dbg.cu = !{!7}
+!llvm.module.flags = !{!46, !47, !48, !49, !50, !51, !52}
+
+!0 = !DIGlobalVariableExpression(var: !1, expr: !DIExpression())
+!1 = distinct !DIGlobalVariable(name: "__profc_main", scope: !2, file: !3, type: !14, isLocal: true, isDefinition: true, annotations: !44)
+!2 = distinct !DISubprogram(name: "main", scope: !3, file: !3, line: 1, type: !4, scopeLine: 1, spFlags: DISPFlagDefinition, unit: !7)
+!3 = !DIFile(filename: "a.c", directory: "/proc/self/cwd", checksumkind: CSK_MD5, checksum: "22eee0eada6e6964fca794aa5a0966d0")
+!4 = !DISubroutineType(types: !5)
+!5 = !{!6}
+!6 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)
+!7 = distinct !DICompileUnit(language: DW_LANG_C11, file: !3, isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug, globals: !8, splitDebugInlining: false, nameTableKind: None)
+!8 = !{!0, !9, !19, !24, !29, !34, !39}
+!9 = !DIGlobalVariableExpression(var: !10, expr: !DIExpression())
+!10 = distinct !DIGlobalVariable(name: "__profc_removed", scope: !11, file: !3, type: !14, isLocal: true, isDefinition: true, annotations: !15)
+!11 = distinct !DISubprogram(name: "removed", scope: !3, file: !3, line: 3, type: !12, scopeLine: 3, spFlags: DISPFlagDefinition, unit: !7)
+!12 = !DISubroutineType(types: !13)
+!13 = !{null}
+!14 = !DIBasicType(tag: DW_TAG_unspecified_type, name: "Profile Data Type")
+!15 = !{!16, !17, !18}
+!16 = !{!"Function Name", !"removed"}
+!17 = !{!"CFG Hash", i64 742261418966908927}
+!18 = !{!"Num Counters", i32 1}
+!19 = !DIGlobalVariableExpression(var: !20, expr: !DIExpression())
+!20 = distinct !DIGlobalVariable(name: "__profc_no_name", scope: !21, file: !3, type: !14, isLocal: true, isDefinition: true, annotations: !22)
+!21 = distinct !DISubprogram(name: "no_name", scope: !3, file: !3, line: 4, type: !12, scopeLine: 4, spFlags: DISPFlagDefinition, unit: !7)
+!22 = !{!17, !18}
+!23 = !{!"Function Name", !"no_name"}
+!24 = !DIGlobalVariableExpression(var: !25, expr: !DIExpression())
+!25 = distinct !DIGlobalVariable(name: "__profc_no_cfg", scope: !26, file: !3, type: !14, isLocal: true, isDefinition: true, annotations: !27)
+!26 = distinct !DISubprogram(name: "no_cfg", scope: !3, file: !3, line: 5, type: !12, scopeLine: 5, spFlags: DISPFlagDefinition, unit: !7)
+!27 = !{!28, !18}
+!28 = !{!"Function Name", !"no_cfg"}
+!29 = !DIGlobalVariableExpression(var: !30, expr: !DIExpression())
+!30 = distinct !DIGlobalVariable(name: "__profc_no_counter", scope: !31, file: !3, type: !14, isLocal: true, isDefinition: true, annotations: !32)
+!31 = distinct !DISubprogram(name: "no_counter", scope: !3, file: !3, line: 6, type: !12, scopeLine: 6, spFlags: DISPFlagDefinition, unit: !7)
+!32 = !{!33, !17}
+!33 = !{!"Function Name", !"no_counter"}
+!34 = !DIGlobalVariableExpression(var: !35, expr: !DIExpression())
+!35 = distinct !DIGlobalVariable(name: "__profc_no_profc", scope: !36, file: !3, type: !14, isLocal: true, isDefinition: true, annotations: !37)
+!36 = distinct !DISubprogram(name: "no_profc", scope: !3, file: !3, line: 7, type: !12, scopeLine: 7, spFlags: DISPFlagDefinition, unit: !7)
+!37 = !{!38, !17, !18}
+!38 = !{!"Function Name", !"no_profc"}
+!39 = !DIGlobalVariableExpression(var: !40, expr: !DIExpression())
+!40 = distinct !DIGlobalVariable(name: "__profc_no_func", scope: !41, file: !3, type: !14, isLocal: true, isDefinition: true, annotations: !42)
+!41 = distinct !DISubprogram(name: "no_func", scope: !3, file: !3, line: 8, type: !12, scopeLine: 8, spFlags: DISPFlagDefinition, unit: !7)
+!42 = !{!43, !17, !18}
+!43 = !{!"Function Name", !"no_func"}
+!44 = !{!45, !17, !18}
+!45 = !{!"Function Name", !"main"}
+!46 = !{i32 7, !"Dwarf Version", i32 5}
+!47 = !{i32 2, !"Debug Info Version", i32 3}
+!48 = !{i32 1, !"wchar_size", i32 4}
+!49 = !{i32 8, !"PIC Level", i32 2}
+!50 = !{i32 7, !"PIE Level", i32 2}
+!51 = !{i32 7, !"uwtable", i32 2}
+!52 = !{i32 7, !"frame-pointer", i32 2}
+!53 = !DILocation(line: 1, column: 14, scope: !2)
+!54 = !DILocation(line: 3, column: 17, scope: !11)
+!55 = !DILocation(line: 4, column: 17, scope: !21)
+!56 = !DILocation(line: 5, column: 16, scope: !26)
+!57 = !DILocation(line: 6, column: 20, scope: !31)
+!58 = !DILocation(line: 7, column: 18, scope: !36)
+!59 = !DILocation(line: 8, column: 17, scope: !41)
diff --git a/compiler-rt/test/profile/instrprof-tmpdir.c b/compiler-rt/test/profile/instrprof-tmpdir.c
index 7206df3..9d4b3d3 100644
--- a/compiler-rt/test/profile/instrprof-tmpdir.c
+++ b/compiler-rt/test/profile/instrprof-tmpdir.c
@@ -1,3 +1,8 @@
+// AIX does not support env -u.
+// TODO(boomanaiden154): Reenable AIX support once we use the internal shell by
+// default.
+// UNSUPPORTED: system-aix
+
// RUN: rm -rf %t
// RUN: mkdir -p %t
// RUN: cd %t
@@ -12,8 +17,7 @@
// RUN: llvm-profdata show ./raw2.profraw | FileCheck %s -check-prefix TMPDIR
//
// Check that we fall back to the default path if TMPDIR is missing.
-// RUN: %if system-aix %{ unset TMPDIR %}
-// RUN: env %if !system-aix %{ -u TMPDIR %} LLVM_PROFILE_FILE="%%t/raw3.profraw" %run %t/binary 2>&1 | FileCheck %s -check-prefix MISSING
+// RUN: env -u TMPDIR LLVM_PROFILE_FILE="%%t/raw3.profraw" %run %t/binary 2>&1 | FileCheck %s -check-prefix MISSING
// RUN: llvm-profdata show ./default.profraw | FileCheck %s -check-prefix TMPDIR
// TMPDIR: Maximum function count: 1
diff --git a/compiler-rt/test/rtsan/Darwin/dlopen.cpp b/compiler-rt/test/rtsan/Darwin/dlopen.cpp
index 1aabe5c..435a435 100644
--- a/compiler-rt/test/rtsan/Darwin/dlopen.cpp
+++ b/compiler-rt/test/rtsan/Darwin/dlopen.cpp
@@ -8,18 +8,19 @@
// RUN: %clangxx -fsanitize=realtime %s -o %t.so -shared -DSHARED_LIB
// RUN: %clangxx %s -o %t
-// RUN: RTSAN_DYLIB_PATH=`%clangxx -fsanitize=realtime %s -### 2>&1 \
+// RUN: %clangxx -fsanitize=realtime %s -### 2>&1 \
// RUN: | grep "libclang_rt.rtsan_osx_dynamic.dylib" \
-// RUN: | sed -e 's/.*"\(.*libclang_rt.rtsan_osx_dynamic.dylib\)".*/\1/'`
+// RUN: | sed -e 's/.*"\(.*libclang_rt.rtsan_osx_dynamic.dylib\)".*/\1/' \
+// RUN: | tr -d '\n' > %t.rtsan_dylib_path
// Launching a non-instrumented binary that dlopen's an instrumented library should fail.
// RUN: not %run %t %t.so 2>&1 | FileCheck %s --check-prefix=CHECK-FAIL
// Launching a non-instrumented binary with an explicit DYLD_INSERT_LIBRARIES should work.
-// RUN: DYLD_INSERT_LIBRARIES=$RTSAN_DYLIB_PATH %run %t %t.so 2>&1 | FileCheck %s
+// RUN: env DYLD_INSERT_LIBRARIES="%{readfile:%t.rtsan_dylib_path}" %run %t %t.so 2>&1 | FileCheck %s
// Launching an instrumented binary with the DYLD_INSERT_LIBRARIES env variable has no error
// RUN: %clangxx -fsanitize=realtime %s -o %t
-// RUN: DYLD_INSERT_LIBRARIES=$RTSAN_DYLIB_PATH %run %t %t.so 2>&1 | FileCheck %s --check-prefix=CHECK-INSTRUMENTED
+// RUN: env DYLD_INSERT_LIBRARIES="%{readfile:%t.rtsan_dylib_path}" %run %t %t.so 2>&1 | FileCheck %s --check-prefix=CHECK-INSTRUMENTED
#include <dlfcn.h>
#include <stdio.h>
diff --git a/compiler-rt/test/sanitizer_common/TestCases/Linux/soft_rss_limit_mb_test.cpp b/compiler-rt/test/sanitizer_common/TestCases/Linux/soft_rss_limit_mb_test.cpp
index e6fc22d..0c72578 100644
--- a/compiler-rt/test/sanitizer_common/TestCases/Linux/soft_rss_limit_mb_test.cpp
+++ b/compiler-rt/test/sanitizer_common/TestCases/Linux/soft_rss_limit_mb_test.cpp
@@ -2,12 +2,12 @@
// RUN: %clangxx -O2 %s -o %t
//
// Run with limit should fail:
-// RUN: %env_tool_opts=soft_rss_limit_mb=220:quarantine_size=1:allocator_may_return_null=1 %run %t 2>&1 | FileCheck %s -check-prefix=CHECK_MAY_RETURN_1
-// RUN: %env_tool_opts=soft_rss_limit_mb=220:quarantine_size=1:allocator_may_return_null=0 not %run %t 2>&1 | FileCheck %s -check-prefix=CHECK_MAY_RETURN_0 --implicit-check-not="returned null"
+// RUN: %env_tool_opts=soft_rss_limit_mb=384:quarantine_size=1:allocator_may_return_null=1 %run %t 2>&1 | FileCheck %s -check-prefix=CHECK_MAY_RETURN_1
+// RUN: %env_tool_opts=soft_rss_limit_mb=384:quarantine_size=1:allocator_may_return_null=0 not %run %t 2>&1 | FileCheck %s -check-prefix=CHECK_MAY_RETURN_0 --implicit-check-not="returned null"
// This run uses getrusage. We can only test getrusage when allocator_may_return_null=0
// because getrusage gives us max-rss, not current-rss.
-// RUN: %env_tool_opts=soft_rss_limit_mb=220:quarantine_size=1:allocator_may_return_null=0:can_use_proc_maps_statm=0 not %run %t 2>&1 | FileCheck %s -check-prefix=CHECK_MAY_RETURN_0 --implicit-check-not="returned null"
+// RUN: %env_tool_opts=soft_rss_limit_mb=384:quarantine_size=1:allocator_may_return_null=0:can_use_proc_maps_statm=0 not %run %t 2>&1 | FileCheck %s -check-prefix=CHECK_MAY_RETURN_0 --implicit-check-not="returned null"
// REQUIRES: stable-runtime
// Ubsan does not intercept pthread_create.
diff --git a/compiler-rt/test/sanitizer_common/TestCases/Posix/posix_spawn.c b/compiler-rt/test/sanitizer_common/TestCases/Posix/posix_spawn.c
index ea58b92..1a66a61 100644
--- a/compiler-rt/test/sanitizer_common/TestCases/Posix/posix_spawn.c
+++ b/compiler-rt/test/sanitizer_common/TestCases/Posix/posix_spawn.c
@@ -6,8 +6,12 @@
#include <assert.h>
#include <spawn.h>
#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
#include <sys/wait.h>
+extern char **environ;
+
int main(int argc, char **argv) {
if (argc > 1) {
// CHECK: SPAWNED
@@ -23,11 +27,22 @@ int main(int argc, char **argv) {
argv[0], "2", "3", "4", "2", "3", "4", "2", "3", "4",
"2", "3", "4", "2", "3", "4", "2", "3", "4", NULL,
};
- char *const env[] = {
+ char *env[] = {
"A=B", "A=B", "A=B", "A=B", "A=B", "A=B", "A=B", "A=B", "A=B", "A=B",
"A=B", "A=B", "A=B", "A=B", "A=B", "A=B", "A=B", "A=B", "A=B", NULL,
};
+ // When this test runs with a runtime (e.g. ASAN), the spawned process needs
+ // to use the same runtime search path as the parent. Otherwise, it might
+ // try to load a runtime that doesn't work and crash before hitting main(),
+ // failing the test. We technically should forward the variable for the
+ // current platform, but some platforms have multiple such variables and
+ // it's quite difficult to plumb this through the lit config.
+ for (char **e = environ; *e; e++)
+ if (strncmp(*e, "DYLD_LIBRARY_PATH=", sizeof("DYLD_LIBRARY_PATH=") - 1) ==
+ 0)
+ env[0] = *e;
+
pid_t pid;
int s = posix_spawn(&pid, argv[0], &file_actions, &attr, args, env);
assert(!s);
diff --git a/compiler-rt/test/sanitizer_common/TestCases/Posix/sanitizer_set_report_fd_test.cpp b/compiler-rt/test/sanitizer_common/TestCases/Posix/sanitizer_set_report_fd_test.cpp
index 6ba7025..e406482 100644
--- a/compiler-rt/test/sanitizer_common/TestCases/Posix/sanitizer_set_report_fd_test.cpp
+++ b/compiler-rt/test/sanitizer_common/TestCases/Posix/sanitizer_set_report_fd_test.cpp
@@ -7,7 +7,7 @@
// RUN: not %run %t %t-out && FileCheck < %t-out %s
// REQUIRES: stable-runtime
-// XFAIL: android && asan
+// UNSUPPORTED: android && asan
#include <sanitizer/common_interface_defs.h>
#include <stdio.h>
diff --git a/compiler-rt/test/sanitizer_common/TestCases/printf-ldbl.c b/compiler-rt/test/sanitizer_common/TestCases/printf-ldbl.c
index cfe8d80..f6629ab 100644
--- a/compiler-rt/test/sanitizer_common/TestCases/printf-ldbl.c
+++ b/compiler-rt/test/sanitizer_common/TestCases/printf-ldbl.c
@@ -1,8 +1,5 @@
// RUN: %clang %s -o %t && %run %t 2>&1
-// Issue #41838
-// XFAIL: sparc-target-arch && target={{.*solaris.*}}
-
#include <assert.h>
#include <stdio.h>
#include <string.h>
diff --git a/compiler-rt/test/sanitizer_common/TestCases/scanf-ldbl.c b/compiler-rt/test/sanitizer_common/TestCases/scanf-ldbl.c
index a38f34a..9ca30f4 100644
--- a/compiler-rt/test/sanitizer_common/TestCases/scanf-ldbl.c
+++ b/compiler-rt/test/sanitizer_common/TestCases/scanf-ldbl.c
@@ -1,8 +1,5 @@
// RUN: %clang %s -o %t && %run %t 2>&1
-// Issue #41838
-// XFAIL: sparc-target-arch && target={{.*solaris.*}}
-
#include <assert.h>
#include <stdio.h>
#include <string.h>
diff --git a/compiler-rt/test/tsan/Darwin/dlopen.cpp b/compiler-rt/test/tsan/Darwin/dlopen.cpp
index 3d12b81..2ab052f 100644
--- a/compiler-rt/test/tsan/Darwin/dlopen.cpp
+++ b/compiler-rt/test/tsan/Darwin/dlopen.cpp
@@ -9,14 +9,15 @@
// RUN: %clangxx_tsan %s -o %t.so -shared -DSHARED_LIB
// RUN: %clangxx_tsan -fno-sanitize=thread %s -o %t
-// RUN: TSAN_DYLIB_PATH=`%clangxx_tsan %s -### 2>&1 \
+// RUN: %clangxx_tsan %s -### 2>&1 \
// RUN: | grep "libclang_rt.tsan_osx_dynamic.dylib" \
-// RUN: | sed -e 's/.*"\(.*libclang_rt.tsan_osx_dynamic.dylib\)".*/\1/'`
+// RUN: | sed -e 's/.*"\(.*libclang_rt.tsan_osx_dynamic.dylib\)".*/\1/' \
+// RUN: | tr -d '\n' > %t.tsan_dylib_path
// Launching a non-instrumented binary that dlopen's an instrumented library should fail.
// RUN: not %run %t %t.so 2>&1 | FileCheck %s --check-prefix=CHECK-FAIL
// Launching a non-instrumented binary with an explicit DYLD_INSERT_LIBRARIES should work.
-// RUN: DYLD_INSERT_LIBRARIES=$TSAN_DYLIB_PATH %run %t %t.so 2>&1 | FileCheck %s
+// RUN: env DYLD_INSERT_LIBRARIES="%{readfile:%t.tsan_dylib_path}" %run %t %t.so 2>&1 | FileCheck %s
#include <dlfcn.h>
#include <pthread.h>
diff --git a/compiler-rt/test/tsan/Darwin/external-ignore-noninstrumented.cpp b/compiler-rt/test/tsan/Darwin/external-ignore-noninstrumented.cpp
index 916b0b8..cfa46e0 100644
--- a/compiler-rt/test/tsan/Darwin/external-ignore-noninstrumented.cpp
+++ b/compiler-rt/test/tsan/Darwin/external-ignore-noninstrumented.cpp
@@ -1,8 +1,10 @@
+// RUN: basename %t-lib.dylib | tr -d '\n' > %t.basename
// RUN: %clangxx_tsan -shared %p/external-lib.cpp -fno-sanitize=thread -DUSE_TSAN_CALLBACKS \
-// RUN: -o %t-lib.dylib -install_name @rpath/`basename %t-lib.dylib`
+// RUN: -o %t-lib.dylib -install_name @rpath/%{readfile:%t.basename}
+// RUN: basename %t-module.dylib | tr -d '\n' > %t.basename
// RUN: %clangxx_tsan -shared %p/external-noninstrumented-module.cpp %t-lib.dylib -fno-sanitize=thread \
-// RUN: -o %t-module.dylib -install_name @rpath/`basename %t-module.dylib`
+// RUN: -o %t-module.dylib -install_name @rpath/%{readfile:%t.basename}
// RUN: %clangxx_tsan %s %t-module.dylib -o %t
// RUN: %run %t 2>&1 | FileCheck %s
diff --git a/compiler-rt/test/tsan/Darwin/external.cpp b/compiler-rt/test/tsan/Darwin/external.cpp
index bf189eb..52fae36 100644
--- a/compiler-rt/test/tsan/Darwin/external.cpp
+++ b/compiler-rt/test/tsan/Darwin/external.cpp
@@ -1,14 +1,17 @@
+// RUN: basename %t-lib-instrumented.dylib | tr -d '\n' > %t.basename
// RUN: %clangxx_tsan %p/external-lib.cpp -shared \
// RUN: -o %t-lib-instrumented.dylib \
-// RUN: -install_name @rpath/`basename %t-lib-instrumented.dylib`
+// RUN: -install_name @rpath/%{readfile:%t.basename}
+// RUN: basename %t-lib-noninstrumented.dylib | tr -d '\n' > %t.basename
// RUN: %clangxx_tsan %p/external-lib.cpp -shared -fno-sanitize=thread \
// RUN: -o %t-lib-noninstrumented.dylib \
-// RUN: -install_name @rpath/`basename %t-lib-noninstrumented.dylib`
+// RUN: -install_name @rpath/%{readfile:%t.basename}
+// RUN: basename %t-lib-noninstrumented-callbacks.dylib | tr -d '\n' > %t.basename
// RUN: %clangxx_tsan %p/external-lib.cpp -shared -fno-sanitize=thread -DUSE_TSAN_CALLBACKS \
// RUN: -o %t-lib-noninstrumented-callbacks.dylib \
-// RUN: -install_name @rpath/`basename %t-lib-noninstrumented-callbacks.dylib`
+// RUN: -install_name @rpath/%{readfile:%t.basename}
// RUN: %clangxx_tsan %s %t-lib-instrumented.dylib -o %t-lib-instrumented
// RUN: %clangxx_tsan %s %t-lib-noninstrumented.dylib -o %t-lib-noninstrumented
diff --git a/compiler-rt/test/tsan/Darwin/malloc-stack-logging.cpp b/compiler-rt/test/tsan/Darwin/malloc-stack-logging.cpp
index 8d9c212..0a96e34 100644
--- a/compiler-rt/test/tsan/Darwin/malloc-stack-logging.cpp
+++ b/compiler-rt/test/tsan/Darwin/malloc-stack-logging.cpp
@@ -4,7 +4,7 @@
// use syscalls directly) to make sure other interceptors aren't called.
// RUN: %clangxx_tsan -O1 %s -o %t
-// RUN: MallocStackLogging=1 %run %t 2>&1 | FileCheck %s
+// RUN: env MallocStackLogging=1 %run %t 2>&1 | FileCheck %s
#include <pthread.h>
#include <stdlib.h>
#include <stdio.h>
diff --git a/compiler-rt/test/tsan/cxa_guard_acquire.cpp b/compiler-rt/test/tsan/cxa_guard_acquire.cpp
index fc40725..6050c24 100644
--- a/compiler-rt/test/tsan/cxa_guard_acquire.cpp
+++ b/compiler-rt/test/tsan/cxa_guard_acquire.cpp
@@ -66,10 +66,17 @@ int main(int argc, char **argv) {
printf("Enter main\n");
// If initialization is contended, the blocked thread should enter a
- // potentially blocking region.
+ // potentially blocking region. Note that we use a DAG check because it is
+ // possible for Thread 1 to acquire the guard, then Thread 2 fail to acquire
+ // the guard then call `OnPotentiallyBlockingRegionBegin` and print "Enter
+ // potentially blocking region\n", before Thread 1 manages to reach "Enter
+ // constructor\n". This is exceptionally rare, but can be replicated by
+ // inserting a `sleep(1)` between `LazyInit() {` and `printf("Enter
+ // constructor\n");`. Due to the barrier it is not possible for the exit logs
+ // to be inverted.
//
- // CHECK-NEXT: Enter constructor
- // CHECK-NEXT: Enter potentially blocking region
+ // CHECK-DAG: Enter constructor
+ // CHECK-DAG: Enter potentially blocking region
// CHECK-NEXT: Exit constructor
// CHECK-NEXT: Exit potentially blocking region
barrier_init(&barrier, 2);
diff --git a/compiler-rt/test/tsan/target_clones_segfault.c b/compiler-rt/test/tsan/target_clones_segfault.c
new file mode 100644
index 0000000..b8847ec
--- /dev/null
+++ b/compiler-rt/test/tsan/target_clones_segfault.c
@@ -0,0 +1,11 @@
+// https://github.com/llvm/llvm-project/issues/163369
+// RUN: %clang_tsan %s -o %t && %run %t
+
+#if __x86_64__
+__attribute__((target_clones("avx,default")))
+#endif
+static int has_target_clones(void) {
+ return 0;
+}
+
+int main(void) { has_target_clones(); }
diff --git a/compiler-rt/test/ubsan/CMakeLists.txt b/compiler-rt/test/ubsan/CMakeLists.txt
index 410585e..f0b84f4 100644
--- a/compiler-rt/test/ubsan/CMakeLists.txt
+++ b/compiler-rt/test/ubsan/CMakeLists.txt
@@ -62,6 +62,9 @@ foreach(arch ${UBSAN_TEST_ARCH})
if(COMPILER_RT_HAS_TSAN AND ";${TSAN_SUPPORTED_ARCH};" MATCHES ";${arch};" AND NOT ANDROID)
add_ubsan_testsuites("ThreadSanitizer" tsan ${arch})
endif()
+ if(COMPILER_RT_HAS_TYSAN AND ";${TYSAN_SUPPORTED_ARCH};" MATCHES ";${arch};")
+ add_ubsan_testsuites("TypeSanitizer" tysan ${arch})
+ endif()
endforeach()
macro(add_ubsan_device_testsuite test_mode sanitizer platform arch)
@@ -124,6 +127,10 @@ if(APPLE)
if(COMPILER_RT_HAS_TSAN AND ";${TSAN_SUPPORTED_ARCH};" MATCHES ";${arch};")
add_ubsan_device_testsuite("ThreadSanitizer" tsan ${platform} ${arch})
endif()
+
+ if(COMPILER_RT_HAS_TYSAN AND ";${TYSAN_SUPPORTED_ARCH};" MATCHES ";${arch};")
+ add_ubsan_device_testsuite("TypeSanitizer" tysan ${platform} ${arch})
+ endif()
endforeach()
endforeach()
endif()
diff --git a/compiler-rt/test/ubsan/TestCases/Float/cast-overflow.cpp b/compiler-rt/test/ubsan/TestCases/Float/cast-overflow.cpp
index 8638bf6..80063b7 100644
--- a/compiler-rt/test/ubsan/TestCases/Float/cast-overflow.cpp
+++ b/compiler-rt/test/ubsan/TestCases/Float/cast-overflow.cpp
@@ -9,9 +9,6 @@
// RUN: %run %t 6 2>&1 | FileCheck %s --check-prefix=CHECK-6
// RUN: %run %t 7 2>&1 | FileCheck %s --check-prefix=CHECK-7
-// Issue #41838
-// XFAIL: sparc-target-arch && target={{.*solaris.*}}
-
// This test assumes float and double are IEEE-754 single- and double-precision.
#if defined(__APPLE__)
diff --git a/compiler-rt/test/ubsan/TestCases/Misc/Posix/print_stack_trace.cpp b/compiler-rt/test/ubsan/TestCases/Misc/Posix/print_stack_trace.cpp
index 93c6bd6..c5c8eb7 100644
--- a/compiler-rt/test/ubsan/TestCases/Misc/Posix/print_stack_trace.cpp
+++ b/compiler-rt/test/ubsan/TestCases/Misc/Posix/print_stack_trace.cpp
@@ -1,9 +1,12 @@
-// RUN: %clangxx -fsanitize=undefined -O0 %s -o %t && UBSAN_OPTIONS=stack_trace_format=DEFAULT:fast_unwind_on_fatal=1 %run %t 2>&1 | FileCheck %s
-// RUN: %clangxx -fsanitize=undefined -O0 %s -o %t && UBSAN_OPTIONS=stack_trace_format=DEFAULT:fast_unwind_on_fatal=0 %run %t 2>&1 | FileCheck %s
+// RUN: %clangxx -fsanitize=undefined -O0 %s -o %t && env UBSAN_OPTIONS=stack_trace_format=DEFAULT:fast_unwind_on_fatal=1 %run %t 2>&1 | FileCheck %s
+// RUN: %clangxx -fsanitize=undefined -O0 %s -o %t && env UBSAN_OPTIONS=stack_trace_format=DEFAULT:fast_unwind_on_fatal=0 %run %t 2>&1 | FileCheck %s
// This test is temporarily disabled due to broken unwinding on ARM.
// UNSUPPORTED: target={{.*-linux-.*}}
+// Temporarily unsupporting on TySan until interfaces are implemented
+// UNSUPPORTED: ubsan-tysan
+
// The test doesn't pass on Darwin in UBSan-TSan configuration, because TSan is
// using the slow unwinder which is not supported on Darwin. The test should
// be universal after landing of https://reviews.llvm.org/D32806.
diff --git a/compiler-rt/test/ubsan/TestCases/Misc/Posix/sigaction.cpp b/compiler-rt/test/ubsan/TestCases/Misc/Posix/sigaction.cpp
index 0ab65bd..0b848ec 100644
--- a/compiler-rt/test/ubsan/TestCases/Misc/Posix/sigaction.cpp
+++ b/compiler-rt/test/ubsan/TestCases/Misc/Posix/sigaction.cpp
@@ -7,6 +7,9 @@
// Reason unknown, needs debugging.
// UNSUPPORTED: target=aarch64{{.*}} && ubsan-tsan
+// TySan doesn't build a shared library
+// UNSUPPORTED: ubsan-tysan
+
#include <assert.h>
#include <signal.h>
#include <stdio.h>
diff --git a/compiler-rt/test/ubsan/TestCases/Misc/coverage-levels.cpp b/compiler-rt/test/ubsan/TestCases/Misc/coverage-levels.cpp
index c613317..fd019d2 100644
--- a/compiler-rt/test/ubsan/TestCases/Misc/coverage-levels.cpp
+++ b/compiler-rt/test/ubsan/TestCases/Misc/coverage-levels.cpp
@@ -19,8 +19,9 @@
// RUN: %clangxx -fsanitize=shift -O1 -fsanitize-coverage=edge,trace-pc-guard %s -o %t
// RUN: %env_ubsan_opts=coverage=1:verbosity=1:coverage_dir='"%t-dir"' %run %t 2>&1 | FileCheck %s --check-prefix=CHECK3 --check-prefix=CHECK_WARN
-// Coverage is not yet implemented in TSan.
+// Coverage is not yet implemented in TSan or TySan.
// XFAIL: ubsan-tsan
+// XFAIL: ubsan-tysan
// UNSUPPORTED: ubsan-standalone-static
// No coverage support
// UNSUPPORTED: target={{.*openbsd.*}}
diff --git a/compiler-rt/test/ubsan/TestCases/Misc/log-path_test.cpp b/compiler-rt/test/ubsan/TestCases/Misc/log-path_test.cpp
index 4773884..3fd0295 100644
--- a/compiler-rt/test/ubsan/TestCases/Misc/log-path_test.cpp
+++ b/compiler-rt/test/ubsan/TestCases/Misc/log-path_test.cpp
@@ -24,9 +24,6 @@
// FIXME: log_path is not supported on Windows yet.
// XFAIL: target={{.*windows-msvc.*}}
-// Issue #41838
-// XFAIL: sparc-target-arch && target={{.*solaris.*}}
-
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]) {
diff --git a/compiler-rt/test/ubsan/lit.common.cfg.py b/compiler-rt/test/ubsan/lit.common.cfg.py
index 25e5279..314d207 100644
--- a/compiler-rt/test/ubsan/lit.common.cfg.py
+++ b/compiler-rt/test/ubsan/lit.common.cfg.py
@@ -39,6 +39,9 @@ elif ubsan_lit_test_mode == "MemorySanitizer":
elif ubsan_lit_test_mode == "ThreadSanitizer":
config.available_features.add("ubsan-tsan")
clang_ubsan_cflags = ["-fsanitize=thread"]
+elif ubsan_lit_test_mode == "TypeSanitizer":
+ config.available_features.add("ubsan-tysan")
+ clang_ubsan_cflags = ["-fsanitize=type"]
else:
lit_config.fatal("Unknown UBSan test mode: %r" % ubsan_lit_test_mode)
diff --git a/compiler-rt/test/ubsan_minimal/TestCases/misalignment.cpp b/compiler-rt/test/ubsan_minimal/TestCases/misalignment.cpp
index cf82879..3f01dc8 100644
--- a/compiler-rt/test/ubsan_minimal/TestCases/misalignment.cpp
+++ b/compiler-rt/test/ubsan_minimal/TestCases/misalignment.cpp
@@ -7,7 +7,7 @@ int *t;
int main() {
int r;
t = (int *)(((char *)&r) + 1);
- // CHECK: ubsan: type-mismatch by 0x{{[[:xdigit:]]+}} address 0x{{[[:xdigit:]]+$}}
+ // CHECK: ubsan: type-mismatch by 0x{{[[:xdigit:]]+}}
// CHECK-NOT: type-mismatch
f(*t);
}
diff --git a/compiler-rt/test/ubsan_minimal/TestCases/null.cpp b/compiler-rt/test/ubsan_minimal/TestCases/null.cpp
index c97527b..b3d9db2 100644
--- a/compiler-rt/test/ubsan_minimal/TestCases/null.cpp
+++ b/compiler-rt/test/ubsan_minimal/TestCases/null.cpp
@@ -5,7 +5,7 @@ void f(int &n) {}
int *t;
int main() {
- // CHECK: ubsan: type-mismatch by 0x{{[[:xdigit:]]+}} address 0x{{[[:xdigit:]]+$}}
+ // CHECK: ubsan: type-mismatch by 0x{{[[:xdigit:]]+}}
// CHECK-NOT: type-mismatch
f(*t);
}
diff --git a/compiler-rt/test/ubsan_minimal/TestCases/override-callback.c b/compiler-rt/test/ubsan_minimal/TestCases/override-callback.c
index aaed134..8c04a00 100644
--- a/compiler-rt/test/ubsan_minimal/TestCases/override-callback.c
+++ b/compiler-rt/test/ubsan_minimal/TestCases/override-callback.c
@@ -1,6 +1,7 @@
-// RUN: %clang_min_runtime -fsanitize=implicit-integer-sign-change %s -o %t && %run %t 2>&1 | FileCheck %s
-// RUN: %clang_min_runtime -fsanitize=implicit-integer-sign-change -fno-sanitize-recover=all %s -o %t && not --crash %run %t 2>&1 | FileCheck %s
-// RUN: %clang_min_runtime -fsanitize=implicit-integer-sign-change -fno-sanitize-recover=all -DOVERRIDE=1 %s -o %t && not --crash %run %t 2>&1 | FileCheck %s --check-prefixes=FATAL
+// RUN: %clang_min_runtime -fsanitize=implicit-integer-sign-change %s -o %t && %run %t 2>&1 | FileCheck %s
+// RUN: %clang_min_runtime -fsanitize=implicit-integer-sign-change -fsanitize-handler-preserve-all-regs -DPRESERVE %s -o %t && %run %t 2>&1 | FileCheck %s --check-prefixes=PRESERVE
+// RUN: %clang_min_runtime -fsanitize=implicit-integer-sign-change -fno-sanitize-recover=all %s -o %t && not --crash %run %t 2>&1 | FileCheck %s
+// RUN: %clang_min_runtime -fsanitize=implicit-integer-sign-change -fno-sanitize-recover=all -DOVERRIDE=1 %s -o %t && not --crash %run %t 2>&1 | FileCheck %s --check-prefixes=FATAL
#include <stdint.h>
#include <stdio.h>
@@ -9,8 +10,21 @@
static int Result;
void __ubsan_report_error(const char *kind, uintptr_t caller) {
+// -fsanitize-handler-preserve-all-regs is ignored on other architectures.
+// Prented we called to other handler on those.
+#if defined(PRESERVE) && !defined(__aarch64__) && !defined(__x86_64__)
+ fprintf(stderr, "CUSTOM_CALLBACK_PRESERVE: %s\n", kind);
+#else
fprintf(stderr, "CUSTOM_CALLBACK: %s\n", kind);
+#endif
+}
+
+#if defined(__aarch64__) || defined(__x86_64__)
+[[clang::preserve_all]] void __ubsan_report_error_preserve(const char *kind,
+ uintptr_t caller) {
+ fprintf(stderr, "CUSTOM_CALLBACK_PRESERVE: %s\n", kind);
}
+#endif
#if OVERRIDE
void __ubsan_report_error_fatal(const char *kind, uintptr_t caller) {
@@ -21,5 +35,6 @@ void __ubsan_report_error_fatal(const char *kind, uintptr_t caller) {
int main(int argc, const char **argv) {
int32_t t0 = (~((uint32_t)0));
// CHECK: CUSTOM_CALLBACK: implicit-conversion
+ // PRESERVE: CUSTOM_CALLBACK_PRESERVE: implicit-conversion
// FATAL: FATAL_CALLBACK: implicit-conversion
}
diff --git a/compiler-rt/test/ubsan_minimal/TestCases/test-darwin-interface.c b/compiler-rt/test/ubsan_minimal/TestCases/test-darwin-interface.c
index abc1073..f7702c99 100644
--- a/compiler-rt/test/ubsan_minimal/TestCases/test-darwin-interface.c
+++ b/compiler-rt/test/ubsan_minimal/TestCases/test-darwin-interface.c
@@ -3,11 +3,20 @@
//
// REQUIRES: x86_64-darwin
-// RUN: nm -jgU `%clangxx_min_runtime -fsanitize-minimal-runtime -fsanitize=undefined %s -o %t '-###' 2>&1 | grep "libclang_rt.ubsan_minimal_osx_dynamic.dylib" | sed -e 's/.*"\(.*libclang_rt.ubsan_minimal_osx_dynamic.dylib\)".*/\1/'` | grep "^___ubsan_handle" \
+// RUN: %clangxx_min_runtime -fsanitize-minimal-runtime -fsanitize=undefined %s -o %t '-###' 2>&1 | \
+// RUN: grep "libclang_rt.ubsan_minimal_osx_dynamic.dylib" | \
+// RUN: sed -e 's/.*"\(.*libclang_rt.ubsan_minimal_osx_dynamic.dylib\)".*/\1/' | \
+// RUN: tr -d '\n' > %t.dylib_path1
+// RUN: nm -jgU %{readfile:%t.dylib_path1} | grep "^___ubsan_handle" \
+// RUN: | grep -vE "_minimal_preserve" \
// RUN: | sed 's/_minimal//g' \
// RUN: > %t.minimal.symlist
//
-// RUN: nm -jgU `%clangxx_min_runtime -fno-sanitize-minimal-runtime -fsanitize=undefined %s -o %t '-###' 2>&1 | grep "libclang_rt.ubsan_osx_dynamic.dylib" | sed -e 's/.*"\(.*libclang_rt.ubsan_osx_dynamic.dylib\)".*/\1/'` | grep "^___ubsan_handle" \
+// RUN: %clangxx_min_runtime -fno-sanitize-minimal-runtime -fsanitize=undefined %s -o %t '-###' 2>&1 | \
+// RUN: grep "libclang_rt.ubsan_osx_dynamic.dylib" | \
+// RUN: sed -e 's/.*"\(.*libclang_rt.ubsan_osx_dynamic.dylib\)".*/\1/' | \
+// RUN: tr -d '\n' > %t.dylib_path2
+// RUN: nm -jgU %{readfile:%t.dylib_path2} | grep "^___ubsan_handle" \
// RUN: | grep -vE "^___ubsan_handle_dynamic_type_cache_miss" \
// RUN: | grep -vE "^___ubsan_handle_cfi_bad_type" \
// RUN: | sed 's/_v1//g' \
diff --git a/compiler-rt/test/xray/TestCases/Posix/always-never-instrument.cpp b/compiler-rt/test/xray/TestCases/Posix/always-never-instrument.cpp
index e5fefc07..85a3d23 100644
--- a/compiler-rt/test/xray/TestCases/Posix/always-never-instrument.cpp
+++ b/compiler-rt/test/xray/TestCases/Posix/always-never-instrument.cpp
@@ -12,6 +12,8 @@
// REQUIRES: built-in-llvm-tree
+// UNSUPPORTED: armhf-linux
+
// NOINSTR-NOT: {{.*__xray_NeverInstrumented.*}}
int __xray_NeverInstrumented() {
return 0;
diff --git a/compiler-rt/test/xray/TestCases/Posix/basic-filtering.cpp b/compiler-rt/test/xray/TestCases/Posix/basic-filtering.cpp
index 1440460..1d03efc 100644
--- a/compiler-rt/test/xray/TestCases/Posix/basic-filtering.cpp
+++ b/compiler-rt/test/xray/TestCases/Posix/basic-filtering.cpp
@@ -3,28 +3,32 @@
// RUN: %clangxx_xray -std=c++11 %s -o %t -g
// RUN: rm -f basic-filtering-*
-// RUN: XRAY_OPTIONS="patch_premain=true xray_mode=xray-basic verbosity=1 \
+// RUN: env XRAY_OPTIONS="patch_premain=true xray_mode=xray-basic verbosity=1 \
// RUN: xray_logfile_base=basic-filtering- \
// RUN: xray_naive_log_func_duration_threshold_us=1000 \
// RUN: xray_naive_log_max_stack_depth=2" %run %t 2>&1 | \
// RUN: FileCheck %s
+// RUN: ls basic-filtering-* | head -1 | tr -d '\n' > %t.log
// RUN: %llvm_xray convert --symbolize --output-format=yaml -instr_map=%t \
-// RUN: "`ls basic-filtering-* | head -1`" | \
+// RUN: "%{readfile:%t.log}" | \
// RUN: FileCheck %s --check-prefix TRACE
// RUN: rm -f basic-filtering-*
//
// Now check support for the XRAY_BASIC_OPTIONS environment variable.
-// RUN: XRAY_OPTIONS="patch_premain=true xray_mode=xray-basic verbosity=1 \
+// RUN: env XRAY_OPTIONS="patch_premain=true xray_mode=xray-basic verbosity=1 \
// RUN: xray_logfile_base=basic-filtering-" \
-// RUN: XRAY_BASIC_OPTIONS="func_duration_threshold_us=1000 max_stack_depth=2" \
+// RUN: env XRAY_BASIC_OPTIONS="func_duration_threshold_us=1000 max_stack_depth=2" \
// RUN: %run %t 2>&1 | FileCheck %s
+// RUN: ls basic-filtering-* | head -1 | tr -d '\n' > %t.log
// RUN: %llvm_xray convert --symbolize --output-format=yaml -instr_map=%t \
-// RUN: "`ls basic-filtering-* | head -1`" | \
+// RUN: "%{readfile:%t.log}" | \
// RUN: FileCheck %s --check-prefix TRACE
// RUN: rm -f basic-filtering-*
// REQUIRES: built-in-llvm-tree
+// UNSUPPORTED: armhf-linux
+
#include <cstdio>
#include <time.h>
diff --git a/compiler-rt/test/xray/TestCases/Posix/basic-mode-dso.cpp b/compiler-rt/test/xray/TestCases/Posix/basic-mode-dso.cpp
index d40dcd8..954c7ef 100644
--- a/compiler-rt/test/xray/TestCases/Posix/basic-mode-dso.cpp
+++ b/compiler-rt/test/xray/TestCases/Posix/basic-mode-dso.cpp
@@ -4,8 +4,9 @@
// RUN: %clangxx_xray -g -fPIC -fxray-instrument -fxray-shared -shared -std=c++11 %t/testlib.cpp -o %t/testlib.so
// RUN: %clangxx_xray -g -fPIC -fxray-instrument -fxray-shared -std=c++11 %t/main.cpp %t/testlib.so -Wl,-rpath,%t -o %t/main.o
-// RUN: XRAY_OPTIONS="patch_premain=false,xray_mode=xray-basic,xray_logfile_base=basic-mode-dso-,verbosity=1" XRAY_BASIC_OPTIONS="func_duration_threshold_us=0" %run %t/main.o 2>&1 | FileCheck %s
-// RUN: %llvm_xray account --format=csv --sort=funcid "`ls basic-mode-dso-* | head -1`" | FileCheck --check-prefix=ACCOUNT %s
+// RUN: env XRAY_OPTIONS="patch_premain=false,xray_mode=xray-basic,xray_logfile_base=basic-mode-dso-,verbosity=1" XRAY_BASIC_OPTIONS="func_duration_threshold_us=0" %run %t/main.o 2>&1 | FileCheck %s
+// RUN: ls basic-mode-dso-* | head -1 | tr -d '\n' > %t.log
+// RUN: %llvm_xray account --format=csv --sort=funcid "%{readfile:%t.log}" | FileCheck --check-prefix=ACCOUNT %s
// RUN: rm basic-mode-dso-*
// REQUIRES: target={{(aarch64|x86_64)-.*}}
diff --git a/compiler-rt/test/xray/TestCases/Posix/c-test.cpp b/compiler-rt/test/xray/TestCases/Posix/c-test.cpp
index 6427566..d7c7666 100644
--- a/compiler-rt/test/xray/TestCases/Posix/c-test.cpp
+++ b/compiler-rt/test/xray/TestCases/Posix/c-test.cpp
@@ -1,6 +1,6 @@
// RUN: %clang_xray -g -fxray-modes=xray-basic,xray-fdr,xray-profiling -o %t %s
// RUN: rm -f xray-log.c-test.*
-// RUN: XRAY_OPTIONS=patch_premain=true:verbosity=1:xray_mode=xray-basic %t \
+// RUN: env XRAY_OPTIONS=patch_premain=true:verbosity=1:xray_mode=xray-basic %t \
// RUN: 2>&1 | FileCheck %s
// RUN: rm -f xray-log.c-test.*
//
diff --git a/compiler-rt/test/xray/TestCases/Posix/common-trampoline-alignment.cpp b/compiler-rt/test/xray/TestCases/Posix/common-trampoline-alignment.cpp
index f918964..d072e57 100644
--- a/compiler-rt/test/xray/TestCases/Posix/common-trampoline-alignment.cpp
+++ b/compiler-rt/test/xray/TestCases/Posix/common-trampoline-alignment.cpp
@@ -2,7 +2,7 @@
// expect 16-byte alignment of the stack.
//
// RUN: %clangxx_xray -std=c++11 %s -o %t
-// RUN: XRAY_OPTIONS="patch_premain=false verbosity=1" \
+// RUN: env XRAY_OPTIONS="patch_premain=false verbosity=1" \
// RUN: %run %t 2>&1
// REQUIRES: x86_64-target-arch
// REQUIRES: built-in-llvm-tree
diff --git a/compiler-rt/test/xray/TestCases/Posix/custom-event-handler-alignment.cpp b/compiler-rt/test/xray/TestCases/Posix/custom-event-handler-alignment.cpp
index 9c61cba..1915482 100644
--- a/compiler-rt/test/xray/TestCases/Posix/custom-event-handler-alignment.cpp
+++ b/compiler-rt/test/xray/TestCases/Posix/custom-event-handler-alignment.cpp
@@ -2,7 +2,7 @@
// calls.
//
// RUN: %clangxx_xray -std=c++11 %s -o %t
-// RUN: XRAY_OPTIONS="patch_premain=false verbosity=1" \
+// RUN: env XRAY_OPTIONS="patch_premain=false verbosity=1" \
// RUN: %run %t 2>&1
// REQUIRES: x86_64-target-arch
// REQUIRES: built-in-llvm-tree
diff --git a/compiler-rt/test/xray/TestCases/Posix/custom-event-logging.cpp b/compiler-rt/test/xray/TestCases/Posix/custom-event-logging.cpp
index 30f4fff..cbdfe6c 100644
--- a/compiler-rt/test/xray/TestCases/Posix/custom-event-logging.cpp
+++ b/compiler-rt/test/xray/TestCases/Posix/custom-event-logging.cpp
@@ -1,9 +1,9 @@
// Use the clang feature for custom xray event logging.
//
// RUN: %clangxx_xray -std=c++11 %s -o %t
-// RUN: XRAY_OPTIONS="patch_premain=false verbosity=1 xray_logfile_base=custom-event-logging.xray-" %run %t 2>&1 | FileCheck %s
+// RUN: env XRAY_OPTIONS="patch_premain=false verbosity=1 xray_logfile_base=custom-event-logging.xray-" %run %t 2>&1 | FileCheck %s
// RUN: %clangxx_xray -std=c++11 -fpic -fpie %s -o %t
-// RUN: XRAY_OPTIONS="patch_premain=false verbosity=1 xray_logfile_base=custom-event-logging.xray-" %run %t 2>&1 | FileCheck %s
+// RUN: env XRAY_OPTIONS="patch_premain=false verbosity=1 xray_logfile_base=custom-event-logging.xray-" %run %t 2>&1 | FileCheck %s
// FIXME: Support this in non-x86_64 as well
// REQUIRES: target={{(aarch64|x86_64)-.*linux.*}}
// REQUIRES: built-in-llvm-tree
diff --git a/compiler-rt/test/xray/TestCases/Posix/default-options.cpp b/compiler-rt/test/xray/TestCases/Posix/default-options.cpp
index e00ff3b..73cb4dd 100644
--- a/compiler-rt/test/xray/TestCases/Posix/default-options.cpp
+++ b/compiler-rt/test/xray/TestCases/Posix/default-options.cpp
@@ -4,6 +4,8 @@
// REQUIRES: built-in-llvm-tree
+// UNSUPPORTED: ppc
+
extern "C" __attribute__((xray_never_instrument)) const char *
__xray_default_options() {
return "patch_premain=true:verbosity=1:xray_mode=xray-basic";
diff --git a/compiler-rt/test/xray/TestCases/Posix/fdr-mode-inmemory.cpp b/compiler-rt/test/xray/TestCases/Posix/fdr-mode-inmemory.cpp
index 6c94dbd..58a800a 100644
--- a/compiler-rt/test/xray/TestCases/Posix/fdr-mode-inmemory.cpp
+++ b/compiler-rt/test/xray/TestCases/Posix/fdr-mode-inmemory.cpp
@@ -2,12 +2,12 @@
// RUN: rm -rf %t.dir
// RUN: mkdir -p %t.dir
// RUN: cd %t.dir
-// RUN: XRAY_OPTIONS="patch_premain=false xray_logfile_base=fdr-inmemory-test- \
+// RUN: env XRAY_OPTIONS="patch_premain=false xray_logfile_base=fdr-inmemory-test- \
// RUN: verbosity=1" \
-// RUN: XRAY_FDR_OPTIONS="no_file_flush=true func_duration_threshold_us=0" \
+// RUN: env XRAY_FDR_OPTIONS="no_file_flush=true func_duration_threshold_us=0" \
// RUN: %run %t 2>&1 | FileCheck %s
-// RUN: FILES=`find %t.dir -name 'fdr-inmemory-test-*' | wc -l`
-// RUN: [ $FILES -eq 0 ]
+// RUN: find %t.dir -name 'fdr-inmemory-test-*' | wc -l | tr -d '\n' > %t.file_count
+// RUN: %python -c "import sys; sys.exit(int(sys.argv[1]))" %{readfile:%t.file_count}
// RUN: rm -rf %t.dir
//
// REQUIRES: built-in-llvm-tree
diff --git a/compiler-rt/test/xray/TestCases/Posix/fdr-mode-multiple.cpp b/compiler-rt/test/xray/TestCases/Posix/fdr-mode-multiple.cpp
index f9288d9..ffe43c9 100644
--- a/compiler-rt/test/xray/TestCases/Posix/fdr-mode-multiple.cpp
+++ b/compiler-rt/test/xray/TestCases/Posix/fdr-mode-multiple.cpp
@@ -2,12 +2,12 @@
// RUN: rm -rf %t.dir
// RUN: mkdir -p %t.dir
// RUN: cd %t.dir
-// RUN: XRAY_OPTIONS="patch_premain=false xray_logfile_base=fdr-inmemory-test- \
+// RUN: env XRAY_OPTIONS="patch_premain=false xray_logfile_base=fdr-inmemory-test- \
// RUN: verbosity=1" \
-// RUN: XRAY_FDR_OPTIONS="no_file_flush=true func_duration_threshold_us=0" \
+// RUN: env XRAY_FDR_OPTIONS="no_file_flush=true func_duration_threshold_us=0" \
// RUN: %run %t 2>&1 | FileCheck %s
-// RUN: FILES=`find %t.dir -name 'fdr-inmemory-test-*' | wc -l`
-// RUN: [ $FILES -eq 0 ]
+// RUN: find %t.dir -name 'fdr-inmemory-test-*' | wc -l | tr -d '\n' > %t.file_count
+// RUN: %python -c "import sys; sys.exit(int(sys.argv[1]))" %{readfile:%t.file_count}
// RUN: rm -rf %t.dir
//
// REQUIRES: built-in-llvm-tree
diff --git a/compiler-rt/test/xray/TestCases/Posix/fdr-mode.cpp b/compiler-rt/test/xray/TestCases/Posix/fdr-mode.cpp
index 0ee8aaa..4d4eb14 100644
--- a/compiler-rt/test/xray/TestCases/Posix/fdr-mode.cpp
+++ b/compiler-rt/test/xray/TestCases/Posix/fdr-mode.cpp
@@ -1,26 +1,29 @@
// RUN: %clangxx_xray -g -std=c++11 %s -o %t
// RUN: rm -f fdr-logging-test-*
// RUN: rm -f fdr-unwrite-test-*
-// RUN: XRAY_OPTIONS="patch_premain=false xray_logfile_base=fdr-logging-test- \
+// RUN: env XRAY_OPTIONS="patch_premain=false xray_logfile_base=fdr-logging-test- \
// RUN: xray_mode=xray-fdr verbosity=1" \
-// RUN: XRAY_FDR_OPTIONS="func_duration_threshold_us=0" \
+// RUN: env XRAY_FDR_OPTIONS="func_duration_threshold_us=0" \
// RUN: %run %t 2>&1 | FileCheck %s
-// RUN: XRAY_OPTIONS="patch_premain=false \
+// RUN: env XRAY_OPTIONS="patch_premain=false \
// RUN: xray_logfile_base=fdr-unwrite-test- xray_mode=xray-fdr \
// RUN: verbosity=1" \
-// RUN: XRAY_FDR_OPTIONS="func_duration_threshold_us=5000" \
+// RUN: env XRAY_FDR_OPTIONS="func_duration_threshold_us=5000" \
// RUN: %run %t 2>&1 | FileCheck %s
+// RUN: ls fdr-logging-test-* | head -1 | tr -d '\n' > %t.log
// RUN: %llvm_xray convert --symbolize --output-format=yaml -instr_map=%t \
-// RUN: "`ls fdr-logging-test-* | head -1`" \
+// RUN: "%{readfile:%t.log}" \
// RUN: | FileCheck %s --check-prefix=TRACE
+// RUN: ls fdr-unwrite-test-* | head -1 | tr -d '\n' > %t.log
// RUN: %llvm_xray convert --symbolize --output-format=yaml -instr_map=%t \
-// RUN: "`ls fdr-unwrite-test-* | head -1`" \
+// RUN: "%{readfile:%t.log}" \
// RUN: | FileCheck %s --check-prefix=UNWRITE
// RUN: rm fdr-logging-test-*
// RUN: rm fdr-unwrite-test-*
// UNSUPPORTED: target=powerpc64le-{{.*}}
/// TODO: FDR logging arg1 handler(__xray_ArgLoggerEntry) hasn't implemented yet on LoongArch
// UNSUPPORTED: target=loongarch64{{.*}}
+// UNSUPPORTED: armhf-linux
// REQUIRES: built-in-llvm-tree
#include "xray/xray_log_interface.h"
diff --git a/compiler-rt/test/xray/TestCases/Posix/fdr-thread-order.cpp b/compiler-rt/test/xray/TestCases/Posix/fdr-thread-order.cpp
index 85284fc..d3fd253 100644
--- a/compiler-rt/test/xray/TestCases/Posix/fdr-thread-order.cpp
+++ b/compiler-rt/test/xray/TestCases/Posix/fdr-thread-order.cpp
@@ -1,6 +1,6 @@
// RUN: rm -rf %t && mkdir %t
// RUN: %clangxx_xray -g -std=c++11 %s -o %t.exe
-// RUN: XRAY_OPTIONS="patch_premain=false \
+// RUN: env XRAY_OPTIONS="patch_premain=false \
// RUN: xray_logfile_base=%t/ xray_mode=xray-fdr verbosity=1" \
// RUN: XRAY_FDR_OPTIONS=func_duration_threshold_us=0 %run %t.exe 2>&1 | \
// RUN: FileCheck %s
diff --git a/compiler-rt/test/xray/TestCases/Posix/fork_basic_logging.cpp b/compiler-rt/test/xray/TestCases/Posix/fork_basic_logging.cpp
index 58f310e..d0905c1 100644
--- a/compiler-rt/test/xray/TestCases/Posix/fork_basic_logging.cpp
+++ b/compiler-rt/test/xray/TestCases/Posix/fork_basic_logging.cpp
@@ -1,11 +1,12 @@
// Check that when forking in basic logging mode, we get the different tids for child and parent
// RUN: %clangxx_xray -g -std=c++11 %s -o %t
// RUN: rm -f fork-basic-logging-test-*
-// RUN: XRAY_OPTIONS="patch_premain=true xray_logfile_base=fork-basic-logging-test- \
+// RUN: env XRAY_OPTIONS="patch_premain=true xray_logfile_base=fork-basic-logging-test- \
// RUN: xray_mode=xray-basic verbosity=1 xray_naive_log_func_duration_threshold_us=0" \
// RUN: %run %t 2>&1 | FileCheck %s
+// RUN: ls -S fork-basic-logging-test-* | head -1 | tr -d '\n' > %t.log
// RUN: %llvm_xray convert --symbolize --output-format=yaml -instr_map=%t \
-// RUN: "`ls -S fork-basic-logging-test-* | head -1`" \
+// RUN: "%{readfile:%t.log}" \
// RUN: | FileCheck %s --check-prefix=TRACE
// REQUIRES: x86_64-target-arch
diff --git a/compiler-rt/test/xray/TestCases/Posix/profiling-multi-threaded.cpp b/compiler-rt/test/xray/TestCases/Posix/profiling-multi-threaded.cpp
index b850c05..b1b8edc 100644
--- a/compiler-rt/test/xray/TestCases/Posix/profiling-multi-threaded.cpp
+++ b/compiler-rt/test/xray/TestCases/Posix/profiling-multi-threaded.cpp
@@ -4,11 +4,11 @@
// FIXME: Make -fxray-modes=xray-profiling part of the default?
// RUN: %clangxx_xray -std=c++11 %s -o %t -fxray-modes=xray-profiling
// RUN: rm -f xray-log.profiling-multi-*
-// RUN: XRAY_OPTIONS=verbosity=1 \
+// RUN: env XRAY_OPTIONS=verbosity=1 \
// RUN: XRAY_PROFILING_OPTIONS=no_flush=1 %run %t
-// RUN: XRAY_OPTIONS=verbosity=1 %run %t
-// RUN: PROFILES=`ls xray-log.profiling-multi-* | wc -l`
-// RUN: [ $PROFILES -eq 1 ]
+// RUN: env XRAY_OPTIONS=verbosity=1 %run %t
+// RUN: ls xray-log.profiling-multi-* | wc -l | tr -d '\n' > %t.profiles
+// RUN: %python -c "import sys; sys.exit(int(sys.argv[1]) - 1)" %{readfile:%t.profiles}
// RUN: rm -f xray-log.profiling-multi-*
//
// REQUIRES: built-in-llvm-tree
diff --git a/compiler-rt/test/xray/TestCases/Posix/profiling-single-threaded.cpp b/compiler-rt/test/xray/TestCases/Posix/profiling-single-threaded.cpp
index b235960..d84f75b 100644
--- a/compiler-rt/test/xray/TestCases/Posix/profiling-single-threaded.cpp
+++ b/compiler-rt/test/xray/TestCases/Posix/profiling-single-threaded.cpp
@@ -4,11 +4,11 @@
// FIXME: Make -fxray-modes=xray-profiling part of the default?
// RUN: %clangxx_xray -std=c++11 %s -o %t -fxray-modes=xray-profiling
// RUN: rm -f xray-log.profiling-single-*
-// RUN: XRAY_OPTIONS=verbosity=1 \
+// RUN: env XRAY_OPTIONS=verbosity=1 \
// RUN: XRAY_PROFILING_OPTIONS=no_flush=true %run %t
-// RUN: XRAY_OPTIONS=verbosity=1 %run %t
-// RUN: PROFILES=`ls xray-log.profiling-single-* | wc -l`
-// RUN: [ $PROFILES -eq 2 ]
+// RUN: env XRAY_OPTIONS=verbosity=1 %run %t
+// RUN: ls xray-log.profiling-single-* | wc -l | tr -d '\n' > %t.profiles
+// RUN: %python -c "import sys; sys.exit(int(sys.argv[1]) - 2)" %{readfile:%t.profiles}
// RUN: rm -f xray-log.profiling-single-*
//
// REQUIRES: built-in-llvm-tree
diff --git a/compiler-rt/test/xray/TestCases/Posix/quiet-start.cpp b/compiler-rt/test/xray/TestCases/Posix/quiet-start.cpp
index 4883001..d8e96e0 100644
--- a/compiler-rt/test/xray/TestCases/Posix/quiet-start.cpp
+++ b/compiler-rt/test/xray/TestCases/Posix/quiet-start.cpp
@@ -2,11 +2,11 @@
// instrumentation sleds.
//
// RUN: %clangxx -std=c++11 %s -o %t %xraylib
-// RUN: XRAY_OPTIONS="patch_premain=true verbosity=1" %run %t 2>&1 | \
+// RUN: env XRAY_OPTIONS="patch_premain=true verbosity=1" %run %t 2>&1 | \
// RUN: FileCheck %s --check-prefix NOISY
-// RUN: XRAY_OPTIONS="patch_premain=true verbosity=0" %run %t 2>&1 | \
+// RUN: env XRAY_OPTIONS="patch_premain=true verbosity=0" %run %t 2>&1 | \
// RUN: FileCheck %s --check-prefix QUIET
-// RUN: XRAY_OPTIONS="" %run %t 2>&1 | FileCheck %s --check-prefix DEFAULT
+// RUN: env XRAY_OPTIONS="" %run %t 2>&1 | FileCheck %s --check-prefix DEFAULT
// REQUIRES: built-in-llvm-tree
diff --git a/compiler-rt/test/xray/lit.site.cfg.py.in b/compiler-rt/test/xray/lit.site.cfg.py.in
index 72a7be6..021d999 100644
--- a/compiler-rt/test/xray/lit.site.cfg.py.in
+++ b/compiler-rt/test/xray/lit.site.cfg.py.in
@@ -5,7 +5,7 @@ config.name_suffix = "@XRAY_TEST_CONFIG_SUFFIX@"
config.xray_lit_source_dir = "@XRAY_LIT_SOURCE_DIR@"
config.target_cflags = "@XRAY_TEST_TARGET_CFLAGS@"
config.target_arch = "@XRAY_TEST_TARGET_ARCH@"
-config.built_with_llvm = ("@COMPILER_RT_STANDALONE_BUILD@" != "TRUE")
+config.built_with_llvm = "@COMPILER_RT_BUILT_WITH_LLVM@"
# TODO: Look into whether we can run a capability test on the standalone build to
# see whether it can run 'llvm-xray convert' instead of turning off tests for a