blob: 93925d6aa873f2ed779e30141c83387377a2e3e6 [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) {
Nico Weberca94d0e2016-04-18 13:57:08 +000057 JITServer::JITProcId Id = JITServer::InvalidId;
58 if (auto EC = Server.getNextProcId(Id)) {
Lang Hames9d7a2692016-01-11 16:35:55 +000059 errs() << "Error: " << EC.message() << "\n";
60 return 1;
61 }
62 switch (Id) {
63 case JITServer::TerminateSessionId:
64 return 0;
65 default:
Nico Weberca94d0e2016-04-18 13:57:08 +000066 if (auto EC = Server.handleKnownProcedure(Id)) {
Lang Hames9d7a2692016-01-11 16:35:55 +000067 errs() << "Error: " << EC.message() << "\n";
68 return 1;
69 }
70 }
71 }
72
73 close(InFD);
74 close(OutFD);
75
Andrew Kaylorc2ebf3f2013-10-02 17:12:36 +000076 return 0;
77}