15e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencer//===- Endian.h - Utilities for IO with endian specific data ----*- C++ -*-===// 25e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencer// 35e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencer// The LLVM Compiler Infrastructure 45e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencer// 55e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencer// This file is distributed under the University of Illinois Open Source 65e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencer// License. See LICENSE.TXT for details. 75e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencer// 85e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencer//===----------------------------------------------------------------------===// 95e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencer// 105e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencer// This file declares generic functions to read and write endian specific data. 115e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencer// 125e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencer//===----------------------------------------------------------------------===// 135e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencer 145e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencer#ifndef LLVM_SUPPORT_ENDIAN_H 155e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencer#define LLVM_SUPPORT_ENDIAN_H 165e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencer 17c8b18df9a79ddb759d6a563dd7ebd90b85ae4918Michael J. Spencer#include "llvm/Support/AlignOf.h" 181f6efa3996dd1929fbc129203ce5009b620e6969Michael J. Spencer#include "llvm/Support/Host.h" 191f6efa3996dd1929fbc129203ce5009b620e6969Michael J. Spencer#include "llvm/Support/SwapByteOrder.h" 205e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencer 215e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencernamespace llvm { 225e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencernamespace support { 23c8b18df9a79ddb759d6a563dd7ebd90b85ae4918Michael J. Spencerenum endianness {big, little, native}; 245e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencer 25c8b18df9a79ddb759d6a563dd7ebd90b85ae4918Michael J. Spencer// These are named values for common alignments. 26c8b18df9a79ddb759d6a563dd7ebd90b85ae4918Michael J. Spencerenum {aligned = 0, unaligned = 1}; 275e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencer 285e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencernamespace detail { 29c8b18df9a79ddb759d6a563dd7ebd90b85ae4918Michael J. Spencer /// \brief ::value is either alignment, or alignof(T) if alignment is 0. 30c8b18df9a79ddb759d6a563dd7ebd90b85ae4918Michael J. Spencer template<class T, int alignment> 31c8b18df9a79ddb759d6a563dd7ebd90b85ae4918Michael J. Spencer struct PickAlignment { 32c8b18df9a79ddb759d6a563dd7ebd90b85ae4918Michael J. Spencer enum {value = alignment == 0 ? AlignOf<T>::Alignment : alignment}; 33c8b18df9a79ddb759d6a563dd7ebd90b85ae4918Michael J. Spencer }; 345e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencer} // end namespace detail 355e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencer 362e6048f8690105f7174e24ceba8e7c9f67009411Michael J. Spencernamespace endian { 3736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// Swap the bytes of value to match the given endianness. 38c8b18df9a79ddb759d6a563dd7ebd90b85ae4918Michael J. Spencertemplate<typename value_type, endianness endian> 39c8b18df9a79ddb759d6a563dd7ebd90b85ae4918Michael J. Spencerinline value_type byte_swap(value_type value) { 4021a01d1ea89dba97c4f9e1f9f41485729a4046bcRafael Espindola if (endian != native && sys::IsBigEndianHost != (endian == big)) 41c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines sys::swapByteOrder(value); 42c8b18df9a79ddb759d6a563dd7ebd90b85ae4918Michael J. Spencer return value; 43c8b18df9a79ddb759d6a563dd7ebd90b85ae4918Michael J. Spencer} 442e6048f8690105f7174e24ceba8e7c9f67009411Michael J. Spencer 4536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// Read a value of a particular endianness from memory. 46c8b18df9a79ddb759d6a563dd7ebd90b85ae4918Michael J. Spencertemplate<typename value_type, 47c8b18df9a79ddb759d6a563dd7ebd90b85ae4918Michael J. Spencer endianness endian, 48c8b18df9a79ddb759d6a563dd7ebd90b85ae4918Michael J. Spencer std::size_t alignment> 49c8b18df9a79ddb759d6a563dd7ebd90b85ae4918Michael J. Spencerinline value_type read(const void *memory) { 50c8b18df9a79ddb759d6a563dd7ebd90b85ae4918Michael J. Spencer value_type ret; 51c8b18df9a79ddb759d6a563dd7ebd90b85ae4918Michael J. Spencer 52c8b18df9a79ddb759d6a563dd7ebd90b85ae4918Michael J. Spencer memcpy(&ret, 53c8b18df9a79ddb759d6a563dd7ebd90b85ae4918Michael J. Spencer LLVM_ASSUME_ALIGNED(memory, 54c8b18df9a79ddb759d6a563dd7ebd90b85ae4918Michael J. Spencer (detail::PickAlignment<value_type, alignment>::value)), 55c8b18df9a79ddb759d6a563dd7ebd90b85ae4918Michael J. Spencer sizeof(value_type)); 56c8b18df9a79ddb759d6a563dd7ebd90b85ae4918Michael J. Spencer return byte_swap<value_type, endian>(ret); 57c8b18df9a79ddb759d6a563dd7ebd90b85ae4918Michael J. Spencer} 582e6048f8690105f7174e24ceba8e7c9f67009411Michael J. Spencer 5936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// Read a value of a particular endianness from a buffer, and increment the 6036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// buffer past that value. 614c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainartemplate<typename value_type, endianness endian, std::size_t alignment, 624c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar typename CharT> 634c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainarinline value_type readNext(const CharT *&memory) { 6436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines value_type ret = read<value_type, endian, alignment>(memory); 6536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines memory += sizeof(value_type); 6636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return ret; 6736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} 6836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 6936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// Write a value to memory with a particular endianness. 70c8b18df9a79ddb759d6a563dd7ebd90b85ae4918Michael J. Spencertemplate<typename value_type, 71c8b18df9a79ddb759d6a563dd7ebd90b85ae4918Michael J. Spencer endianness endian, 72c8b18df9a79ddb759d6a563dd7ebd90b85ae4918Michael J. Spencer std::size_t alignment> 73c8b18df9a79ddb759d6a563dd7ebd90b85ae4918Michael J. Spencerinline void write(void *memory, value_type value) { 74c8b18df9a79ddb759d6a563dd7ebd90b85ae4918Michael J. Spencer value = byte_swap<value_type, endian>(value); 75c8b18df9a79ddb759d6a563dd7ebd90b85ae4918Michael J. Spencer memcpy(LLVM_ASSUME_ALIGNED(memory, 76c8b18df9a79ddb759d6a563dd7ebd90b85ae4918Michael J. Spencer (detail::PickAlignment<value_type, alignment>::value)), 77c8b18df9a79ddb759d6a563dd7ebd90b85ae4918Michael J. Spencer &value, 78c8b18df9a79ddb759d6a563dd7ebd90b85ae4918Michael J. Spencer sizeof(value_type)); 792e6048f8690105f7174e24ceba8e7c9f67009411Michael J. Spencer} 80c8b18df9a79ddb759d6a563dd7ebd90b85ae4918Michael J. Spencer} // end namespace endian 815e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencer 825e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencernamespace detail { 835e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencertemplate<typename value_type, 84fd7c230c85dbc9b1c5145319a0d5eaeb99f61176Michael J. Spencer endianness endian, 85c8b18df9a79ddb759d6a563dd7ebd90b85ae4918Michael J. Spencer std::size_t alignment> 86c8b18df9a79ddb759d6a563dd7ebd90b85ae4918Michael J. Spencerstruct packed_endian_specific_integral { 875e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencer operator value_type() const { 88c8b18df9a79ddb759d6a563dd7ebd90b85ae4918Michael J. Spencer return endian::read<value_type, endian, alignment>( 89c8b18df9a79ddb759d6a563dd7ebd90b85ae4918Michael J. Spencer (const void*)Value.buffer); 905e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencer } 915e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencer 9224973c1063bfb7ac353732a4e8eb801830336c5fEli Bendersky void operator=(value_type newValue) { 93c8b18df9a79ddb759d6a563dd7ebd90b85ae4918Michael J. Spencer endian::write<value_type, endian, alignment>( 94c8b18df9a79ddb759d6a563dd7ebd90b85ae4918Michael J. Spencer (void*)Value.buffer, newValue); 9524973c1063bfb7ac353732a4e8eb801830336c5fEli Bendersky } 965e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencer 9737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines packed_endian_specific_integral &operator+=(value_type newValue) { 9837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines *this = *this + newValue; 9937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return *this; 10037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines } 10137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 10237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines packed_endian_specific_integral &operator-=(value_type newValue) { 10337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines *this = *this - newValue; 10437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return *this; 10537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines } 10637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 1075e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencerprivate: 108c8b18df9a79ddb759d6a563dd7ebd90b85ae4918Michael J. Spencer AlignedCharArray<PickAlignment<value_type, alignment>::value, 109c8b18df9a79ddb759d6a563dd7ebd90b85ae4918Michael J. Spencer sizeof(value_type)> Value; 11037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 11137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinespublic: 11237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines struct ref { 11337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines explicit ref(void *Ptr) : Ptr(Ptr) {} 11437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 11537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines operator value_type() const { 11637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return endian::read<value_type, endian, alignment>(Ptr); 11737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines } 11837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 11937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines void operator=(value_type NewValue) { 12037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines endian::write<value_type, endian, alignment>(Ptr, NewValue); 12137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines } 12237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 12337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines private: 12437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines void *Ptr; 12537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines }; 1265e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencer}; 12737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 1285e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencer} // end namespace detail 1295e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencer 1305e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencertypedef detail::packed_endian_specific_integral 1315e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencer <uint16_t, little, unaligned> ulittle16_t; 1325e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencertypedef detail::packed_endian_specific_integral 1335e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencer <uint32_t, little, unaligned> ulittle32_t; 1345e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencertypedef detail::packed_endian_specific_integral 1355e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencer <uint64_t, little, unaligned> ulittle64_t; 1365e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencer 1375e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencertypedef detail::packed_endian_specific_integral 1385e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencer <int16_t, little, unaligned> little16_t; 1395e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencertypedef detail::packed_endian_specific_integral 1405e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencer <int32_t, little, unaligned> little32_t; 1415e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencertypedef detail::packed_endian_specific_integral 1425e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencer <int64_t, little, unaligned> little64_t; 1435e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencer 1445e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencertypedef detail::packed_endian_specific_integral 1455e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencer <uint16_t, little, aligned> aligned_ulittle16_t; 1465e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencertypedef detail::packed_endian_specific_integral 1475e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencer <uint32_t, little, aligned> aligned_ulittle32_t; 1485e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencertypedef detail::packed_endian_specific_integral 1495e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencer <uint64_t, little, aligned> aligned_ulittle64_t; 1505e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencer 1515e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencertypedef detail::packed_endian_specific_integral 1525e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencer <int16_t, little, aligned> aligned_little16_t; 1535e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencertypedef detail::packed_endian_specific_integral 1545e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencer <int32_t, little, aligned> aligned_little32_t; 1555e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencertypedef detail::packed_endian_specific_integral 1565e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencer <int64_t, little, aligned> aligned_little64_t; 1575e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencer 1585e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencertypedef detail::packed_endian_specific_integral 1595e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencer <uint16_t, big, unaligned> ubig16_t; 1605e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencertypedef detail::packed_endian_specific_integral 1615e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencer <uint32_t, big, unaligned> ubig32_t; 1625e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencertypedef detail::packed_endian_specific_integral 1635e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencer <uint64_t, big, unaligned> ubig64_t; 1645e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencer 1655e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencertypedef detail::packed_endian_specific_integral 1665e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencer <int16_t, big, unaligned> big16_t; 1675e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencertypedef detail::packed_endian_specific_integral 1685e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencer <int32_t, big, unaligned> big32_t; 1695e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencertypedef detail::packed_endian_specific_integral 1705e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencer <int64_t, big, unaligned> big64_t; 1715e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencer 1725e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencertypedef detail::packed_endian_specific_integral 1735e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencer <uint16_t, big, aligned> aligned_ubig16_t; 1745e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencertypedef detail::packed_endian_specific_integral 1755e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencer <uint32_t, big, aligned> aligned_ubig32_t; 1765e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencertypedef detail::packed_endian_specific_integral 1775e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencer <uint64_t, big, aligned> aligned_ubig64_t; 1785e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencer 1795e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencertypedef detail::packed_endian_specific_integral 1805e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencer <int16_t, big, aligned> aligned_big16_t; 1815e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencertypedef detail::packed_endian_specific_integral 1825e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencer <int32_t, big, aligned> aligned_big32_t; 1835e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencertypedef detail::packed_endian_specific_integral 1845e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencer <int64_t, big, aligned> aligned_big64_t; 1855e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencer 186c8b18df9a79ddb759d6a563dd7ebd90b85ae4918Michael J. Spencertypedef detail::packed_endian_specific_integral 187c8b18df9a79ddb759d6a563dd7ebd90b85ae4918Michael J. Spencer <uint16_t, native, unaligned> unaligned_uint16_t; 188c8b18df9a79ddb759d6a563dd7ebd90b85ae4918Michael J. Spencertypedef detail::packed_endian_specific_integral 189c8b18df9a79ddb759d6a563dd7ebd90b85ae4918Michael J. Spencer <uint32_t, native, unaligned> unaligned_uint32_t; 190c8b18df9a79ddb759d6a563dd7ebd90b85ae4918Michael J. Spencertypedef detail::packed_endian_specific_integral 191c8b18df9a79ddb759d6a563dd7ebd90b85ae4918Michael J. Spencer <uint64_t, native, unaligned> unaligned_uint64_t; 192c8b18df9a79ddb759d6a563dd7ebd90b85ae4918Michael J. Spencer 193c8b18df9a79ddb759d6a563dd7ebd90b85ae4918Michael J. Spencertypedef detail::packed_endian_specific_integral 194c8b18df9a79ddb759d6a563dd7ebd90b85ae4918Michael J. Spencer <int16_t, native, unaligned> unaligned_int16_t; 195c8b18df9a79ddb759d6a563dd7ebd90b85ae4918Michael J. Spencertypedef detail::packed_endian_specific_integral 196c8b18df9a79ddb759d6a563dd7ebd90b85ae4918Michael J. Spencer <int32_t, native, unaligned> unaligned_int32_t; 197c8b18df9a79ddb759d6a563dd7ebd90b85ae4918Michael J. Spencertypedef detail::packed_endian_specific_integral 198c8b18df9a79ddb759d6a563dd7ebd90b85ae4918Michael J. Spencer <int64_t, native, unaligned> unaligned_int64_t; 1994c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar 2004c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainarnamespace endian { 2014c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainarinline uint16_t read16le(const void *p) { return *(const ulittle16_t *)p; } 2024c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainarinline uint32_t read32le(const void *p) { return *(const ulittle32_t *)p; } 2034c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainarinline uint64_t read64le(const void *p) { return *(const ulittle64_t *)p; } 2044c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainarinline uint16_t read16be(const void *p) { return *(const ubig16_t *)p; } 2054c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainarinline uint32_t read32be(const void *p) { return *(const ubig32_t *)p; } 2064c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainarinline uint64_t read64be(const void *p) { return *(const ubig64_t *)p; } 2074c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar 2084c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainarinline void write16le(void *p, uint16_t v) { *(ulittle16_t *)p = v; } 2094c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainarinline void write32le(void *p, uint32_t v) { *(ulittle32_t *)p = v; } 2104c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainarinline void write64le(void *p, uint64_t v) { *(ulittle64_t *)p = v; } 2114c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainarinline void write16be(void *p, uint16_t v) { *(ubig16_t *)p = v; } 2124c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainarinline void write32be(void *p, uint32_t v) { *(ubig32_t *)p = v; } 2134c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainarinline void write64be(void *p, uint64_t v) { *(ubig64_t *)p = v; } 2144c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar} // end namespace endian 2155e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencer} // end namespace support 2164c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar} // end namespace llvm 2175e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencer 2185e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencer#endif 219