blob: b7dcaaa3ea9c72c5d30b41b3ea963c46aa2c7536 [file] [log] [blame]
Lang Hames9d7a2692016-01-11 16:35:55 +00001#include "llvm/ExecutionEngine/Orc/OrcArchitectureSupport.h"
2#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__
15typedef OrcX86_64 HostOrcArch;
16#else
17typedef OrcGenericArchitecture HostOrcArch;
18#endif
Andrew Kaylorc2ebf3f2013-10-02 17:12:36 +000019
Lang Hames9d7a2692016-01-11 16:35:55 +000020int main(int argc, char *argv[]) {
Andrew Kaylorc2ebf3f2013-10-02 17:12:36 +000021
Lang Hames9d7a2692016-01-11 16:35:55 +000022 if (argc != 3) {
23 errs() << "Usage: " << argv[0] << " <input fd> <output fd>\n";
24 return 1;
Alp Tokerad6aa472014-01-24 17:18:52 +000025 }
Andrew Kaylorc2ebf3f2013-10-02 17:12:36 +000026
Lang Hames9d7a2692016-01-11 16:35:55 +000027 int InFD;
28 int OutFD;
29 {
30 std::istringstream InFDStream(argv[1]), OutFDStream(argv[2]);
31 InFDStream >> InFD;
32 OutFDStream >> OutFD;
33 }
Andrew Kaylorc2ebf3f2013-10-02 17:12:36 +000034
Lang Hames9d7a2692016-01-11 16:35:55 +000035 if (sys::DynamicLibrary::LoadLibraryPermanently(nullptr)) {
36 errs() << "Error loading program symbols.\n";
37 return 1;
38 }
39
40 auto SymbolLookup = [](const std::string &Name) {
41 return RTDyldMemoryManager::getSymbolAddressInProcess(Name);
42 };
43
Lang Hames52c47242016-01-14 22:02:03 +000044 auto RegisterEHFrames = [](uint8_t *Addr, uint32_t Size) {
45 RTDyldMemoryManager::registerEHFramesInProcess(Addr, Size);
46 };
47
48 auto DeregisterEHFrames = [](uint8_t *Addr, uint32_t Size) {
49 RTDyldMemoryManager::deregisterEHFramesInProcess(Addr, Size);
50 };
51
Lang Hames9d7a2692016-01-11 16:35:55 +000052 FDRPCChannel Channel(InFD, OutFD);
53 typedef remote::OrcRemoteTargetServer<FDRPCChannel, HostOrcArch> JITServer;
Lang Hames52c47242016-01-14 22:02:03 +000054 JITServer Server(Channel, SymbolLookup, RegisterEHFrames, DeregisterEHFrames);
Lang Hames9d7a2692016-01-11 16:35:55 +000055
56 while (1) {
Lang Hames3fde6522016-04-18 19:55:43 +000057 uint32_t RawId;
58 if (auto EC = Server.startReceivingFunction(Channel, RawId)) {
Lang Hames9d7a2692016-01-11 16:35:55 +000059 errs() << "Error: " << EC.message() << "\n";
60 return 1;
61 }
Lang Hames3fde6522016-04-18 19:55:43 +000062 auto Id = static_cast<JITServer::JITFuncId>(RawId);
Lang Hames9d7a2692016-01-11 16:35:55 +000063 switch (Id) {
64 case JITServer::TerminateSessionId:
Lang Hames3fde6522016-04-18 19:55:43 +000065 Server.handleTerminateSession();
Lang Hames9d7a2692016-01-11 16:35:55 +000066 return 0;
67 default:
Lang Hames3fde6522016-04-18 19:55:43 +000068 if (auto EC = Server.handleKnownFunction(Id)) {
Lang Hames9d7a2692016-01-11 16:35:55 +000069 errs() << "Error: " << EC.message() << "\n";
70 return 1;
71 }
72 }
73 }
74
75 close(InFD);
76 close(OutFD);
77
Andrew Kaylorc2ebf3f2013-10-02 17:12:36 +000078 return 0;
79}