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>
166f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#include <llvm/Support/ELF.h>
175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaonamespace mcld
195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
215460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaotemplate<size_t SIZE>
22affc150dc44fab1911775a49636d0ce85333b634Zonr Changclass SizeTraits;
235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
245460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaotemplate<>
255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass SizeTraits<32>
265460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
27affc150dc44fab1911775a49636d0ce85333b634Zonr Changpublic:
285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  typedef uint32_t Address;
295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  typedef uint32_t Offset;
305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  typedef uint32_t Word;
315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  typedef int32_t  SWord;
325460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao};
335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
345460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaotemplate<>
355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass SizeTraits<64>
365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
37affc150dc44fab1911775a49636d0ce85333b634Zonr Changpublic:
385460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  typedef uint64_t Address;
395460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  typedef uint64_t Offset;
405460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  typedef uint64_t Word;
415460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  typedef int64_t  SWord;
425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao};
435460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
446f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines// FIXME: move this to mcld internal ELF header file?
456f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinestemplate<size_t SIZE>
466f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesclass ELFSizeTraits;
476f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
486f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinestemplate<>
496f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesclass ELFSizeTraits<32>
506f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines{
516f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinespublic:
526f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  typedef llvm::ELF::Elf32_Addr  Addr; // Program address
536f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  typedef llvm::ELF::Elf32_Off   Off;  // File offset
546f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  typedef llvm::ELF::Elf32_Half  Half;
556f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  typedef llvm::ELF::Elf32_Word  Word;
566f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  typedef llvm::ELF::Elf32_Sword Sword;
576f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
586f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  typedef llvm::ELF::Elf32_Ehdr  Ehdr;
596f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  typedef llvm::ELF::Elf32_Shdr  Shdr;
606f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  typedef llvm::ELF::Elf32_Sym   Sym;
616f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  typedef llvm::ELF::Elf32_Rel   Rel;
626f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  typedef llvm::ELF::Elf32_Rela  Rela;
636f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  typedef llvm::ELF::Elf32_Phdr  Phdr;
646f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  typedef llvm::ELF::Elf32_Dyn   Dyn;
656f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines};
666f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
676f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinestemplate<>
686f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesclass ELFSizeTraits<64>
696f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines{
706f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinespublic:
716f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  typedef llvm::ELF::Elf64_Addr   Addr;
726f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  typedef llvm::ELF::Elf64_Off    Off;
736f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  typedef llvm::ELF::Elf64_Half   Half;
746f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  typedef llvm::ELF::Elf64_Word   Word;
756f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  typedef llvm::ELF::Elf64_Sword  Sword;
766f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  typedef llvm::ELF::Elf64_Xword  Xword;
776f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  typedef llvm::ELF::Elf64_Sxword Sxword;
786f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
796f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  typedef llvm::ELF::Elf64_Ehdr   Ehdr;
806f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  typedef llvm::ELF::Elf64_Shdr   Shdr;
816f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  typedef llvm::ELF::Elf64_Sym    Sym;
826f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  typedef llvm::ELF::Elf64_Rel    Rel;
836f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  typedef llvm::ELF::Elf64_Rela   Rela;
846f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  typedef llvm::ELF::Elf64_Phdr   Phdr;
856f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  typedef llvm::ELF::Elf64_Dyn    Dyn;
866f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines};
876f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
885460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao/// alignAddress - helper function to align an address with given alignment
895460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao/// constraint
905460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao///
915460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao/// @param pAddr - the address to be aligned
925460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao/// @param pAlignConstraint - the alignment used to align the given address
935460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoinline void alignAddress(uint64_t& pAddr, uint64_t pAlignConstraint)
945460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
955460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  if (pAlignConstraint != 0)
965460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    pAddr = (pAddr + pAlignConstraint - 1) &~ (pAlignConstraint - 1);
975460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
985460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
995460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaotemplate<size_t Constraint>
1005460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaouint64_t Align(uint64_t pAddress);
1015460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1025460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaotemplate<>
1035460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoinline uint64_t Align<32>(uint64_t pAddress)
1045460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
1055460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  return (pAddress + 0x1F) & (~0x1F);
1065460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
1075460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1085460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaotemplate<>
1095460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoinline uint64_t Align<64>(uint64_t pAddress)
1105460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
1115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  return (pAddress + 0x3F) & (~0x3F);
1125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
1135460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
114d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao#ifdef bswap16
115d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao#undef bswap16
116d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao#endif
117d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao#ifdef bswap32
118d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao#undef bswap32
119d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao#endif
120d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao#ifdef bswap64
121d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao#undef bswap64
122d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao#endif
123d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao
1245460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao/// bswap16 - byte swap 16-bit version
1255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao/// @ref binary utilities - elfcpp_swap
1265460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoinline uint16_t bswap16(uint16_t pData)
1275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
1285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao   return ((pData >> 8) & 0xFF) | ((pData & 0xFF) << 8);
1295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
1305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao/// bswap32 - byte swap 32-bit version
1325460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao/// @ref elfcpp_swap
1335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoinline uint32_t bswap32(uint32_t pData)
1345460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
1355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao   return (((pData & 0xFF000000) >> 24) |
1365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao           ((pData & 0x00FF0000) >>  8) |
1375460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao           ((pData & 0x0000FF00) <<  8) |
1385460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao           ((pData & 0x000000FF) << 24));
1395460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1405460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
1415460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao/// bswap64 - byte swap 64-bit version
1435460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao/// @ref binary utilities - elfcpp_swap
1445460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoinline uint64_t bswap64(uint64_t pData)
1455460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
1465460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao   return (((pData & 0xFF00000000000000ULL) >> 56) |
1475460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao           ((pData & 0x00FF000000000000ULL) >> 40) |
1485460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao           ((pData & 0x0000FF0000000000ULL) >> 24) |
1495460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao           ((pData & 0x000000FF00000000ULL) >>  8) |
1505460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao           ((pData & 0x00000000FF000000ULL) <<  8) |
1515460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao           ((pData & 0x0000000000FF0000ULL) << 24) |
1525460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao           ((pData & 0x000000000000FF00ULL) << 40) |
1535460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao           ((pData & 0x00000000000000FFULL) << 56));
1545460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
1555460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
156affc150dc44fab1911775a49636d0ce85333b634Zonr Changtemplate <size_t SizeOfStr, typename FieldType>
157affc150dc44fab1911775a49636d0ce85333b634Zonr Changclass StringSizerHelper
158affc150dc44fab1911775a49636d0ce85333b634Zonr Chang{
159affc150dc44fab1911775a49636d0ce85333b634Zonr Changprivate:
160affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  char FIELD_TOO_SMALL[SizeOfStr <= FieldType(~0U) ? 1 : -1];
161affc150dc44fab1911775a49636d0ce85333b634Zonr Changpublic:
162affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  enum { Size = SizeOfStr };
163affc150dc44fab1911775a49636d0ce85333b634Zonr Chang};
164affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
165affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#define STR_SIZE(str, fieldTy) StringSizerHelper<sizeof(str)-1, fieldTy>::Size
166affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
1675460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} // namespace of mcld
1685460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1695460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#endif
170affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
171