Index: lib/ReaderWriter/ELF/CreateELF.h =================================================================== --- lib/ReaderWriter/ELF/CreateELF.h +++ lib/ReaderWriter/ELF/CreateELF.h @@ -35,48 +35,37 @@ /// \param maxAlignment the maximum alignment of the file. /// \param args arguments forwarded to CreateELFTraits::create. -#define LLVM_CREATE_ELF_CreateELFTraits(endian, align, is64, ...) \ - Traits::template create>( \ - __VA_ARGS__); - -#if !LLVM_IS_UNALIGNED_ACCESS_FAST -# define LLVM_CREATE_ELF_Create(normal, low, endian, is64, ...) \ - if (maxAlignment >= normal) \ - return LLVM_CREATE_ELF_CreateELFTraits(endian, normal, is64, __VA_ARGS__) \ - else if (maxAlignment >= low) \ - return LLVM_CREATE_ELF_CreateELFTraits(endian, low, is64, __VA_ARGS__) \ - else \ - llvm_unreachable("Invalid alignment for ELF file!"); -#else -# define LLVM_CREATE_ELF_Create(normal, low, endian, is64, ...) \ - if (maxAlignment >= low) \ - return LLVM_CREATE_ELF_CreateELFTraits(endian, low, is64, __VA_ARGS__) \ - else \ - llvm_unreachable("Invalid alignment for ELF file!"); -#endif - template llvm::ErrorOr> createELF(std::pair ident, std::size_t maxAlignment, Args &&... args) { - if (ident.first == llvm::ELF::ELFCLASS32 && - ident.second == llvm::ELF::ELFDATA2LSB) { - LLVM_CREATE_ELF_Create(4, 2, little, false, std::forward(args)...) - } else if (ident.first == llvm::ELF::ELFCLASS32 && - ident.second == llvm::ELF::ELFDATA2MSB) { - LLVM_CREATE_ELF_Create(4, 2, big, false, std::forward(args)...) - } else if (ident.first == llvm::ELF::ELFCLASS64 && - ident.second == llvm::ELF::ELFDATA2MSB) { - LLVM_CREATE_ELF_Create(8, 2, big, true, std::forward(args)...) - } else if (ident.first == llvm::ELF::ELFCLASS64 && - ident.second == llvm::ELF::ELFDATA2LSB) { - LLVM_CREATE_ELF_Create(8, 2, little, true, std::forward(args)...) + using namespace llvm::ELF; + using namespace llvm::support; + unsigned char size = ident.first; + unsigned char endian = ident.second; + + if (maxAlignment < 2) + llvm_unreachable("Invalid alignment for ELF file!"); + + if (size == ELFCLASS32 && endian == ELFDATA2LSB) { + return Traits::template create>( + std::forward(args)...); + } + if (size == ELFCLASS32 && endian == ELFDATA2MSB) { + return Traits::template create>( + std::forward(args)...); + } + if (size == ELFCLASS64 && endian == ELFDATA2LSB) { + return Traits::template create>( + std::forward(args)...); + } + if (size == ELFCLASS64 && endian == ELFDATA2MSB) { + return Traits::template create>( + std::forward(args)...); } llvm_unreachable("Invalid ELF type!"); } -} // end anon namespace -#undef LLVM_CREATE_ELF_CreateELFTraits -#undef LLVM_CREATE_ELF_Create +} // end anon namespace #endif