[compiler-rt] Remove `__cdecl` from _ReturnAddress (PR #72919)

nicole mazzuca via llvm-commits llvm-commits at lists.llvm.org
Mon Nov 20 14:11:56 PST 2023


https://github.com/strega-nil created https://github.com/llvm/llvm-project/pull/72919

As an intrinsic, `_ReturnAddress` does not need it; additionally,
if someone else declares `_ReturnAddress` without `__cdecl` (for
example, `<intrin.h>`)

Additionally, actually add a test for this change. I've tested it locally with both LLVM and MSVC.

>From b979ec222f4edf6841805f930473d07002653fa8 Mon Sep 17 00:00:00 2001
From: Nicole Mazzuca <nicole at strega-nil.co>
Date: Fri, 17 Nov 2023 16:32:55 -0800
Subject: [PATCH 1/2] Remove __cdecl from _ReturnAddress

As an intrinsic, `_ReturnAddress` does not need it; additionally,
if someone else declares `_ReturnAddress` without `__cdecl` (for
example, `<intrin.h>`)
---
 .../include/sanitizer/common_interface_defs.h     |  2 +-
 .../test/asan/TestCases/Windows/msvc/gz.cpp       | 15 +++++++++++++++
 2 files changed, 16 insertions(+), 1 deletion(-)
 create mode 100644 compiler-rt/test/asan/TestCases/Windows/msvc/gz.cpp

diff --git a/compiler-rt/include/sanitizer/common_interface_defs.h b/compiler-rt/include/sanitizer/common_interface_defs.h
index 56d9e008fa06e96..f9fce595b37bb89 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 000000000000000..cbb2df955b70a8a
--- /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 <intrin.h>
+
+#include <sanitizer/asan_interface.h>
+
+int main() {
+  __alignas(8) char buffer[8];
+  __asan_poison_memory_region(buffer, sizeof buffer);
+}

>From cea15763e4c7f00f1e14e8418196cc12a527334f Mon Sep 17 00:00:00 2001
From: Nicole Mazzuca <nicole at strega-nil.co>
Date: Mon, 20 Nov 2023 13:29:13 -0800
Subject: [PATCH 2/2] fix test

---
 compiler-rt/test/asan/TestCases/Windows/msvc/gz.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/compiler-rt/test/asan/TestCases/Windows/msvc/gz.cpp b/compiler-rt/test/asan/TestCases/Windows/msvc/gz.cpp
index cbb2df955b70a8a..52a59d2fe335e7a 100644
--- a/compiler-rt/test/asan/TestCases/Windows/msvc/gz.cpp
+++ b/compiler-rt/test/asan/TestCases/Windows/msvc/gz.cpp
@@ -10,6 +10,6 @@
 #include <sanitizer/asan_interface.h>
 
 int main() {
-  __alignas(8) char buffer[8];
+  alignas(8) char buffer[8];
   __asan_poison_memory_region(buffer, sizeof buffer);
 }



More information about the llvm-commits mailing list