1 //===----------- ChildTarget.cpp - Out-of-proc executor for lli -----------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 // 9 // Simple out-of-process executor for lli. 10 // 11 //===----------------------------------------------------------------------===// 12 13 #include "llvm/ExecutionEngine/Orc/TargetProcess/JITLoaderGDB.h" 14 #include "llvm/ExecutionEngine/Orc/TargetProcess/RegisterEHFrames.h" 15 #include "llvm/ExecutionEngine/Orc/TargetProcess/SimpleExecutorMemoryManager.h" 16 #include "llvm/ExecutionEngine/Orc/TargetProcess/SimpleRemoteEPCServer.h" 17 #include "llvm/Support/DynamicLibrary.h" 18 #include "llvm/Support/Error.h" 19 #include "llvm/Support/MathExtras.h" 20 #include "llvm/Support/raw_ostream.h" 21 #include <cstring> 22 #include <sstream> 23 24 using namespace llvm; 25 using namespace llvm::orc; 26 27 ExitOnError ExitOnErr; 28 29 int main(int argc, char *argv[]) { 30 #if LLVM_ENABLE_THREADS 31 32 if (argc != 3) { 33 errs() << "Usage: " << argv[0] << " <input fd> <output fd>\n"; 34 return 1; 35 } 36 37 if (sys::DynamicLibrary::LoadLibraryPermanently(nullptr)) { 38 errs() << "Error loading program symbols.\n"; 39 return 1; 40 } 41 42 ExitOnErr.setBanner(std::string(argv[0]) + ": "); 43 44 int InFD = 0; 45 int OutFD = 0; 46 { 47 std::istringstream InFDStream(argv[1]), OutFDStream(argv[2]); 48 InFDStream >> InFD; 49 OutFDStream >> OutFD; 50 } 51 52 auto Server = 53 ExitOnErr(SimpleRemoteEPCServer::Create<FDSimpleRemoteEPCTransport>( 54 [](SimpleRemoteEPCServer::Setup &S) -> Error { 55 S.setDispatcher( 56 std::make_unique<SimpleRemoteEPCServer::ThreadDispatcher>()); 57 S.bootstrapSymbols() = 58 SimpleRemoteEPCServer::defaultBootstrapSymbols(); 59 S.services().push_back( 60 std::make_unique<rt_bootstrap::SimpleExecutorMemoryManager>()); 61 return Error::success(); 62 }, 63 InFD, OutFD)); 64 65 ExitOnErr(Server->waitForDisconnect()); 66 67 return 0; 68 69 #else 70 errs() << argv[0] 71 << " error: this tool requires threads, but LLVM was " 72 "built with LLVM_ENABLE_THREADS=Off\n"; 73 return 1; 74 #endif 75 } 76