diff options
author | monster <monster@ydb.tech> | 2022-07-07 14:41:37 +0300 |
---|---|---|
committer | monster <monster@ydb.tech> | 2022-07-07 14:41:37 +0300 |
commit | 06e5c21a835c0e923506c4ff27929f34e00761c2 (patch) | |
tree | 75efcbc6854ef9bd476eb8bf00cc5c900da436a2 /contrib/libs/llvm12/tools/lli/ChildTarget | |
parent | 03f024c4412e3aa613bb543cf1660176320ba8f4 (diff) | |
download | ydb-06e5c21a835c0e923506c4ff27929f34e00761c2.tar.gz |
fix ya.make
Diffstat (limited to 'contrib/libs/llvm12/tools/lli/ChildTarget')
-rw-r--r-- | contrib/libs/llvm12/tools/lli/ChildTarget/ChildTarget.cpp | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/contrib/libs/llvm12/tools/lli/ChildTarget/ChildTarget.cpp b/contrib/libs/llvm12/tools/lli/ChildTarget/ChildTarget.cpp new file mode 100644 index 0000000000..5772baca1d --- /dev/null +++ b/contrib/libs/llvm12/tools/lli/ChildTarget/ChildTarget.cpp @@ -0,0 +1,69 @@ +#include "llvm/ExecutionEngine/Orc/OrcABISupport.h" +#include "llvm/ExecutionEngine/Orc/OrcRemoteTargetServer.h" +#include "llvm/ExecutionEngine/Orc/Shared/FDRawByteChannel.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); + }; + + shared::FDRawByteChannel Channel(InFD, OutFD); + typedef remote::OrcRemoteTargetServer<shared::FDRawByteChannel, HostOrcArch> + JITServer; + JITServer Server(Channel, SymbolLookup, RegisterEHFrames, DeregisterEHFrames); + + while (!Server.receivedTerminate()) + ExitOnErr(Server.handleOne()); + + close(InFD); + close(OutFD); + + return 0; +} |