https://github.com/arsenm created https://github.com/llvm/llvm-project/pull/147917
Start using RuntimeLibcalls in the base implementation of getSafeStackPointerLocation instead of hardcoding the function names. >From 389ea4cfc170382c158dcf0aefe832871c679bd8 Mon Sep 17 00:00:00 2001 From: Matt Arsenault <matthew.arsena...@amd.com> Date: Thu, 10 Jul 2025 15:48:10 +0900 Subject: [PATCH] SafeStack: Check if __safestack_pointer_address is available Start using RuntimeLibcalls in the base implementation of getSafeStackPointerLocation instead of hardcoding the function names. --- llvm/lib/CodeGen/TargetLoweringBase.cpp | 17 ++++++++++++++--- .../safestack-pointer-address-libcall-error.ll | 6 ++++-- 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/llvm/lib/CodeGen/TargetLoweringBase.cpp b/llvm/lib/CodeGen/TargetLoweringBase.cpp index 0a077b7b61437..7e730621e4203 100644 --- a/llvm/lib/CodeGen/TargetLoweringBase.cpp +++ b/llvm/lib/CodeGen/TargetLoweringBase.cpp @@ -1965,15 +1965,26 @@ TargetLoweringBase::getDefaultSafeStackPointerLocation(IRBuilderBase &IRB, Value * TargetLoweringBase::getSafeStackPointerLocation(IRBuilderBase &IRB) const { + // FIXME: Can this triple check be replaced with SAFESTACK_POINTER_ADDRESS + // being available? if (!TM.getTargetTriple().isAndroid()) return getDefaultSafeStackPointerLocation(IRB, true); - // Android provides a libc function to retrieve the address of the current - // thread's unsafe stack pointer. Module *M = IRB.GetInsertBlock()->getParent()->getParent(); auto *PtrTy = PointerType::getUnqual(M->getContext()); + + const char *SafestackPointerAddressName = + getLibcallName(RTLIB::SAFESTACK_POINTER_ADDRESS); + if (!SafestackPointerAddressName) { + M->getContext().emitError( + "no libcall available for safestack pointer address"); + return PoisonValue::get(PtrTy); + } + + // Android provides a libc function to retrieve the address of the current + // thread's unsafe stack pointer. FunctionCallee Fn = - M->getOrInsertFunction("__safestack_pointer_address", PtrTy); + M->getOrInsertFunction(SafestackPointerAddressName, PtrTy); return IRB.CreateCall(Fn); } diff --git a/llvm/test/Transforms/SafeStack/NVPTX/safestack-pointer-address-libcall-error.ll b/llvm/test/Transforms/SafeStack/NVPTX/safestack-pointer-address-libcall-error.ll index 9bf84585e5468..d3ea974fca0cf 100644 --- a/llvm/test/Transforms/SafeStack/NVPTX/safestack-pointer-address-libcall-error.ll +++ b/llvm/test/Transforms/SafeStack/NVPTX/safestack-pointer-address-libcall-error.ll @@ -1,6 +1,8 @@ -; RUN: not opt -disable-output -mtriple=nvptx64-- -safestack-use-pointer-address -mcpu=sm_90 -passes=safe-stack %s 2>&1 | FileCheck %s +; RUN: not opt -disable-output -mtriple=nvptx64-- -safestack-use-pointer-address -mcpu=sm_90 -passes=safe-stack %s 2>&1 | FileCheck -check-prefix=ERR1 %s +; RUN: not opt -disable-output -mtriple=nvptx64-unknown-android -mcpu=sm_90 -passes=safe-stack %s 2>&1 | FileCheck -check-prefix=ERR2 %s -; CHECK: error: no libcall available for safestack pointer address +; ERR1: error: no libcall available for safestack pointer address +; ERR2: 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) _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits