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