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/ADT/StringRef.h" 14 #include "llvm/ExecutionEngine/Orc/TargetProcess/JITLoaderGDB.h" 15 #include "llvm/ExecutionEngine/Orc/TargetProcess/RegisterEHFrames.h" 16 #include "llvm/ExecutionEngine/Orc/TargetProcess/SimpleExecutorMemoryManager.h" 17 #include "llvm/ExecutionEngine/Orc/TargetProcess/SimpleRemoteEPCServer.h" 18 #include "llvm/Support/DynamicLibrary.h" 19 #include "llvm/Support/Error.h" 20 #include "llvm/Support/MathExtras.h" 21 #include "llvm/Support/raw_ostream.h" 22 #include <cstring> 23 #include <sstream> 24 25 using namespace llvm; 26 using namespace llvm::orc; 27 28 ExitOnError ExitOnErr; 29 30 int main(int argc, char *argv[]) { 31 #if LLVM_ENABLE_THREADS 32 33 if (argc != 3) { 34 errs() << "Usage: " << argv[0] << " <input fd> <output fd>\n"; 35 return 1; 36 } 37 38 if (sys::DynamicLibrary::LoadLibraryPermanently(nullptr)) { 39 errs() << "Error loading program symbols.\n"; 40 return 1; 41 } 42 43 ExitOnErr.setBanner(std::string(argv[0]) + ": "); 44 45 int InFD = 0; 46 int OutFD = 0; 47 { 48 std::istringstream InFDStream(argv[1]), OutFDStream(argv[2]); 49 InFDStream >> InFD; 50 OutFDStream >> OutFD; 51 } 52 53 auto Server = 54 ExitOnErr(SimpleRemoteEPCServer::Create<FDSimpleRemoteEPCTransport>( 55 [](SimpleRemoteEPCServer::Setup &S) -> Error { 56 S.setDispatcher( 57 std::make_unique<SimpleRemoteEPCServer::ThreadDispatcher>()); 58 S.bootstrapSymbols() = 59 SimpleRemoteEPCServer::defaultBootstrapSymbols(); 60 S.services().push_back( 61 std::make_unique<rt_bootstrap::SimpleExecutorMemoryManager>()); 62 return Error::success(); 63 }, 64 InFD, OutFD)); 65 66 ExitOnErr(Server->waitForDisconnect()); 67 68 return 0; 69 70 #else 71 errs() << argv[0] 72 << " error: this tool requires threads, but LLVM was " 73 "built with LLVM_ENABLE_THREADS=Off\n"; 74 return 1; 75 #endif 76 } 77