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 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