1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112
|
//===-- RemoteJITUtils.h - Utilities for remote-JITing ----------*- C++ -*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
//
// Utilities for ExecutorProcessControl-based remote JITing with Orc and
// JITLink.
//
//===----------------------------------------------------------------------===//
#ifndef LLVM_EXAMPLES_ORCV2EXAMPLES_LLJITWITHREMOTEDEBUGGING_REMOTEJITUTILS_H
#define LLVM_EXAMPLES_ORCV2EXAMPLES_LLJITWITHREMOTEDEBUGGING_REMOTEJITUTILS_H
#include "llvm/ADT/ArrayRef.h"
#include "llvm/ADT/StringRef.h"
#include "llvm/ADT/Triple.h"
#include "llvm/ExecutionEngine/JITSymbol.h"
#include "llvm/ExecutionEngine/Orc/Core.h"
#include "llvm/ExecutionEngine/Orc/Layer.h"
#include "llvm/ExecutionEngine/Orc/ObjectTransformLayer.h"
#include "llvm/ExecutionEngine/Orc/Shared/FDRawByteChannel.h"
#include "llvm/Support/Error.h"
#include <memory>
#include <string>
#if !defined(_MSC_VER) && !defined(__MINGW32__)
#include <unistd.h>
#else
#include <io.h>
#endif
namespace llvm {
namespace orc {
class ChildProcessJITLinkExecutor;
class RemoteExecutorProcessControl;
class TCPSocketJITLinkExecutor;
class JITLinkExecutor {
public:
using RPCChannel = shared::FDRawByteChannel;
/// Create a JITLinkExecutor for the given exectuable on disk.
static Expected<std::unique_ptr<ChildProcessJITLinkExecutor>>
CreateLocal(std::string ExecutablePath);
/// Find the default exectuable on disk and create a JITLinkExecutor for it.
static Expected<std::unique_ptr<ChildProcessJITLinkExecutor>>
FindLocal(const char *JITArgv0);
/// Create a JITLinkExecutor that connects to the given network address
/// through a TCP socket. A valid NetworkAddress provides hostname and port,
/// e.g. localhost:20000.
static Expected<std::unique_ptr<TCPSocketJITLinkExecutor>>
ConnectTCPSocket(StringRef NetworkAddress, ExecutionSession &ES);
// Implement ObjectLinkingLayerCreator
Expected<std::unique_ptr<ObjectLayer>> operator()(ExecutionSession &,
const Triple &);
Error addDebugSupport(ObjectLayer &ObjLayer);
Expected<std::unique_ptr<DefinitionGenerator>>
loadDylib(StringRef RemotePath);
Expected<int> runAsMain(JITEvaluatedSymbol MainSym,
ArrayRef<std::string> Args);
Error disconnect();
virtual ~JITLinkExecutor();
protected:
std::unique_ptr<RemoteExecutorProcessControl> EPC;
JITLinkExecutor();
};
/// JITLinkExecutor that runs in a child process on the local machine.
class ChildProcessJITLinkExecutor : public JITLinkExecutor {
public:
Error launch(ExecutionSession &ES);
pid_t getPID() const { return ProcessID; }
StringRef getPath() const { return ExecutablePath; }
private:
std::string ExecutablePath;
pid_t ProcessID;
ChildProcessJITLinkExecutor(std::string ExecutablePath)
: ExecutablePath(std::move(ExecutablePath)) {}
static std::string defaultPath(const char *HostArgv0, StringRef ExecutorName);
friend class JITLinkExecutor;
};
/// JITLinkExecutor connected through a TCP socket.
class TCPSocketJITLinkExecutor : public JITLinkExecutor {
private:
TCPSocketJITLinkExecutor(std::unique_ptr<RemoteExecutorProcessControl> EPC);
friend class JITLinkExecutor;
};
} // namespace orc
} // namespace llvm
#endif
|