mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-01 16:33:37 +01:00
ff2a79674c
to what's done for MachO and COFF. This allows advanced uses of the class to be implemented outside the Object library. In particular, the DyldELFObject subclass is now moved into its logical home - ExecutionEngine/RuntimeDyld. This patch was reviewed by Michael Spencer. llvm-svn: 150327
51 lines
1.9 KiB
C++
51 lines
1.9 KiB
C++
//===- ELFObjectFile.cpp - ELF object file implementation -------*- C++ -*-===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// Part of the ELFObjectFile class implementation.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "llvm/Object/ELF.h"
|
|
|
|
namespace llvm {
|
|
|
|
using namespace object;
|
|
|
|
namespace {
|
|
std::pair<unsigned char, unsigned char>
|
|
getElfArchType(MemoryBuffer *Object) {
|
|
if (Object->getBufferSize() < ELF::EI_NIDENT)
|
|
return std::make_pair((uint8_t)ELF::ELFCLASSNONE,(uint8_t)ELF::ELFDATANONE);
|
|
return std::make_pair( (uint8_t)Object->getBufferStart()[ELF::EI_CLASS]
|
|
, (uint8_t)Object->getBufferStart()[ELF::EI_DATA]);
|
|
}
|
|
}
|
|
|
|
// Creates an in-memory object-file by default: createELFObjectFile(Buffer)
|
|
ObjectFile *ObjectFile::createELFObjectFile(MemoryBuffer *Object) {
|
|
std::pair<unsigned char, unsigned char> Ident = getElfArchType(Object);
|
|
error_code ec;
|
|
|
|
if (Ident.first == ELF::ELFCLASS32 && Ident.second == ELF::ELFDATA2LSB)
|
|
return new ELFObjectFile<support::little, false>(Object, ec);
|
|
else if (Ident.first == ELF::ELFCLASS32 && Ident.second == ELF::ELFDATA2MSB)
|
|
return new ELFObjectFile<support::big, false>(Object, ec);
|
|
else if (Ident.first == ELF::ELFCLASS64 && Ident.second == ELF::ELFDATA2MSB)
|
|
return new ELFObjectFile<support::big, true>(Object, ec);
|
|
else if (Ident.first == ELF::ELFCLASS64 && Ident.second == ELF::ELFDATA2LSB) {
|
|
ELFObjectFile<support::little, true> *result =
|
|
new ELFObjectFile<support::little, true>(Object, ec);
|
|
return result;
|
|
}
|
|
|
|
report_fatal_error("Buffer is not an ELF object file!");
|
|
}
|
|
|
|
} // end namespace llvm
|