blob: 0ef730bd4eb842227d7733dc7fb892f86400fdcc [file] [log] [blame]
Michael J. Spencer68b3f0c2010-11-15 03:21:41 +00001//===- ObjectFile.cpp - File format independent object file -----*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file defines a file format independent ObjectFile class.
11//
12//===----------------------------------------------------------------------===//
13
14#include "llvm/Object/ObjectFile.h"
15#include "llvm/Support/ErrorHandling.h"
16#include "llvm/Support/MemoryBuffer.h"
Michael J. Spencer88af6b92010-11-16 01:06:51 +000017#include "llvm/System/Path.h"
Michael J. Spencer68b3f0c2010-11-15 03:21:41 +000018
Michael J. Spencer88af6b92010-11-16 01:06:51 +000019using namespace llvm;
20using namespace object;
Michael J. Spencer68b3f0c2010-11-15 03:21:41 +000021
22ObjectFile::ObjectFile(MemoryBuffer *Object)
23 : MapFile(Object) {
24 assert(MapFile && "Must be a valid MemoryBuffer!");
25 base = reinterpret_cast<const uint8_t *>(MapFile->getBufferStart());
26}
27
28ObjectFile::~ObjectFile() {
29 delete MapFile;
30}
31
32StringRef ObjectFile::getFilename() const {
33 return MapFile->getBufferIdentifier();
34}
35
36ObjectFile *ObjectFile::createObjectFile(MemoryBuffer *Object) {
37 if (!Object || Object->getBufferSize() < 64)
38 return 0;
39 sys::LLVMFileType type = sys::IdentifyFileType(Object->getBufferStart(),
40 static_cast<unsigned>(Object->getBufferSize()));
41 switch (type) {
42 case sys::ELF_Relocatable_FileType:
43 case sys::ELF_Executable_FileType:
44 case sys::ELF_SharedObject_FileType:
45 case sys::ELF_Core_FileType:
46 return 0;
47 case sys::Mach_O_Object_FileType:
48 case sys::Mach_O_Executable_FileType:
49 case sys::Mach_O_FixedVirtualMemorySharedLib_FileType:
50 case sys::Mach_O_Core_FileType:
Peter Collingbourneb1a33c42010-11-17 00:43:43 +000051 case sys::Mach_O_PreloadExecutable_FileType:
Michael J. Spencer68b3f0c2010-11-15 03:21:41 +000052 case sys::Mach_O_DynamicallyLinkedSharedLib_FileType:
53 case sys::Mach_O_DynamicLinker_FileType:
54 case sys::Mach_O_Bundle_FileType:
55 case sys::Mach_O_DynamicallyLinkedSharedLibStub_FileType:
56 return 0;
57 case sys::COFF_FileType:
58 return 0;
59 default:
60 llvm_unreachable("Unknown Object File Type");
61 }
62}
63
Michael J. Spencer88af6b92010-11-16 01:06:51 +000064ObjectFile *ObjectFile::createObjectFile(StringRef ObjectPath) {
65 return createObjectFile(MemoryBuffer::getFile(ObjectPath));
Michael J. Spencer68b3f0c2010-11-15 03:21:41 +000066}