diff options
author | Michael J. Spencer <bigcheesegs@gmail.com> | 2010-11-15 03:21:41 +0000 |
---|---|---|
committer | Michael J. Spencer <bigcheesegs@gmail.com> | 2010-11-15 03:21:41 +0000 |
commit | 68b3f0c40e29e461dbbc85370078692df4336b42 (patch) | |
tree | 208cdc2a530213509990314774e5e452dbda2def /lib/Object | |
parent | 6d2ff122af017a24b6e94d4f98f40a3edc0bb62d (diff) | |
download | external_llvm-68b3f0c40e29e461dbbc85370078692df4336b42.zip external_llvm-68b3f0c40e29e461dbbc85370078692df4336b42.tar.gz external_llvm-68b3f0c40e29e461dbbc85370078692df4336b42.tar.bz2 |
Add LLVMObject Library.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@119107 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Object')
-rw-r--r-- | lib/Object/CMakeLists.txt | 3 | ||||
-rw-r--r-- | lib/Object/ObjectFile.cpp | 68 |
2 files changed, 71 insertions, 0 deletions
diff --git a/lib/Object/CMakeLists.txt b/lib/Object/CMakeLists.txt new file mode 100644 index 0000000..18ee4be --- /dev/null +++ b/lib/Object/CMakeLists.txt @@ -0,0 +1,3 @@ +add_llvm_library(LLVMObject + ObjectFile.cpp + ) diff --git a/lib/Object/ObjectFile.cpp b/lib/Object/ObjectFile.cpp new file mode 100644 index 0000000..29aa4b8 --- /dev/null +++ b/lib/Object/ObjectFile.cpp @@ -0,0 +1,68 @@ +//===- ObjectFile.cpp - File format independent object file -----*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// This file defines a file format independent ObjectFile class. +// +//===----------------------------------------------------------------------===// + +#include "llvm/Object/ObjectFile.h" +#include "llvm/Support/ErrorHandling.h" +#include "llvm/Support/MemoryBuffer.h" + +namespace llvm { +namespace object { + +ObjectFile::ObjectFile(MemoryBuffer *Object) + : MapFile(Object) { + assert(MapFile && "Must be a valid MemoryBuffer!"); + base = reinterpret_cast<const uint8_t *>(MapFile->getBufferStart()); +} + +ObjectFile::~ObjectFile() { + delete MapFile; +} + +StringRef ObjectFile::getFilename() const { + return MapFile->getBufferIdentifier(); +} + +ObjectFile *ObjectFile::createObjectFile(MemoryBuffer *Object) { + if (!Object || Object->getBufferSize() < 64) + return 0; + sys::LLVMFileType type = sys::IdentifyFileType(Object->getBufferStart(), + static_cast<unsigned>(Object->getBufferSize())); + switch (type) { + case sys::ELF_Relocatable_FileType: + case sys::ELF_Executable_FileType: + case sys::ELF_SharedObject_FileType: + case sys::ELF_Core_FileType: + return 0; + case sys::Mach_O_Object_FileType: + case sys::Mach_O_Executable_FileType: + case sys::Mach_O_FixedVirtualMemorySharedLib_FileType: + case sys::Mach_O_Core_FileType: + case sys::Mach_O_PreloadExectuable_FileType: + case sys::Mach_O_DynamicallyLinkedSharedLib_FileType: + case sys::Mach_O_DynamicLinker_FileType: + case sys::Mach_O_Bundle_FileType: + case sys::Mach_O_DynamicallyLinkedSharedLibStub_FileType: + return 0; + case sys::COFF_FileType: + return 0; + default: + llvm_unreachable("Unknown Object File Type"); + } +} + +ObjectFile *ObjectFile::createObjectFile(const sys::Path &ObjectPath) { + return createObjectFile(MemoryBuffer::getFile(ObjectPath.c_str())); +} + +} // end namespace object +} // end namespace llvm |