[clang] [llvm] [CodeGen] Use unique_ptr for FunctionInfo to prevent memory leaks (PR #196603)

2026-05-09 Thread via cfe-commits

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)

2026-05-09 Thread Vitaly Buka via cfe-commits

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)

2026-05-09 Thread via cfe-commits

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)

2026-05-09 Thread Eli Friedman via cfe-commits


@@ -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)

2026-05-09 Thread Peter Collingbourne via cfe-commits

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)

2026-05-09 Thread Vitaly Buka via cfe-commits

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)

2026-05-09 Thread Vitaly Buka via cfe-commits

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)

2026-05-09 Thread Vitaly Buka via cfe-commits

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)

2026-05-09 Thread Vitaly Buka via cfe-commits

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