SizeTraits.h revision affc150dc44fab1911775a49636d0ce85333b634
15460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===- SizeTraits.h -------------------------------------------------------===// 25460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// 35460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// The MCLinker Project 45460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// 55460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// This file is distributed under the University of Illinois Open Source 65460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// License. See LICENSE.TXT for details. 75460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// 85460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===----------------------------------------------------------------------===// 95460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#ifndef MCLD_SIZE_TRAITS_H 105460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#define MCLD_SIZE_TRAITS_H 115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#ifdef ENABLE_UNITTEST 125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <gtest.h> 135460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#endif 145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 155460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <llvm/Support/DataTypes.h> 165460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaonamespace mcld 185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaotemplate<size_t SIZE> 21affc150dc44fab1911775a49636d0ce85333b634Zonr Changclass SizeTraits; 225460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaotemplate<> 245460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass SizeTraits<32> 255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 26affc150dc44fab1911775a49636d0ce85333b634Zonr Changpublic: 275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao typedef uint32_t Address; 285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao typedef uint32_t Offset; 295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao typedef uint32_t Word; 305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao typedef int32_t SWord; 315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}; 325460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaotemplate<> 345460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass SizeTraits<64> 355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 36affc150dc44fab1911775a49636d0ce85333b634Zonr Changpublic: 375460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao typedef uint64_t Address; 385460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao typedef uint64_t Offset; 395460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao typedef uint64_t Word; 405460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao typedef int64_t SWord; 415460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}; 425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 435460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao/// alignAddress - helper function to align an address with given alignment 445460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao/// constraint 455460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao/// 465460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao/// @param pAddr - the address to be aligned 475460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao/// @param pAlignConstraint - the alignment used to align the given address 485460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoinline void alignAddress(uint64_t& pAddr, uint64_t pAlignConstraint) 495460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 505460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao if (pAlignConstraint != 0) 515460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao pAddr = (pAddr + pAlignConstraint - 1) &~ (pAlignConstraint - 1); 525460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 535460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 545460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaotemplate<size_t Constraint> 555460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaouint64_t Align(uint64_t pAddress); 565460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 575460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaotemplate<> 585460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoinline uint64_t Align<32>(uint64_t pAddress) 595460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 605460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return (pAddress + 0x1F) & (~0x1F); 615460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 625460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 635460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaotemplate<> 645460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoinline uint64_t Align<64>(uint64_t pAddress) 655460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 665460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return (pAddress + 0x3F) & (~0x3F); 675460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 685460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 695460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao/// bswap16 - byte swap 16-bit version 705460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao/// @ref binary utilities - elfcpp_swap 715460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoinline uint16_t bswap16(uint16_t pData) 725460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 735460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return ((pData >> 8) & 0xFF) | ((pData & 0xFF) << 8); 745460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 755460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 765460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao/// bswap32 - byte swap 32-bit version 775460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao/// @ref elfcpp_swap 785460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoinline uint32_t bswap32(uint32_t pData) 795460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 805460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return (((pData & 0xFF000000) >> 24) | 815460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao ((pData & 0x00FF0000) >> 8) | 825460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao ((pData & 0x0000FF00) << 8) | 835460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao ((pData & 0x000000FF) << 24)); 845460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 855460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 865460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 875460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao/// bswap64 - byte swap 64-bit version 885460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao/// @ref binary utilities - elfcpp_swap 895460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoinline uint64_t bswap64(uint64_t pData) 905460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 915460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return (((pData & 0xFF00000000000000ULL) >> 56) | 925460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao ((pData & 0x00FF000000000000ULL) >> 40) | 935460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao ((pData & 0x0000FF0000000000ULL) >> 24) | 945460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao ((pData & 0x000000FF00000000ULL) >> 8) | 955460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao ((pData & 0x00000000FF000000ULL) << 8) | 965460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao ((pData & 0x0000000000FF0000ULL) << 24) | 975460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao ((pData & 0x000000000000FF00ULL) << 40) | 985460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao ((pData & 0x00000000000000FFULL) << 56)); 995460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 1005460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 101affc150dc44fab1911775a49636d0ce85333b634Zonr Changtemplate <size_t SizeOfStr, typename FieldType> 102affc150dc44fab1911775a49636d0ce85333b634Zonr Changclass StringSizerHelper 103affc150dc44fab1911775a49636d0ce85333b634Zonr Chang{ 104affc150dc44fab1911775a49636d0ce85333b634Zonr Changprivate: 105affc150dc44fab1911775a49636d0ce85333b634Zonr Chang char FIELD_TOO_SMALL[SizeOfStr <= FieldType(~0U) ? 1 : -1]; 106affc150dc44fab1911775a49636d0ce85333b634Zonr Changpublic: 107affc150dc44fab1911775a49636d0ce85333b634Zonr Chang enum { Size = SizeOfStr }; 108affc150dc44fab1911775a49636d0ce85333b634Zonr Chang}; 109affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 110affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#define STR_SIZE(str, fieldTy) StringSizerHelper<sizeof(str)-1, fieldTy>::Size 111affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 1125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} // namespace of mcld 1135460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#endif 115affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 116