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