[clang] [llvm] [TLI] Add support for reallocarray (PR #114818)
via cfe-commits
cfe-commits at lists.llvm.org
Wed Nov 13 04:01:52 PST 2024
https://github.com/serge-sans-paille updated https://github.com/llvm/llvm-project/pull/114818
>From a1ca0d1e0cbc2f1c5eb09639a687f0eed6f6826c Mon Sep 17 00:00:00 2001
From: serge-sans-paille <sguelton at mozilla.com>
Date: Mon, 4 Nov 2024 16:50:45 +0100
Subject: [PATCH 1/3] [TLI] Add support for reallocarray
>From the man page (e.g. https://man.archlinux.org/man/reallocarray.3.en):
SYNOPSIS
reallocarray():
Since glibc 2.29:
_DEFAULT_SOURCE
glibc 2.28 and earlier:
_GNU_SOURCE
STANDARDS
reallocarray()
None.
HISTORY
reallocarray()
glibc 2.26. OpenBSD 5.6, FreeBSD 11.0.
---
clang/include/clang/Basic/Builtins.td | 7 +++++++
clang/test/Sema/builtins-gnu-mode.c | 1 +
llvm/include/llvm/Analysis/TargetLibraryInfo.def | 5 +++++
llvm/lib/Analysis/TargetLibraryInfo.cpp | 1 +
llvm/lib/Transforms/Utils/BuildLibCalls.cpp | 15 +++++++++++++++
.../tools/llvm-tli-checker/ps4-tli-check.yaml | 4 ++--
llvm/unittests/Analysis/TargetLibraryInfoTest.cpp | 1 +
7 files changed, 32 insertions(+), 2 deletions(-)
diff --git a/clang/include/clang/Basic/Builtins.td b/clang/include/clang/Basic/Builtins.td
index 9bd67e0cefebc3..1ee739b6396d65 100644
--- a/clang/include/clang/Basic/Builtins.td
+++ b/clang/include/clang/Basic/Builtins.td
@@ -3224,6 +3224,13 @@ def AllocA : GNULibBuiltin<"stdlib.h"> {
let AddBuiltinPrefixedAlias = 1;
}
+// Available in glibc by default since since 2.29 and in GNU mode before.
+def ReallocArray : GNULibBuiltin<"stdlib.h"> {
+ let Spellings = ["reallocarray"];
+ let Prototype = "void*(void*, size_t, size_t)";
+}
+
+
// POSIX malloc.h
def MemAlign : GNULibBuiltin<"malloc.h"> {
diff --git a/clang/test/Sema/builtins-gnu-mode.c b/clang/test/Sema/builtins-gnu-mode.c
index d93b6fdef027b6..f85a1e5793a703 100644
--- a/clang/test/Sema/builtins-gnu-mode.c
+++ b/clang/test/Sema/builtins-gnu-mode.c
@@ -8,6 +8,7 @@ int stpncpy;
int strdup;
int strndup;
int index;
+int reallocarray;
int rindex;
int bzero;
int strcasecmp;
diff --git a/llvm/include/llvm/Analysis/TargetLibraryInfo.def b/llvm/include/llvm/Analysis/TargetLibraryInfo.def
index fd53a26ef8fc11..db566b8ee610e5 100644
--- a/llvm/include/llvm/Analysis/TargetLibraryInfo.def
+++ b/llvm/include/llvm/Analysis/TargetLibraryInfo.def
@@ -2077,6 +2077,11 @@ TLI_DEFINE_ENUM_INTERNAL(reallocf)
TLI_DEFINE_STRING_INTERNAL("reallocf")
TLI_DEFINE_SIG_INTERNAL(Ptr, Ptr, SizeT)
+/// void *reallocarray(void *ptr, size_t nmemb, size_t size);
+TLI_DEFINE_ENUM_INTERNAL(reallocarray)
+TLI_DEFINE_STRING_INTERNAL("reallocarray")
+TLI_DEFINE_SIG_INTERNAL(Ptr, Ptr, SizeT, SizeT)
+
/// char *realpath(const char *file_name, char *resolved_name);
TLI_DEFINE_ENUM_INTERNAL(realpath)
TLI_DEFINE_STRING_INTERNAL("realpath")
diff --git a/llvm/lib/Analysis/TargetLibraryInfo.cpp b/llvm/lib/Analysis/TargetLibraryInfo.cpp
index 7f0b98ab3c1514..e4b1dbfc3e7231 100644
--- a/llvm/lib/Analysis/TargetLibraryInfo.cpp
+++ b/llvm/lib/Analysis/TargetLibraryInfo.cpp
@@ -852,6 +852,7 @@ static void initializeLibCalls(TargetLibraryInfoImpl &TLI, const Triple &T,
TLI.setUnavailable(LibFunc_memrchr);
TLI.setUnavailable(LibFunc_ntohl);
TLI.setUnavailable(LibFunc_ntohs);
+ TLI.setUnavailable(LibFunc_reallocarray);
TLI.setUnavailable(LibFunc_reallocf);
TLI.setUnavailable(LibFunc_roundeven);
TLI.setUnavailable(LibFunc_roundevenf);
diff --git a/llvm/lib/Transforms/Utils/BuildLibCalls.cpp b/llvm/lib/Transforms/Utils/BuildLibCalls.cpp
index e039457f313b29..8887f2d7792fee 100644
--- a/llvm/lib/Transforms/Utils/BuildLibCalls.cpp
+++ b/llvm/lib/Transforms/Utils/BuildLibCalls.cpp
@@ -577,6 +577,21 @@ bool llvm::inferNonMandatoryLibFuncAttrs(Function &F,
Changed |= setDoesNotCapture(F, 0);
Changed |= setArgNoUndef(F, 1);
break;
+ case LibFunc_reallocarray:
+ Changed |= setAllocFamily(F, "malloc");
+ Changed |= setAllocKind(F, AllocFnKind::Realloc);
+ Changed |= setAllocatedPointerParam(F, 0);
+ Changed |= setAllocSize(F, 1, std::nullopt);
+ Changed |= setAllocSize(F, 2, std::nullopt);
+ Changed |= setOnlyAccessesInaccessibleMemOrArgMem(F);
+ Changed |= setRetNoUndef(F);
+ Changed |= setDoesNotThrow(F);
+ Changed |= setRetDoesNotAlias(F);
+ Changed |= setWillReturn(F);
+ Changed |= setDoesNotCapture(F, 0);
+ Changed |= setArgNoUndef(F, 1);
+ Changed |= setArgNoUndef(F, 2);
+ break;
case LibFunc_read:
// May throw; "read" is a valid pthread cancellation point.
Changed |= setRetAndArgsNoUndef(F);
diff --git a/llvm/test/tools/llvm-tli-checker/ps4-tli-check.yaml b/llvm/test/tools/llvm-tli-checker/ps4-tli-check.yaml
index 6702725e4fc8a4..2d23b15d74b17d 100644
--- a/llvm/test/tools/llvm-tli-checker/ps4-tli-check.yaml
+++ b/llvm/test/tools/llvm-tli-checker/ps4-tli-check.yaml
@@ -54,10 +54,10 @@
## the exact count first; the two directives should add up to that.
## Yes, this means additions to TLI will fail this test, but the argument
## to -COUNT can't be an expression.
-# AVAIL: TLI knows 522 symbols, 289 available
+# AVAIL: TLI knows 523 symbols, 289 available
# AVAIL-COUNT-289: {{^}} available
# AVAIL-NOT: {{^}} available
-# UNAVAIL-COUNT-233: not available
+# UNAVAIL-COUNT-234: not available
# UNAVAIL-NOT: not available
## This is a large file so it's worth telling lit to stop here.
diff --git a/llvm/unittests/Analysis/TargetLibraryInfoTest.cpp b/llvm/unittests/Analysis/TargetLibraryInfoTest.cpp
index 982d00c5d33593..b9900db68b1420 100644
--- a/llvm/unittests/Analysis/TargetLibraryInfoTest.cpp
+++ b/llvm/unittests/Analysis/TargetLibraryInfoTest.cpp
@@ -318,6 +318,7 @@ TEST_F(TargetLibraryInfoTest, ValidProto) {
"declare void @qsort(i8*, i64, i64, i32 (i8*, i8*)*)\n"
"declare i64 @readlink(i8*, i8*, i64)\n"
"declare i8* @realloc(i8*, i64)\n"
+ "declare i8* @reallocarray(i8*, i64, i64)\n"
"declare i8* @reallocf(i8*, i64)\n"
"declare double @remainder(double, double)\n"
"declare float @remainderf(float, float)\n"
>From 4c328629e70371cc1a7e00f4fdcd7e000eec0e8a Mon Sep 17 00:00:00 2001
From: serge-sans-paille <sguelton at mozilla.com>
Date: Wed, 13 Nov 2024 10:00:48 +0100
Subject: [PATCH 2/3] fixup! [TLI] Add support for reallocarray
---
clang/include/clang/Basic/Builtins.td | 7 -------
llvm/lib/Transforms/Utils/BuildLibCalls.cpp | 3 +--
llvm/test/Transforms/InferFunctionAttrs/annotate.ll | 4 ++++
3 files changed, 5 insertions(+), 9 deletions(-)
diff --git a/clang/include/clang/Basic/Builtins.td b/clang/include/clang/Basic/Builtins.td
index 1ee739b6396d65..9bd67e0cefebc3 100644
--- a/clang/include/clang/Basic/Builtins.td
+++ b/clang/include/clang/Basic/Builtins.td
@@ -3224,13 +3224,6 @@ def AllocA : GNULibBuiltin<"stdlib.h"> {
let AddBuiltinPrefixedAlias = 1;
}
-// Available in glibc by default since since 2.29 and in GNU mode before.
-def ReallocArray : GNULibBuiltin<"stdlib.h"> {
- let Spellings = ["reallocarray"];
- let Prototype = "void*(void*, size_t, size_t)";
-}
-
-
// POSIX malloc.h
def MemAlign : GNULibBuiltin<"malloc.h"> {
diff --git a/llvm/lib/Transforms/Utils/BuildLibCalls.cpp b/llvm/lib/Transforms/Utils/BuildLibCalls.cpp
index 8887f2d7792fee..e4f4052e5e4815 100644
--- a/llvm/lib/Transforms/Utils/BuildLibCalls.cpp
+++ b/llvm/lib/Transforms/Utils/BuildLibCalls.cpp
@@ -581,8 +581,7 @@ bool llvm::inferNonMandatoryLibFuncAttrs(Function &F,
Changed |= setAllocFamily(F, "malloc");
Changed |= setAllocKind(F, AllocFnKind::Realloc);
Changed |= setAllocatedPointerParam(F, 0);
- Changed |= setAllocSize(F, 1, std::nullopt);
- Changed |= setAllocSize(F, 2, std::nullopt);
+ Changed |= setAllocSize(F, 1, 2);
Changed |= setOnlyAccessesInaccessibleMemOrArgMem(F);
Changed |= setRetNoUndef(F);
Changed |= setDoesNotThrow(F);
diff --git a/llvm/test/Transforms/InferFunctionAttrs/annotate.ll b/llvm/test/Transforms/InferFunctionAttrs/annotate.ll
index 452d90aa98d88d..e63487de61ba24 100644
--- a/llvm/test/Transforms/InferFunctionAttrs/annotate.ll
+++ b/llvm/test/Transforms/InferFunctionAttrs/annotate.ll
@@ -827,6 +827,9 @@ declare i64 @readlink(ptr, ptr, i64)
; CHECK: declare noalias noundef ptr @realloc(ptr allocptr nocapture, i64 noundef) [[INACCESSIBLEMEMORARGMEMONLY_NOUNWIND_WILLRETURN_ALLOCKIND_REALLOC_ALLOCSIZE1_FAMILY_MALLOC:#[0-9]+]]
declare ptr @realloc(ptr, i64)
+; CHECK: declare noalias noundef ptr @reallocarray(ptr allocptr nocapture, i64 noundef, i64 noundef) [[INACCESSIBLEMEMORARGMEMONLY_NOUNWIND_WILLRETURN_ALLOCKIND_REALLOC_ALLOCSIZE12_FAMILY_MALLOC:#[0-9]+]]
+declare ptr @reallocarray(ptr, i64, i64)
+
; CHECK: declare noalias noundef ptr @reallocf(ptr allocptr nocapture, i64 noundef) [[INACCESSIBLEMEMORARGMEMONLY_NOUNWIND_WILLRETURN_ALLOCKIND_REALLOC_ALLOCSIZE1_FAMILY_MALLOC]]
declare ptr @reallocf(ptr, i64)
@@ -1194,6 +1197,7 @@ declare void @memset_pattern16(ptr, ptr, i64)
; CHECK-DAG: attributes [[NOFREE]] = { nofree }
; CHECK-DAG: attributes [[ARGMEMONLY_NOFREE_NOUNWIND]] = { nofree nounwind memory(argmem: readwrite) }
; CHECK-DAG: attributes [[INACCESSIBLEMEMORARGMEMONLY_NOUNWIND_WILLRETURN_ALLOCKIND_REALLOC_ALLOCSIZE1_FAMILY_MALLOC]] = { mustprogress nounwind willreturn allockind("realloc") allocsize(1) memory(argmem: readwrite, inaccessiblemem: readwrite) "alloc-family"="malloc" }
+; CHECK-DAG: attributes [[INACCESSIBLEMEMORARGMEMONLY_NOUNWIND_WILLRETURN_ALLOCKIND_REALLOC_ALLOCSIZE12_FAMILY_MALLOC]] = { mustprogress nounwind willreturn allockind("realloc") allocsize(1,2) memory(argmem: readwrite, inaccessiblemem: readwrite) "alloc-family"="malloc" }
; CHECK-DAG: attributes [[INACCESSIBLEMEMORARGONLY_NOFREE_NOUNWIND_WILLRETURN_FAMILY_MALLOC]] = { mustprogress nofree nounwind willreturn memory(argmem: readwrite, inaccessiblemem: readwrite) "alloc-family"="malloc" }
; CHECK-DAG: attributes [[NOFREE_COLD]] = { cold nofree }
; CHECK-DAG: attributes [[NOFREE_COLD_NORETURN]] = { cold nofree noreturn }
>From a14e23fa12a51a9a5fe26a7153ee295993a0850e Mon Sep 17 00:00:00 2001
From: serge-sans-paille <sguelton at mozilla.com>
Date: Wed, 13 Nov 2024 12:17:33 +0100
Subject: [PATCH 3/3] fixup! [TLI] Add support for reallocarray
---
clang/test/Sema/builtins-gnu-mode.c | 1 -
1 file changed, 1 deletion(-)
diff --git a/clang/test/Sema/builtins-gnu-mode.c b/clang/test/Sema/builtins-gnu-mode.c
index f85a1e5793a703..d93b6fdef027b6 100644
--- a/clang/test/Sema/builtins-gnu-mode.c
+++ b/clang/test/Sema/builtins-gnu-mode.c
@@ -8,7 +8,6 @@ int stpncpy;
int strdup;
int strndup;
int index;
-int reallocarray;
int rindex;
int bzero;
int strcasecmp;
More information about the cfe-commits
mailing list