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