| //===----------- ChildTarget.cpp - Out-of-proc executor for lli -----------===// | |
| // | |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | |
| // See https://llvm.org/LICENSE.txt for license information. | |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | |
| // | |
| //===----------------------------------------------------------------------===// | |
| // | |
| // Simple out-of-process executor for lli. | |
| // | |
| //===----------------------------------------------------------------------===// | |
| #include "llvm/Config/llvm-config.h" // for LLVM_ENABLE_THREADS | |
| #include "llvm/ExecutionEngine/Orc/TargetProcess/JITLoaderGDB.h" | |
| #include "llvm/ExecutionEngine/Orc/TargetProcess/RegisterEHFrames.h" | |
| #include "llvm/ExecutionEngine/Orc/TargetProcess/SimpleExecutorMemoryManager.h" | |
| #include "llvm/ExecutionEngine/Orc/TargetProcess/SimpleRemoteEPCServer.h" | |
| #include "llvm/Support/DynamicLibrary.h" | |
| #include "llvm/Support/Error.h" | |
| #include "llvm/Support/MathExtras.h" | |
| #include "llvm/Support/raw_ostream.h" | |
| #include <cstring> | |
| #include <sstream> | |
| using namespace llvm; | |
| using namespace llvm::orc; | |
| ExitOnError ExitOnErr; | |
| int main(int argc, char *argv[]) { | |
| #if LLVM_ENABLE_THREADS | |
| if (argc != 3) { | |
| errs() << "Usage: " << argv[0] << " <input fd> <output fd>\n"; | |
| return 1; | |
| } | |
| if (sys::DynamicLibrary::LoadLibraryPermanently(nullptr)) { | |
| errs() << "Error loading program symbols.\n"; | |
| return 1; | |
| } | |
| ExitOnErr.setBanner(std::string(argv[0]) + ": "); | |
| int InFD = 0; | |
| int OutFD = 0; | |
| { | |
| std::istringstream InFDStream(argv[1]), OutFDStream(argv[2]); | |
| InFDStream >> InFD; | |
| OutFDStream >> OutFD; | |
| } | |
| auto Server = | |
| ExitOnErr(SimpleRemoteEPCServer::Create<FDSimpleRemoteEPCTransport>( | |
| [](SimpleRemoteEPCServer::Setup &S) -> Error { | |
| S.setDispatcher( | |
| std::make_unique<SimpleRemoteEPCServer::ThreadDispatcher>()); | |
| S.bootstrapSymbols() = | |
| SimpleRemoteEPCServer::defaultBootstrapSymbols(); | |
| S.services().push_back( | |
| std::make_unique<rt_bootstrap::SimpleExecutorMemoryManager>()); | |
| return Error::success(); | |
| }, | |
| InFD, OutFD)); | |
| ExitOnErr(Server->waitForDisconnect()); | |
| return 0; | |
| #else | |
| errs() << argv[0] | |
| << " error: this tool requires threads, but LLVM was " | |
| "built with LLVM_ENABLE_THREADS=Off\n"; | |
| return 1; | |
| #endif | |
| } |