[llvm] [GlobalISel] Fix null deref when target has no stack guard variable (PR #224252)

via llvm-commits llvm-commits at lists.llvm.org
Thu Sep 17 06:56:09 PDT 2026


https://github.com/tfzee updated https://github.com/llvm/llvm-project/pull/224252

>From dd73780a7e2e966845dff88cef03fe387b3ec493 Mon Sep 17 00:00:00 2001
From: "Ziegler, Tim" <tim.ziegler at intel.com>
Date: Thu, 17 Sep 2026 11:36:02 +0200
Subject: [PATCH 1/4] Add nullptr check

---
 llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp b/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp
index c491a8812e697..4e1046f7539d5 100644
--- a/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp
+++ b/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp
@@ -4907,8 +4907,11 @@ bool IRTranslatorImpl::emitSPDescriptorParent(StackProtectorDescriptor &SPD,
   } else {
     // TODO: test using android subtarget when we support @llvm.thread.pointer.
     const Value *IRGuard = TLI->getSDagStackGuard(M, *Libcalls);
+    if(!IRGuard) {
+      LLVM_DEBUG(dbgs() << "Failed to lower call to stack protector check\n");
+      return false;
+    }
     Register GuardPtr = getOrCreateVReg(*IRGuard);
-
     Guard = CurBuilder
                 ->buildLoad(PtrMemTy, GuardPtr,
                             MachinePointerInfo::getFixedStack(*MF, FI), Align,

>From 2f5786759dcd24a386f765b88cf5873b854f2a12 Mon Sep 17 00:00:00 2001
From: "Ziegler, Tim" <tim.ziegler at intel.com>
Date: Thu, 17 Sep 2026 11:59:19 +0200
Subject: [PATCH 2/4] Clean unneeded edit

---
 llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp | 1 +
 1 file changed, 1 insertion(+)

diff --git a/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp b/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp
index 4e1046f7539d5..42cf2c8f700aa 100644
--- a/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp
+++ b/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp
@@ -4912,6 +4912,7 @@ bool IRTranslatorImpl::emitSPDescriptorParent(StackProtectorDescriptor &SPD,
       return false;
     }
     Register GuardPtr = getOrCreateVReg(*IRGuard);
+
     Guard = CurBuilder
                 ->buildLoad(PtrMemTy, GuardPtr,
                             MachinePointerInfo::getFixedStack(*MF, FI), Align,

>From bbceeaf898427f709ddad2804d139a035f0eacbf Mon Sep 17 00:00:00 2001
From: "Ziegler, Tim" <tim.ziegler at intel.com>
Date: Thu, 17 Sep 2026 12:00:26 +0200
Subject: [PATCH 3/4] Fix formatting

---
 llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp b/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp
index 42cf2c8f700aa..52731edb366aa 100644
--- a/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp
+++ b/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp
@@ -4907,7 +4907,7 @@ bool IRTranslatorImpl::emitSPDescriptorParent(StackProtectorDescriptor &SPD,
   } else {
     // TODO: test using android subtarget when we support @llvm.thread.pointer.
     const Value *IRGuard = TLI->getSDagStackGuard(M, *Libcalls);
-    if(!IRGuard) {
+    if (!IRGuard) {
       LLVM_DEBUG(dbgs() << "Failed to lower call to stack protector check\n");
       return false;
     }

>From a41568cc6f35da8af03a64916379dd3312eae893 Mon Sep 17 00:00:00 2001
From: "Ziegler, Tim" <tim.ziegler at intel.com>
Date: Thu, 17 Sep 2026 15:55:55 +0200
Subject: [PATCH 4/4] Added spirv test

---
 llvm/test/CodeGen/SPIRV/stack-protector.ll | 17 +++++++++++++++++
 1 file changed, 17 insertions(+)
 create mode 100644 llvm/test/CodeGen/SPIRV/stack-protector.ll

diff --git a/llvm/test/CodeGen/SPIRV/stack-protector.ll b/llvm/test/CodeGen/SPIRV/stack-protector.ll
new file mode 100644
index 0000000000000..1b35cad3248cd
--- /dev/null
+++ b/llvm/test/CodeGen/SPIRV/stack-protector.ll
@@ -0,0 +1,17 @@
+; RUN: not --crash llc -mtriple=spirv64-unknown-unknown -filetype=null %s 2>&1 | FileCheck %s
+; RUN: not --crash llc -mtriple=spirv32-unknown-unknown -filetype=null %s 2>&1 | FileCheck %s
+
+; SPIRV has no STACK_CHECK_GUARD libcall impl, so getSDagStackGuard() returns
+; nullptr. The stack protector check must report a failure to translate instead
+; of dereferencing the null guard value.
+
+; CHECK: error: unable to lower stackguard
+; CHECK: LLVM ERROR: unable to translate basic block
+
+define void @func() sspreq nounwind {
+  %alloca = alloca i32, align 4
+  call void @capture(ptr %alloca)
+  ret void
+}
+
+declare void @capture(ptr)



More information about the llvm-commits mailing list