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);
38namespace 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(
63 return std::move(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(); });
90 char HeaderBuffer[FDMsgHeader::Size];
93 FDMsgHeader::Size + ArgBytes.
size();
100 std::lock_guard<std::mutex> Lock(M);
102 return make_error<StringError>(
"FD-transport disconnected",
104 if (
int ErrNo = writeBytes(HeaderBuffer, FDMsgHeader::Size))
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",
138Error 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()));
169int 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;
186void FDSimpleRemoteEPCTransport::listenLoop() {
190 char HeaderBuffer[FDMsgHeader::Size];
194 if (
auto Err2 = readBytes(HeaderBuffer, FDMsgHeader::Size, &IsEOF)) {
195 Err =
joinErrors(std::move(Err), std::move(Err2));
206 ExecutorAddr TagAddr;
217 if (MsgSize < FDMsgHeader::Size) {
219 make_error<StringError>(
"Message size too small",
226 ArgBytes.resize(MsgSize - FDMsgHeader::Size);
227 if (
auto Err2 = readBytes(ArgBytes.data(), ArgBytes.size())) {
228 Err =
joinErrors(std::move(Err), std::move(Err2));
232 if (
auto Action = C.
handleMessage(OpC, SeqNo, TagAddr, ArgBytes)) {
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
size_t size() const
size - Get the array size.
Lightweight error class with error context and mandatory checking.
static ErrorSuccess success()
Create a success value.
Tagged union holding either a T or a Error.
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
Represents an address in the executor process.
uint64_t getValue() const
Uses read/write on FileDescriptors for transport.
void disconnect() override
Trigger disconnection from the transport.
static Expected< std::unique_ptr< FDSimpleRemoteEPCTransport > > Create(SimpleRemoteEPCTransportClient &C, int InFD, int OutFD)
Create a FDSimpleRemoteEPCTransport using the given FDs for reading (InFD) and writing (OutFD).
Error start() override
Called during setup of the client to indicate that the client is ready to receive messages.
Error sendMessage(SimpleRemoteEPCOpcode OpC, uint64_t SeqNo, ExecutorAddr TagAddr, ArrayRef< char > ArgBytes) override
Send a SimpleRemoteEPC message.
~FDSimpleRemoteEPCTransport() override
virtual Expected< HandleMessageAction > handleMessage(SimpleRemoteEPCOpcode OpC, uint64_t SeqNo, ExecutorAddr TagAddr, SimpleRemoteEPCArgBytesVector ArgBytes)=0
Handle receipt of a message.
virtual void handleDisconnect(Error Err)=0
Handle a disconnection from the underlying transport.
virtual ~SimpleRemoteEPCTransportClient()
virtual ~SimpleRemoteEPCTransport()
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
@ C
The default llvm calling convention, compatible with C.
ManagedStatic< cl::opt< FnT >, OptCreatorT > Action
const char * DispatchFnName
const char * ExecutorSessionObjectName
SmallVector< char, 128 > SimpleRemoteEPCArgBytesVector
static Error makeUnexpectedEOFError()
detail::packed_endian_specific_integral< uint64_t, llvm::endianness::little, unaligned > ulittle64_t
This is an optimization pass for GlobalISel generic memory operations.
std::error_code inconvertibleErrorCode()
The value returned by this function can be returned from convertToErrorCode for Error values where no...
Error joinErrors(Error E1, Error E2)
Concatenate errors.
Error write(MCStreamer &Out, ArrayRef< std::string > Inputs, OnCuIndexOverflow OverflowOptValue)
Error errorCodeToError(std::error_code EC)
Helper for converting an std::error_code to a Error.