summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatt Arsenault <Matthew.Arsenault@amd.com>2025-11-07 15:27:24 -0800
committerMatt Arsenault <arsenm2@gmail.com>2025-11-11 19:23:52 -0800
commitabf1fe120ccc125e06d5151396697bc7453d3233 (patch)
treeaf0c6f03570f0d9ca9e65eb5b388723da81abb1e
parent57b5e69daf1ed481aa6b682979c1539fd4d9f3aa (diff)
RuntimeLibcalls: Add __memcpy_chk, __memmove_chk, __memset_chkusers/arsenm/runtime-libcalls/add-memcpy-memmove-memset-chk-functions
These were in TargetLibraryInfo, but missing from RuntimeLibcalls. This only adds the cases that already have the non-chk variants already. Copies the enabled-by-default logic from TargetLibraryInfo, which is probably overly permissive. Only isPS opts-out.
-rw-r--r--llvm/include/llvm/IR/RuntimeLibcalls.td17
-rw-r--r--llvm/test/Transforms/Util/DeclareRuntimeLibcalls/basic.ll4
-rw-r--r--llvm/test/Transforms/Util/DeclareRuntimeLibcalls/ps.ll6
3 files changed, 25 insertions, 2 deletions
diff --git a/llvm/include/llvm/IR/RuntimeLibcalls.td b/llvm/include/llvm/IR/RuntimeLibcalls.td
index c22af429d1da..11e6127e0741 100644
--- a/llvm/include/llvm/IR/RuntimeLibcalls.td
+++ b/llvm/include/llvm/IR/RuntimeLibcalls.td
@@ -35,6 +35,9 @@ def isNotOSLinuxAndNotOSOpenBSD : RuntimeLibcallPredicate<
def isNotOSAIXAndNotOSOpenBSD : RuntimeLibcallPredicate<
[{!TT.isOSAIX() && !TT.isOSOpenBSD()}]>;
+def isNotPS : RuntimeLibcallPredicate<
+ [{!TT.isPS()}]>;
+
// OpenBSD uses __guard_local. AIX uses __ssp_canary_word, MSVC/Windows
// Itanium uses __security_cookie
def hasStackChkFail : RuntimeLibcallPredicate<
@@ -374,8 +377,11 @@ foreach FPTy = ["F32", "F64", "F128", "PPCF128"] in {
// Memory
def MEMCMP : RuntimeLibcall;
def MEMCPY : RuntimeLibcall;
+def MEMCPY_CHK : RuntimeLibcall;
def MEMMOVE : RuntimeLibcall;
+def MEMMOVE_CHK : RuntimeLibcall;
def MEMSET : RuntimeLibcall;
+def MEMSET_CHK : RuntimeLibcall;
def CALLOC : RuntimeLibcall;
def BZERO : RuntimeLibcall;
def STRLEN : RuntimeLibcall;
@@ -1091,6 +1097,10 @@ def memcpy : RuntimeLibcallImpl<MEMCPY>;
def memmove : RuntimeLibcallImpl<MEMMOVE>;
def memset : RuntimeLibcallImpl<MEMSET>;
+def __memcpy_chk : RuntimeLibcallImpl<MEMCPY_CHK>;
+def __memmove_chk : RuntimeLibcallImpl<MEMMOVE_CHK>;
+def __memset_chk : RuntimeLibcallImpl<MEMSET_CHK>;
+
// DSEPass can emit calloc if it finds a pair of malloc/memset
def calloc : RuntimeLibcallImpl<CALLOC>;
@@ -2624,8 +2634,10 @@ defvar X86_F128_Libcalls = LibcallImpls<(add LibmF128Libcalls, LibmF128FiniteLib
defvar SinCosF32F64Libcalls = LibcallImpls<(add sincosf, sincos), hasSinCos_f32_f64>;
+defvar MemChkLibcalls = [__memcpy_chk, __memset_chk, __memmove_chk];
+
defvar X86CommonLibcalls =
- (add (sub WinDefaultLibcallImpls, WindowsDivRemMulLibcallOverrides),
+ (add (sub WinDefaultLibcallImpls, WindowsDivRemMulLibcallOverrides, MemChkLibcalls),
DarwinSinCosStret, DarwinExp10,
X86_F128_Libcalls,
LibmHasSinCosF80, // FIXME: Depends on long double
@@ -2641,7 +2653,8 @@ defvar X86CommonLibcalls =
// FIXME: MSVCRT doesn't have powi. The f128 case is added as a
// hack for one test relying on it.
__powitf2_f128,
- DefaultStackProtector
+ DefaultStackProtector,
+ LibcallImpls<(add MemChkLibcalls), isNotPS>
);
defvar Windows32DivRemMulCalls =
diff --git a/llvm/test/Transforms/Util/DeclareRuntimeLibcalls/basic.ll b/llvm/test/Transforms/Util/DeclareRuntimeLibcalls/basic.ll
index be8cae261c7b..db0cc24c287b 100644
--- a/llvm/test/Transforms/Util/DeclareRuntimeLibcalls/basic.ll
+++ b/llvm/test/Transforms/Util/DeclareRuntimeLibcalls/basic.ll
@@ -12,6 +12,10 @@ define float @sinf(float %x) {
; CHECK: declare void @_Unwind_Resume(...)
+; CHECK: declare void @__memcpy_chk(...)
+; CHECK: declare void @__memmove_chk(...)
+; CHECK: declare void @__memset_chk(...)
+
; CHECK: declare void @__umodti3(...)
; CHECK: declare void @acosf(...)
diff --git a/llvm/test/Transforms/Util/DeclareRuntimeLibcalls/ps.ll b/llvm/test/Transforms/Util/DeclareRuntimeLibcalls/ps.ll
new file mode 100644
index 000000000000..bcdcc63400f7
--- /dev/null
+++ b/llvm/test/Transforms/Util/DeclareRuntimeLibcalls/ps.ll
@@ -0,0 +1,6 @@
+; RUN: opt -S -passes=declare-runtime-libcalls -mtriple=x86_64-scei-ps4 < %s | FileCheck %s
+; RUN: opt -S -passes=declare-runtime-libcalls -mtriple=x86_64-scei-ps5 < %s | FileCheck %s
+
+; CHECK-NOT: __memcpy_chk
+; CHECK-NOT: __memset_chk
+; CHECK-NOT: __memmove_chk