1 #include "llvm/ExecutionEngine/Orc/OrcABISupport.h"
2 #include "llvm/ExecutionEngine/Orc/OrcRemoteTargetServer.h"
3 #include "llvm/ExecutionEngine/Orc/RPC/FDRawByteChannel.h"
4 #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"
10
11 using namespace llvm;
12 using namespace llvm::orc;
13 using namespace llvm::sys;
14
15 #ifdef __x86_64__
16 typedef OrcX86_64_SysV HostOrcArch;
17 #else
18 typedef OrcGenericABI HostOrcArch;
19 #endif
20
21 ExitOnError ExitOnErr;
22
main(int argc,char * argv[])23 int main(int argc, char *argv[]) {
24
25 if (argc != 3) {
26 errs() << "Usage: " << argv[0] << " <input fd> <output fd>\n";
27 return 1;
28 }
29
30 ExitOnErr.setBanner(std::string(argv[0]) + ":");
31
32 int InFD;
33 int OutFD;
34 {
35 std::istringstream InFDStream(argv[1]), OutFDStream(argv[2]);
36 InFDStream >> InFD;
37 OutFDStream >> OutFD;
38 }
39
40 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
49 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
57 rpc::FDRawByteChannel Channel(InFD, OutFD);
58 typedef remote::OrcRemoteTargetServer<rpc::FDRawByteChannel, HostOrcArch>
59 JITServer;
60 JITServer Server(Channel, SymbolLookup, RegisterEHFrames, DeregisterEHFrames);
61
62 while (!Server.receivedTerminate())
63 ExitOnErr(Server.handleOne());
64
65 close(InFD);
66 close(OutFD);
67
68 return 0;
69 }
70