[PATCH] D156618: [IR] Fix a memory leak if Function::dropAllReferences() is followed by setHungoffOperand
Liqiang Tao via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Wed Sep 20 04:17:53 PDT 2023
This revision was automatically updated to reflect the committed changes.
taolq marked an inline comment as not done.
Closed by commit rG85ec68d69bca: [IR] Fix a memory leak if Function::dropAllReferences() is followed by… (authored by taolq).
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D156618/new/
https://reviews.llvm.org/D156618
Files:
llvm/include/llvm/IR/Function.h
llvm/lib/IR/Function.cpp
Index: llvm/lib/IR/Function.cpp
===================================================================
--- llvm/lib/IR/Function.cpp
+++ llvm/lib/IR/Function.cpp
@@ -518,15 +518,7 @@
Src.setValueSubclassData(Src.getSubclassDataFromValue() | (1 << 0));
}
-// dropAllReferences() - This function causes all the subinstructions to "let
-// go" of all references that they are maintaining. This allows one to
-// 'delete' a whole class at a time, even though there may be circular
-// references... first all references are dropped, and all use counts go to
-// zero. Then everything is deleted for real. Note that no operations are
-// valid on an object that has "dropped all references", except operator
-// delete.
-//
-void Function::dropAllReferences() {
+void Function::deleteBodyImpl(bool ShouldDrop) {
setIsMaterializable(false);
for (BasicBlock &BB : *this)
@@ -537,10 +529,18 @@
while (!BasicBlocks.empty())
BasicBlocks.begin()->eraseFromParent();
- // Drop uses of any optional data (real or placeholder).
if (getNumOperands()) {
- User::dropAllReferences();
- setNumHungOffUseOperands(0);
+ if (ShouldDrop) {
+ // Drop uses of any optional data (real or placeholder).
+ User::dropAllReferences();
+ setNumHungOffUseOperands(0);
+ } else {
+ // The code needs to match Function::allocHungoffUselist().
+ auto *CPN = ConstantPointerNull::get(PointerType::get(getContext(), 0));
+ Op<0>().set(CPN);
+ Op<1>().set(CPN);
+ Op<2>().set(CPN);
+ }
setValueSubclassData(getSubclassDataFromValue() & ~0xe);
}
Index: llvm/include/llvm/IR/Function.h
===================================================================
--- llvm/include/llvm/IR/Function.h
+++ llvm/include/llvm/IR/Function.h
@@ -116,6 +116,8 @@
void clearArguments();
+ void deleteBodyImpl(bool ShouldDrop);
+
/// Function ctor - If the (optional) Module argument is specified, the
/// function is automatically inserted into the end of the function list for
/// the module.
@@ -667,7 +669,7 @@
/// the linkage to external.
///
void deleteBody() {
- dropAllReferences();
+ deleteBodyImpl(/*ShouldDrop=*/false);
setLinkage(ExternalLinkage);
}
@@ -882,7 +884,9 @@
/// function, dropping all references deletes the entire body of the function,
/// including any contained basic blocks.
///
- void dropAllReferences();
+ void dropAllReferences() {
+ deleteBodyImpl(/*ShouldDrop=*/true);
+ }
/// hasAddressTaken - returns true if there are any uses of this function
/// other than direct calls or invokes to it, or blockaddress expressions.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D156618.557105.patch
Type: text/x-patch
Size: 2655 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20230920/65d65dc8/attachment.bin>
More information about the llvm-commits
mailing list