diff options
author | Rui Ueyama <ruiu@google.com> | 2015-10-11 01:53:04 +0000 |
---|---|---|
committer | Rui Ueyama <ruiu@google.com> | 2015-10-11 01:53:04 +0000 |
commit | a47ee68d8e43c824139fcf1d7dce9ffe5dc81381 (patch) | |
tree | 28faf8df1a6c03e8d4de9583f86336a4cef57d58 /lld/ELF/LinkerScript.cpp | |
parent | 00f972728beb9aa9208b0650255be0df44bb790a (diff) | |
download | bcm5719-llvm-a47ee68d8e43c824139fcf1d7dce9ffe5dc81381.tar.gz bcm5719-llvm-a47ee68d8e43c824139fcf1d7dce9ffe5dc81381.zip |
ELF2: Do not leak MemoryBuffers.
llvm-svn: 249962
Diffstat (limited to 'lld/ELF/LinkerScript.cpp')
-rw-r--r-- | lld/ELF/LinkerScript.cpp | 16 |
1 files changed, 8 insertions, 8 deletions
diff --git a/lld/ELF/LinkerScript.cpp b/lld/ELF/LinkerScript.cpp index e29c717d43e..9162a44cadc 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 @@ using namespace lld::elf2; 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 @@ private: 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 @@ void LinkerScript::readInclude() { 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 @@ void LinkerScript::readSearchDir() { 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(); } |