18 #if !defined(_MSC_VER) && !defined(__MINGW32__)
27 static constexpr
unsigned MsgSizeOffset = 0;
28 static constexpr
unsigned OpCOffset = MsgSizeOffset +
sizeof(
uint64_t);
29 static constexpr
unsigned SeqNoOffset = OpCOffset +
sizeof(
uint64_t);
30 static constexpr
unsigned TagAddrOffset = SeqNoOffset +
sizeof(
uint64_t);
31 static constexpr
unsigned Size = TagAddrOffset +
sizeof(
uint64_t);
38 namespace SimpleRemoteEPCDefaultBootstrapSymbolNames {
41 "__llvm_orc_SimpleRemoteEPC_dispatch_ctx";
52 #if LLVM_ENABLE_THREADS
54 return make_error<StringError>(
"Invalid input file descriptor " +
58 return make_error<StringError>(
"Invalid output file descriptor " +
61 std::unique_ptr<FDSimpleRemoteEPCTransport> FDT(
65 return make_error<StringError>(
"FD-based SimpleRemoteEPC transport requires "
66 "thread support, but llvm was built with "
67 "LLVM_ENABLE_THREADS=Off",
73 #if LLVM_ENABLE_THREADS
74 ListenerThread.join();
79 #if LLVM_ENABLE_THREADS
80 ListenerThread = std::thread([
this]() { listenLoop(); });
100 std::lock_guard<std::mutex> Lock(M);
102 return make_error<StringError>(
"FD-transport disconnected",
106 if (
int ErrNo = writeBytes(ArgBytes.
data(), ArgBytes.
size()))
116 bool CloseOutFD = InFD != OutFD;
119 while (close(InFD) == -1) {
126 while (close(OutFD) == -1) {
134 return make_error<StringError>(
"Unexpected end-of-file",
138 Error FDSimpleRemoteEPCTransport::readBytes(
char *Dst,
size_t Size,
140 assert((Size == 0 || Dst) &&
"Attempt to read into null.");
141 ssize_t Completed = 0;
142 while (Completed <
static_cast<ssize_t
>(Size)) {
143 ssize_t Read =
::read(InFD, Dst + Completed, Size - Completed);
147 if (Completed == 0 && IsEOF) {
152 }
else if (ErrNo == EAGAIN || ErrNo == EINTR)
155 std::lock_guard<std::mutex> Lock(M);
156 if (Disconnected && IsEOF) {
161 std::error_code(ErrNo, std::generic_category()));
169 int FDSimpleRemoteEPCTransport::writeBytes(
const char *Src,
size_t Size) {
170 assert((Size == 0 || Src) &&
"Attempt to append from null.");
171 ssize_t Completed = 0;
172 while (Completed <
static_cast<ssize_t
>(Size)) {
173 ssize_t Written =
::write(OutFD, Src + Completed, Size - Completed);
176 if (ErrNo == EAGAIN || ErrNo == EINTR)
181 Completed += Written;
186 void FDSimpleRemoteEPCTransport::listenLoop() {
206 ExecutorAddr TagAddr;
219 make_error<StringError>(
"Message size too small",
227 if (
auto Err2 = readBytes(ArgBytes.data(), ArgBytes.size())) {
232 if (
auto Action =
C.handleMessage(OpC, SeqNo, TagAddr, ArgBytes)) {