diff --git a/compiler-rt/include/sanitizer/common_interface_defs.h b/compiler-rt/include/sanitizer/common_interface_defs.h index 56d9e008fa06e..f9fce595b37bb 100644 --- a/compiler-rt/include/sanitizer/common_interface_defs.h +++ b/compiler-rt/include/sanitizer/common_interface_defs.h @@ -293,7 +293,7 @@ void SANITIZER_CDECL __sanitizer_symbolize_global(void *data_ptr, #define __sanitizer_return_address() \ __builtin_extract_return_addr(__builtin_return_address(0)) #else -void *SANITIZER_CDECL _ReturnAddress(void); +void *_ReturnAddress(void); #pragma intrinsic(_ReturnAddress) #define __sanitizer_return_address() _ReturnAddress() #endif diff --git a/compiler-rt/test/asan/TestCases/Windows/msvc/gz.cpp b/compiler-rt/test/asan/TestCases/Windows/msvc/gz.cpp new file mode 100644 index 0000000000000..52a59d2fe335e --- /dev/null +++ b/compiler-rt/test/asan/TestCases/Windows/msvc/gz.cpp @@ -0,0 +1,15 @@ +// Make sure that ASan works with non-cdecl default calling conventions. +// Many x86 projects pass `/Gz` to their compiles, so that __stdcall is the default, +// but LLVM is built with __cdecl. +// +// RUN: %clang_cl_asan -Gz %Od %s %Fe%t + +// includes a declaration of `_ReturnAddress` +#include + +#include + +int main() { + alignas(8) char buffer[8]; + __asan_poison_memory_region(buffer, sizeof buffer); +}