<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>