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"
15*bae14cefSMichael 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 
26*bae14cefSMichael J. Spencer   std::size_t MaxAlignment =
27*bae14cefSMichael J. Spencer     1ULL << CountTrailingZeros_64(uintptr_t(Object->getBufferStart()));
28*bae14cefSMichael J. Spencer 
29b60a18deSMichael J. Spencer   if (Ident.first == ELF::ELFCLASS32 && Ident.second == ELF::ELFDATA2LSB)
30*bae14cefSMichael J. Spencer     if (MaxAlignment >= 4)
31*bae14cefSMichael J. Spencer       return new ELFObjectFile<support::little, 4, false>(Object, ec);
32*bae14cefSMichael J. Spencer     else if (MaxAlignment >= 2)
33*bae14cefSMichael J. Spencer       return new ELFObjectFile<support::little, 2, false>(Object, ec);
34*bae14cefSMichael J. Spencer     else
35*bae14cefSMichael J. Spencer       llvm_unreachable("Invalid alignment for ELF file!");
36b60a18deSMichael J. Spencer   else if (Ident.first == ELF::ELFCLASS32 && Ident.second == ELF::ELFDATA2MSB)
37*bae14cefSMichael J. Spencer     if (MaxAlignment >= 4)
38*bae14cefSMichael J. Spencer       return new ELFObjectFile<support::big, 4, false>(Object, ec);
39*bae14cefSMichael J. Spencer     else if (MaxAlignment >= 2)
40*bae14cefSMichael J. Spencer       return new ELFObjectFile<support::big, 2, false>(Object, ec);
41*bae14cefSMichael J. Spencer     else
42*bae14cefSMichael J. Spencer       llvm_unreachable("Invalid alignment for ELF file!");
43b60a18deSMichael J. Spencer   else if (Ident.first == ELF::ELFCLASS64 && Ident.second == ELF::ELFDATA2MSB)
44*bae14cefSMichael J. Spencer     if (MaxAlignment >= 8)
45*bae14cefSMichael J. Spencer       return new ELFObjectFile<support::big, 8, true>(Object, ec);
46*bae14cefSMichael J. Spencer     else if (MaxAlignment >= 2)
47*bae14cefSMichael J. Spencer       return new ELFObjectFile<support::big, 2, true>(Object, ec);
48*bae14cefSMichael J. Spencer     else
49*bae14cefSMichael J. Spencer       llvm_unreachable("Invalid alignment for ELF file!");
50c3c80f09SEli Bendersky   else if (Ident.first == ELF::ELFCLASS64 && Ident.second == ELF::ELFDATA2LSB) {
51*bae14cefSMichael J. Spencer     if (MaxAlignment >= 8)
52*bae14cefSMichael J. Spencer       return new ELFObjectFile<support::little, 8, true>(Object, ec);
53*bae14cefSMichael J. Spencer     else if (MaxAlignment >= 2)
54*bae14cefSMichael J. Spencer       return new ELFObjectFile<support::little, 2, true>(Object, ec);
55*bae14cefSMichael J. Spencer     else
56*bae14cefSMichael 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