1// 2// Copyright (c) 2024 Apple Inc. All rights reserved. 3// Provided subject to the LICENSE file in the top level directory. 4// 5 6#include <executorch/backends/apple/mps/runtime/MPSDelegateHeader.h> 7 8#include <cstring> 9 10#include <executorch/runtime/core/error.h> 11#include <executorch/runtime/core/result.h> 12 13namespace executorch { 14namespace backends { 15namespace mps { 16namespace delegate { 17 18using executorch::runtime::Error; 19using executorch::runtime::Result; 20 21/// Interprets the 8 bytes at `data` as a little-endian uint64_t. 22uint64_t getUInt64LE(const uint8_t* data) { 23 return (uint64_t)data[0] | ((uint64_t)data[1] << 8) | 24 ((uint64_t)data[2] << 16) | ((uint64_t)data[3] << 24) | 25 ((uint64_t)data[4] << 32) | ((uint64_t)data[5] << 40) | 26 ((uint64_t)data[6] << 48) | ((uint64_t)data[7] << 56); 27} 28 29Result<MPSDelegateHeader> MPSDelegateHeader::Parse(const void* data, size_t size) { 30 const uint8_t* header_data = (const uint8_t*)data; 31 32 if (size < MPSDelegateHeader::kMinSize) { 33 return Error::InvalidArgument; 34 } 35 36 const uint8_t* magic_start = header_data + MPSDelegateHeader::kMagicOffset; 37 if (std::memcmp(magic_start, MPSDelegateHeader::kMagic, MPSDelegateHeader::kMagicSize) != 0) { 38 return Error::NotFound; 39 } 40 41 uint64_t constant_data_offset = getUInt64LE(header_data + MPSDelegateHeader::kConstantDataSegmentOffset); 42 uint64_t constant_data_size = getUInt64LE(header_data + MPSDelegateHeader::kConstantDataSizeOffset); 43 uint64_t flatbuffer_offset = MPSDelegateHeader::kFlatbufferDataOffsetOffset; 44 uint64_t flatbuffer_size = size - flatbuffer_offset; 45 46 return MPSDelegateHeader{ 47 constant_data_offset, 48 constant_data_size, 49 flatbuffer_offset, 50 flatbuffer_size}; 51} 52 53} // namespace delegate 54} // namespace mps 55} // namespace backends 56} // namespace executorch 57