[lld] r198987 - [yaml] use BumpPtrAllocator for string copies

Nick Kledzik kledzik at apple.com
Fri Jan 10 17:11:49 PST 2014


Author: kledzik
Date: Fri Jan 10 19:11:49 2014
New Revision: 198987

URL: http://llvm.org/viewvc/llvm-project?rev=198987&view=rev
Log:
[yaml] use BumpPtrAllocator for string copies

Modified:
    lld/trunk/lib/ReaderWriter/YAML/ReaderWriterYAML.cpp

Modified: lld/trunk/lib/ReaderWriter/YAML/ReaderWriterYAML.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/YAML/ReaderWriterYAML.cpp?rev=198987&r1=198986&r2=198987&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/YAML/ReaderWriterYAML.cpp (original)
+++ lld/trunk/lib/ReaderWriter/YAML/ReaderWriterYAML.cpp Fri Jan 10 19:11:49 2014
@@ -150,24 +150,19 @@ private:
   typedef llvm::StringMap<const lld::Atom *> NameToAtom;
   typedef llvm::DenseMap<const lld::Atom *, std::string> AtomToRefName;
 
-  // Allocate a new copy of this string and keep track of allocations
-  // in _stringCopies, so they can be freed when RefNameBuilder is destroyed.
+  // Allocate a new copy of this string in _storage, so the strings 
+  // can be freed when RefNameBuilder is destroyed.
   StringRef copyString(StringRef str) {
-    // We want _stringCopies to own the string memory so it is deallocated
-    // when the File object is destroyed.  But we need a StringRef that
-    // points into that memory.
-    std::unique_ptr<char[]> s(new char[str.size()]);
-    memcpy(s.get(), str.data(), str.size());
-    StringRef r = StringRef(s.get(), str.size());
-    _stringCopies.push_back(std::move(s));
-    return r;
+    char* s = _storage.Allocate<char>(str.size());
+    memcpy(s, str.data(), str.size());
+    return StringRef(s, str.size());
   }
 
   unsigned int                         _collisionCount;
   unsigned int                         _unnamedCounter;
   NameToAtom                           _nameMap;
   AtomToRefName                        _refNames;
-  std::vector<std::unique_ptr<char[]>> _stringCopies;
+  llvm::BumpPtrAllocator               _storage;
 };
 
 /// Used when reading yaml files to find the target of a reference
@@ -640,17 +635,12 @@ template <> struct MappingTraits<const l
       return _absoluteAtoms;
     }
 
-    // Allocate a new copy of this string and keep track of allocations
-    // in _stringCopies, so they can be freed when File is destroyed.
+    // Allocate a new copy of this string in _storage, so the strings 
+    // can be freed when File is destroyed.
     StringRef copyString(StringRef str) {
-      // We want _stringCopies to own the string memory so it is deallocated
-      // when the File object is destroyed.  But we need a StringRef that
-      // points into that memory.
-      std::unique_ptr<char[]> s(new char[str.size()]);
-      memcpy(s.get(), str.data(), str.size());
-      StringRef r = StringRef(s.get(), str.size());
-      _stringCopies.push_back(std::move(s));
-      return r;
+      char* s = _storage.Allocate<char>(str.size());
+      memcpy(s, str.data(), str.size());
+      return StringRef(s, str.size());
     }
 
     IO                                  &_io;
@@ -660,7 +650,7 @@ template <> struct MappingTraits<const l
     AtomList<lld::UndefinedAtom>         _undefinedAtoms;
     AtomList<lld::SharedLibraryAtom>     _sharedLibraryAtoms;
     AtomList<lld::AbsoluteAtom>          _absoluteAtoms;
-    std::vector<std::unique_ptr<char[]>> _stringCopies;
+    llvm::BumpPtrAllocator               _storage;
   };
 
   static void mapping(IO &io, const lld::File *&file) {





More information about the llvm-commits mailing list