26  std::string StringMsg = 
"truncated or malformed fat file (" + Msg.
str() + 
")";
 
   28                                        object_error::parse_failed);
 
 
   34  memcpy(&Res, 
Ptr, 
sizeof(
T));
 
 
   43    : Parent(Parent), Index(Index) {
 
   45  if (!Parent || Index >= Parent->getNumberOfObjects()) {
 
   49    StringRef ParentData = Parent->getData();
 
   50    if (Parent->getMagic() == MachO::FAT_MAGIC) {
 
   51      const char *HeaderPos = ParentData.begin() + sizeof(MachO::fat_header) +
 
   52                              Index * sizeof(MachO::fat_arch);
 
   53      Header = getUniversalBinaryStruct<MachO::fat_arch>(HeaderPos);
 
   55      const char *HeaderPos = ParentData.begin() + sizeof(MachO::fat_header) +
 
   56                              Index * sizeof(MachO::fat_arch_64);
 
   57      Header64 = getUniversalBinaryStruct<MachO::fat_arch_64>(HeaderPos);
 
 
   66                       "called when Parent is a nullptr");
 
   72    ObjectData = ParentData.
substr(Header.offset, Header.size);
 
   73    cputype = Header.cputype;
 
   75    ObjectData = ParentData.
substr(Header64.offset, Header64.size);
 
   76    cputype = Header64.cputype;
 
   78  StringRef ObjectName = Parent->getFileName();
 
 
   87                       "called when Parent is a nullptr");
 
   92    ObjectData = ParentData.
substr(Header.offset, Header.size);
 
   94    ObjectData = ParentData.
substr(Header64.offset, Header64.size);
 
   96  StringRef ObjectName = Parent->getFileName();
 
 
  106                       "called when Parent is a nullptr");
 
  108  StringRef ParentData = Parent->getData();
 
  111    ObjectData = ParentData.
substr(Header.offset, Header.size);
 
  113    ObjectData = ParentData.
