| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485 |
- //===---- RemoteTargetMessage.h - LLI out-of-process message protocol -----===//
- //
- // The LLVM Compiler Infrastructure
- //
- // This file is distributed under the University of Illinois Open Source
- // License. See LICENSE.TXT for details.
- //
- //===----------------------------------------------------------------------===//
- //
- // Definition of the LLIMessageType enum which is used for communication with a
- // child process for remote execution.
- //
- //===----------------------------------------------------------------------===//
- #ifndef LLVM_TOOLS_LLI_REMOTETARGETMESSAGE_H
- #define LLVM_TOOLS_LLI_REMOTETARGETMESSAGE_H
- namespace llvm {
- // LLI messages from parent-to-child or vice versa follow an exceedingly simple
- // protocol where the first four bytes represent the message type, the next
- // four bytes represent the size of data for the command and following bytes
- // represent the actual data.
- //
- // The protocol is not intended to be robust, secure or fault-tolerant. It is
- // only here for testing purposes and is therefore intended to be the simplest
- // implementation that will work. It is assumed that the parent and child
- // share characteristics like endianness.
- //
- // Quick description of the protocol:
- //
- // { Header + Payload Size + Payload }
- //
- // The protocol message consist of a header, the payload size (which can be
- // zero), and the payload itself. The payload can contain any number of items,
- // and the size has to be the sum of them all. Each end is responsible for
- // reading/writing the correct number of items with the correct sizes.
- //
- // The current four known exchanges are:
- //
- // * Allocate Space:
- // Parent: { LLI_AllocateSpace, 8, Alignment, Size }
- // Child: { LLI_AllocationResult, 8, Address }
- //
- // * Load Data:
- // Parent: { LLI_LoadDataSection, 8+Size, Address, Data }
- // Child: { LLI_LoadComplete, 4, StatusCode }
- //
- // * Load Code:
- // Parent: { LLI_LoadCodeSection, 8+Size, Address, Code }
- // Child: { LLI_LoadComplete, 4, StatusCode }
- //
- // * Execute Code:
- // Parent: { LLI_Execute, 8, Address }
- // Child: { LLI_ExecutionResult, 4, Result }
- //
- // It is the responsibility of either side to check for correct headers,
- // sizes and payloads, since any inconsistency would misalign the pipe, and
- // result in data corruption.
- enum LLIMessageType {
- LLI_Error = -1,
- LLI_ChildActive = 0, // Data = not used
- LLI_AllocateSpace, // Data = struct { uint32_t Align, uint_32t Size }
- LLI_AllocationResult, // Data = uint64_t Address (child memory space)
- LLI_LoadCodeSection, // Data = uint64_t Address, void * SectionData
- LLI_LoadDataSection, // Data = uint64_t Address, void * SectionData
- LLI_LoadResult, // Data = uint32_t LLIMessageStatus
- LLI_Execute, // Data = uint64_t Address
- LLI_ExecutionResult, // Data = uint32_t Result
- LLI_Terminate // Data = not used
- };
- enum LLIMessageStatus {
- LLI_Status_Success = 0, // Operation succeeded
- LLI_Status_NotAllocated, // Address+Size not allocated in child space
- LLI_Status_IncompleteMsg // Size received doesn't match request
- };
- } // end namespace llvm
- #endif
|