blob: 0b75e20f83e9a52e539f1080ff99f2988429470c [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
44 FDRPCChannel Channel(InFD, OutFD);
45 typedef remote::OrcRemoteTargetServer<FDRPCChannel, HostOrcArch> JITServer;
46 JITServer Server(Channel, SymbolLookup);
47
48 while (1) {
49 JITServer::JITProcId Id = JITServer::InvalidId;
50 if (auto EC = Server.getNextProcId(Id)) {
51 errs() << "Error: " << EC.message() << "\n";
52 return 1;
53 }
54 switch (Id) {
55 case JITServer::TerminateSessionId:
56 return 0;
57 default:
58 if (auto EC = Server.handleKnownProcedure(Id)) {
59 errs() << "Error: " << EC.message() << "\n";
60 return 1;
61 }
62 }
63 }
64
65 close(InFD);
66 close(OutFD);
67
Andrew Kaylorc2ebf3f2013-10-02 17:12:36 +000068 return 0;
69}