[lld] r223104 - [mach-o] Fix TrieEdge leak

Nick Kledzik kledzik at apple.com
Mon Dec 1 17:50:44 PST 2014


Author: kledzik
Date: Mon Dec  1 19:50:44 2014
New Revision: 223104

URL: http://llvm.org/viewvc/llvm-project?rev=223104&view=rev
Log:
[mach-o] Fix TrieEdge leak

In PR21682 Jean-Daliel Dupas found a leak in the trie builder and suggested
a fix was to use a list instead of SmallVector so that the list elements
could be allocated in the BumpPtrAllocator.

Modified:
    lld/trunk/lib/ReaderWriter/MachO/MachONormalizedFileBinaryWriter.cpp

Modified: lld/trunk/lib/ReaderWriter/MachO/MachONormalizedFileBinaryWriter.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/MachO/MachONormalizedFileBinaryWriter.cpp?rev=223104&r1=223103&r2=223104&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/MachO/MachONormalizedFileBinaryWriter.cpp (original)
+++ lld/trunk/lib/ReaderWriter/MachO/MachONormalizedFileBinaryWriter.cpp Mon Dec  1 19:50:44 2014
@@ -40,6 +40,7 @@
 #include "llvm/Support/MemoryBuffer.h"
 #include "llvm/Support/raw_ostream.h"
 #include <functional>
+#include <list>
 #include <map>
 #include <system_error>
 
@@ -177,7 +178,7 @@ private:
 
 private:
     StringRef                 _cummulativeString;
-    SmallVector<TrieEdge, 8>  _children;
+    std::list<TrieEdge>       _children;
     uint64_t                  _address;
     uint64_t                  _flags;
     uint64_t                  _other;
@@ -1079,8 +1080,8 @@ void MachOFileLayout::TrieNode::addSymbo
         TrieEdge& abEdge = edge;
         abEdge._subString = abEdgeStr;
         abEdge._child = bNode;
-        TrieEdge bcEdge(bcEdgeStr, cNode);
-        bNode->_children.push_back(bcEdge);
+        TrieEdge *bcEdge = new (allocator) TrieEdge(bcEdgeStr, cNode);
+        bNode->_children.push_back(std::move(*bcEdge));
         bNode->addSymbol(entry, allocator, allNodes);
         return;
       }
@@ -1094,8 +1095,8 @@ void MachOFileLayout::TrieNode::addSymbo
   }
   // No commonality with any existing child, make a new edge.
   TrieNode* newNode = new (allocator) TrieNode(entry.name.copy(allocator));
-  TrieEdge newEdge(partialStr, newNode);
-  _children.push_back(newEdge);
+  TrieEdge *newEdge = new (allocator) TrieEdge(partialStr, newNode);
+  _children.push_back(std::move(*newEdge));
   DEBUG_WITH_TYPE("trie-builder", llvm::dbgs()
                    << "new TrieNode('" << entry.name << "') with edge '"
                    << partialStr << "' from node='"





More information about the llvm-commits mailing list