diff --git a/llvm/include/llvm/ExecutionEngine/Orc/SimpleRemoteEPC.h b/llvm/include/llvm/ExecutionEngine/Orc/SimpleRemoteEPC.h index b334b566ed886..839252f20dcdd 100644 --- a/llvm/include/llvm/ExecutionEngine/Orc/SimpleRemoteEPC.h +++ b/llvm/include/llvm/ExecutionEngine/Orc/SimpleRemoteEPC.h @@ -91,6 +91,9 @@ class SimpleRemoteEPC : public ExecutorProcessControl, SimpleRemoteEPC(std::shared_ptr SSP) : ExecutorProcessControl(std::move(SSP)) {} + Error sendMessage(SimpleRemoteEPCOpcode OpC, uint64_t SeqNo, + ExecutorAddr TagAddr, ArrayRef ArgBytes); + Error handleSetup(uint64_t SeqNo, ExecutorAddr TagAddr, SimpleRemoteEPCArgBytesVector ArgBytes); void prepareToReceiveSetupMessage( diff --git a/llvm/include/llvm/ExecutionEngine/Orc/TargetProcess/SimpleRemoteEPCServer.h b/llvm/include/llvm/ExecutionEngine/Orc/TargetProcess/SimpleRemoteEPCServer.h index 4d3412038b3e7..2014a974667aa 100644 --- a/llvm/include/llvm/ExecutionEngine/Orc/TargetProcess/SimpleRemoteEPCServer.h +++ b/llvm/include/llvm/ExecutionEngine/Orc/TargetProcess/SimpleRemoteEPCServer.h @@ -136,6 +136,9 @@ class SimpleRemoteEPCServer : public SimpleRemoteEPCTransportClient { void handleDisconnect(Error Err) override; private: + Error sendMessage(SimpleRemoteEPCOpcode OpC, uint64_t SeqNo, + ExecutorAddr TagAddr, ArrayRef ArgBytes); + Error sendSetupMessage(StringMap BootstrapSymbols); Error handleResult(uint64_t SeqNo, ExecutorAddr TagAddr, diff --git a/llvm/lib/ExecutionEngine/Orc/SimpleRemoteEPC.cpp b/llvm/lib/ExecutionEngine/Orc/SimpleRemoteEPC.cpp index 64e2a1e54adba..7f47f19383b25 100644 --- a/llvm/lib/ExecutionEngine/Orc/SimpleRemoteEPC.cpp +++ b/llvm/lib/ExecutionEngine/Orc/SimpleRemoteEPC.cpp @@ -65,8 +65,8 @@ void SimpleRemoteEPC::callWrapperAsync(SendResultFunction OnComplete, PendingCallWrapperResults[SeqNo] = std::move(OnComplete); } - if (auto Err = T->sendMessage(SimpleRemoteEPCOpcode::CallWrapper, SeqNo, - ExecutorAddr(WrapperFnAddr), ArgBuffer)) { + if (auto Err = sendMessage(SimpleRemoteEPCOpcode::CallWrapper, SeqNo, + ExecutorAddr(WrapperFnAddr), ArgBuffer)) { getExecutionSession().reportError(std::move(Err)); } } @@ -82,6 +82,34 @@ Expected SimpleRemoteEPC::handleMessage(SimpleRemoteEPCOpcode OpC, uint64_t SeqNo, ExecutorAddr TagAddr, SimpleRemoteEPCArgBytesVector ArgBytes) { + + LLVM_DEBUG({ + dbgs() << "SimpleRemoteEPC::handleMessage: opc = "; + switch (OpC) { + case SimpleRemoteEPCOpcode::Setup: + dbgs() << "Setup"; + assert(SeqNo == 0 && "Non-zero SeqNo for Setup?"); + assert(TagAddr.getValue() == 0 && "Non-zero TagAddr for Setup?"); + break; + case SimpleRemoteEPCOpcode::Hangup: + dbgs() << "Hangup"; + assert(SeqNo == 0 && "Non-zero SeqNo for Hangup?"); + assert(TagAddr.getValue() == 0 && "Non-zero TagAddr for Hangup?"); + break; + case SimpleRemoteEPCOpcode::Result: + dbgs() << "Result"; + assert(TagAddr.getValue() == 0 && "Non-zero TagAddr for Result?"); + break; + case SimpleRemoteEPCOpcode::CallWrapper: + dbgs() << "CallWrapper"; + break; + } + dbgs() << ", seqno = " << SeqNo + << ", tag-addr = " << formatv("{0:x}", TagAddr.getValue()) + << ", arg-buffer = " << formatv("{0:x}", ArgBytes.size()) + << " bytes\n"; + }); + using UT = std::underlying_type_t; if (static_cast(OpC) > static_cast(SimpleRemoteEPCOpcode::LastOpC)) return make_error("Unexpected opcode", @@ -93,8 +121,8 @@ SimpleRemoteEPC::handleMessage(SimpleRemoteEPCOpcode OpC, uint64_t SeqNo, return std::move(Err); break; case SimpleRemoteEPCOpcode::Hangup: - // FIXME: Put EPC into 'detached' state. - return SimpleRemoteEPCTransportClient::EndSession; + return make_error("Unexpected Hangup opcode", + inconvertibleErrorCode()); case SimpleRemoteEPCOpcode::Result: if (auto Err = handleResult(SeqNo, TagAddr, std::move(ArgBytes))) return std::move(Err); @@ -107,6 +135,11 @@ SimpleRemoteEPC::handleMessage(SimpleRemoteEPCOpcode OpC, uint64_t SeqNo, } void SimpleRemoteEPC::handleDisconnect(Error Err) { + LLVM_DEBUG({ + dbgs() << "SimpleRemoteEPC::handleDisconnect: " + << (Err ? "failure" : "success") << "\n"; + }); + PendingCallWrapperResultsMap TmpPending; { @@ -144,6 +177,43 @@ SimpleRemoteEPC::createMemoryAccess() { return nullptr; } +Error SimpleRemoteEPC::sendMessage(SimpleRemoteEPCOpcode OpC, uint64_t SeqNo, + ExecutorAddr TagAddr, + ArrayRef ArgBytes) { + assert(OpC != SimpleRemoteEPCOpcode::Setup && + "SimpleRemoteEPC sending Setup message? That's the wrong direction."); + + LLVM_DEBUG({ + dbgs() << "SimpleRemoteEPC::sendMessage: opc = "; + switch (OpC) { + case SimpleRemoteEPCOpcode::Hangup: + dbgs() << "Hangup"; + assert(SeqNo == 0 && "Non-zero SeqNo for Hangup?"); + assert(TagAddr.getValue() == 0 && "Non-zero TagAddr for Hangup?"); + break; + case SimpleRemoteEPCOpcode::Result: + dbgs() << "Result"; + assert(TagAddr.getValue() == 0 && "Non-zero TagAddr for Result?"); + break; + case SimpleRemoteEPCOpcode::CallWrapper: + dbgs() << "CallWrapper"; + break; + default: + llvm_unreachable("Invalid opcode"); + } + dbgs() << ", seqno = " << SeqNo + << ", tag-addr = " << formatv("{0:x}", TagAddr.getValue()) + << ", arg-buffer = " << formatv("{0:x}", ArgBytes.size()) + << " bytes\n"; + }); + auto Err = T->sendMessage(OpC, SeqNo, TagAddr, ArgBytes); + LLVM_DEBUG({ + if (Err) + dbgs() << " \\--> SimpleRemoteEPC::sendMessage failed\n"; + }); + return Err; +} + Error SimpleRemoteEPC::handleSetup(uint64_t SeqNo, ExecutorAddr TagAddr, SimpleRemoteEPCArgBytesVector ArgBytes) { if (SeqNo != 0) @@ -265,9 +335,8 @@ void SimpleRemoteEPC::handleCallWrapper( assert(ES && "No ExecutionSession attached"); ES->runJITDispatchHandler( [this, RemoteSeqNo](shared::WrapperFunctionResult WFR) { - if (auto Err = - T->sendMessage(SimpleRemoteEPCOpcode::Result, RemoteSeqNo, - ExecutorAddr(), {WFR.data(), WFR.size()})) + if (auto Err = sendMessage(SimpleRemoteEPCOpcode::Result, RemoteSeqNo, + ExecutorAddr(), {WFR.data(), WFR.size()})) getExecutionSession().reportError(std::move(Err)); }, TagAddr.getValue(), ArgBytes); diff --git a/llvm/lib/ExecutionEngine/Orc/TargetProcess/SimpleRemoteEPCServer.cpp b/llvm/lib/ExecutionEngine/Orc/TargetProcess/SimpleRemoteEPCServer.cpp index ca47c4d4a54be..b23d5670b2509 100644 --- a/llvm/lib/ExecutionEngine/Orc/TargetProcess/SimpleRemoteEPCServer.cpp +++ b/llvm/lib/ExecutionEngine/Orc/TargetProcess/SimpleRemoteEPCServer.cpp @@ -61,6 +61,34 @@ Expected SimpleRemoteEPCServer::handleMessage(SimpleRemoteEPCOpcode OpC, uint64_t SeqNo, ExecutorAddr TagAddr, SimpleRemoteEPCArgBytesVector ArgBytes) { + + LLVM_DEBUG({ + dbgs() << "SimpleRemoteEPCServer::handleMessage: opc = "; + switch (OpC) { + case SimpleRemoteEPCOpcode::Setup: + dbgs() << "Setup"; + assert(SeqNo == 0 && "Non-zero SeqNo for Setup?"); + assert(TagAddr.getValue() == 0 && "Non-zero TagAddr for Setup?"); + break; + case SimpleRemoteEPCOpcode::Hangup: + dbgs() << "Hangup"; + assert(SeqNo == 0 && "Non-zero SeqNo for Hangup?"); + assert(TagAddr.getValue() == 0 && "Non-zero TagAddr for Hangup?"); + break; + case SimpleRemoteEPCOpcode::Result: + dbgs() << "Result"; + assert(TagAddr.getValue() == 0 && "Non-zero TagAddr for Result?"); + break; + case SimpleRemoteEPCOpcode::CallWrapper: + dbgs() << "CallWrapper"; + break; + } + dbgs() << ", seqno = " << SeqNo + << ", tag-addr = " << formatv("{0:x}", TagAddr.getValue()) + << ", arg-buffer = " << formatv("{0:x}", ArgBytes.size()) + << " bytes\n"; + }); + using UT = std::underlying_type_t; if (static_cast(OpC) > static_cast(SimpleRemoteEPCOpcode::LastOpC)) return make_error("Unexpected opcode", @@ -123,6 +151,44 @@ void SimpleRemoteEPCServer::handleDisconnect(Error Err) { ShutdownCV.notify_all(); } +Error SimpleRemoteEPCServer::sendMessage(SimpleRemoteEPCOpcode OpC, + uint64_t SeqNo, ExecutorAddr TagAddr, + ArrayRef ArgBytes) { + + LLVM_DEBUG({ + dbgs() << "SimpleRemoteEPCServer::sendMessage: opc = "; + switch (OpC) { + case SimpleRemoteEPCOpcode::Setup: + dbgs() << "Setup"; + assert(SeqNo == 0 && "Non-zero SeqNo for Setup?"); + assert(TagAddr.getValue() == 0 && "Non-zero TagAddr for Setup?"); + break; + case SimpleRemoteEPCOpcode::Hangup: + dbgs() << "Hangup"; + assert(SeqNo == 0 && "Non-zero SeqNo for Hangup?"); + assert(TagAddr.getValue() == 0 && "Non-zero TagAddr for Hangup?"); + break; + case SimpleRemoteEPCOpcode::Result: + dbgs() << "Result"; + assert(TagAddr.getValue() == 0 && "Non-zero TagAddr for Result?"); + break; + case SimpleRemoteEPCOpcode::CallWrapper: + dbgs() << "CallWrapper"; + break; + } + dbgs() << ", seqno = " << SeqNo + << ", tag-addr = " << formatv("{0:x}", TagAddr.getValue()) + << ", arg-buffer = " << formatv("{0:x}", ArgBytes.size()) + << " bytes\n"; + }); + auto Err = T->sendMessage(OpC, SeqNo, TagAddr, ArgBytes); + LLVM_DEBUG({ + if (Err) + dbgs() << " \\--> SimpleRemoteEPC::sendMessage failed\n"; + }); + return Err; +} + Error SimpleRemoteEPCServer::sendSetupMessage( StringMap BootstrapSymbols) { @@ -153,8 +219,8 @@ Error SimpleRemoteEPCServer::sendSetupMessage( return make_error("Could not send setup packet", inconvertibleErrorCode()); - return T->sendMessage(SimpleRemoteEPCOpcode::Setup, 0, ExecutorAddr(), - {SetupPacketBytes.data(), SetupPacketBytes.size()}); + return sendMessage(SimpleRemoteEPCOpcode::Setup, 0, ExecutorAddr(), + {SetupPacketBytes.data(), SetupPacketBytes.size()}); } Error SimpleRemoteEPCServer::handleResult( @@ -187,9 +253,9 @@ void SimpleRemoteEPCServer::handleCallWrapper( auto *Fn = TagAddr.toPtr(); shared::WrapperFunctionResult ResultBytes( Fn(ArgBytes.data(), ArgBytes.size())); - if (auto Err = T->sendMessage(SimpleRemoteEPCOpcode::Result, RemoteSeqNo, - ExecutorAddr(), - {ResultBytes.data(), ResultBytes.size()})) + if (auto Err = sendMessage(SimpleRemoteEPCOpcode::Result, RemoteSeqNo, + ExecutorAddr(), + {ResultBytes.data(), ResultBytes.size()})) ReportError(std::move(Err)); }); } @@ -211,9 +277,8 @@ SimpleRemoteEPCServer::doJITDispatch(const void *FnTag, const char *ArgData, PendingJITDispatchResults[SeqNo] = &ResultP; } - if (auto Err = - T->sendMessage(SimpleRemoteEPCOpcode::CallWrapper, SeqNo, - ExecutorAddr::fromPtr(FnTag), {ArgData, ArgSize})) + if (auto Err = sendMessage(SimpleRemoteEPCOpcode::CallWrapper, SeqNo, + ExecutorAddr::fromPtr(FnTag), {ArgData, ArgSize})) ReportError(std::move(Err)); return ResultF.get(); diff --git a/llvm/tools/llvm-jitlink/llvm-jitlink-executor/llvm-jitlink-executor.cpp b/llvm/tools/llvm-jitlink/llvm-jitlink-executor/llvm-jitlink-executor.cpp index e79639b0ef2e0..fecd6285ec9dd 100644 --- a/llvm/tools/llvm-jitlink/llvm-jitlink-executor/llvm-jitlink-executor.cpp +++ b/llvm/tools/llvm-jitlink/llvm-jitlink-executor/llvm-jitlink-executor.cpp @@ -16,6 +16,7 @@ #include "llvm/ExecutionEngine/Orc/TargetProcess/RegisterEHFrames.h" #include "llvm/ExecutionEngine/Orc/TargetProcess/SimpleExecutorMemoryManager.h" #include "llvm/ExecutionEngine/Orc/TargetProcess/SimpleRemoteEPCServer.h" +#include "llvm/Support/Debug.h" #include "llvm/Support/DynamicLibrary.h" #include "llvm/Support/Error.h" #include "llvm/Support/MathExtras.h" @@ -43,10 +44,18 @@ LLVM_ATTRIBUTE_USED void linkComponents() { } void printErrorAndExit(Twine ErrMsg) { +#ifndef NDEBUG + const char *DebugOption = "[debug] "; +#else + const char *DebugOption = ""; +#endif + errs() << "error: " << ErrMsg.str() << "\n\n" << "Usage:\n" - << " llvm-jitlink-executor filedescs=, [args...]\n" - << " llvm-jitlink-executor listen=: [args...]\n"; + << " llvm-jitlink-executor " << DebugOption + << "filedescs=, [args...]\n" + << " llvm-jitlink-executor " << DebugOption + << "listen=: [args...]\n"; exit(1); } @@ -107,15 +116,24 @@ int main(int argc, char *argv[]) { ExitOnErr.setBanner(std::string(argv[0]) + ": "); + unsigned FirstProgramArg = 1; int InFD = 0; int OutFD = 0; if (argc < 2) printErrorAndExit("insufficient arguments"); else { - StringRef Arg1 = argv[1]; + + StringRef ConnectArg = argv[FirstProgramArg++]; +#ifndef NDEBUG + if (ConnectArg == "debug") { + DebugFlag = true; + ConnectArg = argv[FirstProgramArg++]; + } +#endif + StringRef SpecifierType, Specifier; - std::tie(SpecifierType, Specifier) = Arg1.split('='); + std::tie(SpecifierType, Specifier) = ConnectArg.split('='); if (SpecifierType == "filedescs") { StringRef FD1Str, FD2Str; std::tie(FD1Str, FD2Str) = Specifier.split(',');