blob: b5cf63c5ad90dfdfd5f3bb7c122902677e4759db [file] [log] [blame]
Lang Hames4821c242016-05-07 03:36:38 +00001#include "llvm/ExecutionEngine/Orc/OrcABISupport.h"
Lang Hames9d7a2692016-01-11 16:35:55 +00002#include "llvm/ExecutionEngine/Orc/OrcRemoteTargetServer.h"
Lang Hameseed19c82020-08-10 21:41:01 -07003#include "llvm/ExecutionEngine/Orc/RPC/FDRawByteChannel.h"
Lang Hames9d7a2692016-01-11 16:35:55 +00004#include "llvm/Support/Debug.h"
5#include "llvm/Support/DynamicLibrary.h"
6#include "llvm/Support/Process.h"
7#include <sstream>
8
9#include "../RemoteJITUtils.h"
Andrew Kaylorc2ebf3f2013-10-02 17:12:36 +000010
11using namespace llvm;
Lang Hames9d7a2692016-01-11 16:35:55 +000012using namespace llvm::orc;
13using namespace llvm::sys;
Andrew Kaylorc2ebf3f2013-10-02 17:12:36 +000014
Lang Hames9d7a2692016-01-11 16:35:55 +000015#ifdef __x86_64__
Lang Hames4821c242016-05-07 03:36:38 +000016typedef OrcX86_64_SysV HostOrcArch;
Lang Hames9d7a2692016-01-11 16:35:55 +000017#else
Lang Hames2a1ee0f2016-05-07 03:48:56 +000018typedef OrcGenericABI HostOrcArch;
Lang Hames9d7a2692016-01-11 16:35:55 +000019#endif
Andrew Kaylorc2ebf3f2013-10-02 17:12:36 +000020
Lang Hamesef5a0ee2016-04-25 19:56:45 +000021ExitOnError ExitOnErr;
22
Lang Hames9d7a2692016-01-11 16:35:55 +000023int main(int argc, char *argv[]) {
Andrew Kaylorc2ebf3f2013-10-02 17:12:36 +000024
Lang Hames9d7a2692016-01-11 16:35:55 +000025 if (argc != 3) {
26 errs() << "Usage: " << argv[0] << " <input fd> <output fd>\n";
27 return 1;
Alp Tokerad6aa472014-01-24 17:18:52 +000028 }
Andrew Kaylorc2ebf3f2013-10-02 17:12:36 +000029
Lang Hamesef5a0ee2016-04-25 19:56:45 +000030 ExitOnErr.setBanner(std::string(argv[0]) + ":");
31
Lang Hames9d7a2692016-01-11 16:35:55 +000032 int InFD;
33 int OutFD;
34 {
35 std::istringstream InFDStream(argv[1]), OutFDStream(argv[2]);
36 InFDStream >> InFD;
37 OutFDStream >> OutFD;
38 }
Andrew Kaylorc2ebf3f2013-10-02 17:12:36 +000039
Lang Hames9d7a2692016-01-11 16:35:55 +000040 if (sys::DynamicLibrary::LoadLibraryPermanently(nullptr)) {
41 errs() << "Error loading program symbols.\n";
42 return 1;
43 }
44
45 auto SymbolLookup = [](const std::string &Name) {
46 return RTDyldMemoryManager::getSymbolAddressInProcess(Name);
47 };
48
Lang Hames52c47242016-01-14 22:02:03 +000049 auto RegisterEHFrames = [](uint8_t *Addr, uint32_t Size) {
50 RTDyldMemoryManager::registerEHFramesInProcess(Addr, Size);
51 };
52
53 auto DeregisterEHFrames = [](uint8_t *Addr, uint32_t Size) {
54 RTDyldMemoryManager::deregisterEHFramesInProcess(Addr, Size);
55 };
56
Lang Hameseed19c82020-08-10 21:41:01 -070057 rpc::FDRawByteChannel Channel(InFD, OutFD);
58 typedef remote::OrcRemoteTargetServer<rpc::FDRawByteChannel, HostOrcArch>
59 JITServer;
Lang Hames52c47242016-01-14 22:02:03 +000060 JITServer Server(Channel, SymbolLookup, RegisterEHFrames, DeregisterEHFrames);
Lang Hames9d7a2692016-01-11 16:35:55 +000061
Lang Hames1f2bf2d2016-11-11 21:42:09 +000062 while (!Server.receivedTerminate())
63 ExitOnErr(Server.handleOne());
Lang Hames9d7a2692016-01-11 16:35:55 +000064
65 close(InFD);
66 close(OutFD);
67
Andrew Kaylorc2ebf3f2013-10-02 17:12:36 +000068 return 0;
69}