blob: 5b8d35791c4f8a300a7dd43e002dbbf27fb9d5f8 [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"
3#include "llvm/Support/Debug.h"
4#include "llvm/Support/DynamicLibrary.h"
5#include "llvm/Support/Process.h"
6#include <sstream>
7
8#include "../RemoteJITUtils.h"
Andrew Kaylorc2ebf3f2013-10-02 17:12:36 +00009
10using namespace llvm;
Lang Hames9d7a2692016-01-11 16:35:55 +000011using namespace llvm::orc;
12using namespace llvm::sys;
Andrew Kaylorc2ebf3f2013-10-02 17:12:36 +000013
Lang Hames9d7a2692016-01-11 16:35:55 +000014#ifdef __x86_64__
Lang Hames4821c242016-05-07 03:36:38 +000015typedef OrcX86_64_SysV HostOrcArch;
Lang Hames9d7a2692016-01-11 16:35:55 +000016#else
17typedef OrcGenericArchitecture HostOrcArch;
18#endif
Andrew Kaylorc2ebf3f2013-10-02 17:12:36 +000019
Lang Hamesef5a0ee2016-04-25 19:56:45 +000020ExitOnError ExitOnErr;
21
Lang Hames9d7a2692016-01-11 16:35:55 +000022int main(int argc, char *argv[]) {
Andrew Kaylorc2ebf3f2013-10-02 17:12:36 +000023
Lang Hames9d7a2692016-01-11 16:35:55 +000024 if (argc != 3) {
25 errs() << "Usage: " << argv[0] << " <input fd> <output fd>\n";
26 return 1;
Alp Tokerad6aa472014-01-24 17:18:52 +000027 }
Andrew Kaylorc2ebf3f2013-10-02 17:12:36 +000028
Lang Hamesef5a0ee2016-04-25 19:56:45 +000029 ExitOnErr.setBanner(std::string(argv[0]) + ":");
30
Lang Hames9d7a2692016-01-11 16:35:55 +000031 int InFD;
32 int OutFD;
33 {
34 std::istringstream InFDStream(argv[1]), OutFDStream(argv[2]);
35 InFDStream >> InFD;
36 OutFDStream >> OutFD;
37 }
Andrew Kaylorc2ebf3f2013-10-02 17:12:36 +000038
Lang Hames9d7a2692016-01-11 16:35:55 +000039 if (sys::DynamicLibrary::LoadLibraryPermanently(nullptr)) {
40 errs() << "Error loading program symbols.\n";
41 return 1;
42 }
43
44 auto SymbolLookup = [](const std::string &Name) {
45 return RTDyldMemoryManager::getSymbolAddressInProcess(Name);
46 };
47
Lang Hames52c47242016-01-14 22:02:03 +000048 auto RegisterEHFrames = [](uint8_t *Addr, uint32_t Size) {
49 RTDyldMemoryManager::registerEHFramesInProcess(Addr, Size);
50 };
51
52 auto DeregisterEHFrames = [](uint8_t *Addr, uint32_t Size) {
53 RTDyldMemoryManager::deregisterEHFramesInProcess(Addr, Size);
54 };
55
Lang Hames9d7a2692016-01-11 16:35:55 +000056 FDRPCChannel Channel(InFD, OutFD);
57 typedef remote::OrcRemoteTargetServer<FDRPCChannel, HostOrcArch> JITServer;
Lang Hames52c47242016-01-14 22:02:03 +000058 JITServer Server(Channel, SymbolLookup, RegisterEHFrames, DeregisterEHFrames);
Lang Hames9d7a2692016-01-11 16:35:55 +000059
60 while (1) {
Lang Hames3fde6522016-04-18 19:55:43 +000061 uint32_t RawId;
Lang Hamesef5a0ee2016-04-25 19:56:45 +000062 ExitOnErr(Server.startReceivingFunction(Channel, RawId));
Lang Hames3fde6522016-04-18 19:55:43 +000063 auto Id = static_cast<JITServer::JITFuncId>(RawId);
Lang Hames9d7a2692016-01-11 16:35:55 +000064 switch (Id) {
65 case JITServer::TerminateSessionId:
Lang Hamesef5a0ee2016-04-25 19:56:45 +000066 ExitOnErr(Server.handleTerminateSession());
Lang Hames9d7a2692016-01-11 16:35:55 +000067 return 0;
68 default:
Lang Hamesef5a0ee2016-04-25 19:56:45 +000069 ExitOnErr(Server.handleKnownFunction(Id));
70 break;
Lang Hames9d7a2692016-01-11 16:35:55 +000071 }
72 }
73
74 close(InFD);
75 close(OutFD);
76
Andrew Kaylorc2ebf3f2013-10-02 17:12:36 +000077 return 0;
78}