forked from OSchip/llvm-project
112 lines
3.4 KiB
C++
112 lines
3.4 KiB
C++
//===-- 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 TargetProcessControl-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 RemoteTargetProcessControl;
|
|
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<RemoteTargetProcessControl> TPC;
|
|
|
|
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<RemoteTargetProcessControl> TPC);
|
|
|
|
friend class JITLinkExecutor;
|
|
};
|
|
|
|
} // namespace orc
|
|
} // namespace llvm
|
|
|
|
#endif
|