1 //===-- RemoteJITUtils.h - Utilities for remote-JITing with LLI -*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // Utilities for remote-JITing with LLI.
12 //===----------------------------------------------------------------------===//
14 #ifndef LLVM_TOOLS_LLI_REMOTEJITUTILS_H
15 #define LLVM_TOOLS_LLI_REMOTEJITUTILS_H
17 #include "llvm/ExecutionEngine/Orc/RawByteChannel.h"
18 #include "llvm/ExecutionEngine/RTDyldMemoryManager.h"
21 #if !defined(_MSC_VER) && !defined(__MINGW32__)
27 /// RPC channel that reads from and writes from file descriptors.
28 class FDRawChannel final
: public llvm::orc::rpc::RawByteChannel
{
30 FDRawChannel(int InFD
, int OutFD
) : InFD(InFD
), OutFD(OutFD
) {}
32 llvm::Error
readBytes(char *Dst
, unsigned Size
) override
{
33 assert(Dst
&& "Attempt to read into null.");
34 ssize_t Completed
= 0;
35 while (Completed
< static_cast<ssize_t
>(Size
)) {
36 ssize_t Read
= ::read(InFD
, Dst
+ Completed
, Size
- Completed
);
39 if (ErrNo
== EAGAIN
|| ErrNo
== EINTR
)
42 return llvm::errorCodeToError(
43 std::error_code(errno
, std::generic_category()));
47 return llvm::Error::success();
50 llvm::Error
appendBytes(const char *Src
, unsigned Size
) override
{
51 assert(Src
&& "Attempt to append from null.");
52 ssize_t Completed
= 0;
53 while (Completed
< static_cast<ssize_t
>(Size
)) {
54 ssize_t Written
= ::write(OutFD
, Src
+ Completed
, Size
- Completed
);
57 if (ErrNo
== EAGAIN
|| ErrNo
== EINTR
)
60 return llvm::errorCodeToError(
61 std::error_code(errno
, std::generic_category()));
65 return llvm::Error::success();
68 llvm::Error
send() override
{ return llvm::Error::success(); }
74 // launch the remote process (see lli.cpp) and return a channel to it.
75 std::unique_ptr
<FDRawChannel
> launchRemote();
79 // ForwardingMM - Adapter to connect MCJIT to Orc's Remote8
81 class ForwardingMemoryManager
: public llvm::RTDyldMemoryManager
{
83 void setMemMgr(std::unique_ptr
<RuntimeDyld::MemoryManager
> MemMgr
) {
84 this->MemMgr
= std::move(MemMgr
);
87 void setResolver(std::shared_ptr
<LegacyJITSymbolResolver
> Resolver
) {
88 this->Resolver
= std::move(Resolver
);
91 uint8_t *allocateCodeSection(uintptr_t Size
, unsigned Alignment
,
93 StringRef SectionName
) override
{
94 return MemMgr
->allocateCodeSection(Size
, Alignment
, SectionID
, SectionName
);
97 uint8_t *allocateDataSection(uintptr_t Size
, unsigned Alignment
,
98 unsigned SectionID
, StringRef SectionName
,
99 bool IsReadOnly
) override
{
100 return MemMgr
->allocateDataSection(Size
, Alignment
, SectionID
, SectionName
,
104 void reserveAllocationSpace(uintptr_t CodeSize
, uint32_t CodeAlign
,
105 uintptr_t RODataSize
, uint32_t RODataAlign
,
106 uintptr_t RWDataSize
,
107 uint32_t RWDataAlign
) override
{
108 MemMgr
->reserveAllocationSpace(CodeSize
, CodeAlign
, RODataSize
, RODataAlign
,
109 RWDataSize
, RWDataAlign
);
112 bool needsToReserveAllocationSpace() override
{
113 return MemMgr
->needsToReserveAllocationSpace();
116 void registerEHFrames(uint8_t *Addr
, uint64_t LoadAddr
,
117 size_t Size
) override
{
118 MemMgr
->registerEHFrames(Addr
, LoadAddr
, Size
);
121 void deregisterEHFrames() override
{
122 MemMgr
->deregisterEHFrames();
125 bool finalizeMemory(std::string
*ErrMsg
= nullptr) override
{
126 return MemMgr
->finalizeMemory(ErrMsg
);
129 void notifyObjectLoaded(RuntimeDyld
&RTDyld
,
130 const object::ObjectFile
&Obj
) override
{
131 MemMgr
->notifyObjectLoaded(RTDyld
, Obj
);
134 // Don't hide the sibling notifyObjectLoaded from RTDyldMemoryManager.
135 using RTDyldMemoryManager::notifyObjectLoaded
;
137 JITSymbol
findSymbol(const std::string
&Name
) override
{
138 return Resolver
->findSymbol(Name
);
142 findSymbolInLogicalDylib(const std::string
&Name
) override
{
143 return Resolver
->findSymbolInLogicalDylib(Name
);
147 std::unique_ptr
<RuntimeDyld::MemoryManager
> MemMgr
;
148 std::shared_ptr
<LegacyJITSymbolResolver
> Resolver
;