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