[mach-o] Fix MachOFileNode to own archives same as ELFFileNode
authorNick Kledzik <kledzik@apple.com>
Fri, 7 Nov 2014 22:00:23 +0000 (22:00 +0000)
committerNick Kledzik <kledzik@apple.com>
Fri, 7 Nov 2014 22:00:23 +0000 (22:00 +0000)
My previous fix to have FileArchive own the member MemoryBuffers was not a
complete solution for darwin because nothing owned the FileArchive object.
Fixed MachOFileNode to be like ELFFileNode and have the graph node own the
archive object.

llvm-svn: 221552

lld/include/lld/Driver/DarwinInputGraph.h
lld/lib/Driver/DarwinInputGraph.cpp

index 27289c1..d351d56 100644 (file)
@@ -17,6 +17,7 @@
 #ifndef LLD_DRIVER_DARWIN_INPUT_GRAPH_H
 #define LLD_DRIVER_DARWIN_INPUT_GRAPH_H
 
+#include "lld/Core/ArchiveLibraryFile.h"
 #include "lld/Core/InputGraph.h"
 #include "lld/ReaderWriter/MachOLinkingContext.h"
 
@@ -67,6 +68,7 @@ private:
  void narrowFatBuffer(StringRef filePath);
 
   MachOLinkingContext &_context;
+  std::unique_ptr<const ArchiveLibraryFile> _archiveFile;
   bool _isWholeArchive;
   bool _upwardDylib;
 };
index f5f086f..2946632 100644 (file)
@@ -88,7 +88,10 @@ std::error_code MachOFileNode::parse(const LinkingContext &ctx,
     // If file is an archive and -all_load, then add all members.
     if (ArchiveLibraryFile *archive = dyn_cast<ArchiveLibraryFile>(pf.get())) {
       if (_isWholeArchive) {
-        // Note: the members are added to _files, but the archive is not.
+        // Have this node own the FileArchive object.
+        _archiveFile.reset(archive);
+        pf.release();
+        // Add all members to _files vector
         return archive->parseAllMembers(_files);
       }
     }