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 10 using namespace llvm; 11 using namespace llvm::orc; 12 using namespace llvm::sys; 13 14 #ifdef __x86_64__ 15 typedef OrcX86_64 HostOrcArch; 16 #else 17 typedef OrcGenericArchitecture HostOrcArch; 18 #endif 19 20 int 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 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 52 FDRPCChannel Channel(InFD, OutFD); 53 typedef remote::OrcRemoteTargetServer<FDRPCChannel, HostOrcArch> JITServer; 54 JITServer Server(Channel, SymbolLookup, RegisterEHFrames, DeregisterEHFrames); 55 56 while (1) { 57 uint32_t RawId; 58 if (auto EC = Server.startReceivingFunction(Channel, RawId)) { 59 errs() << "Error: " << EC.message() << "\n"; 60 return 1; 61 } 62 auto Id = static_cast<JITServer::JITFuncId>(RawId); 63 switch (Id) { 64 case JITServer::TerminateSessionId: 65 Server.handleTerminateSession(); 66 return 0; 67 default: 68 if (auto EC = Server.handleKnownFunction(Id)) { 69 errs() << "Error: " << EC.message() << "\n"; 70 return 1; 71 } 72 } 73 } 74 75 close(InFD); 76 close(OutFD); 77 78 return 0; 79 } 80