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