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.arsena...@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 } _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits