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 
14c7d23ddbSEli Bendersky #include "llvm/Object/ELF.h"
15bae14cefSMichael J. Spencer #include "llvm/Support/MathExtras.h"
16b60a18deSMichael J. Spencer 
17c7d23ddbSEli Bendersky namespace llvm {
18c7d23ddbSEli Bendersky 
19b60a18deSMichael J. Spencer using namespace object;
20b60a18deSMichael J. Spencer 
21c3c80f09SEli Bendersky // Creates an in-memory object-file by default: createELFObjectFile(Buffer)
22c7d23ddbSEli Bendersky ObjectFile *ObjectFile::createELFObjectFile(MemoryBuffer *Object) {
23b60a18deSMichael J. Spencer   std::pair<unsigned char, unsigned char> Ident = getElfArchType(Object);
24ec29b121SMichael J. Spencer   error_code ec;
25c3c80f09SEli Bendersky 
26bae14cefSMichael J. Spencer   std::size_t MaxAlignment =
27bae14cefSMichael J. Spencer     1ULL << CountTrailingZeros_64(uintptr_t(Object->getBufferStart()));
28bae14cefSMichael J. Spencer 
29b60a18deSMichael J. Spencer   if (Ident.first == ELF::ELFCLASS32 && Ident.second == ELF::ELFDATA2LSB)
30bae14cefSMichael J. Spencer     if (MaxAlignment >= 4)
31*1a79161fSMichael J. Spencer       return new ELFObjectFile<ELFType<support::little, 4, false> >(Object, ec);
32bae14cefSMichael J. Spencer     else if (MaxAlignment >= 2)
33*1a79161fSMichael J. Spencer       return new ELFObjectFile<ELFType<support::little, 2, false> >(Object, ec);
34bae14cefSMichael J. Spencer     else
35bae14cefSMichael J. Spencer       llvm_unreachable("Invalid alignment for ELF file!");
36b60a18deSMichael J. Spencer   else if (Ident.first == ELF::ELFCLASS32 && Ident.second == ELF::ELFDATA2MSB)
37bae14cefSMichael J. Spencer     if (MaxAlignment >= 4)
38*1a79161fSMichael J. Spencer       return new ELFObjectFile<ELFType<support::big, 4, false> >(Object, ec);
39bae14cefSMichael J. Spencer     else if (MaxAlignment >= 2)
40*1a79161fSMichael J. Spencer       return new ELFObjectFile<ELFType<support::big, 2, false> >(Object, ec);
41bae14cefSMichael J. Spencer     else
42bae14cefSMichael J. Spencer       llvm_unreachable("Invalid alignment for ELF file!");
43b60a18deSMichael J. Spencer   else if (Ident.first == ELF::ELFCLASS64 && Ident.second == ELF::ELFDATA2MSB)
44bae14cefSMichael J. Spencer     if (MaxAlignment >= 8)
45*1a79161fSMichael J. Spencer       return new ELFObjectFile<ELFType<support::big, 8, true> >(Object, ec);
46bae14cefSMichael J. Spencer     else if (MaxAlignment >= 2)
47*1a79161fSMichael J. Spencer       return new ELFObjectFile<ELFType<support::big, 2, true> >(Object, ec);
48bae14cefSMichael J. Spencer     else
49bae14cefSMichael J. Spencer       llvm_unreachable("Invalid alignment for ELF file!");
50c3c80f09SEli Bendersky   else if (Ident.first == ELF::ELFCLASS64 && Ident.second == ELF::ELFDATA2LSB) {
51bae14cefSMichael J. Spencer     if (MaxAlignment >= 8)
52*1a79161fSMichael J. Spencer       return new ELFObjectFile<ELFType<support::little, 8, true> >(Object, ec);
53bae14cefSMichael J. Spencer     else if (MaxAlignment >= 2)
54*1a79161fSMichael J. Spencer       return new ELFObjectFile<ELFType<support::little, 2, true> >(Object, ec);
55bae14cefSMichael J. Spencer     else
56bae14cefSMichael J. Spencer       llvm_unreachable("Invalid alignment for ELF file!");
57c3c80f09SEli Bendersky   }
58c3c80f09SEli Bendersky 
59c3c80f09SEli Bendersky   report_fatal_error("Buffer is not an ELF object file!");
60b60a18deSMichael J. Spencer }
61b60a18deSMichael J. Spencer 
62b60a18deSMichael J. Spencer } // end namespace llvm
63