blob: 77b1d47a9466e42af86a0c9887967325c54a8daf [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
Lang Hames2a1ee0f2016-05-07 03:48:56 +000017typedef OrcGenericABI HostOrcArch;
Lang Hames9d7a2692016-01-11 16:35:55 +000018#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 Hames1f2bf2d2016-11-11 21:42:09 +000056 FDRawChannel Channel(InFD, OutFD);
57 typedef remote::OrcRemoteTargetServer<FDRawChannel, HostOrcArch> JITServer;
Lang Hames52c47242016-01-14 22:02:03 +000058 JITServer Server(Channel, SymbolLookup, RegisterEHFrames, DeregisterEHFrames);
Lang Hames9d7a2692016-01-11 16:35:55 +000059
Lang Hames1f2bf2d2016-11-11 21:42:09 +000060 while (!Server.receivedTerminate())
61 ExitOnErr(Server.handleOne());
Lang Hames9d7a2692016-01-11 16:35:55 +000062
63 close(InFD);
64 close(OutFD);
65
Andrew Kaylorc2ebf3f2013-10-02 17:12:36 +000066 return 0;
67}