1*9880d681SAndroid Build Coastguard Worker //===- SymbolicFile.cpp - Interface that only provides symbols --*- C++ -*-===//
2*9880d681SAndroid Build Coastguard Worker //
3*9880d681SAndroid Build Coastguard Worker // The LLVM Compiler Infrastructure
4*9880d681SAndroid Build Coastguard Worker //
5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source
6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details.
7*9880d681SAndroid Build Coastguard Worker //
8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
9*9880d681SAndroid Build Coastguard Worker //
10*9880d681SAndroid Build Coastguard Worker // This file defines a file format independent SymbolicFile class.
11*9880d681SAndroid Build Coastguard Worker //
12*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
13*9880d681SAndroid Build Coastguard Worker
14*9880d681SAndroid Build Coastguard Worker #include "llvm/Object/COFF.h"
15*9880d681SAndroid Build Coastguard Worker #include "llvm/Object/COFFImportFile.h"
16*9880d681SAndroid Build Coastguard Worker #include "llvm/Object/IRObjectFile.h"
17*9880d681SAndroid Build Coastguard Worker #include "llvm/Object/ObjectFile.h"
18*9880d681SAndroid Build Coastguard Worker #include "llvm/Object/SymbolicFile.h"
19*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/MemoryBuffer.h"
20*9880d681SAndroid Build Coastguard Worker
21*9880d681SAndroid Build Coastguard Worker using namespace llvm;
22*9880d681SAndroid Build Coastguard Worker using namespace object;
23*9880d681SAndroid Build Coastguard Worker
SymbolicFile(unsigned int Type,MemoryBufferRef Source)24*9880d681SAndroid Build Coastguard Worker SymbolicFile::SymbolicFile(unsigned int Type, MemoryBufferRef Source)
25*9880d681SAndroid Build Coastguard Worker : Binary(Type, Source) {}
26*9880d681SAndroid Build Coastguard Worker
~SymbolicFile()27*9880d681SAndroid Build Coastguard Worker SymbolicFile::~SymbolicFile() {}
28*9880d681SAndroid Build Coastguard Worker
createSymbolicFile(MemoryBufferRef Object,sys::fs::file_magic Type,LLVMContext * Context)29*9880d681SAndroid Build Coastguard Worker Expected<std::unique_ptr<SymbolicFile>> SymbolicFile::createSymbolicFile(
30*9880d681SAndroid Build Coastguard Worker MemoryBufferRef Object, sys::fs::file_magic Type, LLVMContext *Context) {
31*9880d681SAndroid Build Coastguard Worker StringRef Data = Object.getBuffer();
32*9880d681SAndroid Build Coastguard Worker if (Type == sys::fs::file_magic::unknown)
33*9880d681SAndroid Build Coastguard Worker Type = sys::fs::identify_magic(Data);
34*9880d681SAndroid Build Coastguard Worker
35*9880d681SAndroid Build Coastguard Worker switch (Type) {
36*9880d681SAndroid Build Coastguard Worker case sys::fs::file_magic::bitcode:
37*9880d681SAndroid Build Coastguard Worker if (Context)
38*9880d681SAndroid Build Coastguard Worker return errorOrToExpected(IRObjectFile::create(Object, *Context));
39*9880d681SAndroid Build Coastguard Worker // Fallthrough
40*9880d681SAndroid Build Coastguard Worker case sys::fs::file_magic::unknown:
41*9880d681SAndroid Build Coastguard Worker case sys::fs::file_magic::archive:
42*9880d681SAndroid Build Coastguard Worker case sys::fs::file_magic::macho_universal_binary:
43*9880d681SAndroid Build Coastguard Worker case sys::fs::file_magic::windows_resource:
44*9880d681SAndroid Build Coastguard Worker return errorCodeToError(object_error::invalid_file_type);
45*9880d681SAndroid Build Coastguard Worker case sys::fs::file_magic::elf:
46*9880d681SAndroid Build Coastguard Worker case sys::fs::file_magic::elf_executable:
47*9880d681SAndroid Build Coastguard Worker case sys::fs::file_magic::elf_shared_object:
48*9880d681SAndroid Build Coastguard Worker case sys::fs::file_magic::elf_core:
49*9880d681SAndroid Build Coastguard Worker case sys::fs::file_magic::macho_executable:
50*9880d681SAndroid Build Coastguard Worker case sys::fs::file_magic::macho_fixed_virtual_memory_shared_lib:
51*9880d681SAndroid Build Coastguard Worker case sys::fs::file_magic::macho_core:
52*9880d681SAndroid Build Coastguard Worker case sys::fs::file_magic::macho_preload_executable:
53*9880d681SAndroid Build Coastguard Worker case sys::fs::file_magic::macho_dynamically_linked_shared_lib:
54*9880d681SAndroid Build Coastguard Worker case sys::fs::file_magic::macho_dynamic_linker:
55*9880d681SAndroid Build Coastguard Worker case sys::fs::file_magic::macho_bundle:
56*9880d681SAndroid Build Coastguard Worker case sys::fs::file_magic::macho_dynamically_linked_shared_lib_stub:
57*9880d681SAndroid Build Coastguard Worker case sys::fs::file_magic::macho_dsym_companion:
58*9880d681SAndroid Build Coastguard Worker case sys::fs::file_magic::macho_kext_bundle:
59*9880d681SAndroid Build Coastguard Worker case sys::fs::file_magic::pecoff_executable:
60*9880d681SAndroid Build Coastguard Worker return ObjectFile::createObjectFile(Object, Type);
61*9880d681SAndroid Build Coastguard Worker case sys::fs::file_magic::coff_import_library:
62*9880d681SAndroid Build Coastguard Worker return std::unique_ptr<SymbolicFile>(new COFFImportFile(Object));
63*9880d681SAndroid Build Coastguard Worker case sys::fs::file_magic::elf_relocatable:
64*9880d681SAndroid Build Coastguard Worker case sys::fs::file_magic::macho_object:
65*9880d681SAndroid Build Coastguard Worker case sys::fs::file_magic::coff_object: {
66*9880d681SAndroid Build Coastguard Worker Expected<std::unique_ptr<ObjectFile>> Obj =
67*9880d681SAndroid Build Coastguard Worker ObjectFile::createObjectFile(Object, Type);
68*9880d681SAndroid Build Coastguard Worker if (!Obj || !Context)
69*9880d681SAndroid Build Coastguard Worker return std::move(Obj);
70*9880d681SAndroid Build Coastguard Worker
71*9880d681SAndroid Build Coastguard Worker ErrorOr<MemoryBufferRef> BCData =
72*9880d681SAndroid Build Coastguard Worker IRObjectFile::findBitcodeInObject(*Obj->get());
73*9880d681SAndroid Build Coastguard Worker if (!BCData)
74*9880d681SAndroid Build Coastguard Worker return std::move(Obj);
75*9880d681SAndroid Build Coastguard Worker
76*9880d681SAndroid Build Coastguard Worker return errorOrToExpected(IRObjectFile::create(
77*9880d681SAndroid Build Coastguard Worker MemoryBufferRef(BCData->getBuffer(),
78*9880d681SAndroid Build Coastguard Worker Object.getBufferIdentifier()), *Context));
79*9880d681SAndroid Build Coastguard Worker }
80*9880d681SAndroid Build Coastguard Worker }
81*9880d681SAndroid Build Coastguard Worker llvm_unreachable("Unexpected Binary File Type");
82*9880d681SAndroid Build Coastguard Worker }
83