//===- 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/FileSystem.h"
#include "llvm/Support/MemoryBuffer.h"
#include "llvm/Support/raw_ostream.h"
#include "llvm/Support/system_error.h"

using namespace llvm;
using namespace object;

void ObjectFile::anchor() { }

ObjectFile::ObjectFile(unsigned int Type, MemoryBuffer *Source,
                       bool BufferOwned)
    : SymbolicFile(Type, Source, BufferOwned) {}

error_code ObjectFile::printSymbolName(raw_ostream &OS,
                                       DataRefImpl Symb) const {
  StringRef Name;
  if (error_code EC = getSymbolName(Symb, Name))
    return EC;
  OS << Name;
  return object_error::success;
}

error_code ObjectFile::getSymbolAlignment(DataRefImpl DRI,
                                          uint32_t &Result) const {
  Result = 0;
  return object_error::success;
}

section_iterator ObjectFile::getRelocatedSection(DataRefImpl Sec) const {
  return section_iterator(SectionRef(Sec, this));
}

ErrorOr<ObjectFile *> ObjectFile::createObjectFile(MemoryBuffer *Object,
                                                   bool BufferOwned,
                                                   sys::fs::file_magic Type) {
  if (Type == sys::fs::file_magic::unknown)
    Type = sys::fs::identify_magic(Object->getBuffer());

  switch (Type) {
  case sys::fs::file_magic::unknown:
  case sys::fs::file_magic::bitcode:
  case sys::fs::file_magic::archive:
  case sys::fs::file_magic::macho_universal_binary:
  case sys::fs::file_magic::windows_resource:
    if (BufferOwned)
      delete Object;
    return object_error::invalid_file_type;
  case sys::fs::file_magic::elf_relocatable:
  case sys::fs::file_magic::elf_executable:
  case sys::fs::file_magic::elf_shared_object:
  case sys::fs::file_magic::elf_core:
    return createELFObjectFile(Object, BufferOwned);
  case sys::fs::file_magic::macho_object:
  case sys::fs::file_magic::macho_executable:
  case sys::fs::file_magic::macho_fixed_virtual_memory_shared_lib:
  case sys::fs::file_magic::macho_core:
  case sys::fs::file_magic::macho_preload_executable:
  case sys::fs::file_magic::macho_dynamically_linked_shared_lib:
  case sys::fs::file_magic::macho_dynamic_linker:
  case sys::fs::file_magic::macho_bundle:
  case sys::fs::file_magic::macho_dynamically_linked_shared_lib_stub:
  case sys::fs::file_magic::macho_dsym_companion:
    return createMachOObjectFile(Object, BufferOwned);
  case sys::fs::file_magic::coff_object:
  case sys::fs::file_magic::coff_import_library:
  case sys::fs::file_magic::pecoff_executable:
    return createCOFFObjectFile(Object, BufferOwned);
  }
  llvm_unreachable("Unexpected Object File Type");
}

ErrorOr<ObjectFile *> ObjectFile::createObjectFile(StringRef ObjectPath) {
  std::unique_ptr<MemoryBuffer> File;
  if (error_code EC = MemoryBuffer::getFile(ObjectPath, File))
    return EC;
  return createObjectFile(File.release());
}
