1 //===- SizeTraits.h -------------------------------------------------------===// 2 // 3 // The MCLinker Project 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 #ifndef MCLD_SIZE_TRAITS_H 10 #define MCLD_SIZE_TRAITS_H 11 #ifdef ENABLE_UNITTEST 12 #include <gtest.h> 13 #endif 14 15 #include <llvm/Support/DataTypes.h> 16 17 namespace mcld 18 { 19 20 template<size_t SIZE> 21 struct SizeTraits; 22 23 template<> 24 class SizeTraits<32> 25 { 26 typedef uint32_t Address; 27 typedef uint32_t Offset; 28 typedef uint32_t Word; 29 typedef int32_t SWord; 30 }; 31 32 template<> 33 class SizeTraits<64> 34 { 35 typedef uint64_t Address; 36 typedef uint64_t Offset; 37 typedef uint64_t Word; 38 typedef int64_t SWord; 39 }; 40 41 /// alignAddress - helper function to align an address with given alignment 42 /// constraint 43 /// 44 /// @param pAddr - the address to be aligned 45 /// @param pAlignConstraint - the alignment used to align the given address alignAddress(uint64_t & pAddr,uint64_t pAlignConstraint)46inline void alignAddress(uint64_t& pAddr, uint64_t pAlignConstraint) 47 { 48 if (pAlignConstraint != 0) 49 pAddr = (pAddr + pAlignConstraint - 1) &~ (pAlignConstraint - 1); 50 } 51 52 template<size_t Constraint> 53 uint64_t Align(uint64_t pAddress); 54 55 template<> 56 inline uint64_t Align<32>(uint64_t pAddress) 57 { 58 return (pAddress + 0x1F) & (~0x1F); 59 } 60 61 template<> 62 inline uint64_t Align<64>(uint64_t pAddress) 63 { 64 return (pAddress + 0x3F) & (~0x3F); 65 } 66 67 /// bswap16 - byte swap 16-bit version 68 /// @ref binary utilities - elfcpp_swap bswap16(uint16_t pData)69inline uint16_t bswap16(uint16_t pData) 70 { 71 return ((pData >> 8) & 0xFF) | ((pData & 0xFF) << 8); 72 } 73 74 /// bswap32 - byte swap 32-bit version 75 /// @ref elfcpp_swap bswap32(uint32_t pData)76inline uint32_t bswap32(uint32_t pData) 77 { 78 return (((pData & 0xFF000000) >> 24) | 79 ((pData & 0x00FF0000) >> 8) | 80 ((pData & 0x0000FF00) << 8) | 81 ((pData & 0x000000FF) << 24)); 82 83 } 84 85 /// bswap64 - byte swap 64-bit version 86 /// @ref binary utilities - elfcpp_swap bswap64(uint64_t pData)87inline uint64_t bswap64(uint64_t pData) 88 { 89 return (((pData & 0xFF00000000000000ULL) >> 56) | 90 ((pData & 0x00FF000000000000ULL) >> 40) | 91 ((pData & 0x0000FF0000000000ULL) >> 24) | 92 ((pData & 0x000000FF00000000ULL) >> 8) | 93 ((pData & 0x00000000FF000000ULL) << 8) | 94 ((pData & 0x0000000000FF0000ULL) << 24) | 95 ((pData & 0x000000000000FF00ULL) << 40) | 96 ((pData & 0x00000000000000FFULL) << 56)); 97 } 98 99 } // namespace of mcld 100 101 #endif 102