136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//===- SymbolicFile.cpp - Interface that only provides symbols --*- C++ -*-===//
236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//
336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//                     The LLVM Compiler Infrastructure
436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//
536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// This file is distributed under the University of Illinois Open Source
636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// License. See LICENSE.TXT for details.
736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//
836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//===----------------------------------------------------------------------===//
936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//
1036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// This file defines a file format independent SymbolicFile class.
1136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//
1236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//===----------------------------------------------------------------------===//
1336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
1436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/Object/IRObjectFile.h"
1536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/Object/ObjectFile.h"
1636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/Object/SymbolicFile.h"
1736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/Support/MemoryBuffer.h"
1836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
1936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesusing namespace llvm;
2036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesusing namespace object;
2136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
22cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen HinesSymbolicFile::SymbolicFile(unsigned int Type,
23cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines                           std::unique_ptr<MemoryBuffer> Source)
24cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    : Binary(Type, std::move(Source)) {}
2536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
2636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen HinesSymbolicFile::~SymbolicFile() {}
2736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
2836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen HinesErrorOr<SymbolicFile *>
29cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen HinesSymbolicFile::createSymbolicFile(std::unique_ptr<MemoryBuffer> &Object,
3036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                                 sys::fs::file_magic Type,
3136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                                 LLVMContext *Context) {
3236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  if (Type == sys::fs::file_magic::unknown)
3336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    Type = sys::fs::identify_magic(Object->getBuffer());
3436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
3536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  switch (Type) {
3636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  case sys::fs::file_magic::bitcode:
3736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    if (Context)
38cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      return IRObjectFile::createIRObjectFile(std::move(Object), *Context);
3936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  // Fallthrough
4036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  case sys::fs::file_magic::unknown:
4136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  case sys::fs::file_magic::archive:
4236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  case sys::fs::file_magic::macho_universal_binary:
4336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  case sys::fs::file_magic::windows_resource:
4436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    return object_error::invalid_file_type;
4536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  case sys::fs::file_magic::elf_relocatable:
4636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  case sys::fs::file_magic::elf_executable:
4736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  case sys::fs::file_magic::elf_shared_object:
4836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  case sys::fs::file_magic::elf_core:
4936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  case sys::fs::file_magic::macho_object:
5036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  case sys::fs::file_magic::macho_executable:
5136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  case sys::fs::file_magic::macho_fixed_virtual_memory_shared_lib:
5236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  case sys::fs::file_magic::macho_core:
5336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  case sys::fs::file_magic::macho_preload_executable:
5436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  case sys::fs::file_magic::macho_dynamically_linked_shared_lib:
5536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  case sys::fs::file_magic::macho_dynamic_linker:
5636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  case sys::fs::file_magic::macho_bundle:
5736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  case sys::fs::file_magic::macho_dynamically_linked_shared_lib_stub:
5836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  case sys::fs::file_magic::macho_dsym_companion:
5936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  case sys::fs::file_magic::coff_object:
6036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  case sys::fs::file_magic::coff_import_library:
6136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  case sys::fs::file_magic::pecoff_executable:
62cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    return ObjectFile::createObjectFile(Object, Type);
6336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  }
6436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  llvm_unreachable("Unexpected Binary File Type");
6536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines}
66