]>
git.proxmox.com Git - rustc.git/blob - src/llvm/include/llvm/Object/MachOUniversal.h
1 //===- MachOUniversal.h - Mach-O universal binaries -------------*- 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 Mach-O fat/universal binaries.
12 //===----------------------------------------------------------------------===//
14 #ifndef LLVM_OBJECT_MACHOUNIVERSAL_H
15 #define LLVM_OBJECT_MACHOUNIVERSAL_H
17 #include "llvm/ADT/StringRef.h"
18 #include "llvm/ADT/Triple.h"
19 #include "llvm/Object/Archive.h"
20 #include "llvm/Object/Binary.h"
21 #include "llvm/Object/MachO.h"
22 #include "llvm/Support/ErrorOr.h"
23 #include "llvm/Support/MachO.h"
28 class MachOUniversalBinary
: public Binary
{
29 virtual void anchor();
31 uint32_t NumberOfObjects
;
34 const MachOUniversalBinary
*Parent
;
35 /// \brief Index of object in the universal binary.
37 /// \brief Descriptor of the object.
38 MachO::fat_arch Header
;
41 ObjectForArch(const MachOUniversalBinary
*Parent
, uint32_t Index
);
48 bool operator==(const ObjectForArch
&Other
) const {
49 return (Parent
== Other
.Parent
) && (Index
== Other
.Index
);
52 ObjectForArch
getNext() const { return ObjectForArch(Parent
, Index
+ 1); }
53 uint32_t getCPUType() const { return Header
.cputype
; }
54 uint32_t getCPUSubType() const { return Header
.cpusubtype
; }
55 uint32_t getOffset() const { return Header
.offset
; }
56 uint32_t getSize() const { return Header
.size
; }
57 uint32_t getAlign() const { return Header
.align
; }
58 std::string
getArchTypeName() const {
59 Triple T
= MachOObjectFile::getArch(Header
.cputype
, Header
.cpusubtype
);
60 return T
.getArchName();
63 ErrorOr
<std::unique_ptr
<MachOObjectFile
>> getAsObjectFile() const;
65 ErrorOr
<std::unique_ptr
<Archive
>> getAsArchive() const;
68 class object_iterator
{
71 object_iterator(const ObjectForArch
&Obj
) : Obj(Obj
) {}
72 const ObjectForArch
* operator->() const {
76 bool operator==(const object_iterator
&Other
) const {
77 return Obj
== Other
.Obj
;
79 bool operator!=(const object_iterator
&Other
) const {
80 return !(*this == Other
);
83 object_iterator
& operator++() { // Preincrement
89 MachOUniversalBinary(MemoryBufferRef Souce
, std::error_code
&EC
);
90 static ErrorOr
<std::unique_ptr
<MachOUniversalBinary
>>
91 create(MemoryBufferRef Source
);
93 object_iterator
begin_objects() const {
94 return ObjectForArch(this, 0);
96 object_iterator
end_objects() const {
97 return ObjectForArch(nullptr, 0);
100 uint32_t getNumberOfObjects() const { return NumberOfObjects
; }
103 static inline bool classof(Binary
const *V
) {
104 return V
->isMachOUniversalBinary();
107 ErrorOr
<std::unique_ptr
<MachOObjectFile
>>
108 getObjectForArch(Triple::ArchType Arch
) const;