1#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" 9 10using namespace llvm; 11using namespace llvm::orc; 12using namespace llvm::sys; 13 14#ifdef __x86_64__ 15typedef OrcX86_64 HostOrcArch; 16#else 17typedef OrcGenericArchitecture HostOrcArch; 18#endif 19 20int main(int argc, char *argv[]) { 21 22 if (argc != 3) { 23 errs() << "Usage: " << argv[0] << " <input fd> <output fd>\n"; 24 return 1; 25 } 26 27 int InFD; 28 int OutFD; 29 { 30 std::istringstream InFDStream(argv[1]), OutFDStream(argv[2]); 31 InFDStream >> InFD; 32 OutFDStream >> OutFD; 33 } 34 35 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 68 return 0; 69} 70