1b60a18deSMichael J. Spencer //===- ELFObjectFile.cpp - ELF object file implementation -------*- C++ -*-===// 2b60a18deSMichael J. Spencer // 3b60a18deSMichael J. Spencer // The LLVM Compiler Infrastructure 4b60a18deSMichael J. Spencer // 5b60a18deSMichael J. Spencer // This file is distributed under the University of Illinois Open Source 6b60a18deSMichael J. Spencer // License. See LICENSE.TXT for details. 7b60a18deSMichael J. Spencer // 8b60a18deSMichael J. Spencer //===----------------------------------------------------------------------===// 9b60a18deSMichael J. Spencer // 10c7d23ddbSEli Bendersky // Part of the ELFObjectFile class implementation. 11b60a18deSMichael J. Spencer // 12b60a18deSMichael J. Spencer //===----------------------------------------------------------------------===// 13b60a18deSMichael J. Spencer 14126973baSMichael J. Spencer #include "llvm/Object/ELFObjectFile.h" 15bae14cefSMichael J. Spencer #include "llvm/Support/MathExtras.h" 16b60a18deSMichael J. Spencer 17c7d23ddbSEli Bendersky namespace llvm { 18b60a18deSMichael J. Spencer using namespace object; 19b60a18deSMichael J. Spencer 20*692410efSRafael Espindola ErrorOr<ObjectFile *> ObjectFile::createELFObjectFile(MemoryBuffer *Obj) { 21*692410efSRafael Espindola std::pair<unsigned char, unsigned char> Ident = getElfArchType(Obj); 22bae14cefSMichael J. Spencer std::size_t MaxAlignment = 23*692410efSRafael Espindola 1ULL << countTrailingZeros(uintptr_t(Obj->getBufferStart())); 24bae14cefSMichael J. Spencer 25*692410efSRafael Espindola error_code EC; 26*692410efSRafael Espindola OwningPtr<ObjectFile> R; 27b60a18deSMichael J. Spencer if (Ident.first == ELF::ELFCLASS32 && Ident.second == ELF::ELFDATA2LSB) 2839678d83SMichael J. Spencer #if !LLVM_IS_UNALIGNED_ACCESS_FAST 29bae14cefSMichael J. Spencer if (MaxAlignment >= 4) 30*692410efSRafael Espindola R.reset(new ELFObjectFile<ELFType<support::little, 4, false> >(Obj, EC)); 3139678d83SMichael J. Spencer else 3239678d83SMichael J. Spencer #endif 3339678d83SMichael J. Spencer if (MaxAlignment >= 2) 34*692410efSRafael Espindola R.reset(new ELFObjectFile<ELFType<support::little, 2, false> >(Obj, EC)); 35bae14cefSMichael J. Spencer else 36bae14cefSMichael J. Spencer llvm_unreachable("Invalid alignment for ELF file!"); 37b60a18deSMichael J. Spencer else if (Ident.first == ELF::ELFCLASS32 && Ident.second == ELF::ELFDATA2MSB) 3839678d83SMichael J. Spencer #if !LLVM_IS_UNALIGNED_ACCESS_FAST 39bae14cefSMichael J. Spencer if (MaxAlignment >= 4) 40*692410efSRafael Espindola R.reset(new ELFObjectFile<ELFType<support::big, 4, false> >(Obj, EC)); 4139678d83SMichael J. Spencer else 4239678d83SMichael J. Spencer #endif 4339678d83SMichael J. Spencer if (MaxAlignment >= 2) 44*692410efSRafael Espindola R.reset(new ELFObjectFile<ELFType<support::big, 2, false> >(Obj, EC)); 45bae14cefSMichael J. Spencer else 46bae14cefSMichael J. Spencer llvm_unreachable("Invalid alignment for ELF file!"); 47b60a18deSMichael J. Spencer else if (Ident.first == ELF::ELFCLASS64 && Ident.second == ELF::ELFDATA2MSB) 4839678d83SMichael J. Spencer #if !LLVM_IS_UNALIGNED_ACCESS_FAST 49bae14cefSMichael J. Spencer if (MaxAlignment >= 8) 50*692410efSRafael Espindola R.reset(new ELFObjectFile<ELFType<support::big, 8, true> >(Obj, EC)); 5139678d83SMichael J. Spencer else 5239678d83SMichael J. Spencer #endif 5339678d83SMichael J. Spencer if (MaxAlignment >= 2) 54*692410efSRafael Espindola R.reset(new ELFObjectFile<ELFType<support::big, 2, true> >(Obj, EC)); 55bae14cefSMichael J. Spencer else 56bae14cefSMichael J. Spencer llvm_unreachable("Invalid alignment for ELF file!"); 57c3c80f09SEli Bendersky else if (Ident.first == ELF::ELFCLASS64 && Ident.second == ELF::ELFDATA2LSB) { 5839678d83SMichael J. Spencer #if !LLVM_IS_UNALIGNED_ACCESS_FAST 59bae14cefSMichael J. Spencer if (MaxAlignment >= 8) 60*692410efSRafael Espindola R.reset(new ELFObjectFile<ELFType<support::little, 8, true> >(Obj, EC)); 6139678d83SMichael J. Spencer else 6239678d83SMichael J. Spencer #endif 6339678d83SMichael J. Spencer if (MaxAlignment >= 2) 64*692410efSRafael Espindola R.reset(new ELFObjectFile<ELFType<support::little, 2, true> >(Obj, EC)); 65bae14cefSMichael J. Spencer else 66bae14cefSMichael J. Spencer llvm_unreachable("Invalid alignment for ELF file!"); 67c3c80f09SEli Bendersky } 68*692410efSRafael Espindola else 69c3c80f09SEli Bendersky report_fatal_error("Buffer is not an ELF object file!"); 70*692410efSRafael Espindola 71*692410efSRafael Espindola if (EC) 72*692410efSRafael Espindola return EC; 73*692410efSRafael Espindola return R.take(); 74b60a18deSMichael J. Spencer } 75b60a18deSMichael J. Spencer 76b60a18deSMichael J. Spencer } // end namespace llvm 77