• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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)46 inline 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)69 inline 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)76 inline 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)87 inline 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