[llvm-branch-commits] [llvm] SafeStack: Emit __safestack_pointer_address call through RuntimeLibcalls (PR #147916)
via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Thu Jul 10 01:02:31 PDT 2025
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-llvm-ir
Author: Matt Arsenault (arsenm)
<details>
<summary>Changes</summary>
Stop using hardcoded function named and check availability. This only fixes
the forced usage via command line in the pass itself; the implementations
inside of TargetLoweringBase hide additional call emission.
---
Full diff: https://github.com/llvm/llvm-project/pull/147916.diff
4 Files Affected:
- (modified) llvm/include/llvm/IR/RuntimeLibcalls.td (+6)
- (modified) llvm/lib/CodeGen/SafeStack.cpp (+9-1)
- (modified) llvm/lib/IR/RuntimeLibcalls.cpp (+5)
- (added) llvm/test/Transforms/SafeStack/NVPTX/safestack-pointer-address-libcall-error.ll (+12)
``````````diff
diff --git a/llvm/include/llvm/IR/RuntimeLibcalls.td b/llvm/include/llvm/IR/RuntimeLibcalls.td
index 29de1206a8974..2c26c05402e4e 100644
--- a/llvm/include/llvm/IR/RuntimeLibcalls.td
+++ b/llvm/include/llvm/IR/RuntimeLibcalls.td
@@ -339,6 +339,9 @@ defset list<RuntimeLibcall> LibCalls__OutOfLineAtomic = {
def STACKPROTECTOR_CHECK_FAIL : RuntimeLibcall;
def STACK_SMASH_HANDLER : RuntimeLibcall;
+// Safe stack
+def SAFESTACK_POINTER_ADDRESS : RuntimeLibcall;
+
// Deoptimization
def DEOPTIMIZE : RuntimeLibcall;
@@ -656,6 +659,9 @@ foreach lc = LibCalls__atomic in {
// Stack Protector Fail
def __stack_chk_fail : RuntimeLibcallImpl<STACKPROTECTOR_CHECK_FAIL>;
+// Safe stack.
+def __safestack_pointer_address : RuntimeLibcallImpl<SAFESTACK_POINTER_ADDRESS>;
+
// Deoptimization
def __llvm_deoptimize : RuntimeLibcallImpl<DEOPTIMIZE>;
diff --git a/llvm/lib/CodeGen/SafeStack.cpp b/llvm/lib/CodeGen/SafeStack.cpp
index a6c1a76f53f39..996207034d076 100644
--- a/llvm/lib/CodeGen/SafeStack.cpp
+++ b/llvm/lib/CodeGen/SafeStack.cpp
@@ -799,8 +799,16 @@ bool SafeStack::run() {
IRB.SetCurrentDebugLocation(
DILocation::get(SP->getContext(), SP->getScopeLine(), 0, SP));
if (SafeStackUsePointerAddress) {
+ const char *SafestackPointerAddressName =
+ TL.getLibcallName(RTLIB::SAFESTACK_POINTER_ADDRESS);
+ if (!SafestackPointerAddressName) {
+ F.getContext().emitError(
+ "no libcall available for safestack pointer address");
+ return false;
+ }
+
FunctionCallee Fn = F.getParent()->getOrInsertFunction(
- "__safestack_pointer_address", IRB.getPtrTy(0));
+ SafestackPointerAddressName, IRB.getPtrTy(0));
UnsafeStackPtr = IRB.CreateCall(Fn);
} else {
UnsafeStackPtr = TL.getSafeStackPointerLocation(IRB);
diff --git a/llvm/lib/IR/RuntimeLibcalls.cpp b/llvm/lib/IR/RuntimeLibcalls.cpp
index f9bd9b6029234..21e8fdb9f7feb 100644
--- a/llvm/lib/IR/RuntimeLibcalls.cpp
+++ b/llvm/lib/IR/RuntimeLibcalls.cpp
@@ -293,6 +293,11 @@ void RuntimeLibcallsInfo::initLibcalls(const Triple &TT,
setLibcallImpl(RTLIB::POWI_F64, RTLIB::Unsupported);
}
+ if (TT.isAndroid()) {
+ setLibcallImpl(RTLIB::SAFESTACK_POINTER_ADDRESS,
+ RTLIB::__safestack_pointer_address);
+ }
+
// Setup Windows compiler runtime calls.
if (TT.getArch() == Triple::x86 &&
(TT.isWindowsMSVCEnvironment() || TT.isWindowsItaniumEnvironment())) {
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
new file mode 100644
index 0000000000000..9bf84585e5468
--- /dev/null
+++ b/llvm/test/Transforms/SafeStack/NVPTX/safestack-pointer-address-libcall-error.ll
@@ -0,0 +1,12 @@
+; RUN: not opt -disable-output -mtriple=nvptx64-- -safestack-use-pointer-address -mcpu=sm_90 -passes=safe-stack %s 2>&1 | FileCheck %s
+
+; CHECK: error: no libcall available for safestack pointer address
+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 }
``````````
</details>
https://github.com/llvm/llvm-project/pull/147916
More information about the llvm-branch-commits
mailing list