llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-llvm-transforms @llvm/pr-subscribers-backend-nvptx 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 _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits