1 //===- SymbolicFile.cpp - Interface that only provides symbols ------------===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
9 // This file defines a file format independent SymbolicFile class.
11 //===----------------------------------------------------------------------===//
13 #include "llvm/Object/SymbolicFile.h"
14 #include "llvm/ADT/StringRef.h"
15 #include "llvm/BinaryFormat/Magic.h"
16 #include "llvm/Object/COFFImportFile.h"
17 #include "llvm/Object/Error.h"
18 #include "llvm/Object/IRObjectFile.h"
19 #include "llvm/Object/ObjectFile.h"
20 #include "llvm/Support/Error.h"
21 #include "llvm/Support/ErrorHandling.h"
25 using namespace object
;
31 SymbolicFile::SymbolicFile(unsigned int Type
, MemoryBufferRef Source
)
32 : Binary(Type
, Source
) {}
34 SymbolicFile::~SymbolicFile() = default;
36 Expected
<std::unique_ptr
<SymbolicFile
>>
37 SymbolicFile::createSymbolicFile(MemoryBufferRef Object
, file_magic Type
,
38 LLVMContext
*Context
, bool InitContent
) {
39 StringRef Data
= Object
.getBuffer();
40 if (Type
== file_magic::unknown
)
41 Type
= identify_magic(Data
);
43 if (!isSymbolicFile(Type
, Context
))
44 return errorCodeToError(object_error::invalid_file_type
);
47 case file_magic::bitcode
:
48 // Context is guaranteed to be non-null here, because bitcode magic only
49 // indicates a symbolic file when Context is non-null.
50 return IRObjectFile::create(Object
, *Context
);
52 case file_magic::elf_executable
:
53 case file_magic::elf_shared_object
:
54 case file_magic::elf_core
:
55 case file_magic::goff_object
:
56 case file_magic::macho_executable
:
57 case file_magic::macho_fixed_virtual_memory_shared_lib
:
58 case file_magic::macho_core
:
59 case file_magic::macho_preload_executable
:
60 case file_magic::macho_dynamically_linked_shared_lib
:
61 case file_magic::macho_dynamic_linker
:
62 case file_magic::macho_bundle
:
63 case file_magic::macho_dynamically_linked_shared_lib_stub
:
64 case file_magic::macho_dsym_companion
:
65 case file_magic::macho_kext_bundle
:
66 case file_magic::macho_file_set
:
67 case file_magic::pecoff_executable
:
68 case file_magic::xcoff_object_32
:
69 case file_magic::xcoff_object_64
:
70 case file_magic::wasm_object
:
71 return ObjectFile::createObjectFile(Object
, Type
, InitContent
);
72 case file_magic::coff_import_library
:
73 return std::unique_ptr
<SymbolicFile
>(new COFFImportFile(Object
));
74 case file_magic::elf_relocatable
:
75 case file_magic::macho_object
:
76 case file_magic::coff_object
: {
77 Expected
<std::unique_ptr
<ObjectFile
>> Obj
=
78 ObjectFile::createObjectFile(Object
, Type
, InitContent
);
80 return std::move(Obj
);
82 Expected
<MemoryBufferRef
> BCData
=
83 IRObjectFile::findBitcodeInObject(*Obj
->get());
85 consumeError(BCData
.takeError());
86 return std::move(Obj
);
89 return IRObjectFile::create(
90 MemoryBufferRef(BCData
->getBuffer(), Object
.getBufferIdentifier()),
94 llvm_unreachable("Unexpected Binary File Type");
98 bool SymbolicFile::isSymbolicFile(file_magic Type
, const LLVMContext
*Context
) {
100 case file_magic::bitcode
:
101 return Context
!= nullptr;
102 case file_magic::elf
:
103 case file_magic::elf_executable
:
104 case file_magic::elf_shared_object
:
105 case file_magic::elf_core
:
106 case file_magic::goff_object
:
107 case file_magic::macho_executable
:
108 case file_magic::macho_fixed_virtual_memory_shared_lib
:
109 case file_magic::macho_core
:
110 case file_magic::macho_preload_executable
:
111 case file_magic::macho_dynamically_linked_shared_lib
:
112 case file_magic::macho_dynamic_linker
:
113 case file_magic::macho_bundle
:
114 case file_magic::macho_dynamically_linked_shared_lib_stub
:
115 case file_magic::macho_dsym_companion
:
116 case file_magic::macho_kext_bundle
:
117 case file_magic::macho_file_set
:
118 case file_magic::pecoff_executable
:
119 case file_magic::xcoff_object_32
:
120 case file_magic::xcoff_object_64
:
121 case file_magic::wasm_object
:
122 case file_magic::coff_import_library
:
123 case file_magic::elf_relocatable
:
124 case file_magic::macho_object
:
125 case file_magic::coff_object
: