summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Object/Binary.cpp
diff options
context:
space:
mode:
authorMichael J. Spencer <bigcheesegs@gmail.com>2011-06-25 17:54:50 +0000
committerMichael J. Spencer <bigcheesegs@gmail.com>2011-06-25 17:54:50 +0000
commitec29b121ff2981544137a9076b5882b53d17a34a (patch)
tree40415d8bff59aacf2dcbc02a3b34d3fef2929ce8 /llvm/lib/Object/Binary.cpp
parentb02c95d43ef3926275cf4ba2886880ff008c6792 (diff)
downloadbcm5719-llvm-ec29b121ff2981544137a9076b5882b53d17a34a.tar.gz
bcm5719-llvm-ec29b121ff2981544137a9076b5882b53d17a34a.zip
Make Binary the parent of ObjectFile and update children to new interface.
llvm-svn: 133870
Diffstat (limited to 'llvm/lib/Object/Binary.cpp')
-rw-r--r--llvm/lib/Object/Binary.cpp52
1 files changed, 49 insertions, 3 deletions
diff --git a/llvm/lib/Object/Binary.cpp b/llvm/lib/Object/Binary.cpp
index 75f5a58ac08..4b31c7557dd 100644
--- a/llvm/lib/Object/Binary.cpp
+++ b/llvm/lib/Object/Binary.cpp
@@ -16,6 +16,10 @@
#include "llvm/Support/MemoryBuffer.h"
#include "llvm/Support/Path.h"
+// Include headers for createBinary.
+#include "llvm/Object/ObjectFile.h"
+#include "llvm/Object/COFF.h"
+
using namespace llvm;
using namespace object;
@@ -37,9 +41,51 @@ StringRef Binary::getFileName() const {
error_code object::createBinary(MemoryBuffer *Source,
OwningPtr<Binary> &Result) {
- // We don't support any at the moment.
- delete Source;
- return object_error::invalid_file_type;
+ OwningPtr<MemoryBuffer> scopedSource(Source);
+ if (!Source)
+ return make_error_code(errc::invalid_argument);
+ if (Source->getBufferSize() < 64)
+ return object_error::invalid_file_type;
+ sys::LLVMFileType type = sys::IdentifyFileType(Source->getBufferStart(),
+ static_cast<unsigned>(Source->getBufferSize()));
+ error_code ec;
+ switch (type) {
+ case sys::ELF_Relocatable_FileType:
+ case sys::ELF_Executable_FileType:
+ case sys::ELF_SharedObject_FileType:
+ case sys::ELF_Core_FileType: {
+ OwningPtr<Binary> ret(
+ ObjectFile::createELFObjectFile(scopedSource.take()));
+ if (!ret)
+ return object_error::invalid_file_type;
+ Result.swap(ret);
+ return object_error::success;
+ }
+ 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_PreloadExecutable_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: {
+ OwningPtr<Binary> ret(
+ ObjectFile::createMachOObjectFile(scopedSource.take()));
+ if (!ret)
+ return object_error::invalid_file_type;
+ Result.swap(ret);
+ return object_error::success;
+ }
+ case sys::COFF_FileType: {
+ OwningPtr<Binary> ret(new COFFObjectFile(scopedSource.take(), ec));
+ if (ec) return ec;
+ Result.swap(ret);
+ return object_error::success;
+ }
+ default: // Unrecognized object file format.
+ return object_error::invalid_file_type;
+ }
}
error_code object::createBinary(StringRef Path, OwningPtr<Binary> &Result) {
OpenPOWER on IntegriCloud