<div dir="ltr">This is great! Thanks very much Ben!<div><br></div><div>-- Lang.</div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Fri, Sep 13, 2019 at 4:33 AM Benjamin Kramer via llvm-commits <<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex">Author: d0k<br>
Date: Fri Sep 13 04:35:33 2019<br>
New Revision: 371843<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=371843&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=371843&view=rev</a><br>
Log:<br>
[Orc] Address the remaining move-capture FIXMEs<br>
<br>
This required spreading unique_function a bit more, which I think is a<br>
good thing.<br>
<br>
Modified:<br>
    llvm/trunk/examples/SpeculativeJIT/SpeculativeJIT.cpp<br>
    llvm/trunk/include/llvm/ExecutionEngine/JITSymbol.h<br>
    llvm/trunk/include/llvm/ExecutionEngine/Orc/Core.h<br>
    llvm/trunk/include/llvm/ExecutionEngine/Orc/LazyEmittingLayer.h<br>
    llvm/trunk/include/llvm/ExecutionEngine/Orc/RPCSerialization.h<br>
    llvm/trunk/include/llvm/ExecutionEngine/Orc/RPCUtils.h<br>
    llvm/trunk/include/llvm/ExecutionEngine/Orc/RemoteObjectLayer.h<br>
    llvm/trunk/include/llvm/ExecutionEngine/RuntimeDyld.h<br>
    llvm/trunk/include/llvm/Support/ThreadPool.h<br>
    llvm/trunk/lib/ExecutionEngine/Orc/LLJIT.cpp<br>
    llvm/trunk/lib/ExecutionEngine/Orc/Legacy.cpp<br>
    llvm/trunk/lib/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.cpp<br>
    llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp<br>
    llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldImpl.h<br>
    llvm/trunk/unittests/ExecutionEngine/Orc/CoreAPIsTest.cpp<br>
<br>
Modified: llvm/trunk/examples/SpeculativeJIT/SpeculativeJIT.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/examples/SpeculativeJIT/SpeculativeJIT.cpp?rev=371843&r1=371842&r2=371843&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/examples/SpeculativeJIT/SpeculativeJIT.cpp?rev=371843&r1=371842&r2=371843&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/examples/SpeculativeJIT/SpeculativeJIT.cpp (original)<br>
+++ llvm/trunk/examples/SpeculativeJIT/SpeculativeJIT.cpp Fri Sep 13 04:35:33 2019<br>
@@ -114,9 +114,7 @@ private:<br>
     this->ES->setDispatchMaterialization(<br>
<br>
         [this](JITDylib &JD, std::unique_ptr<MaterializationUnit> MU) {<br>
-          // FIXME: Switch to move capture once we have c  14.<br>
-          auto SharedMU = std::shared_ptr<MaterializationUnit>(std::move(MU));<br>
-          auto Work = [SharedMU, &JD]() { SharedMU->doMaterialize(JD); };<br>
+          auto Work = [MU = std::move(MU), &JD] { MU->doMaterialize(JD); };<br>
           CompileThreads.async(std::move(Work));<br>
         });<br>
     ExitOnErr(S.addSpeculationRuntime(this->ES->getMainJITDylib(), Mangle));<br>
<br>
Modified: llvm/trunk/include/llvm/ExecutionEngine/JITSymbol.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ExecutionEngine/JITSymbol.h?rev=371843&r1=371842&r2=371843&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ExecutionEngine/JITSymbol.h?rev=371843&r1=371842&r2=371843&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/include/llvm/ExecutionEngine/JITSymbol.h (original)<br>
+++ llvm/trunk/include/llvm/ExecutionEngine/JITSymbol.h Fri Sep 13 04:35:33 2019<br>
@@ -23,6 +23,7 @@<br>
 #include <string><br>
<br>
 #include "llvm/ADT/BitmaskEnum.h"<br>