substr(Header64.offset, Header64.size);
 
  114  StringRef ObjectName = Parent->getFileName();
 
 
  119void MachOUniversalBinary::anchor() { }
 
  124  std::unique_ptr<MachOUniversalBinary> Ret(
 
  127    return std::move(Err);
 
  128  return std::move(Ret);
 
 
  146  NumberOfObjects = 
H.nfat_arch;
 
  147  if (NumberOfObjects == 0) {
 
  160  if (Buf.
size() < MinSize) {
 
  163                         " structs would extend past the end of the file");
 
  166  for (
uint32_t i = 0; i < NumberOfObjects; i++) {
 
  169    bigSize += 
A.getSize();
 
  170    if (bigSize > Buf.
size()) {
 
  172        Twine(
A.getCPUType()) + 
") cpusubtype (" +
 
  174        ") extends past the end of the file");
 
  180                           ") too large for cputype (" + 
Twine(
A.getCPUType()) +
 
  186    if(
A.getOffset() % (1ull << 
A.getAlign()) != 0){
 
  188        " for cputype (" + 
Twine(
A.getCPUType()) + 
") cpusubtype (" +
 
  190        ") not aligned on it's alignment (2^" + 
Twine(
A.getAlign()) + 
")");
 
  193    if (
A.getOffset() < MinSize) {
 
  196        ") offset " + 
Twine(
A.getOffset()) + 
" overlaps universal headers");
 
  200  for (
uint32_t i = 0; i < NumberOfObjects; i++) {
 
  202    for (
uint32_t j = i + 1; j < NumberOfObjects; j++) {
 
  204      if (
A.getCPUType() == 
B.getCPUType() &&
 
  207        Err = 
malformedError(
"contains two of the same architecture (cputype " 
  208          "(" + 
Twine(
A.getCPUType()) + 
") cpusubtype (" +
 
  212      if ((
A.getOffset() >= 
B.getOffset() &&
 
  213           A.getOffset() < 
B.getOffset() + 
B.getSize()) ||
 
  214          (
A.getOffset() + 
A.getSize() > 
B.getOffset() &&
 
  215           A.getOffset() + 
A.getSize() < 
B.getOffset() + 
B.getSize()) ||
 
  216          (
A.getOffset() <= 
B.getOffset() &&
 
  217           A.getOffset() + 
A.getSize() >= 
B.getOffset() + 
B.getSize())) {
 
  220          ") at offset " + 
Twine(
A.getOffset()) + 
" with a size of " +
 
  221          Twine(
A.getSize()) + 
", overlaps cputype (" + 
Twine(
B.getCPUType()) +
 
  223          + 
") at offset " + 
Twine(
B.getOffset()) + 
" with a size of " 
 
  239  for (
const auto &Obj : 
objects())
 
  240    if (Obj.getArchFlagName() == ArchName)
 
 
  252    return O.takeError();
 
  253  return O->getAsObjectFile();
 
 
  261    return O.takeError();
 
  262  return O->getAsIRObject(Ctx);
 
 
  269    return O.takeError();
 
  270  return O->getAsArchive();
 
 
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
 
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
 
static Error malformedError(Twine Msg)
 
static T getUniversalBinaryStruct(const char *Ptr)
 
static Error malformedError(Twine Msg)
 
Helper for Errors used as out-parameters.
 
Lightweight error class with error context and mandatory checking.
 
static ErrorSuccess success()
Create a success value.
 
Tagged union holding either a T or a Error.
 
This is an important class for using LLVM in a threaded context.
 
StringRef - Represent a constant reference to a string, i.e.
 
constexpr StringRef substr(size_t Start, size_t N=npos) const
Return a reference to the substring from [Start, Start + N).
 
constexpr size_t size() const
size - Get the string size.
 
Triple - Helper class for working with autoconf configuration names.
 
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
 
LLVM_ABI std::string str() const
Return the twine contents as a std::string.
 
static Expected< std::unique_ptr< Archive > > create(MemoryBufferRef Source)
 
StringRef getData() const
 
Binary(unsigned int Type, MemoryBufferRef Source)
 
@ ID_MachOUniversalBinary
 
static Expected< std::unique_ptr< IRObjectFile > > create(MemoryBufferRef Object, LLVMContext &Context)
 
LLVM_ABI Expected< std::unique_ptr< MachOObjectFile > > getAsObjectFile() const
 
LLVM_ABI ObjectForArch(const MachOUniversalBinary *Parent, uint32_t Index)
 
LLVM_ABI Expected< std::unique_ptr< IRObjectFile > > getAsIRObject(LLVMContext &Ctx) const
 
LLVM_ABI Expected< std::unique_ptr< Archive > > getAsArchive() const
 
Expected< ObjectForArch > getObjectForArch(StringRef ArchName) const
 
static Expected< std::unique_ptr< MachOUniversalBinary > > create(MemoryBufferRef Source)
 
Expected< std::unique_ptr< IRObjectFile > > getIRObjectForArch(StringRef ArchName, LLVMContext &Ctx) const
 
Expected< std::unique_ptr< MachOObjectFile > > getMachOObjectForArch(StringRef ArchName) const
 
Expected< std::unique_ptr< Archive > > getArchiveForArch(StringRef ArchName) const
 
MachOUniversalBinary(MemoryBufferRef Souce, Error &Err)
 
iterator_range< object_iterator > objects() const
 
static constexpr uint32_t MaxSectionAlignment
 
static Expected< std::unique_ptr< MachOObjectFile > > createMachOObjectFile(MemoryBufferRef Object, uint32_t UniversalCputype=0, uint32_t UniversalIndex=0, size_t MachOFilesetEntryOffset=0)
Create a MachOObjectFile instance from a given buffer.
 
constexpr bool IsLittleEndianHost
 
This is an optimization pass for GlobalISel generic memory operations.
 
LLVM_ABI void report_fatal_error(Error Err, bool gen_crash_diag=true)
 
Error make_error(ArgTs &&... Args)
Make a Error instance representing failure using the given error info type.