]>
git.proxmox.com Git - rustc.git/blob - src/llvm/include/llvm/Object/Binary.h
1 //===- Binary.h - A generic binary file -------------------------*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This file declares the Binary class.
12 //===----------------------------------------------------------------------===//
14 #ifndef LLVM_OBJECT_BINARY_H
15 #define LLVM_OBJECT_BINARY_H
17 #include "llvm/Object/Error.h"
18 #include "llvm/Support/ErrorOr.h"
19 #include "llvm/Support/FileSystem.h"
20 #include "llvm/Support/MemoryBuffer.h"
31 Binary() LLVM_DELETED_FUNCTION
;
32 Binary(const Binary
&other
) LLVM_DELETED_FUNCTION
;
39 Binary(unsigned int Type
, MemoryBufferRef Source
);
43 ID_MachOUniversalBinary
,
46 // Object and children.
50 ID_ELF32L
, // ELF 32-bit, little endian
51 ID_ELF32B
, // ELF 32-bit, big endian
52 ID_ELF64L
, // ELF 64-bit, little endian
53 ID_ELF64B
, // ELF 64-bit, big endian
55 ID_MachO32L
, // MachO 32-bit, little endian
56 ID_MachO32B
, // MachO 32-bit, big endian
57 ID_MachO64L
, // MachO 64-bit, little endian
58 ID_MachO64B
, // MachO 64-bit, big endian
63 static inline unsigned int getELFType(bool isLE
, bool is64Bits
) {
65 return is64Bits
? ID_ELF64L
: ID_ELF32L
;
67 return is64Bits
? ID_ELF64B
: ID_ELF32B
;
70 static unsigned int getMachOType(bool isLE
, bool is64Bits
) {
72 return is64Bits
? ID_MachO64L
: ID_MachO32L
;
74 return is64Bits
? ID_MachO64B
: ID_MachO32B
;
80 StringRef
getData() const;
81 StringRef
getFileName() const;
82 MemoryBufferRef
getMemoryBufferRef() const;
85 unsigned int getType() const { return TypeID
; }
87 // Convenience methods
88 bool isObject() const {
89 return TypeID
> ID_StartObjects
&& TypeID
< ID_EndObjects
;
92 bool isSymbolic() const {
93 return isIR() || isObject();
96 bool isArchive() const {
97 return TypeID
== ID_Archive
;
100 bool isMachOUniversalBinary() const {
101 return TypeID
== ID_MachOUniversalBinary
;
105 return TypeID
>= ID_ELF32L
&& TypeID
<= ID_ELF64B
;
108 bool isMachO() const {
109 return TypeID
>= ID_MachO32L
&& TypeID
<= ID_MachO64B
;
112 bool isCOFF() const {
113 return TypeID
== ID_COFF
;
117 return TypeID
== ID_IR
;
120 bool isLittleEndian() const {
121 return !(TypeID
== ID_ELF32B
|| TypeID
== ID_ELF64B
||
122 TypeID
== ID_MachO32B
|| TypeID
== ID_MachO64B
);
126 /// @brief Create a Binary from Source, autodetecting the file type.
128 /// @param Source The data to create the Binary from.
129 ErrorOr
<std::unique_ptr
<Binary
>> createBinary(MemoryBufferRef Source
,
130 LLVMContext
*Context
= nullptr);
132 template <typename T
> class OwningBinary
{
133 std::unique_ptr
<T
> Bin
;
134 std::unique_ptr
<MemoryBuffer
> Buf
;
138 OwningBinary(std::unique_ptr
<T
> Bin
, std::unique_ptr
<MemoryBuffer
> Buf
);
139 OwningBinary(OwningBinary
<T
>&& Other
);
140 OwningBinary
<T
> &operator=(OwningBinary
<T
> &&Other
);
142 std::unique_ptr
<T
> &getBinary();
143 std::unique_ptr
<MemoryBuffer
> &getBuffer();
146 template <typename T
>
147 OwningBinary
<T
>::OwningBinary(std::unique_ptr
<T
> Bin
,
148 std::unique_ptr
<MemoryBuffer
> Buf
)
149 : Bin(std::move(Bin
)), Buf(std::move(Buf
)) {}
151 template <typename T
> OwningBinary
<T
>::OwningBinary() {}
153 template <typename T
>
154 OwningBinary
<T
>::OwningBinary(OwningBinary
&&Other
)
155 : Bin(std::move(Other
.Bin
)), Buf(std::move(Other
.Buf
)) {}
157 template <typename T
>
158 OwningBinary
<T
> &OwningBinary
<T
>::operator=(OwningBinary
&&Other
) {
159 Bin
= std::move(Other
.Bin
);
160 Buf
= std::move(Other
.Buf
);
164 template <typename T
> std::unique_ptr
<T
> &OwningBinary
<T
>::getBinary() {
168 template <typename T
>
169 std::unique_ptr
<MemoryBuffer
> &OwningBinary
<T
>::getBuffer() {
173 ErrorOr
<OwningBinary
<Binary
>> createBinary(StringRef Path
);