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