[llvm] [TLI] Add support for pvalloc() (PR #144949)
Marco Elver via llvm-commits
llvm-commits at lists.llvm.org
Thu Jun 19 13:26:45 PDT 2025
https://github.com/melver created https://github.com/llvm/llvm-project/pull/144949
While pvalloc() is a legacy POSIX function, it remains widely available in common C libraries like glibc.
Model pvalloc() in TargetLibraryInfo, allowing LLVM to correctly infer its attributes.
>From 6e1fc502d3d8aab9b840217c530c0a941ee020dc Mon Sep 17 00:00:00 2001
From: Marco Elver <elver at google.com>
Date: Thu, 19 Jun 2025 22:00:30 +0200
Subject: [PATCH] [TLI] Add support for pvalloc()
While pvalloc() is a legacy POSIX function, it remains widely available
in common C libraries like glibc.
Model pvalloc() in TargetLibraryInfo, allowing LLVM to correctly infer
its attributes.
---
llvm/include/llvm/Analysis/TargetLibraryInfo.def | 5 +++++
llvm/lib/Analysis/TargetLibraryInfo.cpp | 1 +
llvm/lib/Transforms/Utils/BuildLibCalls.cpp | 1 +
llvm/test/Transforms/InferFunctionAttrs/annotate.ll | 3 +++
llvm/test/tools/llvm-tli-checker/ps4-tli-check.yaml | 4 ++--
llvm/unittests/Analysis/TargetLibraryInfoTest.cpp | 1 +
6 files changed, 13 insertions(+), 2 deletions(-)
diff --git a/llvm/include/llvm/Analysis/TargetLibraryInfo.def b/llvm/include/llvm/Analysis/TargetLibraryInfo.def
index db566b8ee610e..014988299d37f 100644
--- a/llvm/include/llvm/Analysis/TargetLibraryInfo.def
+++ b/llvm/include/llvm/Analysis/TargetLibraryInfo.def
@@ -2046,6 +2046,11 @@ TLI_DEFINE_ENUM_INTERNAL(puts)
TLI_DEFINE_STRING_INTERNAL("puts")
TLI_DEFINE_SIG_INTERNAL(Int, Ptr)
+/// void *pvalloc(size_t size);
+TLI_DEFINE_ENUM_INTERNAL(pvalloc)
+TLI_DEFINE_STRING_INTERNAL("pvalloc")
+TLI_DEFINE_SIG_INTERNAL(Ptr, SizeT)
+
/// ssize_t pwrite(int fildes, const void *buf, size_t nbyte, off_t offset);
TLI_DEFINE_ENUM_INTERNAL(pwrite)
TLI_DEFINE_STRING_INTERNAL("pwrite")
diff --git a/llvm/lib/Analysis/TargetLibraryInfo.cpp b/llvm/lib/Analysis/TargetLibraryInfo.cpp
index c8b568354965d..8fe56b2faeba4 100644
--- a/llvm/lib/Analysis/TargetLibraryInfo.cpp
+++ b/llvm/lib/Analysis/TargetLibraryInfo.cpp
@@ -814,6 +814,7 @@ static void initializeLibCalls(TargetLibraryInfoImpl &TLI, const Triple &T,
TLI.setUnavailable(LibFunc_pclose);
TLI.setUnavailable(LibFunc_popen);
TLI.setUnavailable(LibFunc_pread);
+ TLI.setUnavailable(LibFunc_pvalloc);
TLI.setUnavailable(LibFunc_pwrite);
TLI.setUnavailable(LibFunc_read);
TLI.setUnavailable(LibFunc_readlink);
diff --git a/llvm/lib/Transforms/Utils/BuildLibCalls.cpp b/llvm/lib/Transforms/Utils/BuildLibCalls.cpp
index a5f6047b0b7ae..e36b9ee380fc4 100644
--- a/llvm/lib/Transforms/Utils/BuildLibCalls.cpp
+++ b/llvm/lib/Transforms/Utils/BuildLibCalls.cpp
@@ -512,6 +512,7 @@ bool llvm::inferNonMandatoryLibFuncAttrs(Function &F,
Changed |= setAllocKind(F, AllocFnKind::Alloc | AllocFnKind::Uninitialized | AllocFnKind::Aligned);
[[fallthrough]];
case LibFunc_valloc:
+ case LibFunc_pvalloc:
case LibFunc_malloc:
case LibFunc_vec_malloc:
Changed |= setAllocFamily(F, TheLibFunc == LibFunc_vec_malloc ? "vec_malloc"
diff --git a/llvm/test/Transforms/InferFunctionAttrs/annotate.ll b/llvm/test/Transforms/InferFunctionAttrs/annotate.ll
index 9e56b01c6b315..d39ae37706173 100644
--- a/llvm/test/Transforms/InferFunctionAttrs/annotate.ll
+++ b/llvm/test/Transforms/InferFunctionAttrs/annotate.ll
@@ -812,6 +812,9 @@ declare i32 @putchar_unlocked(i32)
; CHECK: declare noundef i32 @puts(ptr noundef readonly captures(none)) [[NOFREE_NOUNWIND]]
declare i32 @puts(ptr)
+; CHECK: declare noalias noundef ptr @pvalloc(i64 noundef) [[INACCESSIBLEMEMONLY_NOFREE_NOUNWIND_WILLRETURN_ALLOCKIND_ALLOCUNINIT_ALLOCSIZE0_FAMILY_MALLOC]]
+declare ptr @pvalloc(i64)
+
; CHECK: declare noundef i64 @pwrite(i32 noundef, ptr noundef readonly captures(none), i64 noundef, i64 noundef) [[NOFREE]]
declare i64 @pwrite(i32, ptr, i64, i64)
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 2d23b15d74b17..51a5a63ba370c 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 523 symbols, 289 available
+# AVAIL: TLI knows 524 symbols, 289 available
# AVAIL-COUNT-289: {{^}} available
# AVAIL-NOT: {{^}} available
-# UNAVAIL-COUNT-234: not available
+# UNAVAIL-COUNT-235: 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 97722483aefe0..2f1bcbae4fc50 100644
--- a/llvm/unittests/Analysis/TargetLibraryInfoTest.cpp
+++ b/llvm/unittests/Analysis/TargetLibraryInfoTest.cpp
@@ -315,6 +315,7 @@ TEST_F(TargetLibraryInfoTest, ValidProto) {
"declare i32 @putchar(i32)\n"
"declare i32 @putchar_unlocked(i32)\n"
"declare i32 @puts(i8*)\n"
+ "declare i8* @pvalloc(i64)\n"
"declare void @qsort(i8*, i64, i64, i32 (i8*, i8*)*)\n"
"declare i64 @readlink(i8*, i8*, i64)\n"
"declare i8* @realloc(i8*, i64)\n"
More information about the llvm-commits
mailing list