summaryrefslogtreecommitdiff
path: root/include/llvm/Object/MachOUniversal.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/llvm/Object/MachOUniversal.h')
-rw-r--r--include/llvm/Object/MachOUniversal.h70
1 files changed, 56 insertions, 14 deletions
diff --git a/include/llvm/Object/MachOUniversal.h b/include/llvm/Object/MachOUniversal.h
index a11d381a700a2..7eb2af944f3dc 100644
--- a/include/llvm/Object/MachOUniversal.h
+++ b/include/llvm/Object/MachOUniversal.h
@@ -14,21 +14,22 @@
#ifndef LLVM_OBJECT_MACHOUNIVERSAL_H
#define LLVM_OBJECT_MACHOUNIVERSAL_H
-#include "llvm/ADT/StringRef.h"
#include "llvm/ADT/Triple.h"
#include "llvm/ADT/iterator_range.h"
#include "llvm/Object/Archive.h"
#include "llvm/Object/Binary.h"
#include "llvm/Object/MachO.h"
-#include "llvm/Support/ErrorOr.h"
#include "llvm/Support/MachO.h"
namespace llvm {
+class StringRef;
+
namespace object {
class MachOUniversalBinary : public Binary {
virtual void anchor();
+ uint32_t Magic;
uint32_t NumberOfObjects;
public:
class ObjectForArch {
@@ -37,6 +38,7 @@ public:
uint32_t Index;
/// \brief Descriptor of the object.
MachO::fat_arch Header;
+ MachO::fat_arch_64 Header64;
public:
ObjectForArch(const MachOUniversalBinary *Parent, uint32_t Index);
@@ -51,19 +53,58 @@ public:
}
ObjectForArch getNext() const { return ObjectForArch(Parent, Index + 1); }
- uint32_t getCPUType() const { return Header.cputype; }
- uint32_t getCPUSubType() const { return Header.cpusubtype; }
- uint32_t getOffset() const { return Header.offset; }
- uint32_t getSize() const { return Header.size; }
- uint32_t getAlign() const { return Header.align; }
+ uint32_t getCPUType() const {
+ if (Parent->getMagic() == MachO::FAT_MAGIC)
+ return Header.cputype;
+ else // Parent->getMagic() == MachO::FAT_MAGIC_64
+ return Header64.cputype;
+ }
+ uint32_t getCPUSubType() const {
+ if (Parent->getMagic() == MachO::FAT_MAGIC)
+ return Header.cpusubtype;
+ else // Parent->getMagic() == MachO::FAT_MAGIC_64
+ return Header64.cpusubtype;
+ }
+ uint32_t getOffset() const {
+ if (Parent->getMagic() == MachO::FAT_MAGIC)
+ return Header.offset;
+ else // Parent->getMagic() == MachO::FAT_MAGIC_64
+ return Header64.offset;
+ }
+ uint32_t getSize() const {
+ if (Parent->getMagic() == MachO::FAT_MAGIC)
+ return Header.size;
+ else // Parent->getMagic() == MachO::FAT_MAGIC_64
+ return Header64.size;
+ }
+ uint32_t getAlign() const {
+ if (Parent->getMagic() == MachO::FAT_MAGIC)
+ return Header.align;
+ else // Parent->getMagic() == MachO::FAT_MAGIC_64
+ return Header64.align;
+ }
+ uint32_t getReserved() const {
+ if (Parent->getMagic() == MachO::FAT_MAGIC)
+ return 0;
+ else // Parent->getMagic() == MachO::FAT_MAGIC_64
+ return Header64.reserved;
+ }
std::string getArchTypeName() const {
- Triple T = MachOObjectFile::getArch(Header.cputype, Header.cpusubtype);
- return T.getArchName();
+ if (Parent->getMagic() == MachO::FAT_MAGIC) {
+ Triple T =
+ MachOObjectFile::getArchTriple(Header.cputype, Header.cpusubtype);
+ return T.getArchName();
+ } else { // Parent->getMagic() == MachO::FAT_MAGIC_64
+ Triple T =
+ MachOObjectFile::getArchTriple(Header64.cputype,
+ Header64.cpusubtype);
+ return T.getArchName();
+ }
}
- ErrorOr<std::unique_ptr<MachOObjectFile>> getAsObjectFile() const;
+ Expected<std::unique_ptr<MachOObjectFile>> getAsObjectFile() const;
- ErrorOr<std::unique_ptr<Archive>> getAsArchive() const;
+ Expected<std::unique_ptr<Archive>> getAsArchive() const;
};
class object_iterator {
@@ -86,8 +127,8 @@ public:
}
};
- MachOUniversalBinary(MemoryBufferRef Souce, std::error_code &EC);
- static ErrorOr<std::unique_ptr<MachOUniversalBinary>>
+ MachOUniversalBinary(MemoryBufferRef Souce, Error &Err);
+ static Expected<std::unique_ptr<MachOUniversalBinary>>
create(MemoryBufferRef Source);
object_iterator begin_objects() const {
@@ -101,6 +142,7 @@ public:
return make_range(begin_objects(), end_objects());
}
+ uint32_t getMagic() const { return Magic; }
uint32_t getNumberOfObjects() const { return NumberOfObjects; }
// Cast methods.
@@ -108,7 +150,7 @@ public:
return V->isMachOUniversalBinary();
}
- ErrorOr<std::unique_ptr<MachOObjectFile>>
+ Expected<std::unique_ptr<MachOObjectFile>>
getObjectForArch(StringRef ArchName) const;
};