| #include "llvm/ExecutionEngine/Orc/OrcABISupport.h" |
| #include "llvm/ExecutionEngine/Orc/OrcRemoteTargetServer.h" |
| #include "llvm/Support/Debug.h" |
| #include "llvm/Support/DynamicLibrary.h" |
| #include "llvm/Support/Process.h" |
| #include <sstream> |
| |
| #include "../RemoteJITUtils.h" |
| |
| using namespace llvm; |
| using namespace llvm::orc; |
| using namespace llvm::sys; |
| |
| #ifdef __x86_64__ |
| typedef OrcX86_64_SysV HostOrcArch; |
| #else |
| typedef OrcGenericABI HostOrcArch; |
| #endif |
| |
| ExitOnError ExitOnErr; |
| |
| int main(int argc, char *argv[]) { |
| |
| if (argc != 3) { |
| errs() << "Usage: " << argv[0] << " <input fd> <output fd>\n"; |
| return 1; |
| } |
| |
| ExitOnErr.setBanner(std::string(argv[0]) + ":"); |
| |
| int InFD; |
| int OutFD; |
| { |
| std::istringstream InFDStream(argv[1]), OutFDStream(argv[2]); |
| InFDStream >> InFD; |
| OutFDStream >> OutFD; |
| } |
| |
| if (sys::DynamicLibrary::LoadLibraryPermanently(nullptr)) { |
| errs() << "Error loading program symbols.\n"; |
| return 1; |
| } |
| |
| auto SymbolLookup = [](const std::string &Name) { |
| return RTDyldMemoryManager::getSymbolAddressInProcess(Name); |
| }; |
| |
| auto RegisterEHFrames = [](uint8_t *Addr, uint32_t Size) { |
| RTDyldMemoryManager::registerEHFramesInProcess(Addr, Size); |
| }; |
| |
| auto DeregisterEHFrames = [](uint8_t *Addr, uint32_t Size) { |
| RTDyldMemoryManager::deregisterEHFramesInProcess(Addr, Size); |
| }; |
| |
| FDRawChannel Channel(InFD, OutFD); |
| typedef remote::OrcRemoteTargetServer<FDRawChannel, HostOrcArch> JITServer; |
| JITServer Server(Channel, SymbolLookup, RegisterEHFrames, DeregisterEHFrames); |
| |
| while (!Server.receivedTerminate()) |
| ExitOnErr(Server.handleOne()); |
| |
| close(InFD); |
| close(OutFD); |
| |
| return 0; |
| } |