blob: 7e67db962294ebd35c7d33f672f9734c6936a003 [file] [log] [blame]
//===- SizeTraits.h -------------------------------------------------------===//
//
// The MCLinker Project
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#ifndef MCLD_SIZE_TRAITS_H
#define MCLD_SIZE_TRAITS_H
#ifdef ENABLE_UNITTEST
#include <gtest.h>
#endif
#include <llvm/Support/DataTypes.h>
namespace mcld
{
template<size_t SIZE>
struct SizeTraits;
template<>
class SizeTraits<32>
{
typedef uint32_t Address;
typedef uint32_t Offset;
typedef uint32_t Word;
typedef int32_t SWord;
};
template<>
class SizeTraits<64>
{
typedef uint64_t Address;
typedef uint64_t Offset;
typedef uint64_t Word;
typedef int64_t SWord;
};
/// alignAddress - helper function to align an address with given alignment
/// constraint
///
/// @param pAddr - the address to be aligned
/// @param pAlignConstraint - the alignment used to align the given address
inline void alignAddress(uint64_t& pAddr, uint64_t pAlignConstraint)
{
if (pAlignConstraint != 0)
pAddr = (pAddr + pAlignConstraint - 1) &~ (pAlignConstraint - 1);
}
template<size_t Constraint>
uint64_t Align(uint64_t pAddress);
template<>
inline uint64_t Align<32>(uint64_t pAddress)
{
return (pAddress + 0x1F) & (~0x1F);
}
template<>
inline uint64_t Align<64>(uint64_t pAddress)
{
return (pAddress + 0x3F) & (~0x3F);
}
/// bswap16 - byte swap 16-bit version
/// @ref binary utilities - elfcpp_swap
inline uint16_t bswap16(uint16_t pData)
{
return ((pData >> 8) & 0xFF) | ((pData & 0xFF) << 8);
}
/// bswap32 - byte swap 32-bit version
/// @ref elfcpp_swap
inline uint32_t bswap32(uint32_t pData)
{
return (((pData & 0xFF000000) >> 24) |
((pData & 0x00FF0000) >> 8) |
((pData & 0x0000FF00) << 8) |
((pData & 0x000000FF) << 24));
}
/// bswap64 - byte swap 64-bit version
/// @ref binary utilities - elfcpp_swap
inline uint64_t bswap64(uint64_t pData)
{
return (((pData & 0xFF00000000000000ULL) >> 56) |
((pData & 0x00FF000000000000ULL) >> 40) |
((pData & 0x0000FF0000000000ULL) >> 24) |
((pData & 0x000000FF00000000ULL) >> 8) |
((pData & 0x00000000FF000000ULL) << 8) |
((pData & 0x0000000000FF0000ULL) << 24) |
((pData & 0x000000000000FF00ULL) << 40) |
((pData & 0x00000000000000FFULL) << 56));
}
} // namespace of mcld
#endif