mirror of
https://github.com/RPCS3/llvm.git
synced 2024-12-05 02:07:16 +00:00
f4eff4baeb
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. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@150327 91177308-0d34-0410-b5e6-96231b3b80d8
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
|