[llvm] [ASan][Windows] Fixing Windows shadow memory address for arm64 (PR #184902)

Zack Johnson via llvm-commits llvm-commits at lists.llvm.org
Fri Mar 6 10:22:51 PST 2026


https://github.com/zacklj89 updated https://github.com/llvm/llvm-project/pull/184902

>From 4ad810418ea9596c9efb6d5231f737ead488ffbb Mon Sep 17 00:00:00 2001
From: Zack Johnson <zajohnson at microsoft.com>
Date: Thu, 5 Mar 2026 16:53:50 -0500
Subject: [PATCH 1/3] Fixing codegen when using link.exe on arm64

---
 llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp b/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp
index d4a1b7b7813d0..aaaa02c1f0a1c 100644
--- a/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp
+++ b/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp
@@ -576,7 +576,7 @@ static ShadowMapping getShadowMapping(const Triple &TargetTriple, int LongSize,
       else
         Mapping.Offset = (kSmallX86_64ShadowOffsetBase &
                           (kSmallX86_64ShadowOffsetAlignMask << Mapping.Scale));
-    } else if (IsWindows && IsX86_64) {
+    } else if (IsWindows && (IsX86_64 || IsAArch64)) {
       Mapping.Offset = kWindowsShadowOffset64;
     } else if (IsMIPS64)
       Mapping.Offset = kMIPS64_ShadowOffset64;

>From 8287e009fe5181499f01ac85d3bcaf669aa23a73 Mon Sep 17 00:00:00 2001
From: Zack Johnson <zajohnson at microsoft.com>
Date: Thu, 5 Mar 2026 20:55:05 -0500
Subject: [PATCH 2/3] Add instrumentation test for Windows dynamic shadow
 memory address on x64 and arm64

---
 .../dynamic-shadow-windows.ll                 | 20 +++++++++++++++++++
 1 file changed, 20 insertions(+)
 create mode 100644 llvm/test/Instrumentation/AddressSanitizer/dynamic-shadow-windows.ll

diff --git a/llvm/test/Instrumentation/AddressSanitizer/dynamic-shadow-windows.ll b/llvm/test/Instrumentation/AddressSanitizer/dynamic-shadow-windows.ll
new file mode 100644
index 0000000000000..ad76816ec7de8
--- /dev/null
+++ b/llvm/test/Instrumentation/AddressSanitizer/dynamic-shadow-windows.ll
@@ -0,0 +1,20 @@
+; Test using dynamic shadow address on Windows
+;
+; Only x86_64 and aarch64 Windows should use dynamic shadow.
+; RUN: opt -passes=asan -mtriple=x86_64-pc-windows-msvc -S < %s | FileCheck %s --check-prefixes=CHECK,CHECK-DYNAMIC
+; RUN: opt -passes=asan -mtriple=aarch64-pc-windows-msvc -S < %s | FileCheck %s --check-prefixes=CHECK,CHECK-DYNAMIC
+
+define i32 @test_load(ptr %a) sanitize_address {
+; First instrumentation in the function must be to load the dynamic shadow
+; address into a local variable.
+; CHECK-LABEL: @test_load
+; CHECK: entry:
+; CHECK-DYNAMIC-NEXT: %[[SHADOW:[^ ]*]] = load i64, ptr @__asan_shadow_memory_dynamic_address
+
+; Shadow address is loaded and added into the whole offset computation.
+; CHECK-DYNAMIC: add i64 %{{.*}}, %[[SHADOW]]
+
+entry:
+  %tmp1 = load i32, ptr %a, align 4
+  ret i32 %tmp1
+}

>From b00e47546cb4c18392d47901eefed76c6376a53d Mon Sep 17 00:00:00 2001
From: Zack Johnson <zajohnson at microsoft.com>
Date: Fri, 6 Mar 2026 13:21:36 -0500
Subject: [PATCH 3/3] Use preexisting test

---
 .../AddressSanitizer/basic-msvc64.ll          |  1 +
 .../dynamic-shadow-windows.ll                 | 20 -------------------
 2 files changed, 1 insertion(+), 20 deletions(-)
 delete mode 100644 llvm/test/Instrumentation/AddressSanitizer/dynamic-shadow-windows.ll

diff --git a/llvm/test/Instrumentation/AddressSanitizer/basic-msvc64.ll b/llvm/test/Instrumentation/AddressSanitizer/basic-msvc64.ll
index 4e0424d1cbc24..69af9de1308a1 100644
--- a/llvm/test/Instrumentation/AddressSanitizer/basic-msvc64.ll
+++ b/llvm/test/Instrumentation/AddressSanitizer/basic-msvc64.ll
@@ -1,6 +1,7 @@
 ; Test basic address sanitizer instrumentation.
 ;
 ; RUN: opt -passes=asan -S  < %s | FileCheck %s
+; RUN: opt -passes=asan -mtriple=aarch64-pc-windows-msvc -S < %s | FileCheck %s
 
 target triple = "x86_64-pc-windows-msvc"
 ; CHECK: @llvm.global_ctors = {{.*}}@asan.module_ctor
diff --git a/llvm/test/Instrumentation/AddressSanitizer/dynamic-shadow-windows.ll b/llvm/test/Instrumentation/AddressSanitizer/dynamic-shadow-windows.ll
deleted file mode 100644
index ad76816ec7de8..0000000000000
--- a/llvm/test/Instrumentation/AddressSanitizer/dynamic-shadow-windows.ll
+++ /dev/null
@@ -1,20 +0,0 @@
-; Test using dynamic shadow address on Windows
-;
-; Only x86_64 and aarch64 Windows should use dynamic shadow.
-; RUN: opt -passes=asan -mtriple=x86_64-pc-windows-msvc -S < %s | FileCheck %s --check-prefixes=CHECK,CHECK-DYNAMIC
-; RUN: opt -passes=asan -mtriple=aarch64-pc-windows-msvc -S < %s | FileCheck %s --check-prefixes=CHECK,CHECK-DYNAMIC
-
-define i32 @test_load(ptr %a) sanitize_address {
-; First instrumentation in the function must be to load the dynamic shadow
-; address into a local variable.
-; CHECK-LABEL: @test_load
-; CHECK: entry:
-; CHECK-DYNAMIC-NEXT: %[[SHADOW:[^ ]*]] = load i64, ptr @__asan_shadow_memory_dynamic_address
-
-; Shadow address is loaded and added into the whole offset computation.
-; CHECK-DYNAMIC: add i64 %{{.*}}, %[[SHADOW]]
-
-entry:
-  %tmp1 = load i32, ptr %a, align 4
-  ret i32 %tmp1
-}



More information about the llvm-commits mailing list