[llvm-branch-commits] [llvm] SafeStack: Emit call to __stack_chk_fail through RuntimeLibcalls (PR #147915)
Matt Arsenault via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Tue Jul 15 01:04:50 PDT 2025
https://github.com/arsenm updated https://github.com/llvm/llvm-project/pull/147915
>From a74db1073788734efda1d6230b9da4fc4af7d1e7 Mon Sep 17 00:00:00 2001
From: Matt Arsenault <Matthew.Arsenault at amd.com>
Date: Thu, 10 Jul 2025 15:01:13 +0900
Subject: [PATCH] SafeStack: Emit call to __stack_chk_fail through
RuntimeLibcalls
Avoid hardcoding the function name, and query if it's really
supported or not.
---
llvm/lib/CodeGen/SafeStack.cpp | 10 +++++++++-
llvm/test/Transforms/SafeStack/NVPTX/lit.local.cfg | 2 ++
.../SafeStack/NVPTX/safestack-libcall-error.ll | 12 ++++++++++++
3 files changed, 23 insertions(+), 1 deletion(-)
create mode 100644 llvm/test/Transforms/SafeStack/NVPTX/lit.local.cfg
create mode 100644 llvm/test/Transforms/SafeStack/NVPTX/safestack-libcall-error.ll
diff --git a/llvm/lib/CodeGen/SafeStack.cpp b/llvm/lib/CodeGen/SafeStack.cpp
index da229f86f24ce..a6c1a76f53f39 100644
--- a/llvm/lib/CodeGen/SafeStack.cpp
+++ b/llvm/lib/CodeGen/SafeStack.cpp
@@ -475,8 +475,16 @@ void SafeStack::checkStackGuard(IRBuilder<> &IRB, Function &F, Instruction &RI,
SplitBlockAndInsertIfThen(Cmp, &RI, /* Unreachable */ true, Weights, DTU);
IRBuilder<> IRBFail(CheckTerm);
// FIXME: respect -fsanitize-trap / -ftrap-function here?
+ const char *StackChkFailName =
+ TL.getLibcallName(RTLIB::STACKPROTECTOR_CHECK_FAIL);
+ if (!StackChkFailName) {
+ F.getContext().emitError(
+ "no libcall available for stackprotector check fail");
+ return;
+ }
+
FunctionCallee StackChkFail =
- F.getParent()->getOrInsertFunction("__stack_chk_fail", IRB.getVoidTy());
+ F.getParent()->getOrInsertFunction(StackChkFailName, IRB.getVoidTy());
IRBFail.CreateCall(StackChkFail, {});
}
diff --git a/llvm/test/Transforms/SafeStack/NVPTX/lit.local.cfg b/llvm/test/Transforms/SafeStack/NVPTX/lit.local.cfg
new file mode 100644
index 0000000000000..0d37b86e1c8e6
--- /dev/null
+++ b/llvm/test/Transforms/SafeStack/NVPTX/lit.local.cfg
@@ -0,0 +1,2 @@
+if not "NVPTX" in config.root.targets:
+ config.unsupported = True
diff --git a/llvm/test/Transforms/SafeStack/NVPTX/safestack-libcall-error.ll b/llvm/test/Transforms/SafeStack/NVPTX/safestack-libcall-error.ll
new file mode 100644
index 0000000000000..a17a9dd867e3a
--- /dev/null
+++ b/llvm/test/Transforms/SafeStack/NVPTX/safestack-libcall-error.ll
@@ -0,0 +1,12 @@
+; RUN: not opt -disable-output -mtriple=nvptx64-- -mcpu=sm_90 -passes=safe-stack %s 2>&1 | FileCheck %s
+
+; CHECK: error: no libcall available for stackprotector check fail
+define void @foo(i32 %t) #0 {
+ %vla = alloca i32, i32 %t, align 4
+ call void @baz(ptr %vla)
+ ret void
+}
+
+declare void @baz(ptr)
+
+attributes #0 = { nounwind safestack sspstrong }
More information about the llvm-branch-commits
mailing list