ELFObjectFile.cpp revision 256281
1193323Sed//===- ELFObjectFile.cpp - ELF object file implementation -------*- C++ -*-===// 2193323Sed// 3193323Sed// The LLVM Compiler Infrastructure 4193323Sed// 5193323Sed// This file is distributed under the University of Illinois Open Source 6193323Sed// License. See LICENSE.TXT for details. 7193323Sed// 8193323Sed//===----------------------------------------------------------------------===// 9193323Sed// 10193323Sed// Part of the ELFObjectFile class implementation. 11193323Sed// 12193323Sed//===----------------------------------------------------------------------===// 13193323Sed 14193323Sed#include "llvm/Object/ELF.h" 15193323Sed#include "llvm/Support/MathExtras.h" 16193323Sed 17193323Sednamespace llvm { 18193323Sed 19239462Sdimusing namespace object; 20193323Sed 21193323Sed// Creates an in-memory object-file by default: createELFObjectFile(Buffer) 22218893SdimObjectFile *ObjectFile::createELFObjectFile(MemoryBuffer *Object) { 23249423Sdim std::pair<unsigned char, unsigned char> Ident = getElfArchType(Object); 24249423Sdim error_code ec; 25249423Sdim 26249423Sdim std::size_t MaxAlignment = 27249423Sdim 1ULL << CountTrailingZeros_64(uintptr_t(Object->getBufferStart())); 28193323Sed 29193323Sed if (Ident.first == ELF::ELFCLASS32 && Ident.second == ELF::ELFDATA2LSB) 30198090Srdivacky#if !LLVM_IS_UNALIGNED_ACCESS_FAST 31221345Sdim if (MaxAlignment >= 4) 32239462Sdim return new ELFObjectFile<ELFType<support::little, 4, false> >(Object, ec); 33193323Sed else 34193323Sed#endif 35193323Sed if (MaxAlignment >= 2) 36193323Sed return new ELFObjectFile<ELFType<support::little, 2, false> >(Object, ec); 37193323Sed else 38198090Srdivacky llvm_unreachable("Invalid alignment for ELF file!"); 39218893Sdim else if (Ident.first == ELF::ELFCLASS32 && Ident.second == ELF::ELFDATA2MSB) 40193323Sed#if !LLVM_IS_UNALIGNED_ACCESS_FAST 41243830Sdim if (MaxAlignment >= 4) 42243830Sdim return new ELFObjectFile<ELFType<support::big, 4, false> >(Object, ec); 43193323Sed else 44193323Sed#endif 45193323Sed if (MaxAlignment >= 2) 46193323Sed return new ELFObjectFile<ELFType<support::big, 2, false> >(Object, ec); 47239462Sdim else 48193323Sed llvm_unreachable("Invalid alignment for ELF file!"); 49193323Sed else if (Ident.first == ELF::ELFCLASS64 && Ident.second == ELF::ELFDATA2MSB) 50193323Sed#if !LLVM_IS_UNALIGNED_ACCESS_FAST 51193323Sed if (MaxAlignment >= 8) 52193323Sed return new ELFObjectFile<ELFType<support::big, 8, true> >(Object, ec); 53193323Sed else 54193323Sed#endif 55193323Sed if (MaxAlignment >= 2) 56193323Sed return new ELFObjectFile<ELFType<support::big, 2, true> >(Object, ec); 57226633Sdim else 58193323Sed llvm_unreachable("Invalid alignment for ELF file!"); 59193323Sed else if (Ident.first == ELF::ELFCLASS64 && Ident.second == ELF::ELFDATA2LSB) { 60193323Sed#if !LLVM_IS_UNALIGNED_ACCESS_FAST 61239462Sdim if (MaxAlignment >= 8) 62193323Sed return new ELFObjectFile<ELFType<support::little, 8, true> >(Object, ec); 63193323Sed else 64193323Sed#endif 65193323Sed if (MaxAlignment >= 2) 66193323Sed return new ELFObjectFile<ELFType<support::little, 2, true> >(Object, ec); 67193323Sed else 68193323Sed llvm_unreachable("Invalid alignment for ELF file!"); 69193323Sed } 70193323Sed 71193323Sed report_fatal_error("Buffer is not an ELF object file!"); 72193323Sed} 73193323Sed 74193323Sed} // end namespace llvm 75243830Sdim