[clang] [llvm] [CodeGen] Use unique_ptr for FunctionInfo to prevent memory leaks (PR #196603)
llvmorg-github-actions[bot] wrote:
@llvm/pr-subscribers-clang-codegen
Author: Vitaly Buka (vitalybuka)
Changes
Raw pointer return from `FunctionInfo::create` caused leaks in callers
like `computeABIInfoUsingLib`, breaking BPF tests on ASan bots.
Using `std::unique_ptr` enforces automatic cleanup.
This fix was developed with the assistance of Gemini.
Fixes leak from 07b5dfe9473c.
Buildbot: https://lab.llvm.org/buildbot/#/builders/52/builds/17090
---
Full diff: https://github.com/llvm/llvm-project/pull/196603.diff
3 Files Affected:
- (modified) clang/lib/CodeGen/CGCall.cpp (+1-1)
- (modified) llvm/include/llvm/ABI/FunctionInfo.h (+1-1)
- (modified) llvm/lib/ABI/FunctionInfo.cpp (+6-5)
``diff
diff --git a/clang/lib/CodeGen/CGCall.cpp b/clang/lib/CodeGen/CGCall.cpp
index 1cafe364c4c42..a2b9c945788ee 100644
--- a/clang/lib/CodeGen/CGCall.cpp
+++ b/clang/lib/CodeGen/CGCall.cpp
@@ -843,7 +843,7 @@ void CodeGenModule::computeABIInfoUsingLib(CGFunctionInfo
&FI) {
if (Required.allowsOptionalArgs())
NumRequired = Required.getNumRequiredArgs();
- llvm::abi::FunctionInfo *AbiFI = llvm::abi::FunctionInfo::create(
+ auto AbiFI = llvm::abi::FunctionInfo::create(
FI.getCallingConvention(), AbiMapper->convertType(FI.getReturnType()),
MappedArgTypes, NumRequired);
diff --git a/llvm/include/llvm/ABI/FunctionInfo.h
b/llvm/include/llvm/ABI/FunctionInfo.h
index 7f7b6a44ba6ad..0ebd0700836e2 100644
--- a/llvm/include/llvm/ABI/FunctionInfo.h
+++ b/llvm/include/llvm/ABI/FunctionInfo.h
@@ -234,7 +234,7 @@ class FunctionInfo final : private
TrailingObjects {
unsigned arg_size() const { return NumArgs; }
- static FunctionInfo *
+ static std::unique_ptr
create(CallingConv::ID CC, const Type *ReturnType,
ArrayRef ArgTypes,
std::optional NumRequired = std::nullopt);
diff --git a/llvm/lib/ABI/FunctionInfo.cpp b/llvm/lib/ABI/FunctionInfo.cpp
index f89d90c74ea03..7096392135ce8 100644
--- a/llvm/lib/ABI/FunctionInfo.cpp
+++ b/llvm/lib/ABI/FunctionInfo.cpp
@@ -12,16 +12,17 @@
using namespace llvm;
using namespace llvm::abi;
-FunctionInfo *FunctionInfo::create(CallingConv::ID CC, const Type *ReturnType,
- ArrayRef ArgTypes,
- std::optional NumRequired) {
+std::unique_ptr
+FunctionInfo::create(CallingConv::ID CC, const Type *ReturnType,
+ ArrayRef ArgTypes,
+ std::optional NumRequired) {
assert(!NumRequired || *NumRequired <= ArgTypes.size());
void *Buffer = operator new(totalSizeToAlloc(ArgTypes.size()));
- FunctionInfo *FI =
- new (Buffer) FunctionInfo(CC, ReturnType, ArgTypes.size(), NumRequired);
+ std::unique_ptr FI(
+ new (Buffer) FunctionInfo(CC, ReturnType, ArgTypes.size(), NumRequired));
ArgEntry *Args = FI->getTrailingObjects();
for (unsigned I = 0; I < ArgTypes.size(); ++I)
``
https://github.com/llvm/llvm-project/pull/196603
___
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [CodeGen] Use unique_ptr for FunctionInfo to prevent memory leaks (PR #196603)
https://github.com/vitalybuka auto_merge_enabled https://github.com/llvm/llvm-project/pull/196603 ___ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [CodeGen] Use unique_ptr for FunctionInfo to prevent memory leaks (PR #196603)
github-actions[bot] wrote: # :window: Windows x64 Test Results * 61855 tests passed * 1691 tests skipped All executed tests passed, but another part of the build **failed**. Click on a failure below to see the details. [code=4294967295] bin/OrcV2CBindingsBasicUsage.exe ``` FAILED: [code=4294967295] bin/OrcV2CBindingsBasicUsage.exe C:\Windows\system32\cmd.exe /C "cd . && C:\BuildTools\Common7\IDE\CommonExtensions\Microsoft\CMake\CMake\bin\cmake.exe -E vs_link_exe --msvc-ver=1944 --intdir=examples\OrcV2Examples\OrcV2CBindingsBasicUsage\CMakeFiles\OrcV2CBindingsBasicUsage.dir --rc="C:\Program Files (x86)\Windows Kits\10\bin\10.0.26100.0\x64\rc.exe" --mt="C:\Program Files (x86)\Windows Kits\10\bin\10.0.26100.0\x64\mt.exe" --manifests -- C:\clang\clang-msvc\bin\lld-link.exe /nologo examples\OrcV2Examples\OrcV2CBindingsBasicUsage\CMakeFiles\OrcV2CBindingsBasicUsage.dir\OrcV2CBindingsBasicUsage.c.obj examples\OrcV2Examples\OrcV2CBindingsBasicUsage\CMakeFiles\OrcV2CBindingsBasicUsage.dir\__\__\__\resources\windows_version_resource.rc.res /out:bin\OrcV2CBindingsBasicUsage.exe /implib:lib\OrcV2CBindingsBasicUsage.lib /pdb:bin\OrcV2CBindingsBasicUsage.pdb /version:0.0 /MANIFEST:NO /INCREMENTAL:NO /subsystem:console /STACK:1000 lib\LLVMCore.lib lib\LLVMExecutionEngine.lib lib\LLVMIRReader.lib lib\LLVMJITLink.lib lib\LLVMMC.lib lib\LLVMOrcJIT.lib lib\LLVMSupport.lib lib\LLVMTarget.lib lib\LLVMX86CodeGen.lib lib\LLVMX86Desc.lib lib\LLVMX86Info.lib lib\LLVMOrcTargetProcess.lib lib\LLVMRuntimeDyld.lib lib\LLVMOrcShared.lib lib\LLVMPasses.lib lib\LLVMCoroutines.lib lib\LLVMHipStdPar.lib lib\LLVMipo.lib lib\LLVMFrontendOpenMP.lib lib\LLVMFrontendOffloading.lib lib\LLVMObjectYAML.lib lib\LLVMFrontendAtomic.lib lib\LLVMFrontendDirective.lib lib\LLVMLinker.lib lib\LLVMVectorize.lib lib\LLVMSandboxIR.lib lib\LLVMWindowsDriver.lib lib\LLVMOption.lib lib\LLVMMCDisassembler.lib lib\LLVMAsmPrinter.lib lib\LLVMCFGuard.lib lib\LLVMGlobalISel.lib lib\LLVMIRPrinter.lib lib\LLVMInstrumentation.lib lib\LLVMSelectionDAG.lib lib\LLVMCodeGen.lib lib\LLVMObjCARCOpts.lib lib\LLVMScalarOpts.lib lib\LLVMAggressiveInstCombine.lib lib\LLVMInstCombine.lib lib\LLVMTransformUtils.lib lib\LLVMCGData.lib lib\LLVMBitWriter.lib lib\LLVMAnalysis.lib lib\LLVMFrontendHLSL.lib lib\LLVMProfileData.lib lib\LLVMSymbolize.lib lib\LLVMDebugInfoGSYM.lib lib\LLVMDebugInfoDWARF.lib lib\LLVMDebugInfoPDB.lib lib\LLVMObject.lib lib\LLVMAsmParser.lib lib\LLVMBitReader.lib lib\LLVMRemarks.lib lib\LLVMBitstreamReader.lib lib\LLVMTextAPI.lib lib\LLVMMCParser.lib lib\LLVMDebugInfoDWARFLowLevel.lib lib\LLVMBinaryFormat.lib lib\LLVMTargetParser.lib lib\LLVMDebugInfoCodeView.lib lib\LLVMDebugInfoMSF.lib lib\LLVMDebugInfoBTF.lib lib\LLVMCodeGenTypes.lib lib\LLVMDemangle.lib psapi.lib shell32.lib ole32.lib uuid.lib advapi32.lib ws2_32.lib ntdll.lib delayimp.lib -delayload:shell32.dll -delayload:ole32.dll kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib && cd ." LINK: command "C:\clang\clang-msvc\bin\lld-link.exe /nologo examples\OrcV2Examples\OrcV2CBindingsBasicUsage\CMakeFiles\OrcV2CBindingsBasicUsage.dir\OrcV2CBindingsBasicUsage.c.obj examples\OrcV2Examples\OrcV2CBindingsBasicUsage\CMakeFiles\OrcV2CBindingsBasicUsage.dir\__\__\__\resources\windows_version_resource.rc.res /out:bin\OrcV2CBindingsBasicUsage.exe /implib:lib\OrcV2CBindingsBasicUsage.lib /pdb:bin\OrcV2CBindingsBasicUsage.pdb /version:0.0 /MANIFEST:NO /INCREMENTAL:NO /subsystem:console /STACK:1000 lib\LLVMCore.lib lib\LLVMExecutionEngine.lib lib\LLVMIRReader.lib lib\LLVMJITLink.lib lib\LLVMMC.lib lib\LLVMOrcJIT.lib lib\LLVMSupport.lib lib\LLVMTarget.lib lib\LLVMX86CodeGen.lib lib\LLVMX86Desc.lib lib\LLVMX86Info.lib lib\LLVMOrcTargetProcess.lib lib\LLVMRuntimeDyld.lib lib\LLVMOrcShared.lib lib\LLVMPasses.lib lib\LLVMCoroutines.lib lib\LLVMHipStdPar.lib lib\LLVMipo.lib lib\LLVMFrontendOpenMP.lib lib\LLVMFrontendOffloading.lib lib\LLVMObjectYAML.lib lib\LLVMFrontendAtomic.lib lib\LLVMFrontendDirective.lib lib\LLVMLinker.lib lib\LLVMVectorize.lib lib\LLVMSandboxIR.lib lib\LLVMWindowsDriver.lib lib\LLVMOption.lib lib\LLVMMCDisassembler.lib lib\LLVMAsmPrinter.lib lib\LLVMCFGuard.lib lib\LLVMGlobalISel.lib lib\LLVMIRPrinter.lib lib\LLVMInstrumentation.lib lib\LLVMSelectionDAG.lib lib\LLVMCodeGen.lib lib\LLVMObjCARCOpts.lib lib\LLVMScalarOpts.lib lib\LLVMAggressiveInstCombine.lib lib\LLVMInstCombine.lib lib\LLVMTransformUtils.lib lib\LLVMCGData.lib lib\LLVMBitWriter.lib lib\LLVMAnalysis.lib lib\LLVMFrontendHLSL.lib lib\LLVMProfileData.lib lib\LLVMSymbolize.lib lib\LLVMDebugInfoGSYM.lib lib\LLVMDebugInfoDWARF.lib lib\LLVMDebugInfoPDB.lib lib\LLVMObject.lib lib\LLVMAsmParser.lib lib\LLVMBitReader.lib lib\LLVMRemarks.lib lib\LLVMBitstreamReader.lib lib\LLVMTextAPI.lib lib\LLVMMCParser.lib lib\LLVMDebugI
[clang] [llvm] [CodeGen] Use unique_ptr for FunctionInfo to prevent memory leaks (PR #196603)
@@ -12,16 +12,17 @@
using namespace llvm;
using namespace llvm::abi;
-FunctionInfo *FunctionInfo::create(CallingConv::ID CC, const Type *ReturnType,
- ArrayRef ArgTypes,
- std::optional NumRequired) {
+std::unique_ptr
+FunctionInfo::create(CallingConv::ID CC, const Type *ReturnType,
+ ArrayRef ArgTypes,
+ std::optional NumRequired) {
assert(!NumRequired || *NumRequired <= ArgTypes.size());
void *Buffer = operator new(totalSizeToAlloc(ArgTypes.size()));
- FunctionInfo *FI =
- new (Buffer) FunctionInfo(CC, ReturnType, ArgTypes.size(), NumRequired);
+ std::unique_ptr FI(
efriedma-quic wrote:
Is this actually legal? The pointer points to a memory buffer of the wrong
size; plain `delete` has undefined behavior, I think.
You can specify a custom deleter to do the right thing (instead
std::default_delete).
https://github.com/llvm/llvm-project/pull/196603
___
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [CodeGen] Use unique_ptr for FunctionInfo to prevent memory leaks (PR #196603)
https://github.com/pcc approved this pull request. https://github.com/llvm/llvm-project/pull/196603 ___ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [CodeGen] Use unique_ptr for FunctionInfo to prevent memory leaks (PR #196603)
https://github.com/vitalybuka closed https://github.com/llvm/llvm-project/pull/196603 ___ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [CodeGen] Use unique_ptr for FunctionInfo to prevent memory leaks (PR #196603)
https://github.com/vitalybuka updated
https://github.com/llvm/llvm-project/pull/196603
>From 677512ff120953dc2a9cf53dd73bcaeb6f2ecb0d Mon Sep 17 00:00:00 2001
From: Vitaly Buka
Date: Fri, 8 May 2026 11:24:25 -0700
Subject: [PATCH 1/3] =?UTF-8?q?[=F0=9D=98=80=F0=9D=97=BD=F0=9D=97=BF]=20in?=
=?UTF-8?q?itial=20version?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Created using spr 1.3.7
---
clang/lib/CodeGen/CGCall.cpp | 2 +-
llvm/include/llvm/ABI/FunctionInfo.h | 2 +-
llvm/lib/ABI/FunctionInfo.cpp| 11 ++-
3 files changed, 8 insertions(+), 7 deletions(-)
diff --git a/clang/lib/CodeGen/CGCall.cpp b/clang/lib/CodeGen/CGCall.cpp
index 1cafe364c4c42..a2b9c945788ee 100644
--- a/clang/lib/CodeGen/CGCall.cpp
+++ b/clang/lib/CodeGen/CGCall.cpp
@@ -843,7 +843,7 @@ void CodeGenModule::computeABIInfoUsingLib(CGFunctionInfo
&FI) {
if (Required.allowsOptionalArgs())
NumRequired = Required.getNumRequiredArgs();
- llvm::abi::FunctionInfo *AbiFI = llvm::abi::FunctionInfo::create(
+ auto AbiFI = llvm::abi::FunctionInfo::create(
FI.getCallingConvention(), AbiMapper->convertType(FI.getReturnType()),
MappedArgTypes, NumRequired);
diff --git a/llvm/include/llvm/ABI/FunctionInfo.h
b/llvm/include/llvm/ABI/FunctionInfo.h
index 7f7b6a44ba6ad..0ebd0700836e2 100644
--- a/llvm/include/llvm/ABI/FunctionInfo.h
+++ b/llvm/include/llvm/ABI/FunctionInfo.h
@@ -234,7 +234,7 @@ class FunctionInfo final : private
TrailingObjects {
unsigned arg_size() const { return NumArgs; }
- static FunctionInfo *
+ static std::unique_ptr
create(CallingConv::ID CC, const Type *ReturnType,
ArrayRef ArgTypes,
std::optional NumRequired = std::nullopt);
diff --git a/llvm/lib/ABI/FunctionInfo.cpp b/llvm/lib/ABI/FunctionInfo.cpp
index f89d90c74ea03..7096392135ce8 100644
--- a/llvm/lib/ABI/FunctionInfo.cpp
+++ b/llvm/lib/ABI/FunctionInfo.cpp
@@ -12,16 +12,17 @@
using namespace llvm;
using namespace llvm::abi;
-FunctionInfo *FunctionInfo::create(CallingConv::ID CC, const Type *ReturnType,
- ArrayRef ArgTypes,
- std::optional NumRequired) {
+std::unique_ptr
+FunctionInfo::create(CallingConv::ID CC, const Type *ReturnType,
+ ArrayRef ArgTypes,
+ std::optional NumRequired) {
assert(!NumRequired || *NumRequired <= ArgTypes.size());
void *Buffer = operator new(totalSizeToAlloc(ArgTypes.size()));
- FunctionInfo *FI =
- new (Buffer) FunctionInfo(CC, ReturnType, ArgTypes.size(), NumRequired);
+ std::unique_ptr FI(
+ new (Buffer) FunctionInfo(CC, ReturnType, ArgTypes.size(), NumRequired));
ArgEntry *Args = FI->getTrailingObjects();
for (unsigned I = 0; I < ArgTypes.size(); ++I)
>From 300c7b00f0dd6f7ce63ca48e3b919d9332a23e9d Mon Sep 17 00:00:00 2001
From: Vitaly Buka
Date: Fri, 8 May 2026 12:54:14 -0700
Subject: [PATCH 2/3] address review comments: relocate comment to
FunctionInfo::create()
Created using spr 1.3.7
---
llvm/lib/ABI/FunctionInfo.cpp | 3 +++
1 file changed, 3 insertions(+)
diff --git a/llvm/lib/ABI/FunctionInfo.cpp b/llvm/lib/ABI/FunctionInfo.cpp
index 7096392135ce8..54e62bc29e19d 100644
--- a/llvm/lib/ABI/FunctionInfo.cpp
+++ b/llvm/lib/ABI/FunctionInfo.cpp
@@ -21,6 +21,9 @@ FunctionInfo::create(CallingConv::ID CC, const Type
*ReturnType,
void *Buffer = operator new(totalSizeToAlloc(ArgTypes.size()));
+ // We can use standard std::unique_ptr here because FunctionInfo overloads
+ // the non-sized operator delete, which avoids sized deallocation issues
+ // when deallocating the custom-sized buffer containing trailing objects.
std::unique_ptr FI(
new (Buffer) FunctionInfo(CC, ReturnType, ArgTypes.size(), NumRequired));
>From 9dae35e97e260d3849918e56d917d6f285b2 Mon Sep 17 00:00:00 2001
From: Vitaly Buka
Date: Fri, 8 May 2026 12:55:10 -0700
Subject: [PATCH 3/3] shorten comment
Created using spr 1.3.7
---
llvm/lib/ABI/FunctionInfo.cpp | 5 ++---
1 file changed, 2 insertions(+), 3 deletions(-)
diff --git a/llvm/lib/ABI/FunctionInfo.cpp b/llvm/lib/ABI/FunctionInfo.cpp
index 54e62bc29e19d..4e3b4c3f22aff 100644
--- a/llvm/lib/ABI/FunctionInfo.cpp
+++ b/llvm/lib/ABI/FunctionInfo.cpp
@@ -21,9 +21,8 @@ FunctionInfo::create(CallingConv::ID CC, const Type
*ReturnType,
void *Buffer = operator new(totalSizeToAlloc(ArgTypes.size()));
- // We can use standard std::unique_ptr here because FunctionInfo overloads
- // the non-sized operator delete, which avoids sized deallocation issues
- // when deallocating the custom-sized buffer containing trailing objects.
+ // FunctionInfo overloads operator delete, so we can use std::unique_ptr
+ // without worrying about sized deallocation of trailing objects.
std::unique_ptr FI(
new (Buffer) FunctionInfo(CC, ReturnType, ArgTypes.size(), NumRequired));
_
[clang] [llvm] [CodeGen] Use unique_ptr for FunctionInfo to prevent memory leaks (PR #196603)
https://github.com/vitalybuka updated
https://github.com/llvm/llvm-project/pull/196603
>From 677512ff120953dc2a9cf53dd73bcaeb6f2ecb0d Mon Sep 17 00:00:00 2001
From: Vitaly Buka
Date: Fri, 8 May 2026 11:24:25 -0700
Subject: [PATCH 1/2] =?UTF-8?q?[=F0=9D=98=80=F0=9D=97=BD=F0=9D=97=BF]=20in?=
=?UTF-8?q?itial=20version?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Created using spr 1.3.7
---
clang/lib/CodeGen/CGCall.cpp | 2 +-
llvm/include/llvm/ABI/FunctionInfo.h | 2 +-
llvm/lib/ABI/FunctionInfo.cpp| 11 ++-
3 files changed, 8 insertions(+), 7 deletions(-)
diff --git a/clang/lib/CodeGen/CGCall.cpp b/clang/lib/CodeGen/CGCall.cpp
index 1cafe364c4c42..a2b9c945788ee 100644
--- a/clang/lib/CodeGen/CGCall.cpp
+++ b/clang/lib/CodeGen/CGCall.cpp
@@ -843,7 +843,7 @@ void CodeGenModule::computeABIInfoUsingLib(CGFunctionInfo
&FI) {
if (Required.allowsOptionalArgs())
NumRequired = Required.getNumRequiredArgs();
- llvm::abi::FunctionInfo *AbiFI = llvm::abi::FunctionInfo::create(
+ auto AbiFI = llvm::abi::FunctionInfo::create(
FI.getCallingConvention(), AbiMapper->convertType(FI.getReturnType()),
MappedArgTypes, NumRequired);
diff --git a/llvm/include/llvm/ABI/FunctionInfo.h
b/llvm/include/llvm/ABI/FunctionInfo.h
index 7f7b6a44ba6ad..0ebd0700836e2 100644
--- a/llvm/include/llvm/ABI/FunctionInfo.h
+++ b/llvm/include/llvm/ABI/FunctionInfo.h
@@ -234,7 +234,7 @@ class FunctionInfo final : private
TrailingObjects {
unsigned arg_size() const { return NumArgs; }
- static FunctionInfo *
+ static std::unique_ptr
create(CallingConv::ID CC, const Type *ReturnType,
ArrayRef ArgTypes,
std::optional NumRequired = std::nullopt);
diff --git a/llvm/lib/ABI/FunctionInfo.cpp b/llvm/lib/ABI/FunctionInfo.cpp
index f89d90c74ea03..7096392135ce8 100644
--- a/llvm/lib/ABI/FunctionInfo.cpp
+++ b/llvm/lib/ABI/FunctionInfo.cpp
@@ -12,16 +12,17 @@
using namespace llvm;
using namespace llvm::abi;
-FunctionInfo *FunctionInfo::create(CallingConv::ID CC, const Type *ReturnType,
- ArrayRef ArgTypes,
- std::optional NumRequired) {
+std::unique_ptr
+FunctionInfo::create(CallingConv::ID CC, const Type *ReturnType,
+ ArrayRef ArgTypes,
+ std::optional NumRequired) {
assert(!NumRequired || *NumRequired <= ArgTypes.size());
void *Buffer = operator new(totalSizeToAlloc(ArgTypes.size()));
- FunctionInfo *FI =
- new (Buffer) FunctionInfo(CC, ReturnType, ArgTypes.size(), NumRequired);
+ std::unique_ptr FI(
+ new (Buffer) FunctionInfo(CC, ReturnType, ArgTypes.size(), NumRequired));
ArgEntry *Args = FI->getTrailingObjects();
for (unsigned I = 0; I < ArgTypes.size(); ++I)
>From 300c7b00f0dd6f7ce63ca48e3b919d9332a23e9d Mon Sep 17 00:00:00 2001
From: Vitaly Buka
Date: Fri, 8 May 2026 12:54:14 -0700
Subject: [PATCH 2/2] address review comments: relocate comment to
FunctionInfo::create()
Created using spr 1.3.7
---
llvm/lib/ABI/FunctionInfo.cpp | 3 +++
1 file changed, 3 insertions(+)
diff --git a/llvm/lib/ABI/FunctionInfo.cpp b/llvm/lib/ABI/FunctionInfo.cpp
index 7096392135ce8..54e62bc29e19d 100644
--- a/llvm/lib/ABI/FunctionInfo.cpp
+++ b/llvm/lib/ABI/FunctionInfo.cpp
@@ -21,6 +21,9 @@ FunctionInfo::create(CallingConv::ID CC, const Type
*ReturnType,
void *Buffer = operator new(totalSizeToAlloc(ArgTypes.size()));
+ // We can use standard std::unique_ptr here because FunctionInfo overloads
+ // the non-sized operator delete, which avoids sized deallocation issues
+ // when deallocating the custom-sized buffer containing trailing objects.
std::unique_ptr FI(
new (Buffer) FunctionInfo(CC, ReturnType, ArgTypes.size(), NumRequired));
___
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [CodeGen] Use unique_ptr for FunctionInfo to prevent memory leaks (PR #196603)
https://github.com/vitalybuka created
https://github.com/llvm/llvm-project/pull/196603
Raw pointer return from `FunctionInfo::create` caused leaks in callers
like `computeABIInfoUsingLib`, breaking BPF tests on ASan bots.
Using `std::unique_ptr` enforces automatic cleanup.
This fix was developed with the assistance of Gemini.
Fixes leak from 07b5dfe9473c.
Buildbot: https://lab.llvm.org/buildbot/#/builders/52/builds/17090
>From 677512ff120953dc2a9cf53dd73bcaeb6f2ecb0d Mon Sep 17 00:00:00 2001
From: Vitaly Buka
Date: Fri, 8 May 2026 11:24:25 -0700
Subject: [PATCH] =?UTF-8?q?[=F0=9D=98=80=F0=9D=97=BD=F0=9D=97=BF]=20initia?=
=?UTF-8?q?l=20version?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Created using spr 1.3.7
---
clang/lib/CodeGen/CGCall.cpp | 2 +-
llvm/include/llvm/ABI/FunctionInfo.h | 2 +-
llvm/lib/ABI/FunctionInfo.cpp| 11 ++-
3 files changed, 8 insertions(+), 7 deletions(-)
diff --git a/clang/lib/CodeGen/CGCall.cpp b/clang/lib/CodeGen/CGCall.cpp
index 1cafe364c4c42..a2b9c945788ee 100644
--- a/clang/lib/CodeGen/CGCall.cpp
+++ b/clang/lib/CodeGen/CGCall.cpp
@@ -843,7 +843,7 @@ void CodeGenModule::computeABIInfoUsingLib(CGFunctionInfo
&FI) {
if (Required.allowsOptionalArgs())
NumRequired = Required.getNumRequiredArgs();
- llvm::abi::FunctionInfo *AbiFI = llvm::abi::FunctionInfo::create(
+ auto AbiFI = llvm::abi::FunctionInfo::create(
FI.getCallingConvention(), AbiMapper->convertType(FI.getReturnType()),
MappedArgTypes, NumRequired);
diff --git a/llvm/include/llvm/ABI/FunctionInfo.h
b/llvm/include/llvm/ABI/FunctionInfo.h
index 7f7b6a44ba6ad..0ebd0700836e2 100644
--- a/llvm/include/llvm/ABI/FunctionInfo.h
+++ b/llvm/include/llvm/ABI/FunctionInfo.h
@@ -234,7 +234,7 @@ class FunctionInfo final : private
TrailingObjects {
unsigned arg_size() const { return NumArgs; }
- static FunctionInfo *
+ static std::unique_ptr
create(CallingConv::ID CC, const Type *ReturnType,
ArrayRef ArgTypes,
std::optional NumRequired = std::nullopt);
diff --git a/llvm/lib/ABI/FunctionInfo.cpp b/llvm/lib/ABI/FunctionInfo.cpp
index f89d90c74ea03..7096392135ce8 100644
--- a/llvm/lib/ABI/FunctionInfo.cpp
+++ b/llvm/lib/ABI/FunctionInfo.cpp
@@ -12,16 +12,17 @@
using namespace llvm;
using namespace llvm::abi;
-FunctionInfo *FunctionInfo::create(CallingConv::ID CC, const Type *ReturnType,
- ArrayRef ArgTypes,
- std::optional NumRequired) {
+std::unique_ptr
+FunctionInfo::create(CallingConv::ID CC, const Type *ReturnType,
+ ArrayRef ArgTypes,
+ std::optional NumRequired) {
assert(!NumRequired || *NumRequired <= ArgTypes.size());
void *Buffer = operator new(totalSizeToAlloc(ArgTypes.size()));
- FunctionInfo *FI =
- new (Buffer) FunctionInfo(CC, ReturnType, ArgTypes.size(), NumRequired);
+ std::unique_ptr FI(
+ new (Buffer) FunctionInfo(CC, ReturnType, ArgTypes.size(), NumRequired));
ArgEntry *Args = FI->getTrailingObjects();
for (unsigned I = 0; I < ArgTypes.size(); ++I)
___
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
