From: Vitaly Buka Date: Thu, 25 Aug 2016 07:21:34 +0000 (+0000) Subject: Fix memory leaks in clang-offload-bundler X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=6af06d67257e1489e814816e4b615ca437c98cb7;p=clang Fix memory leaks in clang-offload-bundler Summary: 1. Pair removed from StringMap was not destroyed 2. ObjectFile had no owner Reviewers: sfantao Subscribers: llvm-commits Differential Revision: https://reviews.llvm.org/D23865 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@279722 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/tools/clang-offload-bundler/ClangOffloadBundler.cpp b/tools/clang-offload-bundler/ClangOffloadBundler.cpp index 5e39f6e552..afb9b69bba 100644 --- a/tools/clang-offload-bundler/ClangOffloadBundler.cpp +++ b/tools/clang-offload-bundler/ClangOffloadBundler.cpp @@ -348,10 +348,10 @@ public: class ObjectFileHandler final : public FileHandler { /// The object file we are currently dealing with. - ObjectFile &Obj; + std::unique_ptr Obj; /// Return the input file contents. - StringRef getInputFileContents() const { return Obj.getData(); } + StringRef getInputFileContents() const { return Obj->getData(); } /// Return true if the provided section is an offload section and return the /// triple by reference. @@ -400,7 +400,7 @@ public: void ReadHeader(MemoryBuffer &Input) {} StringRef ReadBundleStart(MemoryBuffer &Input) { - while (NextSection != Obj.section_end()) { + while (NextSection != Obj->section_end()) { CurrentSection = NextSection; ++NextSection; @@ -561,9 +561,10 @@ public: GV->setSection(SectionName); } - ObjectFileHandler(ObjectFile &Obj) - : FileHandler(), Obj(Obj), CurrentSection(Obj.section_begin()), - NextSection(Obj.section_begin()) {} + ObjectFileHandler(std::unique_ptr ObjIn) + : FileHandler(), Obj(std::move(ObjIn)), + CurrentSection(Obj->section_begin()), + NextSection(Obj->section_begin()) {} ~ObjectFileHandler() {} }; @@ -677,12 +678,13 @@ static FileHandler *CreateObjectFileHandler(MemoryBuffer &FirstInput) { // We only support regular object files. If this is not an object file, // default to the binary handler. The handler will be owned by the client of // this function. - ObjectFile *Obj = dyn_cast(BinaryOrErr.get().release()); + std::unique_ptr Obj( + dyn_cast(BinaryOrErr.get().release())); if (!Obj) return new BinaryFileHandler(); - return new ObjectFileHandler(*Obj); + return new ObjectFileHandler(std::move(Obj)); } /// Return an appropriate handler given the input files and options. @@ -821,7 +823,7 @@ static bool UnbundleFiles() { } FH.get()->ReadBundle(OutputFile, Input); FH.get()->ReadBundleEnd(Input); - Worklist.remove(&*Output); + Worklist.erase(Output); // Record if we found the host bundle. if (hasHostKind(CurTriple))