[llvm-branch-commits] [llvm] SafeStack: Check if __safestack_pointer_address is available (PR #147917)
via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Thu Jul 10 01:02:42 PDT 2025
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-backend-nvptx
Author: Matt Arsenault (arsenm)
<details>
<summary>Changes</summary>
Start using RuntimeLibcalls in the base implementation of
getSafeStackPointerLocation instead of hardcoding the function
names.
---
Full diff: https://github.com/llvm/llvm-project/pull/147917.diff
2 Files Affected:
- (modified) llvm/lib/CodeGen/TargetLoweringBase.cpp (+14-3)
- (modified) llvm/test/Transforms/SafeStack/NVPTX/safestack-pointer-address-libcall-error.ll (+4-2)
``````````diff
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)
``````````
</details>
https://github.com/llvm/llvm-project/pull/147917
More information about the llvm-branch-commits
mailing list