[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