+#include "llvm/ADT/FunctionExtras.h"<br>
 #include "llvm/ADT/StringRef.h"<br>
 #include "llvm/Support/Error.h"<br>
<br>
@@ -217,7 +218,7 @@ private:<br>
 /// Represents a symbol in the JIT.<br>
 class JITSymbol {<br>
 public:<br>
-  using GetAddressFtor = std::function<Expected<JITTargetAddress>()>;<br>
+  using GetAddressFtor = unique_function<Expected<JITTargetAddress>()>;<br>
<br>
   /// Create a 'null' symbol, used to represent a "symbol not found"<br>
   ///        result from a successful (non-erroneous) lookup.<br>
@@ -325,7 +326,7 @@ class JITSymbolResolver {<br>
 public:<br>
   using LookupSet = std::set<StringRef>;<br>
   using LookupResult = std::map<StringRef, JITEvaluatedSymbol>;<br>
-  using OnResolvedFunction = std::function<void(Expected<LookupResult>)>;<br>
+  using OnResolvedFunction = unique_function<void(Expected<LookupResult>)>;<br>
<br>
   virtual ~JITSymbolResolver() = default;<br>
<br>
<br>
Modified: llvm/trunk/include/llvm/ExecutionEngine/Orc/Core.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ExecutionEngine/Orc/Core.h?rev=371843&r1=371842&r2=371843&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ExecutionEngine/Orc/Core.h?rev=371843&r1=371842&r2=371843&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/include/llvm/ExecutionEngine/Orc/Core.h (original)<br>
+++ llvm/trunk/include/llvm/ExecutionEngine/Orc/Core.h Fri Sep 13 04:35:33 2019<br>
@@ -14,6 +14,7 @@<br>
 #define LLVM_EXECUTIONENGINE_ORC_CORE_H<br>
<br>
 #include "llvm/ADT/BitmaskEnum.h"<br>
+#include "llvm/ADT/FunctionExtras.h"<br>
 #include "llvm/ExecutionEngine/JITSymbol.h"<br>
 #include "llvm/ExecutionEngine/Orc/SymbolStringPool.h"<br>
 #include "llvm/ExecutionEngine/OrcV1Deprecation.h"<br>
@@ -107,7 +108,7 @@ raw_ostream &operator<<(raw_ostream &OS,<br>
 raw_ostream &operator<<(raw_ostream &OS, const SymbolState &S);<br>
<br>
 /// Callback to notify client that symbols have been resolved.<br>
-using SymbolsResolvedCallback = std::function<void(Expected<SymbolMap>)>;<br>
+using SymbolsResolvedCallback = unique_function<void(Expected<SymbolMap>)>;<br>
<br>
 /// Callback to register the dependencies for a given query.<br>
 using RegisterDependenciesFunction =<br>
<br>
Modified: llvm/trunk/include/llvm/ExecutionEngine/Orc/LazyEmittingLayer.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ExecutionEngine/Orc/LazyEmittingLayer.h?rev=371843&r1=371842&r2=371843&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ExecutionEngine/Orc/LazyEmittingLayer.h?rev=371843&r1=371842&r2=371843&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/include/llvm/ExecutionEngine/Orc/LazyEmittingLayer.h (original)<br>
+++ llvm/trunk/include/llvm/ExecutionEngine/Orc/LazyEmittingLayer.h Fri Sep 13 04:35:33 2019<br>
@@ -49,28 +49,24 @@ private:<br>
       switch (EmitState) {<br>
       case NotEmitted:<br>
         if (auto GV = searchGVs(Name, ExportedSymbolsOnly)) {<br>
-          // Create a std::string version of Name to capture here - the argument<br>
-          // (a StringRef) may go away before the lambda is executed.<br>
-          // FIXME: Use capture-init when we move to C++14.<br>
-          std::string PName = Name;<br>
           JITSymbolFlags Flags = JITSymbolFlags::fromGlobalValue(*GV);<br>
-          auto GetAddress =<br>
-            [this, ExportedSymbolsOnly, PName, &B]() -> Expected<JITTargetAddress> {<br>
-              if (this->EmitState == Emitting)<br>
-                return 0;<br>
-              else if (this->EmitState == NotEmitted) {<br>
-                this->EmitState = Emitting;<br>
-                if (auto Err = this->emitToBaseLayer(B))<br>
-                  return std::move(Err);<br>
-                this->EmitState = Emitted;<br>
-              }<br>
-              if (auto Sym = B.findSymbolIn(K, PName, ExportedSymbolsOnly))<br>
-                return Sym.getAddress();<br>
-              else if (auto Err = Sym.takeError())<br>
+          auto GetAddress = [this, ExportedSymbolsOnly, Name = Name.str(),<br>
+                             &B]() -> Expected<JITTargetAddress> {<br>
+            if (this->EmitState == Emitting)<br>
+              return 0;<br>
+            else if (this->EmitState == NotEmitted) {<br>
+              this->EmitState = Emitting;<br>
+              if (auto Err = this->emitToBaseLayer(B))<br>
                 return std::move(Err);<br>
-              else<br>
-                llvm_unreachable("Successful symbol lookup should return "<br>
-                                 "definition address here");<br>
+              this->EmitState = Emitted;<br>
+            }<br>
+            if (auto Sym = B.findSymbolIn(K, Name, ExportedSymbolsOnly))<br>
+              return Sym.getAddress();<br>
+            else if (auto Err = Sym.takeError())<br>
+              return std::move(Err);<br>
+            else<br>
+              llvm_unreachable("Successful symbol lookup should return "<br>
+                               "definition address here");<br>
           };<br>
           return JITSymbol(std::move(GetAddress), Flags);<br>
         } else<br>
<br>
Modified: llvm/trunk/include/llvm/ExecutionEngine/Orc/RPCSerialization.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ExecutionEngine/Orc/RPCSerialization.h?rev=371843&r1=371842&r2=371843&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ExecutionEngine/Orc/RPCSerialization.h?rev=371843&r1=371842&r2=371843&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/include/llvm/ExecutionEngine/Orc/RPCSerialization.h (original)<br>
+++ llvm/trunk/include/llvm/ExecutionEngine/Orc/RPCSerialization.h Fri Sep 13 04:35:33 2019<br>
@@ -359,9 +359,9 @@ public:<br>
     {<br>
       assert(KeyName != nullptr && "No keyname pointer");<br>
       std::lock_guard<std::recursive_mutex> Lock(SerializersMutex);<br>
-      // FIXME: Move capture Serialize once we have C++14.<br>
       Serializers[ErrorInfoT::classID()] =<br>
-          [KeyName, Serialize](ChannelT &C, const ErrorInfoBase &EIB) -> Error {<br>
+          [KeyName, Serialize = std::move(Serialize)](<br>
+              ChannelT &C, const ErrorInfoBase &EIB) -> Error {<br>
         assert(EIB.dynamicClassID() == ErrorInfoT::classID() &&<br>
                "Serializer called for wrong error type");<br>
         if (auto Err = serializeSeq(C, *KeyName))<br>
<br>
Modified: llvm/trunk/include/llvm/ExecutionEngine/Orc/RPCUtils.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ExecutionEngine/Orc/RPCUtils.h?rev=371843&r1=371842&r2=371843&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ExecutionEngine/Orc/RPCUtils.h?rev=371843&r1=371842&r2=371843&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/include/llvm/ExecutionEngine/Orc/RPCUtils.h (original)<br>
+++ llvm/trunk/include/llvm/ExecutionEngine/Orc/RPCUtils.h Fri Sep 13 04:35:33 2019<br>
@@ -1413,14 +1413,12 @@ public:<br>
     using ErrorReturn = typename RTraits::ErrorReturnType;<br>
     using ErrorReturnPromise = typename RTraits::ReturnPromiseType;<br>
<br>
-    // FIXME: Stack allocate and move this into the handler once LLVM builds<br>
-    //        with C++14.<br>
-    auto Promise = std::make_shared<ErrorReturnPromise>();<br>
-    auto FutureResult = Promise->get_future();<br>
+    ErrorReturnPromise Promise;<br>
+    auto FutureResult = Promise.get_future();<br>
<br>
     if (auto Err = this->template appendCallAsync<Func>(<br>
-            [Promise](ErrorReturn RetOrErr) {<br>
-              Promise->set_value(std::move(RetOrErr));<br>
+            [Promise = std::move(Promise)](ErrorReturn RetOrErr) {<br>
+              Promise.set_value(std::move(RetOrErr));<br>
               return Error::success();<br>
             },<br>
             Args...)) {<br>
@@ -1598,8 +1596,7 @@ public:<br>
     // outstanding calls count, then poke the condition variable.<br>
     using ArgType = typename detail::ResponseHandlerArg<<br>
         typename detail::HandlerTraits<HandlerT>::Type>::ArgType;<br>
-    // FIXME: Move handler into wrapped handler once we have C++14.<br>
-    auto WrappedHandler = [this, Handler](ArgType Arg) {<br>
+    auto WrappedHandler = [this, Handler = std::move(Handler)](ArgType Arg) {<br>
       auto Err = Handler(std::move(Arg));<br>
       std::unique_lock<std::mutex> Lock(M);<br>
       --NumOutstandingCalls;<br>
<br>
Modified: llvm/trunk/include/llvm/ExecutionEngine/Orc/RemoteObjectLayer.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ExecutionEngine/Orc/RemoteObjectLayer.h?rev=371843&r1=371842&r2=371843&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ExecutionEngine/Orc/RemoteObjectLayer.h?rev=371843&r1=371842&r2=371843&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/include/llvm/ExecutionEngine/Orc/RemoteObjectLayer.h (original)<br>
+++ llvm/trunk/include/llvm/ExecutionEngine/Orc/RemoteObjectLayer.h Fri Sep 13 04:35:33 2019<br>
@@ -137,17 +137,12 @@ protected:<br>
                              RemoteSymbolId Id)<br>
       : C(C), Id(Id) {}<br>
<br>
-    RemoteSymbolMaterializer(const RemoteSymbolMaterializer &Other)<br>
-      : C(Other.C), Id(Other.Id) {<br>
-      // FIXME: This is a horrible, auto_ptr-style, copy-as-move operation.<br>
-      //        It should be removed as soon as LLVM has C++14's generalized<br>
-      //        lambda capture (at which point the materializer can be moved<br>
-      //        into the lambda in remoteToJITSymbol below).<br>
-      const_cast<RemoteSymbolMaterializer&>(Other).Id = 0;<br>
+    RemoteSymbolMaterializer(RemoteSymbolMaterializer &&Other)<br>
+        : C(Other.C), Id(Other.Id) {<br>
+      Other.Id = 0;<br>
     }<br>
<br>
-    RemoteSymbolMaterializer&<br>
-    operator=(const RemoteSymbolMaterializer&) = delete;<br>
+    RemoteSymbolMaterializer &operator=(RemoteSymbolMaterializer &&) = delete;<br>
<br>
     /// Release the remote symbol.<br>
     ~RemoteSymbolMaterializer() {<br>
@@ -218,9 +213,9 @@ protected:<br>
         return nullptr;<br>
       // else...<br>
       RemoteSymbolMaterializer RSM(*this, RemoteSym.first);<br>
-      auto Sym =<br>
-        JITSymbol([RSM]() mutable { return RSM.materialize(); },<br>
-                  RemoteSym.second);<br>
+      auto Sym = JITSymbol(<br>
+          [RSM = std::move(RSM)]() mutable { return RSM.materialize(); },<br>
+          RemoteSym.second);<br>
       return Sym;<br>
     } else<br>
       return RemoteSymOrErr.takeError();<br>
<br>
Modified: llvm/trunk/include/llvm/ExecutionEngine/RuntimeDyld.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ExecutionEngine/RuntimeDyld.h?rev=371843&r1=371842&r2=371843&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ExecutionEngine/RuntimeDyld.h?rev=371843&r1=371842&r2=371843&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/include/llvm/ExecutionEngine/RuntimeDyld.h (original)<br>
+++ llvm/trunk/include/llvm/ExecutionEngine/RuntimeDyld.h Fri Sep 13 04:35:33 2019<br>
@@ -13,6 +13,7 @@<br>
 #ifndef LLVM_EXECUTIONENGINE_RUNTIMEDYLD_H<br>
 #define LLVM_EXECUTIONENGINE_RUNTIMEDYLD_H<br>
<br>
+#include "llvm/ADT/FunctionExtras.h"<br>
 #include "llvm/ADT/STLExtras.h"<br>
 #include "llvm/ADT/StringRef.h"<br>
 #include "llvm/DebugInfo/DIContext.h"<br>
@@ -271,10 +272,10 @@ private:<br>
                 std::unique_ptr<MemoryBuffer> UnderlyingBuffer,<br>
                 RuntimeDyld::MemoryManager &MemMgr, JITSymbolResolver &Resolver,<br>
                 bool ProcessAllSections,<br>
-                std::function<Error(std::unique_ptr<LoadedObjectInfo>,<br>
-                                    std::map<StringRef, JITEvaluatedSymbol>)><br>
+                unique_function<Error(std::unique_ptr<LoadedObjectInfo>,<br>
+                                      std::map<StringRef, JITEvaluatedSymbol>)><br>
                     OnLoaded,<br>
-                std::function<void(Error)> OnEmitted);<br>
+                unique_function<void(Error)> OnEmitted);<br>
<br>
   // RuntimeDyldImpl is the actual class. RuntimeDyld is just the public<br>
   // interface.<br>
@@ -291,14 +292,14 @@ private:<br>
 // but ORC's RTDyldObjectLinkingLayer2. Internally it constructs a RuntimeDyld<br>
 // instance and uses continuation passing to perform the fix-up and finalize<br>
 // steps asynchronously.<br>
-void jitLinkForORC(object::ObjectFile &Obj,<br>
-                   std::unique_ptr<MemoryBuffer> UnderlyingBuffer,<br>
-                   RuntimeDyld::MemoryManager &MemMgr,<br>
-                   JITSymbolResolver &Resolver, bool ProcessAllSections,<br>
-                   std::function<Error(std::unique_ptr<LoadedObjectInfo>,<br>
-                                       std::map<StringRef, JITEvaluatedSymbol>)><br>
-                       OnLoaded,<br>
-                   std::function<void(Error)> OnEmitted);<br>
+void jitLinkForORC(<br>
+    object::ObjectFile &Obj, std::unique_ptr<MemoryBuffer> UnderlyingBuffer,<br>
+    RuntimeDyld::MemoryManager &MemMgr, JITSymbolResolver &Resolver,<br>
+    bool ProcessAllSections,<br>
+    unique_function<Error(std::unique_ptr<RuntimeDyld::LoadedObjectInfo>,<br>
+                          std::map<StringRef, JITEvaluatedSymbol>)><br>
+        OnLoaded,<br>
+    unique_function<void(Error)> OnEmitted);<br>
<br>
 } // end namespace llvm<br>
<br>
<br>
Modified: llvm/trunk/include/llvm/Support/ThreadPool.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/ThreadPool.h?rev=371843&r1=371842&r2=371843&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/ThreadPool.h?rev=371843&r1=371842&r2=371843&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/include/llvm/Support/ThreadPool.h (original)<br>
+++ llvm/trunk/include/llvm/Support/ThreadPool.h Fri Sep 13 04:35:33 2019<br>
@@ -13,6 +13,7 @@<br>
 #ifndef LLVM_SUPPORT_THREAD_POOL_H<br>
 #define LLVM_SUPPORT_THREAD_POOL_H<br>
<br>
+#include "llvm/ADT/FunctionExtras.h"<br>
 #include "llvm/Config/llvm-config.h"<br>
 #include "llvm/Support/thread.h"<br>
<br>
@@ -35,7 +36,7 @@ namespace llvm {<br>
 /// for some work to become available.<br>
 class ThreadPool {<br>
 public:<br>
-  using TaskTy = std::function<void()>;<br>
+  using TaskTy = unique_function<void()>;<br>
   using PackagedTaskTy = std::packaged_task<void()>;<br>
<br>
   /// Construct a pool with the number of threads found by<br>
<br>
Modified: llvm/trunk/lib/ExecutionEngine/Orc/LLJIT.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/Orc/LLJIT.cpp?rev=371843&r1=371842&r2=371843&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/Orc/LLJIT.cpp?rev=371843&r1=371842&r2=371843&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/ExecutionEngine/Orc/LLJIT.cpp (original)<br>
+++ llvm/trunk/lib/ExecutionEngine/Orc/LLJIT.cpp Fri Sep 13 04:35:33 2019<br>
@@ -132,9 +132,7 @@ LLJIT::LLJIT(LLJITBuilderState &S, Error<br>
     CompileThreads = std::make_unique<ThreadPool>(S.NumCompileThreads);<br>
     ES->setDispatchMaterialization(<br>
         [this](JITDylib &JD, std::unique_ptr<MaterializationUnit> MU) {<br>
-          // FIXME: Switch to move capture once we have c++14.<br>
-          auto SharedMU = std::shared_ptr<MaterializationUnit>(std::move(MU));<br>
-          auto Work = [SharedMU, &JD]() { SharedMU->doMaterialize(JD); };<br>
+          auto Work = [MU = std::move(MU), &JD] { MU->doMaterialize(JD); };<br>
           CompileThreads->async(std::move(Work));<br>
         });<br>
   }<br>
<br>
Modified: llvm/trunk/lib/ExecutionEngine/Orc/Legacy.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/Orc/Legacy.cpp?rev=371843&r1=371842&r2=371843&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/Orc/Legacy.cpp?rev=371843&r1=371842&r2=371843&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/ExecutionEngine/Orc/Legacy.cpp (original)<br>
+++ llvm/trunk/lib/ExecutionEngine/Orc/Legacy.cpp Fri Sep 13 04:35:33 2019<br>
@@ -23,7 +23,8 @@ void JITSymbolResolverAdapter::lookup(co<br>
   for (auto &S : Symbols)<br>
     InternedSymbols.insert(ES.intern(S));<br>
<br>
-  auto OnResolvedWithUnwrap = [OnResolved](Expected<SymbolMap> InternedResult) {<br>
+  auto OnResolvedWithUnwrap = [OnResolved = std::move(OnResolved)](<br>
+                                  Expected<SymbolMap> InternedResult) mutable {<br>
     if (!InternedResult) {<br>
       OnResolved(InternedResult.takeError());<br>
       return;<br>
@@ -36,7 +37,7 @@ void JITSymbolResolverAdapter::lookup(co<br>
   };<br>
<br>
   auto Q = std::make_shared<AsynchronousSymbolQuery>(<br>
-      InternedSymbols, SymbolState::Resolved, OnResolvedWithUnwrap);<br>
+      InternedSymbols, SymbolState::Resolved, std::move(OnResolvedWithUnwrap));<br>
<br>
   auto Unresolved = R.lookup(Q, InternedSymbols);<br>
   if (Unresolved.empty()) {<br>
<br>
Modified: llvm/trunk/lib/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.cpp?rev=371843&r1=371842&r2=371843&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.cpp?rev=371843&r1=371842&r2=371843&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.cpp (original)<br>
+++ llvm/trunk/lib/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.cpp Fri Sep 13 04:35:33 2019<br>
@@ -27,9 +27,9 @@ public:<br>
<br>
     // Build an OnResolve callback to unwrap the interned strings and pass them<br>
     // to the OnResolved callback.<br>
-    // FIXME: Switch to move capture of OnResolved once we have c++14.<br>
     auto OnResolvedWithUnwrap =<br>
-        [OnResolved](Expected<SymbolMap> InternedResult) {<br>
+        [OnResolved = std::move(OnResolved)](<br>
+            Expected<SymbolMap> InternedResult) mutable {<br>
           if (!InternedResult) {<br>
             OnResolved(InternedResult.takeError());<br>
             return;<br>
@@ -50,7 +50,7 @@ public:<br>
     MR.getTargetJITDylib().withSearchOrderDo(<br>
         [&](const JITDylibSearchList &JDs) { SearchOrder = JDs; });<br>
     ES.lookup(SearchOrder, InternedSymbols, SymbolState::Resolved,<br>
-              OnResolvedWithUnwrap, RegisterDependencies);<br>
+              std::move(OnResolvedWithUnwrap), RegisterDependencies);<br>
   }<br>
<br>
   Expected<LookupSet> getResponsibilitySet(const LookupSet &Symbols) {<br>
@@ -133,8 +133,6 @@ void RTDyldObjectLinkingLayer::emit(Mate<br>
<br>
   JITDylibSearchOrderResolver Resolver(*SharedR);<br>
<br>
-  // FIXME: Switch to move-capture for the 'O' buffer once we have c++14.<br>
-  MemoryBuffer *UnownedObjBuffer = O.release();<br>
   jitLinkForORC(<br>
       **Obj, std::move(O), *MemMgr, Resolver, ProcessAllSections,<br>
       [this, K, SharedR, &Obj, InternalSymbols](<br>
@@ -143,9 +141,8 @@ void RTDyldObjectLinkingLayer::emit(Mate<br>
         return onObjLoad(K, *SharedR, **Obj, std::move(LoadedObjInfo),<br>
                          ResolvedSymbols, *InternalSymbols);<br>
       },<br>
-      [this, K, SharedR, UnownedObjBuffer](Error Err) {<br>
-        std::unique_ptr<MemoryBuffer> ObjBuffer(UnownedObjBuffer);<br>
-        onObjEmit(K, std::move(ObjBuffer), *SharedR, std::move(Err));<br>
+      [this, K, SharedR, O = std::move(O)](Error Err) mutable {<br>
+        onObjEmit(K, std::move(O), *SharedR, std::move(Err));<br>
       });<br>
 }<br>
<br>
<br>
Modified: llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp?rev=371843&r1=371842&r2=371843&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp?rev=371843&r1=371842&r2=371843&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp (original)<br>
+++ llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp Fri Sep 13 04:35:33 2019<br>
@@ -1180,17 +1180,15 @@ Error RuntimeDyldImpl::resolveExternalSy<br>
 }<br>
<br>
 void RuntimeDyldImpl::finalizeAsync(<br>
-    std::unique_ptr<RuntimeDyldImpl> This, std::function<void(Error)> OnEmitted,<br>
+    std::unique_ptr<RuntimeDyldImpl> This,<br>
+    unique_function<void(Error)> OnEmitted,<br>
     std::unique_ptr<MemoryBuffer> UnderlyingBuffer) {<br>
<br>
-  // FIXME: Move-capture OnRelocsApplied and UnderlyingBuffer once we have<br>
-  // c++14.<br>
-  auto SharedUnderlyingBuffer =<br>
-      std::shared_ptr<MemoryBuffer>(std::move(UnderlyingBuffer));<br>
   auto SharedThis = std::shared_ptr<RuntimeDyldImpl>(std::move(This));<br>
   auto PostResolveContinuation =<br>
-      [SharedThis, OnEmitted, SharedUnderlyingBuffer](<br>
-          Expected<JITSymbolResolver::LookupResult> Result) {<br>
+      [SharedThis, OnEmitted = std::move(OnEmitted),<br>
+       UnderlyingBuffer = std::move(UnderlyingBuffer)](<br>
+          Expected<JITSymbolResolver::LookupResult> Result) mutable {<br>
         if (!Result) {<br>
           OnEmitted(Result.takeError());<br>
           return;<br>
@@ -1224,7 +1222,7 @@ void RuntimeDyldImpl::finalizeAsync(<br>
   }<br>
<br>
   if (!Symbols.empty()) {<br>
-    SharedThis->Resolver.lookup(Symbols, PostResolveContinuation);<br>
+    SharedThis->Resolver.lookup(Symbols, std::move(PostResolveContinuation));<br>
   } else<br>
     PostResolveContinuation(std::map<StringRef, JITEvaluatedSymbol>());<br>
 }<br>
@@ -1400,11 +1398,11 @@ void jitLinkForORC(object::ObjectFile &O<br>
                    std::unique_ptr<MemoryBuffer> UnderlyingBuffer,<br>
                    RuntimeDyld::MemoryManager &MemMgr,<br>
                    JITSymbolResolver &Resolver, bool ProcessAllSections,<br>
-                   std::function<Error(<br>
+                   unique_function<Error(<br>
                        std::unique_ptr<RuntimeDyld::LoadedObjectInfo> LoadedObj,<br>
                        std::map<StringRef, JITEvaluatedSymbol>)><br>
                        OnLoaded,<br>
-                   std::function<void(Error)> OnEmitted) {<br>
+                   unique_function<void(Error)> OnEmitted) {<br>
<br>
   RuntimeDyld RTDyld(MemMgr, Resolver);<br>
   RTDyld.setProcessAllSections(ProcessAllSections);<br>
<br>
Modified: llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldImpl.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldImpl.h?rev=371843&r1=371842&r2=371843&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldImpl.h?rev=371843&r1=371842&r2=371843&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldImpl.h (original)<br>
+++ llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldImpl.h Fri Sep 13 04:35:33 2019<br>
@@ -549,7 +549,7 @@ public:<br>
   void resolveLocalRelocations();<br>
<br>
   static void finalizeAsync(std::unique_ptr<RuntimeDyldImpl> This,<br>
-                            std::function<void(Error)> OnEmitted,<br>
+                            unique_function<void(Error)> OnEmitted,<br>
                             std::unique_ptr<MemoryBuffer> UnderlyingBuffer);<br>
<br>
   void reassignSectionAddress(unsigned SectionID, uint64_t Addr);<br>
<br>
Modified: llvm/trunk/unittests/ExecutionEngine/Orc/CoreAPIsTest.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/ExecutionEngine/Orc/CoreAPIsTest.cpp?rev=371843&r1=371842&r2=371843&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/ExecutionEngine/Orc/CoreAPIsTest.cpp?rev=371843&r1=371842&r2=371843&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/unittests/ExecutionEngine/Orc/CoreAPIsTest.cpp (original)<br>
+++ llvm/trunk/unittests/ExecutionEngine/Orc/CoreAPIsTest.cpp Fri Sep 13 04:35:33 2019<br>
@@ -1102,9 +1102,8 @@ TEST_F(CoreAPIsStandardTest, TestLookupW<br>
   std::thread MaterializationThread;<br>
   ES.setDispatchMaterialization(<br>
       [&](JITDylib &JD, std::unique_ptr<MaterializationUnit> MU) {<br>
-        auto SharedMU = std::shared_ptr<MaterializationUnit>(std::move(MU));<br>
         MaterializationThread =<br>
-            std::thread([SharedMU, &JD]() { SharedMU->doMaterialize(JD); });<br>
+            std::thread([MU = std::move(MU), &JD] { MU->doMaterialize(JD); });<br>
       });<br>
<br>
   cantFail(JD.define(absoluteSymbols({{Foo, FooSym}})));<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a><br>
<a href="https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br>
</blockquote></div>