1 //===- Binary.cpp - A generic binary file -----------------------*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This file defines the Binary class.
12 //===----------------------------------------------------------------------===//
14 #include "llvm/Object/Binary.h"
15 #include "llvm/ADT/StringRef.h"
16 #include "llvm/Support/MemoryBuffer.h"
17 #include "llvm/Support/Path.h"
19 // Include headers for createBinary.
20 #include "llvm/Object/Archive.h"
21 #include "llvm/Object/COFF.h"
22 #include "llvm/Object/ObjectFile.h"
25 using namespace object;
31 Binary::Binary(unsigned int Type, MemoryBuffer *Source)
35 StringRef Binary::getData() const {
36 return Data->getBuffer();
39 StringRef Binary::getFileName() const {
40 return Data->getBufferIdentifier();
43 error_code object::createBinary(MemoryBuffer *Source,
44 OwningPtr<Binary> &Result) {
45 OwningPtr<MemoryBuffer> scopedSource(Source);
47 return make_error_code(errc::invalid_argument);
48 if (Source->getBufferSize() < 64)
49 return object_error::invalid_file_type;
50 sys::LLVMFileType type = sys::IdentifyFileType(Source->getBufferStart(),
51 static_cast<unsigned>(Source->getBufferSize()));
54 case sys::Archive_FileType: {
55 OwningPtr<Binary> ret(new Archive(scopedSource.take(), ec));
58 return object_error::success;
60 case sys::ELF_Relocatable_FileType:
61 case sys::ELF_Executable_FileType:
62 case sys::ELF_SharedObject_FileType:
63 case sys::ELF_Core_FileType: {
64 OwningPtr<Binary> ret(
65 ObjectFile::createELFObjectFile(scopedSource.take()));
67 return object_error::invalid_file_type;
69 return object_error::success;
71 case sys::Mach_O_Object_FileType:
72 case sys::Mach_O_Executable_FileType:
73 case sys::Mach_O_FixedVirtualMemorySharedLib_FileType:
74 case sys::Mach_O_Core_FileType:
75 case sys::Mach_O_PreloadExecutable_FileType:
76 case sys::Mach_O_DynamicallyLinkedSharedLib_FileType:
77 case sys::Mach_O_DynamicLinker_FileType:
78 case sys::Mach_O_Bundle_FileType:
79 case sys::Mach_O_DynamicallyLinkedSharedLibStub_FileType: {
80 OwningPtr<Binary> ret(
81 ObjectFile::createMachOObjectFile(scopedSource.take()));
83 return object_error::invalid_file_type;
85 return object_error::success;
87 case sys::COFF_FileType: {
88 OwningPtr<Binary> ret(new COFFObjectFile(scopedSource.take(), ec));
91 return object_error::success;
93 default: // Unrecognized object file format.
94 return object_error::invalid_file_type;
98 error_code object::createBinary(StringRef Path, OwningPtr<Binary> &Result) {
99 OwningPtr<MemoryBuffer> File;
100 if (error_code ec = MemoryBuffer::getFile(Path, File))
102 return createBinary(File.take(), Result);