[compiler-rt] 73114e4 - [compiler-rt][windows] Test fixups for MSVC. (#109887)
via llvm-commits
llvm-commits at lists.llvm.org
Mon Feb 10 10:51:12 PST 2025
Author: Charlie Barto
Date: 2025-02-10T10:51:08-08:00
New Revision: 73114e43eea0a6f0d70272dc203bc520da1c4f6b
URL: https://github.com/llvm/llvm-project/commit/73114e43eea0a6f0d70272dc203bc520da1c4f6b
DIFF: https://github.com/llvm/llvm-project/commit/73114e43eea0a6f0d70272dc203bc520da1c4f6b.diff
LOG: [compiler-rt][windows] Test fixups for MSVC. (#109887)
- add XFAIL/UNSUPPORTED annotations for tests run wtih real MSVC
- macroify usages of clang-specific attributes in asan tests
- Add substitution for /Oy-/-fno-omit-frame-pointer
This makes the dll_intercept_memset test work with mingw
These are most of the changes that are required to get things running
with MSVC, however there are some remaining build-flag tweaks.
Nothing in here should be a functional change.
Added:
compiler-rt/test/asan/TestCases/defines.h
Modified:
compiler-rt/test/asan/TestCases/Windows/coverage-basic.cpp
compiler-rt/test/asan/TestCases/Windows/crash_read_write.cpp
compiler-rt/test/asan/TestCases/Windows/dll_host.cpp
compiler-rt/test/asan/TestCases/Windows/dll_intercept_memcpy.cpp
compiler-rt/test/asan/TestCases/Windows/dll_intercept_memset.cpp
compiler-rt/test/asan/TestCases/Windows/dll_null_deref.cpp
compiler-rt/test/asan/TestCases/Windows/dll_operator_array_new_with_dtor_left_oob.cpp
compiler-rt/test/asan/TestCases/Windows/dll_stack_use_after_return.cpp
compiler-rt/test/asan/TestCases/Windows/global_const_string_oob.cpp
compiler-rt/test/asan/TestCases/Windows/illegal_instruction.cpp
compiler-rt/test/asan/TestCases/Windows/issue64990.cpp
compiler-rt/test/asan/TestCases/Windows/msvc/seh.cpp
compiler-rt/test/asan/TestCases/Windows/null_deref_multiple_dlls.cpp
compiler-rt/test/asan/TestCases/Windows/operator_array_new_with_dtor_left_oob.cpp
compiler-rt/test/asan/TestCases/Windows/sse_misalignment.cpp
compiler-rt/test/asan/TestCases/Windows/stack_use_after_return.cpp
compiler-rt/test/asan/TestCases/Windows/unsymbolized.cpp
compiler-rt/test/asan/TestCases/alloca_big_alignment.cpp
compiler-rt/test/asan/TestCases/alloca_constant_size.cpp
compiler-rt/test/asan/TestCases/alloca_detect_custom_size_.cpp
compiler-rt/test/asan/TestCases/alloca_instruments_all_paddings.cpp
compiler-rt/test/asan/TestCases/alloca_loop_unpoisoning.cpp
compiler-rt/test/asan/TestCases/alloca_overflow_partial.cpp
compiler-rt/test/asan/TestCases/alloca_overflow_right.cpp
compiler-rt/test/asan/TestCases/alloca_safe_access.cpp
compiler-rt/test/asan/TestCases/alloca_underflow_left.cpp
compiler-rt/test/asan/TestCases/alloca_vla_interact.cpp
compiler-rt/test/asan/TestCases/contiguous_container.cpp
compiler-rt/test/asan/TestCases/coverage-trace-pc.cpp
compiler-rt/test/asan/TestCases/debug_locate.cpp
compiler-rt/test/asan/TestCases/debug_stacks.cpp
compiler-rt/test/asan/TestCases/deep_tail_call.cpp
compiler-rt/test/asan/TestCases/default_ignorelist.cpp
compiler-rt/test/asan/TestCases/default_options.cpp
compiler-rt/test/asan/TestCases/error_report_callback.cpp
compiler-rt/test/asan/TestCases/exitcode.cpp
compiler-rt/test/asan/TestCases/force_inline_opt0.cpp
compiler-rt/test/asan/TestCases/global-location-nodebug.cpp
compiler-rt/test/asan/TestCases/global-underflow.cpp
compiler-rt/test/asan/TestCases/halt_on_error-1.c
compiler-rt/test/asan/TestCases/heavy_uar_test.cpp
compiler-rt/test/asan/TestCases/ignorelist.cpp
compiler-rt/test/asan/TestCases/ill.cpp
compiler-rt/test/asan/TestCases/initialization-bug.cpp
compiler-rt/test/asan/TestCases/inline.cpp
compiler-rt/test/asan/TestCases/intercept-rethrow-exception.cpp
compiler-rt/test/asan/TestCases/interception_failure_test.cpp
compiler-rt/test/asan/TestCases/interface_test.cpp
compiler-rt/test/asan/TestCases/invalid-pointer-pairs-compare-errors.cpp
compiler-rt/test/asan/TestCases/invalid-pointer-pairs-subtract-errors.cpp
compiler-rt/test/asan/TestCases/invalid-pointer-pairs.cpp
compiler-rt/test/asan/TestCases/large_func_test.cpp
compiler-rt/test/asan/TestCases/null_deref.cpp
compiler-rt/test/asan/TestCases/pass-struct-byval.cpp
compiler-rt/test/asan/TestCases/report_error_summary.cpp
compiler-rt/test/asan/TestCases/speculative_load.cpp
compiler-rt/test/asan/TestCases/stack-buffer-overflow-with-position.cpp
compiler-rt/test/asan/TestCases/stack-oob-frames.cpp
compiler-rt/test/asan/TestCases/strcat-overlap.cpp
compiler-rt/test/asan/TestCases/strcpy-overlap.cpp
compiler-rt/test/asan/TestCases/strncat-overlap.cpp
compiler-rt/test/asan/TestCases/strncpy-overflow.cpp
compiler-rt/test/asan/TestCases/strncpy-overlap.cpp
compiler-rt/test/asan/TestCases/throw_call_test.cpp
compiler-rt/test/asan/TestCases/throw_catch.cpp
compiler-rt/test/asan/TestCases/throw_invoke_test.cpp
compiler-rt/test/asan/TestCases/use-after-scope-capture.cpp
compiler-rt/test/asan/TestCases/use-after-scope-dtor-order.cpp
compiler-rt/test/asan/TestCases/use-after-scope-inlined.cpp
compiler-rt/test/asan/TestCases/use-after-scope-loop-bug.cpp
compiler-rt/test/asan/TestCases/use-after-scope-loop-removed.cpp
compiler-rt/test/asan/TestCases/use-after-scope-loop.cpp
compiler-rt/test/asan/TestCases/use-after-scope-temp.cpp
compiler-rt/test/asan/TestCases/use-after-scope-temp2.cpp
compiler-rt/test/asan/TestCases/use-after-scope-types.cpp
compiler-rt/test/asan/TestCases/vla_chrome_testcase.cpp
compiler-rt/test/asan/TestCases/vla_condition_overflow.cpp
compiler-rt/test/asan/TestCases/vla_loop_overfow.cpp
compiler-rt/test/asan/TestCases/zero_page_pc.cpp
compiler-rt/test/asan/lit.cfg.py
Removed:
compiler-rt/test/asan/TestCases/Windows/null_deref.cpp
################################################################################
diff --git a/compiler-rt/test/asan/TestCases/Windows/coverage-basic.cpp b/compiler-rt/test/asan/TestCases/Windows/coverage-basic.cpp
index 71291e8a5315834..1b7901698826065 100644
--- a/compiler-rt/test/asan/TestCases/Windows/coverage-basic.cpp
+++ b/compiler-rt/test/asan/TestCases/Windows/coverage-basic.cpp
@@ -4,6 +4,7 @@
// RUN: %env_asan_opts=coverage=1 %run ./test.exe
//
// RUN: %sancov print *.sancov | FileCheck %s
+// XFAIL: msvc
#include <stdio.h>
diff --git a/compiler-rt/test/asan/TestCases/Windows/crash_read_write.cpp b/compiler-rt/test/asan/TestCases/Windows/crash_read_write.cpp
index 74200cca1521b3b..bafc40c2c56654c 100644
--- a/compiler-rt/test/asan/TestCases/Windows/crash_read_write.cpp
+++ b/compiler-rt/test/asan/TestCases/Windows/crash_read_write.cpp
@@ -2,12 +2,13 @@
// RUN: not %run %t 2>&1 | FileCheck %s --check-prefix=READ
// RUN: not %run %t write 2>&1 | FileCheck %s --check-prefix=WRITE
-#include <windows.h>
+#include "../defines.h"
#include <stdio.h>
+#include <windows.h>
static volatile int sink;
-__attribute__((noinline)) void Read(int *ptr) { sink = *ptr; }
-__attribute__((noinline)) void Write(int *ptr) { *ptr = 0; }
+ATTRIBUTE_NOINLINE void Read(int *ptr) { sink = *ptr; }
+ATTRIBUTE_NOINLINE void Write(int *ptr) { *ptr = 0; }
int main(int argc, char **argv) {
// Writes to shadow are detected as reads from shadow gap (because of how the
// shadow mapping works). This is kinda hard to fix. Test a random address in
diff --git a/compiler-rt/test/asan/TestCases/Windows/dll_host.cpp b/compiler-rt/test/asan/TestCases/Windows/dll_host.cpp
index 85b7967e86b5108..773482783823ff3 100644
--- a/compiler-rt/test/asan/TestCases/Windows/dll_host.cpp
+++ b/compiler-rt/test/asan/TestCases/Windows/dll_host.cpp
@@ -1,4 +1,5 @@
// UNSUPPORTED: target={{.*-windows-gnu}}
+// XFAIL: msvc
// This is a host program for DLL tests.
//
diff --git a/compiler-rt/test/asan/TestCases/Windows/dll_intercept_memcpy.cpp b/compiler-rt/test/asan/TestCases/Windows/dll_intercept_memcpy.cpp
index 0a96752f9d0bfc1..4fa437960f1263b 100644
--- a/compiler-rt/test/asan/TestCases/Windows/dll_intercept_memcpy.cpp
+++ b/compiler-rt/test/asan/TestCases/Windows/dll_intercept_memcpy.cpp
@@ -1,9 +1,9 @@
// RUN: %clang_cl_asan %Od %p/dll_host.cpp %Fe%t
-// RUN: %clang_cl_asan -Wno-fortify-source %LD %Od %s %Fe%t.dll
+// RUN: %clang_cl_asan %if !MSVC %{ -Wno-fortify-source %} %LD %Od %s %Fe%t.dll
// RUN: not %run %t %t.dll 2>&1 | FileCheck %s
// Test that it works correctly even with ICF enabled.
-// RUN: %clang_cl_asan -Wno-fortify-source %LD %Od %s %Fe%t.dll \
+// RUN: %clang_cl_asan %if !MSVC %{ -Wno-fortify-source %} %LD %Od %s %Fe%t.dll \
// RUN: %if target={{.*-windows-gnu}} %{ -Wl,--gc-sections,--icf=all %} \
// RUN: %else %{ -link /OPT:REF /OPT:ICF %}
// RUN: not %run %t %t.dll 2>&1 | FileCheck %s
@@ -23,12 +23,12 @@ int test_function() {
// CHECK: Initial test OK
memcpy(buff2, buff1, 6);
-// CHECK: AddressSanitizer: stack-buffer-overflow on address [[ADDR:0x[0-9a-f]+]]
-// CHECK: WRITE of size 6 at [[ADDR]] thread T0
-// CHECK-NEXT: __asan_{{.*}}memcpy
-// CHECK-NEXT: test_function {{.*}}dll_intercept_memcpy.cpp:[[@LINE-4]]
-// CHECK: Address [[ADDR]] is located in stack of thread T0 at offset {{.*}} in frame
-// CHECK-NEXT: test_function {{.*}}dll_intercept_memcpy.cpp
-// CHECK: 'buff2'{{.*}} <== Memory access at offset {{.*}} overflows this variable
+ // CHECK: AddressSanitizer: stack-buffer-overflow on address [[ADDR:0x[0-9a-f]+]]
+ // CHECK: WRITE of size 6 at [[ADDR]] thread T0
+ // CHECK-NEXT: __asan_{{.*}}{{(memcpy|memmove)}}
+ // CHECK-NEXT: test_function {{.*}}dll_intercept_memcpy.cpp:[[@LINE-4]]
+ // CHECK: Address [[ADDR]] is located in stack of thread T0 at offset {{.*}} in frame
+ // CHECK-NEXT: test_function {{.*}}dll_intercept_memcpy.cpp
+ // CHECK: 'buff2'{{.*}} <== Memory access at offset {{.*}} overflows this variable
return 0;
}
diff --git a/compiler-rt/test/asan/TestCases/Windows/dll_intercept_memset.cpp b/compiler-rt/test/asan/TestCases/Windows/dll_intercept_memset.cpp
index 27b343f439cb558..948a429e8c1a6ea 100644
--- a/compiler-rt/test/asan/TestCases/Windows/dll_intercept_memset.cpp
+++ b/compiler-rt/test/asan/TestCases/Windows/dll_intercept_memset.cpp
@@ -1,9 +1,9 @@
-// RUN: %clang_cl_asan %Od %p/dll_host.cpp %Fe%t
-// RUN: %clang_cl_asan -Wno-fortify-source %LD %Od %s %Fe%t.dll
+// RUN: %clang_cl_asan %Od %Oy- %p/dll_host.cpp %Fe%t
+// RUN: %clang_cl_asan %if !MSVC %{ -Wno-fortify-source %} %Oy- %LD %Od %s %Fe%t.dll
// RUN: not %run %t %t.dll 2>&1 | FileCheck %s
// Test that it works correctly even with ICF enabled.
-// RUN: %clang_cl_asan -Wno-fortify-source %LD %Od %s %Fe%t.dll \
+// RUN: %clang_cl_asan %if !MSVC %{ -Wno-fortify-source %} %Oy- %LD %Od %s %Fe%t.dll \
// RUN: %if target={{.*-windows-gnu}} %{ -Wl,--gc-sections,--icf=all %} \
// RUN: %else %{ -link /OPT:REF /OPT:ICF %}
// RUN: not %run %t %t.dll 2>&1 | FileCheck %s
diff --git a/compiler-rt/test/asan/TestCases/Windows/dll_null_deref.cpp b/compiler-rt/test/asan/TestCases/Windows/dll_null_deref.cpp
index b65926941cd786d..d0d9a8ff0f51637 100644
--- a/compiler-rt/test/asan/TestCases/Windows/dll_null_deref.cpp
+++ b/compiler-rt/test/asan/TestCases/Windows/dll_null_deref.cpp
@@ -2,7 +2,9 @@
// RUN: %clang_cl_asan %LD %Od %s %Fe%t.dll
// RUN: not %run %t %t.dll 2>&1 | FileCheck %s
-__attribute__((noinline))
+#include "../defines.h"
+
+ATTRIBUTE_NOINLINE
static void NullDeref(int *ptr) {
// CHECK: ERROR: AddressSanitizer: access-violation on unknown address
// CHECK: {{0x0*000.. .*pc 0x.*}}
diff --git a/compiler-rt/test/asan/TestCases/Windows/dll_operator_array_new_with_dtor_left_oob.cpp b/compiler-rt/test/asan/TestCases/Windows/dll_operator_array_new_with_dtor_left_oob.cpp
index ca6b256654a236f..1d279f279d76822 100644
--- a/compiler-rt/test/asan/TestCases/Windows/dll_operator_array_new_with_dtor_left_oob.cpp
+++ b/compiler-rt/test/asan/TestCases/Windows/dll_operator_array_new_with_dtor_left_oob.cpp
@@ -2,12 +2,20 @@
// RUN: %clang_cl_asan %LD %Od %s %Fe%t.dll
// RUN: not %run %t %t.dll 2>&1 | FileCheck %s
+#include "../defines.h"
+
struct C {
int x;
~C() {}
};
-int __attribute__((noinline, optnone)) hide(int x) { return x; }
+int ATTRIBUTE_NOINLINE
+#if defined(__clang__) || !defined(_MSC_VER)
+ __attribute__((optnone))
+#endif
+ hide(int x) {
+ return x;
+}
extern "C" __declspec(dllexport)
int test_function() {
diff --git a/compiler-rt/test/asan/TestCases/Windows/dll_stack_use_after_return.cpp b/compiler-rt/test/asan/TestCases/Windows/dll_stack_use_after_return.cpp
index be237044bb340df..3a09566eb873f55 100644
--- a/compiler-rt/test/asan/TestCases/Windows/dll_stack_use_after_return.cpp
+++ b/compiler-rt/test/asan/TestCases/Windows/dll_stack_use_after_return.cpp
@@ -4,6 +4,8 @@
// RUN: %clang_cl_asan %LD %Od %s %Fe%t.dll -fsanitize-address-use-after-return=always
// RUN: not %run %t %t.dll 2>&1 | FileCheck %s
+// UNSUPPORTED: msvc
+
#include <malloc.h>
char *x;
diff --git a/compiler-rt/test/asan/TestCases/Windows/global_const_string_oob.cpp b/compiler-rt/test/asan/TestCases/Windows/global_const_string_oob.cpp
index 978860977364431..9615ccfc2aa0eb6 100644
--- a/compiler-rt/test/asan/TestCases/Windows/global_const_string_oob.cpp
+++ b/compiler-rt/test/asan/TestCases/Windows/global_const_string_oob.cpp
@@ -13,7 +13,7 @@ int main(void) {
// CHECK: AddressSanitizer: global-buffer-overflow on address [[ADDR:0x[0-9a-f]+]]
// CHECK: READ of size 1 at [[ADDR]] thread T0
// CHECK-NEXT: {{#0 .* main .*global_const_string_oob.cpp:}}[[@LINE-5]]
- // CHECK: [[ADDR]] is located 5 bytes after global variable [[STR:.*]] defined in {{'.*global_const_string_oob.cpp' .*}} of size 11
+ // CHECK: [[ADDR]] is located 5 bytes after global variable [[STR:.*]] defined in {{'.*global_const_string_oob.cpp.*}} of size 11
// CHECK: [[STR]] is ascii string 'foobarspam'
return 0;
}
diff --git a/compiler-rt/test/asan/TestCases/Windows/illegal_instruction.cpp b/compiler-rt/test/asan/TestCases/Windows/illegal_instruction.cpp
index 9b902c7536ca91c..5c71c38a5113bc5 100644
--- a/compiler-rt/test/asan/TestCases/Windows/illegal_instruction.cpp
+++ b/compiler-rt/test/asan/TestCases/Windows/illegal_instruction.cpp
@@ -1,5 +1,7 @@
// RUN: %clang_cl_asan %Od %s %Fe%t
// RUN: %env_asan_opts=handle_sigill=1 not %run %t 2>&1 | FileCheck %s
+// msvc doesn't have a __builtin_trap equivalent
+// XFAIL: msvc
// Test the error output from an illegal instruction.
diff --git a/compiler-rt/test/asan/TestCases/Windows/issue64990.cpp b/compiler-rt/test/asan/TestCases/Windows/issue64990.cpp
index b1b6e42148cb682..5222ec6e081913b 100644
--- a/compiler-rt/test/asan/TestCases/Windows/issue64990.cpp
+++ b/compiler-rt/test/asan/TestCases/Windows/issue64990.cpp
@@ -1,9 +1,13 @@
// Repro for the issue #64990: Asan with Windows EH generates __asan_xxx runtime calls without required funclet tokens
-// RUN: %clang_cl_asan %Od %s -EHsc %Fe%t
+// RUN: %clang_cl_asan %Od %if MSVC %{ /Oi %} %s -EHsc %Fe%t
// RUN: not %run %t 2>&1 | FileCheck %s
// UNSUPPORTED: target={{.*-windows-gnu}}
+#if defined(_MSC_VER) && !defined(__clang__)
+# include <string.h>
+#endif
+
char buff1[6] = "hello";
char buff2[6] = "hello";
@@ -12,7 +16,11 @@ int main(int argc, char **argv) {
throw 1;
} catch (...) {
// Make asan generate call to __asan_memcpy inside the EH pad.
+#if defined(_MSC_VER) && !defined(__clang__)
+ memcpy(buff1, buff2 + 3, 6);
+#else
__builtin_memcpy(buff1, buff2 + 3, 6);
+#endif
}
return 0;
}
diff --git a/compiler-rt/test/asan/TestCases/Windows/msvc/seh.cpp b/compiler-rt/test/asan/TestCases/Windows/msvc/seh.cpp
index 4cb0c55bc773026..f3c7e1a33a568fb 100644
--- a/compiler-rt/test/asan/TestCases/Windows/msvc/seh.cpp
+++ b/compiler-rt/test/asan/TestCases/Windows/msvc/seh.cpp
@@ -2,15 +2,15 @@
//
diff erent EH personality depending on the -GS setting, so test both -GS+ and
// -GS-.
//
-// RUN: cl -c %s -Fo%t.obj -DCOMPILE_SEH
-// RUN: %clangxx_asan -o %t.exe %s %t.obj
+// RUN: cl /EHa %MD -c %s -Fo%t.obj -DCOMPILE_SEH
+// RUN: %clangxx_asan -o %t.exe %s %t.obj -DCOMPILE_MAIN
// RUN: %run %t.exe
//
-// RUN: cl -GS- -c %s -Fo%t.obj -DCOMPILE_SEH
-// RUN: %clangxx_asan -o %t.exe %s %t.obj
+// RUN: cl /EHa %MD -GS- -c %s -Fo%t.obj -DCOMPILE_SEH
+// RUN: %clangxx_asan -o %t.exe %s %t.obj -DCOMPILE_MAIN
// RUN: %run %t.exe
//
-// RUN: %clang_cl_asan %s -DCOMPILE_SEH -Fe%t.exe
+// RUN: %clang_cl_asan /EHa %MD %s -DCOMPILE_SEH -Fe%t.exe -DCOMPILE_MAIN
// RUN: %run %t.exe
#include <windows.h>
@@ -42,7 +42,7 @@ void ThrowAndCatch() {
}
#endif
-#if defined(__clang__)
+#if defined(COMPILE_MAIN)
int main() {
char x[32];
fprintf(stderr, "Before: %p poisoned: %d\n", &x,
diff --git a/compiler-rt/test/asan/TestCases/Windows/null_deref.cpp b/compiler-rt/test/asan/TestCases/Windows/null_deref.cpp
deleted file mode 100644
index 6582bac9e69e306..000000000000000
--- a/compiler-rt/test/asan/TestCases/Windows/null_deref.cpp
+++ /dev/null
@@ -1,15 +0,0 @@
-// RUN: %clangxx_asan -O0 %s -o %t && not %run %t 2>&1 | FileCheck %s
-// FIXME: merge this with the common null_deref test when we can run common
-// tests on Windows.
-
-__attribute__((noinline))
-static void NullDeref(int *ptr) {
- // CHECK: ERROR: AddressSanitizer: access-violation on unknown address
- // CHECK: {{0x0*000.. .*pc 0x.*}}
- ptr[10]++; // BOOM
-}
-int main() {
- NullDeref((int*)0);
- // CHECK: {{ #1 0x.* in main.*null_deref.cpp:}}[[@LINE-1]]:3
- // CHECK: AddressSanitizer can not provide additional info.
-}
diff --git a/compiler-rt/test/asan/TestCases/Windows/null_deref_multiple_dlls.cpp b/compiler-rt/test/asan/TestCases/Windows/null_deref_multiple_dlls.cpp
index ea5140a13dc8839..19e3beefa4e0f1a 100644
--- a/compiler-rt/test/asan/TestCases/Windows/null_deref_multiple_dlls.cpp
+++ b/compiler-rt/test/asan/TestCases/Windows/null_deref_multiple_dlls.cpp
@@ -9,6 +9,7 @@
// RUN: %clang_cl_asan %Od -DEXE %s %t1.lib %t2.lib %Fe%t
// RUN: not %run %t 2>&1 | FileCheck %s
+#include "../defines.h"
#include <malloc.h>
#include <string.h>
@@ -28,7 +29,8 @@ __declspec(dllexport) void foo1() {}
}
#elif defined(DLL2)
extern "C" {
-__attribute__((noinline)) static void NullDeref(int *ptr) {
+ATTRIBUTE_NOINLINE
+static void NullDeref(int *ptr) {
// CHECK: ERROR: AddressSanitizer: access-violation on unknown address
// CHECK: {{0x0*000.. .*pc 0x.*}}
ptr[10]++; // BOOM
diff --git a/compiler-rt/test/asan/TestCases/Windows/operator_array_new_with_dtor_left_oob.cpp b/compiler-rt/test/asan/TestCases/Windows/operator_array_new_with_dtor_left_oob.cpp
index cad28ae8ace213a..c66b201500e36f8 100644
--- a/compiler-rt/test/asan/TestCases/Windows/operator_array_new_with_dtor_left_oob.cpp
+++ b/compiler-rt/test/asan/TestCases/Windows/operator_array_new_with_dtor_left_oob.cpp
@@ -1,13 +1,21 @@
// RUN: %clang_cl_asan %Od %s %Fe%t
// RUN: not %run %t 2>&1 | FileCheck %s
+#include "../defines.h"
+
struct C {
int x;
~C() {}
};
-
-int __attribute__((noinline, optnone)) hide(int x) { return x; }
-
+#if defined(_MSC_VER) && !defined(__clang__)
+# pragma optimize("", off)
+#else
+__attribute__((optnone))
+#endif
+int ATTRIBUTE_NOINLINE hide(int x) { return x; }
+#if defined(_MSC_VER) && !defined(__clang__)
+# pragma optimize("", on)
+#endif
int main() {
C *buffer = new C[42];
buffer[hide(-(1 + (int)sizeof(void*) / 4))].x = 42;
diff --git a/compiler-rt/test/asan/TestCases/Windows/sse_misalignment.cpp b/compiler-rt/test/asan/TestCases/Windows/sse_misalignment.cpp
index 1424ee88129f6be..ee953cd6e4bfe16 100644
--- a/compiler-rt/test/asan/TestCases/Windows/sse_misalignment.cpp
+++ b/compiler-rt/test/asan/TestCases/Windows/sse_misalignment.cpp
@@ -3,6 +3,7 @@
// FIXME: On MinGW frame #0 does not include the line number?
// XFAIL: target={{.*-windows-gnu}}
+// XFAIL: msvc
// Test the error output from misaligned SSE2 memory access. This is a READ
// memory access. Windows appears to always provide an address of -1 for these
diff --git a/compiler-rt/test/asan/TestCases/Windows/stack_use_after_return.cpp b/compiler-rt/test/asan/TestCases/Windows/stack_use_after_return.cpp
index 9385e36a37b6783..0b33ff3340cf644 100644
--- a/compiler-rt/test/asan/TestCases/Windows/stack_use_after_return.cpp
+++ b/compiler-rt/test/asan/TestCases/Windows/stack_use_after_return.cpp
@@ -3,7 +3,7 @@
// RUN: %clang_cl_asan %Od %s %Fe%t -fsanitize-address-use-after-return=always
// RUN: not %run %t 2>&1 | FileCheck %s
-
+// XFAIL: msvc
char *x;
void foo() {
diff --git a/compiler-rt/test/asan/TestCases/Windows/unsymbolized.cpp b/compiler-rt/test/asan/TestCases/Windows/unsymbolized.cpp
index 00428b809fccd7a..ade5e5b914be859 100644
--- a/compiler-rt/test/asan/TestCases/Windows/unsymbolized.cpp
+++ b/compiler-rt/test/asan/TestCases/Windows/unsymbolized.cpp
@@ -8,9 +8,10 @@
// RUN: not %run %t.exe 2>&1 | FileCheck %s
// REQUIRES: lld-available
-#include <stdlib.h>
+#include "../defines.h"
#include <stdio.h>
-int __attribute__((noinline)) do_uaf(void);
+#include <stdlib.h>
+int ATTRIBUTE_NOINLINE do_uaf(void);
int main() {
int r = do_uaf();
printf("r: %d\n", r);
diff --git a/compiler-rt/test/asan/TestCases/alloca_big_alignment.cpp b/compiler-rt/test/asan/TestCases/alloca_big_alignment.cpp
index a451e873f2e42df..5ef52e7b6e0ddf9 100644
--- a/compiler-rt/test/asan/TestCases/alloca_big_alignment.cpp
+++ b/compiler-rt/test/asan/TestCases/alloca_big_alignment.cpp
@@ -1,12 +1,14 @@
// RUN: %clangxx_asan -O0 -mllvm -asan-instrument-dynamic-allocas %s -o %t
// RUN: not %run %t 2>&1 | FileCheck %s
//
+// XFAIL: msvc
+#include "defines.h"
#include <assert.h>
#include <stdint.h>
-__attribute__((noinline)) void foo(int index, int len) {
- volatile char str[len] __attribute__((aligned(128)));
+ATTRIBUTE_NOINLINE void foo(int index, int len) {
+ volatile char str[len] ATTRIBUTE_ALIGNED(128);
assert(!(reinterpret_cast<uintptr_t>(str) & 127L));
str[index] = '1'; // BOOM
// CHECK: ERROR: AddressSanitizer: dynamic-stack-buffer-overflow on address [[ADDR:0x[0-9a-f]+]]
diff --git a/compiler-rt/test/asan/TestCases/alloca_constant_size.cpp b/compiler-rt/test/asan/TestCases/alloca_constant_size.cpp
index 8910ea9f8d8e23a..91c3ca296ac1e41 100644
--- a/compiler-rt/test/asan/TestCases/alloca_constant_size.cpp
+++ b/compiler-rt/test/asan/TestCases/alloca_constant_size.cpp
@@ -7,6 +7,9 @@
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
+#ifdef _MSC_VER
+# include <malloc.h>
+#endif
// MSVC provides _alloca instead of alloca.
#if defined(_MSC_VER) && !defined(alloca)
diff --git a/compiler-rt/test/asan/TestCases/alloca_detect_custom_size_.cpp b/compiler-rt/test/asan/TestCases/alloca_detect_custom_size_.cpp
index 8b207aa07f2eb48..e8e73d46f8a73d1 100644
--- a/compiler-rt/test/asan/TestCases/alloca_detect_custom_size_.cpp
+++ b/compiler-rt/test/asan/TestCases/alloca_detect_custom_size_.cpp
@@ -2,16 +2,24 @@
// RUN: not %run %t 2>&1 | FileCheck %s
//
+#include "defines.h"
#include <assert.h>
#include <stdint.h>
+#if defined(_MSC_VER) && !defined(__clang__)
+# include <malloc.h>
+#endif
struct A {
char a[3];
int b[3];
};
-__attribute__((noinline)) void foo(int index, int len) {
- volatile struct A str[len] __attribute__((aligned(32)));
+ATTRIBUTE_NOINLINE void foo(int index, int len) {
+#if !defined(_MSC_VER) || defined(__clang__)
+ volatile struct A str[len] ATTRIBUTE_ALIGNED(32);
+#else
+ volatile struct A *str = (volatile struct A *)_alloca(len * sizeof(struct A));
+#endif
assert(!(reinterpret_cast<uintptr_t>(str) & 31L));
str[index].a[0] = '1'; // BOOM
// CHECK: ERROR: AddressSanitizer: dynamic-stack-buffer-overflow on address [[ADDR:0x[0-9a-f]+]]
diff --git a/compiler-rt/test/asan/TestCases/alloca_instruments_all_paddings.cpp b/compiler-rt/test/asan/TestCases/alloca_instruments_all_paddings.cpp
index 912c8b0abaabd00..4688079dfe6fbc0 100644
--- a/compiler-rt/test/asan/TestCases/alloca_instruments_all_paddings.cpp
+++ b/compiler-rt/test/asan/TestCases/alloca_instruments_all_paddings.cpp
@@ -2,6 +2,8 @@
// RUN: %clangxx_asan -O3 -mllvm -asan-instrument-dynamic-allocas %s -o %t
// RUN: %run %t 2>&1
//
+// MSVC does not support asan-instrament-dynamic-allocas yet
+// UNSUPPORTED: msvc
#include "sanitizer/asan_interface.h"
#include <assert.h>
diff --git a/compiler-rt/test/asan/TestCases/alloca_loop_unpoisoning.cpp b/compiler-rt/test/asan/TestCases/alloca_loop_unpoisoning.cpp
index 0967b34dc7dbfef..7e77d963c1e65fe 100644
--- a/compiler-rt/test/asan/TestCases/alloca_loop_unpoisoning.cpp
+++ b/compiler-rt/test/asan/TestCases/alloca_loop_unpoisoning.cpp
@@ -5,10 +5,14 @@
// This testcase checks that allocas and VLAs inside loop are correctly unpoisoned.
+// MSVC doesn't support VLAs in the first place.
+// UNSUPPORTED: msvc
+
+#include "defines.h"
+#include "sanitizer/asan_interface.h"
#include <assert.h>
#include <stdint.h>
#include <stdlib.h>
-#include "sanitizer/asan_interface.h"
// MSVC provides _alloca instead of alloca.
#if defined(_MSC_VER) && !defined(alloca)
@@ -21,7 +25,7 @@
void *top, *bot;
-__attribute__((noinline)) void foo(int len) {
+ATTRIBUTE_NOINLINE void foo(int len) {
char x;
top = &x;
volatile char array[len];
diff --git a/compiler-rt/test/asan/TestCases/alloca_overflow_partial.cpp b/compiler-rt/test/asan/TestCases/alloca_overflow_partial.cpp
index 25c6d75be7a5385..f06195bb7793ff8 100644
--- a/compiler-rt/test/asan/TestCases/alloca_overflow_partial.cpp
+++ b/compiler-rt/test/asan/TestCases/alloca_overflow_partial.cpp
@@ -1,6 +1,8 @@
// RUN: %clangxx_asan -O0 -mllvm -asan-instrument-dynamic-allocas %s -o %t
// RUN: not %run %t 2>&1 | FileCheck %s
//
+// MSVC doesn't support VLAs
+// UNSUPPORTED: msvc
#include <assert.h>
#include <stdint.h>
diff --git a/compiler-rt/test/asan/TestCases/alloca_overflow_right.cpp b/compiler-rt/test/asan/TestCases/alloca_overflow_right.cpp
index 7ec4b86cdc715ee..626c12488858dcf 100644
--- a/compiler-rt/test/asan/TestCases/alloca_overflow_right.cpp
+++ b/compiler-rt/test/asan/TestCases/alloca_overflow_right.cpp
@@ -1,6 +1,8 @@
// RUN: %clangxx_asan -O0 -mllvm -asan-instrument-dynamic-allocas %s -o %t
// RUN: not %run %t 2>&1 | FileCheck %s
//
+// MSVC doesn't support VLAs
+// UNSUPPORTED: msvc
#include <assert.h>
#include <stdint.h>
diff --git a/compiler-rt/test/asan/TestCases/alloca_safe_access.cpp b/compiler-rt/test/asan/TestCases/alloca_safe_access.cpp
index 98e31769812bf95..8979b6ca726eee6 100644
--- a/compiler-rt/test/asan/TestCases/alloca_safe_access.cpp
+++ b/compiler-rt/test/asan/TestCases/alloca_safe_access.cpp
@@ -1,6 +1,8 @@
// RUN: %clangxx_asan -O0 -mllvm -asan-instrument-dynamic-allocas %s -o %t
// RUN: %run %t 2>&1
//
+// MSVC doesn't support VLAs
+// UNSUPPORTED: msvc
#include <assert.h>
#include <stdint.h>
diff --git a/compiler-rt/test/asan/TestCases/alloca_underflow_left.cpp b/compiler-rt/test/asan/TestCases/alloca_underflow_left.cpp
index 52cd781c4bb8803..532344319b01924 100644
--- a/compiler-rt/test/asan/TestCases/alloca_underflow_left.cpp
+++ b/compiler-rt/test/asan/TestCases/alloca_underflow_left.cpp
@@ -1,6 +1,8 @@
// RUN: %clangxx_asan -O0 -mllvm -asan-instrument-dynamic-allocas %s -o %t
// RUN: not %run %t 2>&1 | FileCheck %s
//
+// MSVC doesn't support VLAs
+// UNSUPPORTED: msvc
#include <assert.h>
#include <stdint.h>
diff --git a/compiler-rt/test/asan/TestCases/alloca_vla_interact.cpp b/compiler-rt/test/asan/TestCases/alloca_vla_interact.cpp
index b98bb726dcebc38..e83812242f88b4a 100644
--- a/compiler-rt/test/asan/TestCases/alloca_vla_interact.cpp
+++ b/compiler-rt/test/asan/TestCases/alloca_vla_interact.cpp
@@ -8,6 +8,9 @@
// This testcase checks correct interaction between VLAs and allocas.
+// MSVC doesn't support VLA's
+// UNSUPPORTED: msvc
+
#include <assert.h>
#include <stdint.h>
#include <stdlib.h>
diff --git a/compiler-rt/test/asan/TestCases/contiguous_container.cpp b/compiler-rt/test/asan/TestCases/contiguous_container.cpp
index 6288e752fd4ba8b..a2adb1951dde614 100644
--- a/compiler-rt/test/asan/TestCases/contiguous_container.cpp
+++ b/compiler-rt/test/asan/TestCases/contiguous_container.cpp
@@ -2,6 +2,7 @@
//
// Test __sanitizer_annotate_contiguous_container.
+#include "defines.h"
#include <algorithm>
#include <numeric>
#include <vector>
@@ -247,9 +248,9 @@ void TestDoubleEndedContainer(size_t capacity, size_t off_begin,
delete[] buffer;
}
-__attribute__((noinline)) void Throw() { throw 1; }
+ATTRIBUTE_NOINLINE void Throw() { throw 1; }
-__attribute__((noinline)) void ThrowAndCatch() {
+ATTRIBUTE_NOINLINE void ThrowAndCatch() {
try {
Throw();
} catch (...) {
diff --git a/compiler-rt/test/asan/TestCases/coverage-trace-pc.cpp b/compiler-rt/test/asan/TestCases/coverage-trace-pc.cpp
index c03a6f02f77196f..e55c3acce9af35d 100644
--- a/compiler-rt/test/asan/TestCases/coverage-trace-pc.cpp
+++ b/compiler-rt/test/asan/TestCases/coverage-trace-pc.cpp
@@ -2,6 +2,8 @@
// RUN: %clangxx_asan -O0 -DTRACE_RT %s -o %t-rt.o -c
// RUN: %clangxx_asan -O0 -fsanitize-coverage=edge,trace-pc,indirect-calls %s -o %t %t-rt.o
// RUN: %run %t
+// XFAIL: msvc
+
#ifdef TRACE_RT
int pc_count;
void *last_callee;
@@ -12,13 +14,14 @@ extern "C" void __sanitizer_cov_trace_pc_indir(void *callee) {
last_callee = callee;
}
#else
-#include <stdio.h>
-#include <assert.h>
+# include "defines.h"
+# include <assert.h>
+# include <stdio.h>
extern int pc_count;
extern void *last_callee;
-__attribute__((noinline)) void foo() { printf("foo\n"); }
-__attribute__((noinline)) void bar() { printf("bar\n"); }
+ATTRIBUTE_NOINLINE void foo() { printf("foo\n"); }
+ATTRIBUTE_NOINLINE void bar() { printf("bar\n"); }
int main(int argc, char **argv) {
void (*f)(void) = argc ? foo : bar;
diff --git a/compiler-rt/test/asan/TestCases/debug_locate.cpp b/compiler-rt/test/asan/TestCases/debug_locate.cpp
index 93d1af8b83916f4..2ccddd4739d4a6d 100644
--- a/compiler-rt/test/asan/TestCases/debug_locate.cpp
+++ b/compiler-rt/test/asan/TestCases/debug_locate.cpp
@@ -3,7 +3,7 @@
// that it correctly finds out which region (and name and size) the address
// belongs to.
// RUN: %clangxx_asan -O0 %s -o %t && %run %t 2>&1
-
+// UNSUPPORTED: msvc
#include <assert.h>
#include <sanitizer/asan_interface.h>
#include <stdio.h>
diff --git a/compiler-rt/test/asan/TestCases/debug_stacks.cpp b/compiler-rt/test/asan/TestCases/debug_stacks.cpp
index 67a9ac849c3aa75..391e241023462d2 100644
--- a/compiler-rt/test/asan/TestCases/debug_stacks.cpp
+++ b/compiler-rt/test/asan/TestCases/debug_stacks.cpp
@@ -1,6 +1,6 @@
// Check that the stack trace debugging API works and returns correct
// malloc and free stacks.
-// RUN: %clangxx_asan -O0 %s -o %t && not %run %t 2>&1 | FileCheck %s
+// RUN: %clangxx_asan -O0 %if MSVC %{ /wd4477 %} %s -o %t && not %run %t 2>&1 | FileCheck %s
// FIXME: Figure out why allocation/free stack traces may be too short on ARM.
// REQUIRES: stable-runtime
diff --git a/compiler-rt/test/asan/TestCases/deep_tail_call.cpp b/compiler-rt/test/asan/TestCases/deep_tail_call.cpp
index 628ef06db144747..772fa48bab7dc3b 100644
--- a/compiler-rt/test/asan/TestCases/deep_tail_call.cpp
+++ b/compiler-rt/test/asan/TestCases/deep_tail_call.cpp
@@ -4,15 +4,16 @@
// RUN: %clangxx_asan -O3 %s -o %t && not %run %t 2>&1 | FileCheck %s
// CHECK: AddressSanitizer: global-buffer-overflow
+#include "defines.h"
int global[10];
// CHECK: {{#0.*call4}}
-void __attribute__((noinline)) call4(int i) { global[i+10]++; }
+void ATTRIBUTE_NOINLINE call4(int i) { global[i + 10]++; }
// CHECK: {{#1.*call3}}
-void __attribute__((noinline)) call3(int i) { call4(i); }
+void ATTRIBUTE_NOINLINE call3(int i) { call4(i); }
// CHECK: {{#2.*call2}}
-void __attribute__((noinline)) call2(int i) { call3(i); }
+void ATTRIBUTE_NOINLINE call2(int i) { call3(i); }
// CHECK: {{#3.*call1}}
-void __attribute__((noinline)) call1(int i) { call2(i); }
+void ATTRIBUTE_NOINLINE call1(int i) { call2(i); }
// CHECK: {{#4.*main}}
int main(int argc, char **argv) {
call1(argc);
diff --git a/compiler-rt/test/asan/TestCases/default_ignorelist.cpp b/compiler-rt/test/asan/TestCases/default_ignorelist.cpp
index 8297b51e7680e97..c1277394680f1e5 100644
--- a/compiler-rt/test/asan/TestCases/default_ignorelist.cpp
+++ b/compiler-rt/test/asan/TestCases/default_ignorelist.cpp
@@ -1,5 +1,5 @@
// FIXME: https://code.google.com/p/address-sanitizer/issues/detail?id=316
-// XFAIL: android
+// XFAIL: android, msvc
// UNSUPPORTED: ios
//
// Test that ASan uses the default ignorelist from resource directory.
diff --git a/compiler-rt/test/asan/TestCases/default_options.cpp b/compiler-rt/test/asan/TestCases/default_options.cpp
index 845e8a5f1793e42..33507f3c82ef115 100644
--- a/compiler-rt/test/asan/TestCases/default_options.cpp
+++ b/compiler-rt/test/asan/TestCases/default_options.cpp
@@ -1,13 +1,14 @@
// RUN: %clangxx_asan -O2 %s -o %t
// RUN: %run %t 2>&1 | FileCheck %s
+#include "defines.h"
+
const char *kAsanDefaultOptions = "verbosity=1 help=1";
// Required for dyld macOS 12.0+
#if (__APPLE__)
__attribute__((weak))
#endif
-__attribute__((no_sanitize_address))
-extern "C" const char *
+ATTRIBUTE_NO_SANITIZE_ADDRESS extern "C" const char *
__asan_default_options() {
// CHECK: Available flags for AddressSanitizer:
return kAsanDefaultOptions;
diff --git a/compiler-rt/test/asan/TestCases/defines.h b/compiler-rt/test/asan/TestCases/defines.h
new file mode 100644
index 000000000000000..db6e374d2a03121
--- /dev/null
+++ b/compiler-rt/test/asan/TestCases/defines.h
@@ -0,0 +1,34 @@
+#ifndef SANITIZER_TEST_DEFINES_H
+#define SANITIZER_TEST_DEFINES_H
+
+#if defined(_MSC_VER) && !defined(__clang__)
+# include <intrin.h>
+
+# define ATTRIBUTE_NOINLINE __declspec(noinline)
+# define ATTRIBUTE_ALIGNED(x) __declspec(align(x))
+# define ATTRIBUTE_NO_SANITIZE_ADDRESS __declspec(no_sanitize_address)
+# define ATTRIBUTE_USED /* FIXME: Is there a __declspec used? */
+# define ATTRIBUTE_ALWAYS_INLINE __forceinline
+# define VOLATILE volatile
+# define EXTRACT_RETURN_ADDRESS _ReturnAddress()
+# define ASM_CAUSE_SIDE_EFFECT(dest) __asm { mov eax, dest}
+# define MULTIPLE_ATTRIBUTE_DECL(a, b) __declspec(a b)
+
+#else
+
+# define ATTRIBUTE_NOINLINE __attribute__((noinline))
+# define ATTRIBUTE_ALIGNED(x) __attribute__((aligned(x)))
+# define ATTRIBUTE_NO_SANITIZE_ADDRESS __attribute__((no_sanitize_address))
+# define ATTRIBUTE_USED __attribute__((used))
+# define ATTRIBUTE_ALWAYS_INLINE __attribute__((always_inline))
+# define INLINE_ASM(x) __asm__(x)
+# define VOLATILE __volatile__
+# define EXTRACT_RETURN_ADDRESS \
+ __builtin_extract_return_addr(__builtin_return_address(0))
+# define ASM_CAUSE_SIDE_EFFECT(dest) \
+ __asm__ __volatile__("" : : "r"(dest) : "memory");
+# define MULTIPLE_ATTRIBUTE_DECL(a, b) __attribute__((a, b))
+
+#endif // _MSC_VER
+
+#endif // SANITIZER_TEST_DEFINES
diff --git a/compiler-rt/test/asan/TestCases/error_report_callback.cpp b/compiler-rt/test/asan/TestCases/error_report_callback.cpp
index 8c5bbe418fc5211..903947e729fb2f1 100644
--- a/compiler-rt/test/asan/TestCases/error_report_callback.cpp
+++ b/compiler-rt/test/asan/TestCases/error_report_callback.cpp
@@ -1,6 +1,7 @@
// RUN: %clangxx_asan -O0 %s -o %t
// RUN: not %run %t 0 2>&1 | FileCheck %s
+#include "defines.h"
#include <sanitizer/asan_interface.h>
#include <stdio.h>
@@ -11,9 +12,7 @@ static void ErrorReportCallbackOneToZ(const char *report) {
int main(int argc, char **argv) {
__asan_set_error_report_callback(ErrorReportCallbackOneToZ);
- __asan_report_error(
- (void *)__builtin_extract_return_addr(__builtin_return_address(0)), 0, 0,
- 0, true, 1);
+ __asan_report_error((void *)EXTRACT_RETURN_ADDRESS, 0, 0, 0, true, 1);
// CHECK: ABCDEF
// CHECK: ERROR: AddressSanitizer
// CHECK: GHIJKL
diff --git a/compiler-rt/test/asan/TestCases/exitcode.cpp b/compiler-rt/test/asan/TestCases/exitcode.cpp
index e949436e1909ce2..21743bfbd7b8d7f 100644
--- a/compiler-rt/test/asan/TestCases/exitcode.cpp
+++ b/compiler-rt/test/asan/TestCases/exitcode.cpp
@@ -1,4 +1,4 @@
-// RUN: %clangxx_asan -g -Wno-deprecated-declarations %s -o %t
+// RUN: %clangxx_asan -g %if !MSVC %{ -Wno-deprecated-declarations %} %s -o %t
// RUN: %env_asan_opts=exitcode=42 %run %t | FileCheck %s
// Android doesn't have spawn.h or posix_spawn.
diff --git a/compiler-rt/test/asan/TestCases/force_inline_opt0.cpp b/compiler-rt/test/asan/TestCases/force_inline_opt0.cpp
index e6e5d26c7998ecc..0c721bcc5c8093d 100644
--- a/compiler-rt/test/asan/TestCases/force_inline_opt0.cpp
+++ b/compiler-rt/test/asan/TestCases/force_inline_opt0.cpp
@@ -1,8 +1,11 @@
// This test checks that we are no instrumenting a memory access twice
// (before and after inlining)
-// RUN: %clangxx_asan -O1 %s -o %t && %run %t
-// RUN: %clangxx_asan -O0 %s -o %t && %run %t
-__attribute__((always_inline))
+// RUN: %clangxx_asan -O1 %if MSVC %{ /Ob1 %} %s -o %t && %run %t
+// RUN: %clangxx_asan -O0 %if MSVC %{ /Ob1 %} %s -o %t && %run %t
+
+#include "defines.h"
+
+ATTRIBUTE_ALWAYS_INLINE
void foo(int *x) {
*x = 0;
}
diff --git a/compiler-rt/test/asan/TestCases/global-location-nodebug.cpp b/compiler-rt/test/asan/TestCases/global-location-nodebug.cpp
index 07c8e63f439da47..199816b8036abdd 100644
--- a/compiler-rt/test/asan/TestCases/global-location-nodebug.cpp
+++ b/compiler-rt/test/asan/TestCases/global-location-nodebug.cpp
@@ -11,7 +11,7 @@
/// Solaris ld -S has
diff erent semantics, so enforce -fuse-ld= for
/// configurations that default to GNU ld.
// XFAIL: target={{.*solaris.*}}
-
+// XFAIL: msvc
// CHECK: AddressSanitizer: global-buffer-overflow
// CLASS_STATIC-NO-G: 0x{{.*}} is located 4 bytes after global variable '{{.*}}C::array{{.*}}' defined in '{{.*}}global-location.cpp' {{.*}} of size 40
// GLOB-NO-G: 0x{{.*}} is located 4 bytes after global variable '{{.*}}global{{.*}}' defined in '{{.*}}global-location.cpp' {{.*}} of size 40
diff --git a/compiler-rt/test/asan/TestCases/global-underflow.cpp b/compiler-rt/test/asan/TestCases/global-underflow.cpp
index 32b4ce82f9b04d3..fc9b14628aece20 100644
--- a/compiler-rt/test/asan/TestCases/global-underflow.cpp
+++ b/compiler-rt/test/asan/TestCases/global-underflow.cpp
@@ -1,3 +1,4 @@
+// XFAIL: msvc
// RUN: %clangxx_asan -O0 %s %p/Helpers/underflow.cpp -o %t && not %run %t 2>&1 | FileCheck %s
// RUN: %clangxx_asan -O1 %s %p/Helpers/underflow.cpp -o %t && not %run %t 2>&1 | FileCheck %s
// RUN: %clangxx_asan -O2 %s %p/Helpers/underflow.cpp -o %t && not %run %t 2>&1 | FileCheck %s
diff --git a/compiler-rt/test/asan/TestCases/halt_on_error-1.c b/compiler-rt/test/asan/TestCases/halt_on_error-1.c
index 63c65e58bb71b3a..d40a28198713395 100644
--- a/compiler-rt/test/asan/TestCases/halt_on_error-1.c
+++ b/compiler-rt/test/asan/TestCases/halt_on_error-1.c
@@ -5,7 +5,7 @@
// RUN: env not %run %t 2>&1 | FileCheck %s
// RUN: %env_asan_opts=halt_on_error=true not %run %t 2>&1 | FileCheck %s
// RUN: %env_asan_opts=halt_on_error=false %run %t 2>&1 | FileCheck %s --check-prefix CHECK-RECOVER
-
+// XFAIL: msvc
#include <string.h>
volatile int ten = 10;
diff --git a/compiler-rt/test/asan/TestCases/heavy_uar_test.cpp b/compiler-rt/test/asan/TestCases/heavy_uar_test.cpp
index 661867260d2603c..200d19cdbaf8a0a 100644
--- a/compiler-rt/test/asan/TestCases/heavy_uar_test.cpp
+++ b/compiler-rt/test/asan/TestCases/heavy_uar_test.cpp
@@ -15,29 +15,29 @@
// UNSUPPORTED: ios
+#include "defines.h"
#include <stdio.h>
-#include <string.h>
#include <stdlib.h>
+#include <string.h>
#ifdef _WIN32
# include <windows.h>
#endif
-__attribute__((noinline))
+ATTRIBUTE_NOINLINE
char *pretend_to_do_something(char *x) {
__asm__ __volatile__("" : : "r" (x) : "memory");
return x;
}
-__attribute__((noinline))
+ATTRIBUTE_NOINLINE
char *LeakStack() {
char x[1024];
memset(x, 0, sizeof(x));
return pretend_to_do_something(x);
}
-template<size_t kFrameSize>
-__attribute__((noinline))
-void RecursiveFunctionWithStackFrame(int depth) {
+template <size_t kFrameSize>
+ATTRIBUTE_NOINLINE void RecursiveFunctionWithStackFrame(int depth) {
if (depth <= 0) return;
char x[kFrameSize];
x[0] = depth;
diff --git a/compiler-rt/test/asan/TestCases/ignorelist.cpp b/compiler-rt/test/asan/TestCases/ignorelist.cpp
index 348ea5d350bf161..5fe728bfe9c2109 100644
--- a/compiler-rt/test/asan/TestCases/ignorelist.cpp
+++ b/compiler-rt/test/asan/TestCases/ignorelist.cpp
@@ -15,7 +15,10 @@
// badGlobal is accessed improperly, but we ignorelisted it. Align
// it to make sure memory past the end of badGlobal will be in
// the same page.
-__attribute__((aligned(16))) int badGlobal;
+
+// XFAIL: msvc
+#include "defines.h"
+ATTRIBUTE_ALIGNED(16) int badGlobal;
int readBadGlobal() {
return (&badGlobal)[1];
}
diff --git a/compiler-rt/test/asan/TestCases/ill.cpp b/compiler-rt/test/asan/TestCases/ill.cpp
index d7b5350916719a9..da457d6737dbd94 100644
--- a/compiler-rt/test/asan/TestCases/ill.cpp
+++ b/compiler-rt/test/asan/TestCases/ill.cpp
@@ -2,12 +2,18 @@
//
// RUN: %clangxx_asan %s -o %t && %env_asan_opts=handle_sigill=0 not --crash %run %t 2>&1 | FileCheck %s --check-prefix=CHECK0
// RUN: %clangxx_asan %s -o %t && %env_asan_opts=handle_sigill=1 not %run %t 2>&1 | FileCheck %s --check-prefix=CHECK1
-// REQUIRES: x86-target-arch
+// REQUIRES: x86-target-arch && (!MSVC || asan-32-bits)
#ifdef _WIN32
#include <windows.h>
#endif
+// note: test is limited to i386 only ("asan-32-bits") when using "real" MSVC
+// see the requires clause above
+#if defined(_MSC_VER) && !defined(__clang__)
+# define __builtin_trap() __asm ud2;
+#endif
+
int main(int argc, char **argv) {
#ifdef _WIN32
// Sometimes on Windows this test generates a WER fault dialog. Suppress that.
diff --git a/compiler-rt/test/asan/TestCases/initialization-bug.cpp b/compiler-rt/test/asan/TestCases/initialization-bug.cpp
index 2775f6ce356dd45..1af6e256f0c24c6 100644
--- a/compiler-rt/test/asan/TestCases/initialization-bug.cpp
+++ b/compiler-rt/test/asan/TestCases/initialization-bug.cpp
@@ -8,6 +8,7 @@
// FIXME: https://code.google.com/p/address-sanitizer/issues/detail?id=186
// XFAIL: target={{.*windows-msvc.*}}
+#include "defines.h"
#include <cstdio>
// The structure of the test is:
@@ -27,7 +28,7 @@ int z = initZ();
// result is undefined behavior, which should be caught by initialization order
// checking.
extern int y;
-int __attribute__((noinline)) initX() {
+int ATTRIBUTE_NOINLINE initX() {
return y + 1;
// CHECK: {{AddressSanitizer: initialization-order-fiasco}}
// CHECK: {{READ of size .* at 0x.* thread T0}}
diff --git a/compiler-rt/test/asan/TestCases/inline.cpp b/compiler-rt/test/asan/TestCases/inline.cpp
index 12bd27e675844cf..42779a07ae2e64d 100644
--- a/compiler-rt/test/asan/TestCases/inline.cpp
+++ b/compiler-rt/test/asan/TestCases/inline.cpp
@@ -2,10 +2,15 @@
// Test that no_sanitize_address attribute applies even when the function would
// be normally inlined.
+//
+// MSVC doesn't apply __declspec(no_sanitize_address) to inlined functions
+// (i.e. it contains this bug)
+// XFAIL: msvc
+#include "defines.h"
#include <stdlib.h>
-__attribute__((no_sanitize_address))
+ATTRIBUTE_NO_SANITIZE_ADDRESS
int f(int *p) {
return *p; // BOOOM?? Nope!
}
diff --git a/compiler-rt/test/asan/TestCases/intercept-rethrow-exception.cpp b/compiler-rt/test/asan/TestCases/intercept-rethrow-exception.cpp
index bf51eed41fddf67..24b93c56e730c77 100644
--- a/compiler-rt/test/asan/TestCases/intercept-rethrow-exception.cpp
+++ b/compiler-rt/test/asan/TestCases/intercept-rethrow-exception.cpp
@@ -15,6 +15,7 @@
// https://reviews.llvm.org/D111703 made compiler incompatible with released NDK.
// UNSUPPORTED: android && arm-target-arch
+#include "defines.h"
#include <assert.h>
#include <exception>
#include <sanitizer/asan_interface.h>
@@ -28,7 +29,7 @@ namespace {
// [[noreturn]] because the scenario we're emulating doesn't always throw. If it
// were [[noreturn]], the calling code would emit a call to
// __asan_handle_no_return.
-void __attribute__((no_sanitize("address")))
+void ATTRIBUTE_NO_SANITIZE_ADDRESS
uninstrumented_rethrow_exception(std::exception_ptr const &exc_ptr) {
std::rethrow_exception(exc_ptr);
}
diff --git a/compiler-rt/test/asan/TestCases/interception_failure_test.cpp b/compiler-rt/test/asan/TestCases/interception_failure_test.cpp
index 918fa8e82bf74aa..bdaf3eb3178f2c9 100644
--- a/compiler-rt/test/asan/TestCases/interception_failure_test.cpp
+++ b/compiler-rt/test/asan/TestCases/interception_failure_test.cpp
@@ -18,6 +18,10 @@
// it works with the dynamic runtime.
// XFAIL: target={{.*netbsd.*}} && !asan-dynamic-runtime
+#if defined(_MSC_VER) && !defined(__clang__)
+# pragma warning(disable : 4273)
+#endif
+
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
diff --git a/compiler-rt/test/asan/TestCases/interface_test.cpp b/compiler-rt/test/asan/TestCases/interface_test.cpp
index 9419f07e91eae33..bc347807bcc3aa1 100644
--- a/compiler-rt/test/asan/TestCases/interface_test.cpp
+++ b/compiler-rt/test/asan/TestCases/interface_test.cpp
@@ -1,8 +1,8 @@
// Check that user may include ASan interface header.
// RUN: %clang_asan %s -o %t && %run %t
// RUN: %clang_asan -x c %s -o %t && %run %t
-// RUN: %clang %s -pie -o %t && %run %t
-// RUN: %clang -x c %s -pie -o %t && %run %t
+// RUN: %clang %s %pie -o %t && %run %t
+// RUN: %clang -x c %s %pie -o %t && %run %t
#include <sanitizer/asan_interface.h>
int main() {
diff --git a/compiler-rt/test/asan/TestCases/invalid-pointer-pairs-compare-errors.cpp b/compiler-rt/test/asan/TestCases/invalid-pointer-pairs-compare-errors.cpp
index 7b1479e2d05bd46..84c264b30569263 100644
--- a/compiler-rt/test/asan/TestCases/invalid-pointer-pairs-compare-errors.cpp
+++ b/compiler-rt/test/asan/TestCases/invalid-pointer-pairs-compare-errors.cpp
@@ -1,7 +1,7 @@
// RUN: %clangxx_asan -O0 %s -o %t -mllvm -asan-detect-invalid-pointer-pair
// RUN: %env_asan_opts=detect_invalid_pointer_pairs=2:halt_on_error=0 %run %t 2>&1 | FileCheck %s
-
+// XFAIL: msvc
#include <assert.h>
#include <stdlib.h>
diff --git a/compiler-rt/test/asan/TestCases/invalid-pointer-pairs-subtract-errors.cpp b/compiler-rt/test/asan/TestCases/invalid-pointer-pairs-subtract-errors.cpp
index 535833d05c89a6b..80742cddc0460d8 100644
--- a/compiler-rt/test/asan/TestCases/invalid-pointer-pairs-subtract-errors.cpp
+++ b/compiler-rt/test/asan/TestCases/invalid-pointer-pairs-subtract-errors.cpp
@@ -1,7 +1,7 @@
// RUN: %clangxx_asan -O0 %s -o %t -mllvm -asan-detect-invalid-pointer-pair
// RUN: %env_asan_opts=detect_invalid_pointer_pairs=2:halt_on_error=0 %run %t 2>&1 | FileCheck %s
-
+// XFAIL: msvc
#include <assert.h>
#include <stdlib.h>
diff --git a/compiler-rt/test/asan/TestCases/invalid-pointer-pairs.cpp b/compiler-rt/test/asan/TestCases/invalid-pointer-pairs.cpp
index accd9b7704d51b4..061a0a7b2b86153 100644
--- a/compiler-rt/test/asan/TestCases/invalid-pointer-pairs.cpp
+++ b/compiler-rt/test/asan/TestCases/invalid-pointer-pairs.cpp
@@ -4,7 +4,7 @@
// RUN: %env_asan_opts=detect_invalid_pointer_pairs=1 not %run %t g 2>&1 | FileCheck %s -check-prefix=CMP -check-prefix=ALL-ERRORS
// RUN: %env_asan_opts=detect_invalid_pointer_pairs=1 not %run %t s 2>&1 | FileCheck %s -check-prefix=SUB -check-prefix=ALL-ERRORS
// RUN: %env_asan_opts=detect_invalid_pointer_pairs=1 not %run %t f 2>&1 | FileCheck %s -check-prefix=FREE -check-prefix=ALL-ERRORS
-
+// XFAIL: msvc
#include <assert.h>
#include <stdlib.h>
diff --git a/compiler-rt/test/asan/TestCases/large_func_test.cpp b/compiler-rt/test/asan/TestCases/large_func_test.cpp
index c64fc7d3c7aa745..1c25d345cb5c41f 100644
--- a/compiler-rt/test/asan/TestCases/large_func_test.cpp
+++ b/compiler-rt/test/asan/TestCases/large_func_test.cpp
@@ -7,8 +7,9 @@
// Issue #108194: Incomplete .debug_line at -O1 and above.
// XFAIL: target={{.*sparc.*}}
+#include "defines.h"
#include <stdlib.h>
-__attribute__((noinline))
+ATTRIBUTE_NOINLINE
static void LargeFunction(int *x, int zero) {
x[0]++;
x[1]++;
@@ -29,7 +30,7 @@ static void LargeFunction(int *x, int zero) {
// Darwin.
// CHECK-Linux: {{#0 0x.* in LargeFunction.*large_func_test.cpp:}}[[@LINE-3]]
// CHECK-SunOS: {{#0 0x.* in LargeFunction.*large_func_test.cpp:}}[[@LINE-4]]
- // CHECK-Windows:{{#0 0x.* in LargeFunction.*large_func_test.cpp:}}[[@LINE-5]]
+ // CHECK-Windows:{{#[0-1] 0x.* in LargeFunction.*large_func_test.cpp:}}[[@LINE-5]]
// CHECK-FreeBSD:{{#0 0x.* in LargeFunction.*large_func_test.cpp:}}[[@LINE-6]]
// CHECK-Darwin: {{#0 0x.* in .*LargeFunction.*large_func_test.cpp}}:[[@LINE-7]]
@@ -48,7 +49,7 @@ static void LargeFunction(int *x, int zero) {
int main(int argc, char **argv) {
int *x = new int[100];
LargeFunction(x, argc - 1);
- // CHECK: {{ #1 0x.* in main .*large_func_test.cpp:}}[[@LINE-1]]
+ // CHECK: {{ #[1-2] 0x.* in main .*large_func_test.cpp:}}[[@LINE-1]]
// CHECK: {{0x.* is located 12 bytes after 400-byte region}}
// CHECK: {{allocated by thread T0 here:}}
// CHECK-Linux: {{ #0 0x.* in operator new}}
diff --git a/compiler-rt/test/asan/TestCases/null_deref.cpp b/compiler-rt/test/asan/TestCases/null_deref.cpp
index a8947a437803274..3ccb4753263694f 100644
--- a/compiler-rt/test/asan/TestCases/null_deref.cpp
+++ b/compiler-rt/test/asan/TestCases/null_deref.cpp
@@ -3,7 +3,9 @@
// RUN: %clangxx_asan -O2 %s -o %t && not %run %t 2>&1 | FileCheck %s
// RUN: %clangxx_asan -O3 %s -o %t && not %run %t 2>&1 | FileCheck %s
-__attribute__((noinline))
+#include "defines.h"
+
+ATTRIBUTE_NOINLINE
// FIXME: Static symbols don't show up in PDBs. We can remove this once we start
// using DWARF.
#ifndef _MSC_VER
diff --git a/compiler-rt/test/asan/TestCases/pass-struct-byval.cpp b/compiler-rt/test/asan/TestCases/pass-struct-byval.cpp
index ba49eccf41cab57..69409bc6ace6b16 100644
--- a/compiler-rt/test/asan/TestCases/pass-struct-byval.cpp
+++ b/compiler-rt/test/asan/TestCases/pass-struct-byval.cpp
@@ -1,6 +1,6 @@
// RUN: %clangxx_asan -O0 %s -o %t
// RUN: not %run %t 2>&1 | FileCheck %s
-
+// XFAIL: msvc
struct A {
int a[8];
};
diff --git a/compiler-rt/test/asan/TestCases/report_error_summary.cpp b/compiler-rt/test/asan/TestCases/report_error_summary.cpp
index 9e024e35bed864c..e10def7218634c2 100644
--- a/compiler-rt/test/asan/TestCases/report_error_summary.cpp
+++ b/compiler-rt/test/asan/TestCases/report_error_summary.cpp
@@ -2,8 +2,10 @@
#include <stdio.h>
+#if !defined(_MSC_VER) || defined(__clang__)
// Required for ld64 macOS 12.0+
__attribute__((weak)) extern "C" void foo() {}
+#endif
extern "C" void __sanitizer_report_error_summary(const char *summary) {
fprintf(stderr, "test_report_error_summary\n");
diff --git a/compiler-rt/test/asan/TestCases/speculative_load.cpp b/compiler-rt/test/asan/TestCases/speculative_load.cpp
index fdf70eb39767aab..27bd293d28a395b 100644
--- a/compiler-rt/test/asan/TestCases/speculative_load.cpp
+++ b/compiler-rt/test/asan/TestCases/speculative_load.cpp
@@ -4,6 +4,9 @@
// RUN: %clangxx_asan -O2 %s -o %t && %run %t 2>&1
// RUN: %clangxx_asan -O3 %s -o %t && %run %t 2>&1
+// MSVC doesn't support GCC style inline assembly
+// UNSUPPORTED: msvc
+
#include <sanitizer/asan_interface.h>
struct S {
diff --git a/compiler-rt/test/asan/TestCases/stack-buffer-overflow-with-position.cpp b/compiler-rt/test/asan/TestCases/stack-buffer-overflow-with-position.cpp
index 0077663d6a17660..d33c6246fd4fb41 100644
--- a/compiler-rt/test/asan/TestCases/stack-buffer-overflow-with-position.cpp
+++ b/compiler-rt/test/asan/TestCases/stack-buffer-overflow-with-position.cpp
@@ -13,6 +13,7 @@
// RUN: not %run %t 63 2>&1 | FileCheck --check-prefix=CHECK-63 %s
// RUN: not %run %t 73 2>&1 | FileCheck --check-prefix=CHECK-73 %s
// RUN: not %run %t 74 2>&1 | FileCheck --check-prefix=CHECK-74 %s
+// XFAIL: msvc
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
diff --git a/compiler-rt/test/asan/TestCases/stack-oob-frames.cpp b/compiler-rt/test/asan/TestCases/stack-oob-frames.cpp
index 3b5d511b26818a6..1e077513c2168e3 100644
--- a/compiler-rt/test/asan/TestCases/stack-oob-frames.cpp
+++ b/compiler-rt/test/asan/TestCases/stack-oob-frames.cpp
@@ -4,6 +4,9 @@
// RUN: not %run %t 2 2>&1 | FileCheck %s --check-prefix=CHECK2
// RUN: not %run %t 3 2>&1 | FileCheck %s --check-prefix=CHECK3
+// MSVC doesn't support GCC style inline ASM
+// UNSUPPORTED: msvc
+
#define NOINLINE __attribute__((noinline))
inline void break_optimization(void *arg) {
__asm__ __volatile__("" : : "r" (arg) : "memory");
diff --git a/compiler-rt/test/asan/TestCases/strcat-overlap.cpp b/compiler-rt/test/asan/TestCases/strcat-overlap.cpp
index 76fd3e1f11d14ef..af78bc444054943 100644
--- a/compiler-rt/test/asan/TestCases/strcat-overlap.cpp
+++ b/compiler-rt/test/asan/TestCases/strcat-overlap.cpp
@@ -34,11 +34,12 @@
// UNSUPPORTED: target={{.*windows-msvc.*}}
// UNSUPPORTED: android
+#include "defines.h"
#include <string.h>
// Don't inline function otherwise stacktrace changes.
-__attribute__((noinline)) void bad_function() {
+ATTRIBUTE_NOINLINE void bad_function() {
char buffer[] = "hello\0XXX";
// CHECK: strcat-param-overlap: memory ranges
// CHECK: [{{0x.*,[ ]*0x.*}}) and [{{0x.*,[ ]*0x.*}}) overlap
diff --git a/compiler-rt/test/asan/TestCases/strcpy-overlap.cpp b/compiler-rt/test/asan/TestCases/strcpy-overlap.cpp
index efd2e6b7521ef17..89ac7a39b33ca80 100644
--- a/compiler-rt/test/asan/TestCases/strcpy-overlap.cpp
+++ b/compiler-rt/test/asan/TestCases/strcpy-overlap.cpp
@@ -26,13 +26,14 @@
// RUN: echo "interceptor_name:strcpy" > %t.supp
// RUN: %env_asan_opts=suppressions='"%t.supp"' %run %t
-// UNSUPPORTED: android
+// UNSUPPORTED: android, MSVC
+#include "defines.h"
#include <string.h>
// Don't inline function otherwise stacktrace changes.
-__attribute__((noinline)) void bad_function() {
+ATTRIBUTE_NOINLINE void bad_function() {
char buffer[] = "hello";
// CHECK: strcpy-param-overlap: memory ranges
// CHECK: [{{0x.*,[ ]*0x.*}}) and [{{0x.*,[ ]*0x.*}}) overlap
diff --git a/compiler-rt/test/asan/TestCases/strncat-overlap.cpp b/compiler-rt/test/asan/TestCases/strncat-overlap.cpp
index 3e3f7ee2723f544..e4f2fbca68abf67 100644
--- a/compiler-rt/test/asan/TestCases/strncat-overlap.cpp
+++ b/compiler-rt/test/asan/TestCases/strncat-overlap.cpp
@@ -28,11 +28,12 @@
// UNSUPPORTED: android
+#include "defines.h"
#include <string.h>
// Don't inline function otherwise stacktrace changes.
-__attribute__((noinline)) void bad_function() {
+ATTRIBUTE_NOINLINE void bad_function() {
char buffer[] = "hello\0XXX";
// CHECK: strncat-param-overlap: memory ranges
// CHECK: [{{0x.*,[ ]*0x.*}}) and [{{0x.*,[ ]*0x.*}}) overlap
diff --git a/compiler-rt/test/asan/TestCases/strncpy-overflow.cpp b/compiler-rt/test/asan/TestCases/strncpy-overflow.cpp
index ff84052a94987a3..f75f8c5eb3ff645 100644
--- a/compiler-rt/test/asan/TestCases/strncpy-overflow.cpp
+++ b/compiler-rt/test/asan/TestCases/strncpy-overflow.cpp
@@ -6,14 +6,15 @@
// REQUIRES: compiler-rt-optimized
// REQUIRES: stable-runtime
-#include <string.h>
+#include "defines.h"
#include <stdlib.h>
+#include <string.h>
// We need a way to prevent the optimize from eliminating the
// strncpy below (which otherwises writes to dead storage). We
// need the read to be out-of-line to prevent memory forwarding
// from making the memory dead again.
-int sink_memory(int N, char *p) __attribute__((noinline));
+int ATTRIBUTE_NOINLINE sink_memory(int N, char *p);
int sink_memory(int N, char *p) {
int sum = 0;
for (int i = 0; i < N; i++)
diff --git a/compiler-rt/test/asan/TestCases/strncpy-overlap.cpp b/compiler-rt/test/asan/TestCases/strncpy-overlap.cpp
index 860fc5d304e0e73..9334a333c052a5a 100644
--- a/compiler-rt/test/asan/TestCases/strncpy-overlap.cpp
+++ b/compiler-rt/test/asan/TestCases/strncpy-overlap.cpp
@@ -28,11 +28,12 @@
// UNSUPPORTED: android
+#include "defines.h"
#include <string.h>
// Don't inline function otherwise stacktrace changes.
-__attribute__((noinline)) void bad_function() {
+ATTRIBUTE_NOINLINE void bad_function() {
char buffer[] = "hello";
// CHECK: strncpy-param-overlap: memory ranges
// CHECK: [{{0x.*,[ ]*0x.*}}) and [{{0x.*,[ ]*0x.*}}) overlap
diff --git a/compiler-rt/test/asan/TestCases/throw_call_test.cpp b/compiler-rt/test/asan/TestCases/throw_call_test.cpp
index 20a7c0b76601551..06e9422701406ac 100644
--- a/compiler-rt/test/asan/TestCases/throw_call_test.cpp
+++ b/compiler-rt/test/asan/TestCases/throw_call_test.cpp
@@ -2,6 +2,10 @@
// http://code.google.com/p/address-sanitizer/issues/detail?id=147 (not fixed).
// BROKEN: %clangxx_asan %s -o %t -static-libstdc++ && %run %t
+// MSVC doesn't support GCC style inline ASM
+// UNSUPPORTED: msvc
+
+#include "defines.h"
#include <stdio.h>
static volatile int zero = 0;
inline void pretend_to_do_something(void *x) {
@@ -15,7 +19,7 @@ void ReallyThrow() {
throw 42;
}
-__attribute__((noinline))
+ATTRIBUTE_NOINLINE
void Throw() {
int a, b, c, d, e, f, g, h;
pretend_to_do_something(&a);
@@ -30,7 +34,7 @@ void Throw() {
ReallyThrow();
}
-__attribute__((noinline))
+ATTRIBUTE_NOINLINE
void CheckStack() {
int ar[100];
pretend_to_do_something(ar);
diff --git a/compiler-rt/test/asan/TestCases/throw_catch.cpp b/compiler-rt/test/asan/TestCases/throw_catch.cpp
index 2884e95f8a7e29e..71e66e3fc4dd409 100644
--- a/compiler-rt/test/asan/TestCases/throw_catch.cpp
+++ b/compiler-rt/test/asan/TestCases/throw_catch.cpp
@@ -1,17 +1,18 @@
// RUN: %clangxx_asan -fsanitize-address-use-after-return=never -O %s -o %t && %run %t
+#include "defines.h"
#include <assert.h>
-#include <stdio.h>
#include <sanitizer/asan_interface.h>
+#include <stdio.h>
-__attribute__((noinline))
+ATTRIBUTE_NOINLINE
void Throw() {
int local;
fprintf(stderr, "Throw: %p\n", &local);
throw 1;
}
-__attribute__((noinline))
+ATTRIBUTE_NOINLINE
void ThrowAndCatch() {
int local;
try {
@@ -21,7 +22,7 @@ void ThrowAndCatch() {
}
}
-__attribute__((noinline))
+ATTRIBUTE_NOINLINE
void TestThrow() {
char x[32];
fprintf(stderr, "Before: %p poisoned: %d\n", &x,
@@ -33,7 +34,7 @@ void TestThrow() {
assert(!__asan_address_is_poisoned(x + 32));
}
-__attribute__((noinline))
+ATTRIBUTE_NOINLINE
void TestThrowInline() {
char x[32];
fprintf(stderr, "Before: %p poisoned: %d\n", &x,
diff --git a/compiler-rt/test/asan/TestCases/throw_invoke_test.cpp b/compiler-rt/test/asan/TestCases/throw_invoke_test.cpp
index a9069e1ca8d1a5a..2faf3efe9e6ec82 100644
--- a/compiler-rt/test/asan/TestCases/throw_invoke_test.cpp
+++ b/compiler-rt/test/asan/TestCases/throw_invoke_test.cpp
@@ -2,8 +2,9 @@
// RUN: %clangxx_asan %s -o %t -static-libstdc++ && %run %t
// Investigate why it fails with NDK 21.
-// UNSUPPORTED: android
+// UNSUPPORTED: android, MSVC
+#include "defines.h"
#include <stdio.h>
static volatile int zero = 0;
inline void pretend_to_do_something(void *x) {
@@ -34,7 +35,7 @@ void Throw() {
ReallyThrow();
}
-__attribute__((noinline))
+ATTRIBUTE_NOINLINE
void CheckStack() {
int ar[100];
pretend_to_do_something(ar);
diff --git a/compiler-rt/test/asan/TestCases/use-after-scope-capture.cpp b/compiler-rt/test/asan/TestCases/use-after-scope-capture.cpp
index 0eca27181e54f84..110d9e522245303 100644
--- a/compiler-rt/test/asan/TestCases/use-after-scope-capture.cpp
+++ b/compiler-rt/test/asan/TestCases/use-after-scope-capture.cpp
@@ -1,12 +1,13 @@
// RUN: %clangxx_asan -O0 %s -o %t && not %run %t 2>&1 | FileCheck %s
+#include "defines.h"
#include <functional>
int main() {
std::function<int()> f;
{
int x = 0;
- f = [&x]() __attribute__((noinline)) {
+ f = [&x]() ATTRIBUTE_NOINLINE {
return x; // BOOM
// CHECK: ERROR: AddressSanitizer: stack-use-after-scope
// We cannot assert the line, after the argument promotion pass this crashes
diff --git a/compiler-rt/test/asan/TestCases/use-after-scope-dtor-order.cpp b/compiler-rt/test/asan/TestCases/use-after-scope-dtor-order.cpp
index 42f62c72397ec36..c4a188d2c86ce45 100644
--- a/compiler-rt/test/asan/TestCases/use-after-scope-dtor-order.cpp
+++ b/compiler-rt/test/asan/TestCases/use-after-scope-dtor-order.cpp
@@ -1,10 +1,11 @@
// RUN: %clangxx_asan -O1 %s -o %t && not %run %t 2>&1 | FileCheck %s
+#include "defines.h"
#include <stdio.h>
struct IntHolder {
explicit IntHolder(int *val = 0) : val_(val) { }
- __attribute__((noinline)) ~IntHolder() {
+ ATTRIBUTE_NOINLINE ~IntHolder() {
printf("Value: %d\n", *val_); // BOOM
// CHECK: ERROR: AddressSanitizer: stack-use-after-scope
// CHECK: #0 0x{{.*}} in IntHolder::~IntHolder{{.*}}.cpp:[[@LINE-2]]
diff --git a/compiler-rt/test/asan/TestCases/use-after-scope-inlined.cpp b/compiler-rt/test/asan/TestCases/use-after-scope-inlined.cpp
index 1014ff919b9ef82..d0154ef744241ea 100644
--- a/compiler-rt/test/asan/TestCases/use-after-scope-inlined.cpp
+++ b/compiler-rt/test/asan/TestCases/use-after-scope-inlined.cpp
@@ -4,9 +4,13 @@
//
// RUN: %clangxx_asan -O2 %s -o %t && not %run %t 2>&1 | FileCheck %s
+// MSVC marks this as xfail because it doesn't generate the metadata to display the "x.i" offset.
+// XFAIL: msvc
+#include "defines.h"
+
int *arr;
-__attribute__((always_inline))
+ATTRIBUTE_ALWAYS_INLINE
void inlined(int arg) {
int x[5];
for (int i = 0; i < arg; i++) x[i] = i;
diff --git a/compiler-rt/test/asan/TestCases/use-after-scope-loop-bug.cpp b/compiler-rt/test/asan/TestCases/use-after-scope-loop-bug.cpp
index 286b6441a5698e9..b97fe6730ddc4ca 100644
--- a/compiler-rt/test/asan/TestCases/use-after-scope-loop-bug.cpp
+++ b/compiler-rt/test/asan/TestCases/use-after-scope-loop-bug.cpp
@@ -1,4 +1,4 @@
-// RUN: %clangxx_asan -O1 %s -o %t && not %run %t 2>&1 | FileCheck %s
+// RUN: %clangxx_asan %if MSVC %{ /Od %} %else %{ -O1 %} %s -o %t && not %run %t 2>&1 | FileCheck %s
volatile int *p;
diff --git a/compiler-rt/test/asan/TestCases/use-after-scope-loop-removed.cpp b/compiler-rt/test/asan/TestCases/use-after-scope-loop-removed.cpp
index 8a8a7b60deb6b49..8fedceb6cf33099 100644
--- a/compiler-rt/test/asan/TestCases/use-after-scope-loop-removed.cpp
+++ b/compiler-rt/test/asan/TestCases/use-after-scope-loop-removed.cpp
@@ -1,4 +1,5 @@
-// RUN: %clangxx_asan -O1 %s -o %t && not %run %t 2>&1 | FileCheck %s
+// RUN: %clangxx_asan %if MSVC %{ /Od %} %else %{ -O1 %} \
+// RUN: %s -o %t && not %run %t 2>&1 | FileCheck %s
#include <stdlib.h>
diff --git a/compiler-rt/test/asan/TestCases/use-after-scope-loop.cpp b/compiler-rt/test/asan/TestCases/use-after-scope-loop.cpp
index 3e199056930cbb2..7254a785995b747 100644
--- a/compiler-rt/test/asan/TestCases/use-after-scope-loop.cpp
+++ b/compiler-rt/test/asan/TestCases/use-after-scope-loop.cpp
@@ -1,4 +1,5 @@
-// RUN: %clangxx_asan -O1 %s -o %t && not %run %t 2>&1 | FileCheck %s
+// RUN: %clangxx_asan %if MSVC %{ /Od %} %else %{ -O1 %} \
+// RUN: %s -o %t && not %run %t 2>&1 | FileCheck %s
int *p[3];
diff --git a/compiler-rt/test/asan/TestCases/use-after-scope-temp.cpp b/compiler-rt/test/asan/TestCases/use-after-scope-temp.cpp
index 29680f37bfa532e..ab14e14e485d9f8 100644
--- a/compiler-rt/test/asan/TestCases/use-after-scope-temp.cpp
+++ b/compiler-rt/test/asan/TestCases/use-after-scope-temp.cpp
@@ -1,14 +1,14 @@
-// RUN: %clangxx_asan -O1 %s -o %t && not %run %t 2>&1 | FileCheck %s
+// RUN: %clangxx_asan %if MSVC %{ /Od %} %else %{ -O1 %} \
+// RUN: %s -o %t && not %run %t 2>&1 | FileCheck %s
+#include "defines.h"
struct IntHolder {
int val;
};
const IntHolder *saved;
-__attribute__((noinline)) void save(const IntHolder &holder) {
- saved = &holder;
-}
+ATTRIBUTE_NOINLINE void save(const IntHolder &holder) { saved = &holder; }
int main(int argc, char *argv[]) {
save({argc});
diff --git a/compiler-rt/test/asan/TestCases/use-after-scope-temp2.cpp b/compiler-rt/test/asan/TestCases/use-after-scope-temp2.cpp
index b98d6f12911a780..ff65f592ee20828 100644
--- a/compiler-rt/test/asan/TestCases/use-after-scope-temp2.cpp
+++ b/compiler-rt/test/asan/TestCases/use-after-scope-temp2.cpp
@@ -1,9 +1,10 @@
-// RUN: %clangxx_asan -O1 %s -o %t && not %run %t 2>&1 | FileCheck %s
+// RUN: %clangxx_asan %if MSVC %{ /Od %} %else %{ -O1 %} \
+// RUN: %s -o %t && not %run %t 2>&1 | FileCheck %s
+
+#include "defines.h"
struct IntHolder {
- __attribute__((noinline)) const IntHolder &Self() const {
- return *this;
- }
+ ATTRIBUTE_NOINLINE const IntHolder &Self() const { return *this; }
int val = 3;
};
diff --git a/compiler-rt/test/asan/TestCases/use-after-scope-types.cpp b/compiler-rt/test/asan/TestCases/use-after-scope-types.cpp
index 5751a0a09bb4ec6..3e740edfae250c4 100644
--- a/compiler-rt/test/asan/TestCases/use-after-scope-types.cpp
+++ b/compiler-rt/test/asan/TestCases/use-after-scope-types.cpp
@@ -11,6 +11,7 @@
// RUN: not %run %t 9 2>&1 | FileCheck %s
// RUN: not %run %t 10 2>&1 | FileCheck %s
+#include "defines.h"
#include <stdlib.h>
#include <string>
#include <vector>
@@ -32,7 +33,7 @@ template <class T, size_t N> struct Ptr<T[N]> {
T *t;
};
-template <class T> __attribute__((noinline)) void test() {
+template <class T> ATTRIBUTE_NOINLINE void test() {
Ptr<T> ptr;
{
T x;
diff --git a/compiler-rt/test/asan/TestCases/vla_chrome_testcase.cpp b/compiler-rt/test/asan/TestCases/vla_chrome_testcase.cpp
index 613d4bb2763fabb..743e2ae71425b77 100644
--- a/compiler-rt/test/asan/TestCases/vla_chrome_testcase.cpp
+++ b/compiler-rt/test/asan/TestCases/vla_chrome_testcase.cpp
@@ -1,20 +1,22 @@
// RUN: %clangxx_asan -O0 -mllvm -asan-instrument-dynamic-allocas %s -o %t
// RUN: not %run %t 2>&1 | FileCheck %s
//
+// MSVC doesn't support VLAs
+// UNSUPPORTED: msvc
// This is reduced testcase based on Chromium code.
// See http://reviews.llvm.org/D6055?vs=on&id=15616&whitespace=ignore-all#toc.
-#include <stdint.h>
+#include "defines.h"
#include <assert.h>
+#include <stdint.h>
int a = 7;
int b;
int c;
int *p;
-__attribute__((noinline)) void fn3(int *first, int second) {
-}
+ATTRIBUTE_NOINLINE void fn3(int *first, int second) {}
int main() {
int d = b && c;
diff --git a/compiler-rt/test/asan/TestCases/vla_condition_overflow.cpp b/compiler-rt/test/asan/TestCases/vla_condition_overflow.cpp
index 00df5d2919c465a..5269a35e9796ad8 100644
--- a/compiler-rt/test/asan/TestCases/vla_condition_overflow.cpp
+++ b/compiler-rt/test/asan/TestCases/vla_condition_overflow.cpp
@@ -2,11 +2,14 @@
// RUN: not %run %t 2>&1 | FileCheck %s
//
// REQUIRES: stable-runtime
+// MSVC doesn't support VLAs
+// UNSUPPORTED: msvc
+#include "defines.h"
#include <assert.h>
#include <stdint.h>
-__attribute__((noinline)) void foo(int index, int len) {
+ATTRIBUTE_NOINLINE void foo(int index, int len) {
if (index > len) {
char str[len];
assert(!(reinterpret_cast<uintptr_t>(str) & 31L));
diff --git a/compiler-rt/test/asan/TestCases/vla_loop_overfow.cpp b/compiler-rt/test/asan/TestCases/vla_loop_overfow.cpp
index 370e0dc72c12f48..d4cf9513d0fa67d 100644
--- a/compiler-rt/test/asan/TestCases/vla_loop_overfow.cpp
+++ b/compiler-rt/test/asan/TestCases/vla_loop_overfow.cpp
@@ -3,6 +3,9 @@
//
// REQUIRES: stable-runtime
+// MSVC doesn't support VLAs
+// UNSUPPORTED: msvc
+
#include <assert.h>
#include <stdint.h>
diff --git a/compiler-rt/test/asan/TestCases/zero_page_pc.cpp b/compiler-rt/test/asan/TestCases/zero_page_pc.cpp
index a7d00ce9b698864..3af4d04a587c28c 100644
--- a/compiler-rt/test/asan/TestCases/zero_page_pc.cpp
+++ b/compiler-rt/test/asan/TestCases/zero_page_pc.cpp
@@ -1,6 +1,10 @@
// Check that ASan correctly detects SEGV on the zero page.
// RUN: %clangxx_asan %s -o %t && not %run %t 2>&1 | FileCheck %s
+#if defined(_MSC_VER) && !defined(__CLANG__)
+# define __has_feature(x) 0
+#endif
+
#if __has_feature(ptrauth_calls)
# include <ptrauth.h>
#endif
diff --git a/compiler-rt/test/asan/lit.cfg.py b/compiler-rt/test/asan/lit.cfg.py
index c57f5ca0fa652c7..2da511103da7cf3 100644
--- a/compiler-rt/test/asan/lit.cfg.py
+++ b/compiler-rt/test/asan/lit.cfg.py
@@ -183,6 +183,7 @@ def build_invocation(compile_flags, with_lto=False):
config.substitutions.append(("%MD", "-MD"))
config.substitutions.append(("%MT", "-MT"))
config.substitutions.append(("%Gw", "-Gw"))
+ config.substitutions.append(("%Oy-", "-Oy-"))
base_lib = os.path.join(
config.compiler_rt_libdir, "clang_rt.asan%%s%s.lib" % config.target_suffix
@@ -220,6 +221,7 @@ def build_invocation(compile_flags, with_lto=False):
config.substitutions.append(("%MD", ""))
config.substitutions.append(("%MT", ""))
config.substitutions.append(("%Gw", "-fdata-sections"))
+ config.substitutions.append(("%Oy-", "-fno-omit-frame-pointer"))
# FIXME: De-hardcode this path.
asan_source_dir = os.path.join(
More information about the llvm-commits
mailing list