[Orc] Make OrcMCJITReplacement::addObject calls transfer buffer ownership to the
[oota-llvm.git] / lib / ExecutionEngine / Orc / OrcMCJITReplacement.h
index 9fdf0efdd9084b2fbf19e456bced1272f0e75746..ddbc73251c7eee4c83224fe84600f9b3b32df551 100644 (file)
@@ -20,7 +20,6 @@
 #include "llvm/ExecutionEngine/Orc/LazyEmittingLayer.h"
 #include "llvm/ExecutionEngine/Orc/ObjectLinkingLayer.h"
 #include "llvm/Object/Archive.h"
 #include "llvm/ExecutionEngine/Orc/LazyEmittingLayer.h"
 #include "llvm/ExecutionEngine/Orc/ObjectLinkingLayer.h"
 #include "llvm/Object/Archive.h"
-#include "llvm/Target/TargetSubtargetInfo.h"
 
 namespace llvm {
 
 
 namespace llvm {
 
@@ -119,25 +118,25 @@ public:
 
   OrcMCJITReplacement(std::unique_ptr<RTDyldMemoryManager> MM,
                       std::unique_ptr<TargetMachine> TM)
 
   OrcMCJITReplacement(std::unique_ptr<RTDyldMemoryManager> MM,
                       std::unique_ptr<TargetMachine> TM)
-      : TM(std::move(TM)), MM(std::move(MM)),
-        Mang(this->TM->getSubtargetImpl()->getDataLayout()),
+      : TM(std::move(TM)), MM(std::move(MM)), Mang(this->TM->getDataLayout()),
         NotifyObjectLoaded(*this), NotifyFinalized(*this),
         NotifyObjectLoaded(*this), NotifyFinalized(*this),
-        ObjectLayer(NotifyObjectLoaded, NotifyFinalized),
+        ObjectLayer(ObjectLayerT::CreateRTDyldMMFtor(), NotifyObjectLoaded,
+                    NotifyFinalized),
         CompileLayer(ObjectLayer, SimpleCompiler(*this->TM)),
         LazyEmitLayer(CompileLayer) {
         CompileLayer(ObjectLayer, SimpleCompiler(*this->TM)),
         LazyEmitLayer(CompileLayer) {
-    setDataLayout(this->TM->getSubtargetImpl()->getDataLayout());
+    setDataLayout(this->TM->getDataLayout());
   }
 
   }
 
-  void addModule(std::unique_ptr<Module> M) {
+  void addModule(std::unique_ptr<Module> M) override {
 
     // If this module doesn't have a DataLayout attached then attach the
     // default.
     if (!M->getDataLayout())
       M->setDataLayout(getDataLayout());
 
 
     // If this module doesn't have a DataLayout attached then attach the
     // default.
     if (!M->getDataLayout())
       M->setDataLayout(getDataLayout());
 
-    OwnedModules.push_back(std::move(M));
+    Modules.push_back(std::move(M));
     std::vector<Module *> Ms;
     std::vector<Module *> Ms;
-    Ms.push_back(&*OwnedModules.back());
+    Ms.push_back(&*Modules.back());
     LazyEmitLayer.addModuleSet(std::move(Ms),
                                llvm::make_unique<ForwardingRTDyldMM>(*this));
   }
     LazyEmitLayer.addModuleSet(std::move(Ms),
                                llvm::make_unique<ForwardingRTDyldMM>(*this));
   }
@@ -155,8 +154,13 @@ public:
     std::tie(Obj, Buf) = O.takeBinary();
     std::vector<std::unique_ptr<object::ObjectFile>> Objs;
     Objs.push_back(std::move(Obj));
     std::tie(Obj, Buf) = O.takeBinary();
     std::vector<std::unique_ptr<object::ObjectFile>> Objs;
     Objs.push_back(std::move(Obj));
-    ObjectLayer.addObjectSet(std::move(Objs),
-                             llvm::make_unique<ForwardingRTDyldMM>(*this));
+    auto H =
+      ObjectLayer.addObjectSet(std::move(Objs),
+                               llvm::make_unique<ForwardingRTDyldMM>(*this));
+
+    std::vector<std::unique_ptr<MemoryBuffer>> Bufs;
+    Bufs.push_back(std::move(Buf));
+    ObjectLayer.takeOwnershipOfBuffers(H, std::move(Bufs));
   }
 
   void addArchive(object::OwningBinary<object::Archive> A) override {
   }
 
   void addArchive(object::OwningBinary<object::Archive> A) override {
@@ -257,7 +261,7 @@ private:
                     const ObjListT &Objects,
                     const LoadedObjInfoListT &Infos) const {
       M.UnfinalizedSections[H] = std::move(M.SectionsAllocatedSinceLastLoad);
                     const ObjListT &Objects,
                     const LoadedObjInfoListT &Infos) const {
       M.UnfinalizedSections[H] = std::move(M.SectionsAllocatedSinceLastLoad);
-      M.SectionsAllocatedSinceLastLoad = {};
+      M.SectionsAllocatedSinceLastLoad = SectionAddrSet();
       assert(Objects.size() == Infos.size() &&
              "Incorrect number of Infos for Objects.");
       for (unsigned I = 0; I < Objects.size(); ++I)
       assert(Objects.size() == Infos.size() &&
              "Incorrect number of Infos for Objects.");
       for (unsigned I = 0; I < Objects.size(); ++I)
@@ -303,10 +307,6 @@ private:
   CompileLayerT CompileLayer;
   LazyEmitLayerT LazyEmitLayer;
 
   CompileLayerT CompileLayer;
   LazyEmitLayerT LazyEmitLayer;
 
-  // MCJIT keeps modules alive - we need to do the same for backwards
-  // compatibility.
-  std::vector<std::unique_ptr<Module>> OwnedModules;
-
   // We need to store ObjLayerT::ObjSetHandles for each of the object sets
   // that have been emitted but not yet finalized so that we can forward the
   // mapSectionAddress calls appropriately.
   // We need to store ObjLayerT::ObjSetHandles for each of the object sets
   // that have been emitted but not yet finalized so that we can forward the
   // mapSectionAddress calls appropriately.