aboutsummaryrefslogtreecommitdiffstats
path: root/contrib/libs/llvm12/tools/lli/ChildTarget
diff options
context:
space:
mode:
authormonster <monster@ydb.tech>2022-07-07 14:41:37 +0300
committermonster <monster@ydb.tech>2022-07-07 14:41:37 +0300
commit06e5c21a835c0e923506c4ff27929f34e00761c2 (patch)
tree75efcbc6854ef9bd476eb8bf00cc5c900da436a2 /contrib/libs/llvm12/tools/lli/ChildTarget
parent03f024c4412e3aa613bb543cf1660176320ba8f4 (diff)
downloadydb-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.cpp69
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;
+}