1 //===---- RemoteTargetMessage.h - LLI out-of-process message protocol -----===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 // 10 // Definition of the LLIMessageType enum which is used for communication with a 11 // child process for remote execution. 12 // 13 //===----------------------------------------------------------------------===// 14 15 #ifndef LLI_REMOTETARGETMESSAGE_H 16 #define LLI_REMOTETARGETMESSAGE_H 17 18 namespace llvm { 19 20 // LLI messages from parent-to-child or vice versa follow an exceedingly simple 21 // protocol where the first four bytes represent the message type, the next 22 // four bytes represent the size of data for the command and following bytes 23 // represent the actual data. 24 // 25 // The protocol is not intended to be robust, secure or fault-tolerant. It is 26 // only here for testing purposes and is therefore intended to be the simplest 27 // implementation that will work. It is assumed that the parent and child 28 // share characteristics like endianness. 29 // 30 // Quick description of the protocol: 31 // 32 // { Header + Payload Size + Payload } 33 // 34 // The protocol message consist of a header, the payload size (which can be 35 // zero), and the payload itself. The payload can contain any number of items, 36 // and the size has to be the sum of them all. Each end is responsible for 37 // reading/writing the correct number of items with the correct sizes. 38 // 39 // The current four known exchanges are: 40 // 41 // * Allocate Space: 42 // Parent: { LLI_AllocateSpace, 8, Alignment, Size } 43 // Child: { LLI_AllocationResult, 8, Address } 44 // 45 // * Load Data: 46 // Parent: { LLI_LoadDataSection, 8+Size, Address, Data } 47 // Child: { LLI_LoadComplete, 4, StatusCode } 48 // 49 // * Load Code: 50 // Parent: { LLI_LoadCodeSection, 8+Size, Address, Code } 51 // Child: { LLI_LoadComplete, 4, StatusCode } 52 // 53 // * Execute Code: 54 // Parent: { LLI_Execute, 8, Address } 55 // Child: { LLI_ExecutionResult, 4, Result } 56 // 57 // It is the responsibility of either side to check for correct headers, 58 // sizes and payloads, since any inconsistency would misalign the pipe, and 59 // result in data corruption. 60 61 enum LLIMessageType { 62 LLI_Error = -1, 63 LLI_ChildActive = 0, // Data = not used 64 LLI_AllocateSpace, // Data = struct { uint32_t Align, uint_32t Size } 65 LLI_AllocationResult, // Data = uint64_t Address (child memory space) 66 67 LLI_LoadCodeSection, // Data = uint64_t Address, void * SectionData 68 LLI_LoadDataSection, // Data = uint64_t Address, void * SectionData 69 LLI_LoadResult, // Data = uint32_t LLIMessageStatus 70 71 LLI_Execute, // Data = uint64_t Address 72 LLI_ExecutionResult, // Data = uint32_t Result 73 74 LLI_Terminate // Data = not used 75 }; 76 77 enum LLIMessageStatus { 78 LLI_Status_Success = 0, // Operation succeeded 79 LLI_Status_NotAllocated, // Address+Size not allocated in child space 80 LLI_Status_IncompleteMsg // Size received doesn't match request 81 }; 82 83 } // end namespace llvm 84 85 #endif 86