ELF2: Do not leak MemoryBuffers.

llvm-svn: 249962
diff --git a/lld/ELF/Driver.cpp b/lld/ELF/Driver.cpp
index 74c6ecf..7c15093 100644
--- a/lld/ELF/Driver.cpp
+++ b/lld/ELF/Driver.cpp
@@ -136,7 +136,7 @@
 
   switch (identify_magic(MBRef.getBuffer())) {
   case file_magic::unknown:
-    readLinkerScript(MBRef);
+    readLinkerScript(&Alloc, MBRef);
     return;
   case file_magic::archive:
     if (WholeArchive) {
diff --git a/lld/ELF/Driver.h b/lld/ELF/Driver.h
index c961c82..91169d5 100644
--- a/lld/ELF/Driver.h
+++ b/lld/ELF/Driver.h
@@ -44,6 +44,7 @@
   template <template <class> class T>
   std::unique_ptr<ELFFileBase> createELFInputFile(MemoryBufferRef MB);
 
+  llvm::BumpPtrAllocator Alloc;
   ArgParser Parser;
   bool WholeArchive = false;
   std::vector<std::unique_ptr<InputFile>> Files;
@@ -60,7 +61,7 @@
 };
 
 // Parses a linker script. Calling this function updates the Symtab and Config.
-void readLinkerScript(MemoryBufferRef MB);
+void readLinkerScript(llvm::BumpPtrAllocator *A, MemoryBufferRef MB);
 
 } // namespace elf2
 } // namespace lld
diff --git a/lld/ELF/LinkerScript.cpp b/lld/ELF/LinkerScript.cpp
index e29c717..9162a44 100644
--- a/lld/ELF/LinkerScript.cpp
+++ b/lld/ELF/LinkerScript.cpp
@@ -18,6 +18,7 @@
 #include "SymbolTable.h"
 #include "llvm/Support/FileSystem.h"
 #include "llvm/Support/MemoryBuffer.h"
+#include "llvm/Support/StringSaver.h"
 
 using namespace llvm;
 using namespace lld;
@@ -26,7 +27,8 @@
 namespace {
 class LinkerScript {
 public:
-  LinkerScript(StringRef S) : Tokens(tokenize(S)) {}
+  LinkerScript(BumpPtrAllocator *A, StringRef S)
+      : Saver(*A), Tokens(tokenize(S)) {}
   void run();
 
 private:
@@ -44,9 +46,9 @@
   void readOutputFormat();
   void readSearchDir();
 
+  StringSaver Saver;
   std::vector<StringRef> Tokens;
   size_t Pos = 0;
-  static std::vector<std::unique_ptr<MemoryBuffer>> OwningMBs;
 };
 }
 
@@ -169,9 +171,9 @@
   auto MBOrErr = MemoryBuffer::getFile(Tok);
   error(MBOrErr, Twine("cannot open ") + Tok);
   std::unique_ptr<MemoryBuffer> &MB = *MBOrErr;
-  std::vector<StringRef> V = tokenize(MB->getMemBufferRef().getBuffer());
+  StringRef S = Saver.save(MB->getMemBufferRef().getBuffer());
+  std::vector<StringRef> V = tokenize(S);
   Tokens.insert(Tokens.begin() + Pos, V.begin(), V.end());
-  OwningMBs.push_back(std::move(MB)); // keep ownership of MB
 }
 
 void LinkerScript::readOutput() {
@@ -196,9 +198,7 @@
   expect(")");
 }
 
-std::vector<std::unique_ptr<MemoryBuffer>> LinkerScript::OwningMBs;
-
 // Entry point. The other functions or classes are private to this file.
-void lld::elf2::readLinkerScript(MemoryBufferRef MB) {
-  LinkerScript(MB.getBuffer()).run();
+void lld::elf2::readLinkerScript(BumpPtrAllocator *A, MemoryBufferRef MB) {
+  LinkerScript(A, MB.getBuffer()).run();
 }