ObjectFile.cpp revision 263508
11539Srgrimes//===- ObjectFile.cpp - File format independent object file -----*- C++ -*-===//
21539Srgrimes//
31539Srgrimes//                     The LLVM Compiler Infrastructure
41539Srgrimes//
51539Srgrimes// This file is distributed under the University of Illinois Open Source
61539Srgrimes// License. See LICENSE.TXT for details.
71539Srgrimes//
81539Srgrimes//===----------------------------------------------------------------------===//
91539Srgrimes//
101539Srgrimes// This file defines a file format independent ObjectFile class.
111539Srgrimes//
121539Srgrimes//===----------------------------------------------------------------------===//
13203964Simp
141539Srgrimes#include "llvm/Object/ObjectFile.h"
151539Srgrimes#include "llvm/ADT/OwningPtr.h"
161539Srgrimes#include "llvm/Support/ErrorHandling.h"
171539Srgrimes#include "llvm/Support/FileSystem.h"
181539Srgrimes#include "llvm/Support/MemoryBuffer.h"
191539Srgrimes#include "llvm/Support/system_error.h"
201539Srgrimes
211539Srgrimesusing namespace llvm;
221539Srgrimesusing namespace object;
231539Srgrimes
241539Srgrimesvoid ObjectFile::anchor() { }
251539Srgrimes
261539SrgrimesObjectFile::ObjectFile(unsigned int Type, MemoryBuffer *source)
271539Srgrimes  : Binary(Type, source) {
281539Srgrimes}
2923657Speter
3055031Sbdeerror_code ObjectFile::getSymbolAlignment(DataRefImpl DRI,
311539Srgrimes                                          uint32_t &Result) const {
321539Srgrimes  Result = 0;
331539Srgrimes  return object_error::success;
347865Sbde}
351539Srgrimes
3633861Sbdesection_iterator ObjectFile::getRelocatedSection(DataRefImpl Sec) const {
37123257Smarcel  return section_iterator(SectionRef(Sec, this));
38102227Smike}
3933861Sbde
40103728SwollmanObjectFile *ObjectFile::createObjectFile(MemoryBuffer *Object) {
41102227Smike  if (Object->getBufferSize() < 64) {
42102227Smike    delete Object;
43102227Smike    return 0;
4415483Sbde  }
4515483Sbde
4615483Sbde  sys::fs::file_magic Type = sys::fs::identify_magic(Object->getBuffer());
47102227Smike  switch (Type) {
48102227Smike  case sys::fs::file_magic::unknown:
49102227Smike  case sys::fs::file_magic::bitcode:
501539Srgrimes  case sys::fs::file_magic::archive:
511539Srgrimes  case sys::fs::file_magic::macho_universal_binary:
5299640Sobrien  case sys::fs::file_magic::windows_resource:
53102227Smike    delete Object;
54102227Smike    return 0;
55102227Smike  case sys::fs::file_magic::elf_relocatable:
561539Srgrimes  case sys::fs::file_magic::elf_executable:
5799640Sobrien  case sys::fs::file_magic::elf_shared_object:
581539Srgrimes  case sys::fs::file_magic::elf_core:
591539Srgrimes    return createELFObjectFile(Object);
60103766Sbde  case sys::fs::file_magic::macho_object:
61103766Sbde  case sys::fs::file_magic::macho_executable:
621539Srgrimes  case sys::fs::file_magic::macho_fixed_virtual_memory_shared_lib:
631539Srgrimes  case sys::fs::file_magic::macho_core:
641539Srgrimes  case sys::fs::file_magic::macho_preload_executable:
65103766Sbde  case sys::fs::file_magic::macho_dynamically_linked_shared_lib:
66103766Sbde  case sys::fs::file_magic::macho_dynamic_linker:
671539Srgrimes  case sys::fs::file_magic::macho_bundle:
681539Srgrimes  case sys::fs::file_magic::macho_dynamically_linked_shared_lib_stub:
691539Srgrimes  case sys::fs::file_magic::macho_dsym_companion:
701539Srgrimes    return createMachOObjectFile(Object);
711539Srgrimes  case sys::fs::file_magic::coff_object:
721539Srgrimes  case sys::fs::file_magic::coff_import_library:
731539Srgrimes  case sys::fs::file_magic::pecoff_executable:
74227753Stheraven    return createCOFFObjectFile(Object);
751539Srgrimes  }
76227753Stheraven  llvm_unreachable("Unexpected Object File Type");
77227753Stheraven}
781539Srgrimes
79228330StheravenObjectFile *ObjectFile::createObjectFile(StringRef ObjectPath) {
8093032Simp  OwningPtr<MemoryBuffer> File;
8193032Simp  if (MemoryBuffer::getFile(ObjectPath, File))
8293032Simp    return NULL;
8393032Simp  return createObjectFile(File.take());
8493032Simp}
8593032Simp