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//===----------------------------------------------------------------------===// 987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#ifndef MCLD_ADT_SIZETRAITS_H 1087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#define MCLD_ADT_SIZETRAITS_H 115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <llvm/Support/DataTypes.h> 136f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#include <llvm/Support/ELF.h> 145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 155460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaonamespace mcld 165460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaotemplate<size_t SIZE> 19affc150dc44fab1911775a49636d0ce85333b634Zonr Changclass SizeTraits; 205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 215460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaotemplate<> 225460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass SizeTraits<32> 235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 24affc150dc44fab1911775a49636d0ce85333b634Zonr Changpublic: 255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao typedef uint32_t Address; 265460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao typedef uint32_t Offset; 275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao typedef uint32_t Word; 285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao typedef int32_t SWord; 295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}; 305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaotemplate<> 325460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass SizeTraits<64> 335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 34affc150dc44fab1911775a49636d0ce85333b634Zonr Changpublic: 355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao typedef uint64_t Address; 365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao typedef uint64_t Offset; 375460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao typedef uint64_t Word; 385460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao typedef int64_t SWord; 395460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}; 405460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 416f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines// FIXME: move this to mcld internal ELF header file? 426f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinestemplate<size_t SIZE> 436f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesclass ELFSizeTraits; 446f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 456f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinestemplate<> 466f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesclass ELFSizeTraits<32> 476f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines{ 486f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinespublic: 496f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines typedef llvm::ELF::Elf32_Addr Addr; // Program address 506f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines typedef llvm::ELF::Elf32_Off Off; // File offset 516f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines typedef llvm::ELF::Elf32_Half Half; 526f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines typedef llvm::ELF::Elf32_Word Word; 536f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines typedef llvm::ELF::Elf32_Sword Sword; 546f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 556f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines typedef llvm::ELF::Elf32_Ehdr Ehdr; 566f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines typedef llvm::ELF::Elf32_Shdr Shdr; 576f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines typedef llvm::ELF::Elf32_Sym Sym; 586f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines typedef llvm::ELF::Elf32_Rel Rel; 596f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines typedef llvm::ELF::Elf32_Rela Rela; 606f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines typedef llvm::ELF::Elf32_Phdr Phdr; 616f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines typedef llvm::ELF::Elf32_Dyn Dyn; 626f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines}; 636f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 646f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinestemplate<> 656f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesclass ELFSizeTraits<64> 666f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines{ 676f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinespublic: 686f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines typedef llvm::ELF::Elf64_Addr Addr; 696f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines typedef llvm::ELF::Elf64_Off Off; 706f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines typedef llvm::ELF::Elf64_Half Half; 716f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines typedef llvm::ELF::Elf64_Word Word; 726f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines typedef llvm::ELF::Elf64_Sword Sword; 736f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines typedef llvm::ELF::Elf64_Xword Xword; 746f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines typedef llvm::ELF::Elf64_Sxword Sxword; 756f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 766f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines typedef llvm::ELF::Elf64_Ehdr Ehdr; 776f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines typedef llvm::ELF::Elf64_Shdr Shdr; 786f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines typedef llvm::ELF::Elf64_Sym Sym; 796f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines typedef llvm::ELF::Elf64_Rel Rel; 806f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines typedef llvm::ELF::Elf64_Rela Rela; 816f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines typedef llvm::ELF::Elf64_Phdr Phdr; 826f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines typedef llvm::ELF::Elf64_Dyn Dyn; 836f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines}; 846f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 855460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao/// alignAddress - helper function to align an address with given alignment 865460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao/// constraint 875460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao/// 885460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao/// @param pAddr - the address to be aligned 895460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao/// @param pAlignConstraint - the alignment used to align the given address 905460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoinline void alignAddress(uint64_t& pAddr, uint64_t pAlignConstraint) 915460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 925460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao if (pAlignConstraint != 0) 935460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao pAddr = (pAddr + pAlignConstraint - 1) &~ (pAlignConstraint - 1); 945460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 955460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 965460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaotemplate<size_t Constraint> 975460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaouint64_t Align(uint64_t pAddress); 985460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 995460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaotemplate<> 1005460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoinline uint64_t Align<32>(uint64_t pAddress) 1015460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 1025460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return (pAddress + 0x1F) & (~0x1F); 1035460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 1045460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1055460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaotemplate<> 1065460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoinline uint64_t Align<64>(uint64_t pAddress) 1075460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 1085460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return (pAddress + 0x3F) & (~0x3F); 1095460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 1105460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 111d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao#ifdef bswap16 112d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao#undef bswap16 113d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao#endif 114d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao#ifdef bswap32 115d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao#undef bswap32 116d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao#endif 117d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao#ifdef bswap64 118d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao#undef bswap64 119d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao#endif 120d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao 1215460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao/// bswap16 - byte swap 16-bit version 1225460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao/// @ref binary utilities - elfcpp_swap 1235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoinline uint16_t bswap16(uint16_t pData) 1245460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 1255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return ((pData >> 8) & 0xFF) | ((pData & 0xFF) << 8); 1265460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 1275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao/// bswap32 - byte swap 32-bit version 1295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao/// @ref elfcpp_swap 1305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoinline uint32_t bswap32(uint32_t pData) 1315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 1325460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return (((pData & 0xFF000000) >> 24) | 1335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao ((pData & 0x00FF0000) >> 8) | 1345460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao ((pData & 0x0000FF00) << 8) | 1355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao ((pData & 0x000000FF) << 24)); 1365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1375460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 1385460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1395460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao/// bswap64 - byte swap 64-bit version 1405460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao/// @ref binary utilities - elfcpp_swap 1415460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoinline uint64_t bswap64(uint64_t pData) 1425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 1435460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return (((pData & 0xFF00000000000000ULL) >> 56) | 1445460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao ((pData & 0x00FF000000000000ULL) >> 40) | 1455460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao ((pData & 0x0000FF0000000000ULL) >> 24) | 1465460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao ((pData & 0x000000FF00000000ULL) >> 8) | 1475460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao ((pData & 0x00000000FF000000ULL) << 8) | 1485460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao ((pData & 0x0000000000FF0000ULL) << 24) | 1495460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao ((pData & 0x000000000000FF00ULL) << 40) | 1505460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao ((pData & 0x00000000000000FFULL) << 56)); 1515460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 1525460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 15387f34658dec9097d987d254a990ea7f311bfc95fStephen Hinestemplate<size_t SIZE> 15487f34658dec9097d987d254a990ea7f311bfc95fStephen Hinestypename SizeTraits<SIZE>::Word bswap(typename SizeTraits<SIZE>::Word pData); 15587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 15687f34658dec9097d987d254a990ea7f311bfc95fStephen Hinestemplate<> 15787f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesinline SizeTraits<32>::Word bswap<32>(SizeTraits<32>::Word pData) 15887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines{ 15987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines return bswap32(pData); 16087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines} 16187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 16287f34658dec9097d987d254a990ea7f311bfc95fStephen Hinestemplate<> 16387f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesinline SizeTraits<64>::Word bswap<64>(SizeTraits<64>::Word pData) 16487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines{ 16587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines return bswap64(pData); 16687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines} 16787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 16887f34658dec9097d987d254a990ea7f311bfc95fStephen Hinestemplate <size_t WIDTH> 16987f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesinline uint64_t signExtend(uint64_t pVal) 17087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines{ 17187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines uint64_t mask = (~((uint64_t)0)) >> (64 - WIDTH); 17287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines uint64_t sign_bit = 1 << (WIDTH - 1); 17387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 17487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines return ((pVal & mask) ^ sign_bit) - sign_bit; 17587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines} 17687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 17787f34658dec9097d987d254a990ea7f311bfc95fStephen Hinestemplate <> 17887f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesinline uint64_t signExtend<64>(uint64_t pVal) 17987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines{ 18087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines return pVal; 18187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines} 18287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 183affc150dc44fab1911775a49636d0ce85333b634Zonr Changtemplate <size_t SizeOfStr, typename FieldType> 184affc150dc44fab1911775a49636d0ce85333b634Zonr Changclass StringSizerHelper 185affc150dc44fab1911775a49636d0ce85333b634Zonr Chang{ 186affc150dc44fab1911775a49636d0ce85333b634Zonr Changprivate: 187affc150dc44fab1911775a49636d0ce85333b634Zonr Chang char FIELD_TOO_SMALL[SizeOfStr <= FieldType(~0U) ? 1 : -1]; 188affc150dc44fab1911775a49636d0ce85333b634Zonr Changpublic: 189affc150dc44fab1911775a49636d0ce85333b634Zonr Chang enum { Size = SizeOfStr }; 190affc150dc44fab1911775a49636d0ce85333b634Zonr Chang}; 191affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 192affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#define STR_SIZE(str, fieldTy) StringSizerHelper<sizeof(str)-1, fieldTy>::Size 193affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 1945460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} // namespace of mcld 1955460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1965460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#endif 197affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 198