MachOUniversal.h revision 263508
1//===- MachOUniversal.h - Mach-O universal binaries -------------*- 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 declares Mach-O fat/universal binaries. 11// 12//===----------------------------------------------------------------------===// 13 14#ifndef LLVM_OBJECT_MACHOUNIVERSAL_H 15#define LLVM_OBJECT_MACHOUNIVERSAL_H 16 17#include "llvm/ADT/OwningPtr.h" 18#include "llvm/ADT/StringRef.h" 19#include "llvm/ADT/Triple.h" 20#include "llvm/Object/Binary.h" 21#include "llvm/Support/MachO.h" 22 23namespace llvm { 24namespace object { 25 26class ObjectFile; 27 28class MachOUniversalBinary : public Binary { 29 virtual void anchor(); 30 31 uint32_t NumberOfObjects; 32public: 33 class ObjectForArch { 34 const MachOUniversalBinary *Parent; 35 /// \brief Index of object in the universal binary. 36 uint32_t Index; 37 /// \brief Descriptor of the object. 38 MachO::fat_arch Header; 39 40 public: 41 ObjectForArch(const MachOUniversalBinary *Parent, uint32_t Index); 42 43 void clear() { 44 Parent = 0; 45 Index = 0; 46 } 47 48 bool operator==(const ObjectForArch &Other) const { 49 return (Parent == Other.Parent) && (Index == Other.Index); 50 } 51 52 ObjectForArch getNext() const { return ObjectForArch(Parent, Index + 1); } 53 uint32_t getCPUType() const { return Header.cputype; } 54 55 error_code getAsObjectFile(OwningPtr<ObjectFile> &Result) const; 56 }; 57 58 class object_iterator { 59 ObjectForArch Obj; 60 public: 61 object_iterator(const ObjectForArch &Obj) : Obj(Obj) {} 62 const ObjectForArch* operator->() const { 63 return &Obj; 64 } 65 66 bool operator==(const object_iterator &Other) const { 67 return Obj == Other.Obj; 68 } 69 bool operator!=(const object_iterator &Other) const { 70 return !(*this == Other); 71 } 72 73 object_iterator& operator++() { // Preincrement 74 Obj = Obj.getNext(); 75 return *this; 76 } 77 }; 78 79 MachOUniversalBinary(MemoryBuffer *Source, error_code &ec); 80 81 object_iterator begin_objects() const { 82 return ObjectForArch(this, 0); 83 } 84 object_iterator end_objects() const { 85 return ObjectForArch(0, 0); 86 } 87 88 uint32_t getNumberOfObjects() const { return NumberOfObjects; } 89 90 // Cast methods. 91 static inline bool classof(Binary const *V) { 92 return V->isMachOUniversalBinary(); 93 } 94 95 error_code getObjectForArch(Triple::ArchType Arch, 96 OwningPtr<ObjectFile> &Result) const; 97}; 98 99} 100} 101 102#endif 103