[llvm] [MachO] Replace getStruct with getStructOrErr (PR #95810)

via llvm-commits llvm-commits at lists.llvm.org
Tue Jun 25 09:07:38 PDT 2024


https://github.com/AtariDreams updated https://github.com/llvm/llvm-project/pull/95810

>From 9a0ad3d7533b858f4b2c50196524c310684bf640 Mon Sep 17 00:00:00 2001
From: Rose <gfunni234 at gmail.com>
Date: Mon, 17 Jun 2024 13:01:54 -0400
Subject: [PATCH] [MachO] Replace getStruct with getStructOrErr

---
 llvm/include/llvm/Object/MachO.h              |  10 +-
 .../JITLink/MachOLinkGraphBuilder.cpp         |  12 +-
 .../RuntimeDyld/RuntimeDyldMachO.cpp          |   5 +-
 .../Targets/RuntimeDyldMachOI386.h            |   9 +-
 llvm/lib/Object/MachOObjectFile.cpp           | 452 +++++++++++++-----
 llvm/lib/Object/MachOUniversalWriter.cpp      |  16 +-
 llvm/lib/ObjectYAML/MachOEmitter.cpp          |   4 +-
 llvm/tools/dsymutil/MachOUtils.cpp            |   9 +-
 llvm/tools/llvm-objdump/MachODump.cpp         |  86 +++-
 llvm/tools/llvm-readobj/MachODumper.cpp       |  44 +-
 llvm/tools/llvm-size/llvm-size.cpp            |  21 +-
 llvm/tools/sancov/sancov.cpp                  |   5 +-
 12 files changed, 493 insertions(+), 180 deletions(-)

diff --git a/llvm/include/llvm/Object/MachO.h b/llvm/include/llvm/Object/MachO.h
index 35350df78f8d4..c538233a78408 100644
--- a/llvm/include/llvm/Object/MachO.h
+++ b/llvm/include/llvm/Object/MachO.h
@@ -644,10 +644,12 @@ class MachOObjectFile : public ObjectFile {
   SectionRef getAnyRelocationSection(const MachO::any_relocation_info &RE) const;
 
   // MachO specific structures.
-  MachO::section getSection(DataRefImpl DRI) const;
-  MachO::section_64 getSection64(DataRefImpl DRI) const;
-  MachO::section getSection(const LoadCommandInfo &L, unsigned Index) const;
-  MachO::section_64 getSection64(const LoadCommandInfo &L,unsigned Index) const;
+  Expected<MachO::section> getSection(DataRefImpl DRI) const;
+  Expected<MachO::section_64> getSection64(DataRefImpl DRI) const;
+  Expected<MachO::section> getSection(const LoadCommandInfo &L,
+                                      unsigned Index) const;
+  Expected<MachO::section_64> getSection64(const LoadCommandInfo &L,
+                                           unsigned Index) const;
   MachO::nlist getSymbolTableEntry(DataRefImpl DRI) const;
   MachO::nlist_64 getSymbol64TableEntry(DataRefImpl DRI) const;
 
diff --git a/llvm/lib/ExecutionEngine/JITLink/MachOLinkGraphBuilder.cpp b/llvm/lib/ExecutionEngine/JITLink/MachOLinkGraphBuilder.cpp
index bb21f633d9829..d3ab971699c67 100644
--- a/llvm/lib/ExecutionEngine/JITLink/MachOLinkGraphBuilder.cpp
+++ b/llvm/lib/ExecutionEngine/JITLink/MachOLinkGraphBuilder.cpp
@@ -132,8 +132,10 @@ Error MachOLinkGraphBuilder::createNormalizedSections() {
     auto SecIndex = Obj.getSectionIndex(SecRef.getRawDataRefImpl());
 
     if (Obj.is64Bit()) {
-      const MachO::section_64 &Sec64 =
-          Obj.getSection64(SecRef.getRawDataRefImpl());
+      auto Sec64OrErr = Obj.getSection64(SecRef.getRawDataRefImpl());
+      if (!Sec64OrErr)
+        return Sec64OrErr.takeError();
+      const MachO::section_64 &Sec64 = Sec64OrErr.get();
 
       memcpy(&NSec.SectName, &Sec64.sectname, 16);
       NSec.SectName[16] = '\0';
@@ -146,7 +148,11 @@ Error MachOLinkGraphBuilder::createNormalizedSections() {
       NSec.Flags = Sec64.flags;
       DataOffset = Sec64.offset;
     } else {
-      const MachO::section &Sec32 = Obj.getSection(SecRef.getRawDataRefImpl());
+      auto Sec32OrErr = Obj.getSection(SecRef.getRawDataRefImpl());
+
+      if (!Sec32OrErr)
+        return Sec32OrErr.takeError();
+      const MachO::section &Sec32 = Sec32OrErr.get();
 
       memcpy(&NSec.SectName, &Sec32.sectname, 16);
       NSec.SectName[16] = '\0';
diff --git a/llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldMachO.cpp b/llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldMachO.cpp
index 9ca76602ea18e..f320a30ff9b7e 100644
--- a/llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldMachO.cpp
+++ b/llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldMachO.cpp
@@ -185,7 +185,10 @@ Error RuntimeDyldMachO::populateIndirectSymbolPointersSection(
          "Pointer table section not supported in 64-bit MachO.");
 
   MachO::dysymtab_command DySymTabCmd = Obj.getDysymtabLoadCommand();
-  MachO::section Sec32 = Obj.getSection(PTSection.getRawDataRefImpl());
+  auto Sec32OrErr = Obj.getSection(PTSection.getRawDataRefImpl());
+  if (!Sec32OrErr)
+    return Sec32OrErr.takeError();
+  MachO::section Sec32 = Sec32OrErr.get();
   uint32_t PTSectionSize = Sec32.size;
   unsigned FirstIndirectSymbol = Sec32.reserved1;
   const unsigned PTEntrySize = 4;
diff --git a/llvm/lib/ExecutionEngine/RuntimeDyld/Targets/RuntimeDyldMachOI386.h b/llvm/lib/ExecutionEngine/RuntimeDyld/Targets/RuntimeDyldMachOI386.h
index a983e22671b24..20b92a4aa29eb 100644
--- a/llvm/lib/ExecutionEngine/RuntimeDyld/Targets/RuntimeDyldMachOI386.h
+++ b/llvm/lib/ExecutionEngine/RuntimeDyld/Targets/RuntimeDyldMachOI386.h
@@ -209,10 +209,12 @@ class RuntimeDyldMachOI386
 
   // Populate stubs in __jump_table section.
   Error populateJumpTable(const MachOObjectFile &Obj,
-                          const SectionRef &JTSection,
-                         unsigned JTSectionID) {
+                          const SectionRef &JTSection, unsigned JTSectionID) {
     MachO::dysymtab_command DySymTabCmd = Obj.getDysymtabLoadCommand();
-    MachO::section Sec32 = Obj.getSection(JTSection.getRawDataRefImpl());
+    auto Sec32OrErr = Obj.getSection(JTSection.getRawDataRefImpl());
+    if (!Sec32OrErr)
+      return Sec32OrErr.takeError();
+    MachO::section Sec32 = Sec32OrErr.get();
     uint32_t JTSectionSize = Sec32.size;
     unsigned FirstIndirectSymbol = Sec32.reserved1;
     unsigned JTEntrySize = Sec32.reserved2;
@@ -241,7 +243,6 @@ class RuntimeDyldMachOI386
 
     return Error::success();
   }
-
 };
 }
 
diff --git a/llvm/lib/Object/MachOObjectFile.cpp b/llvm/lib/Object/MachOObjectFile.cpp
index 61d880b19f751..5e49fde29dc1f 100644
--- a/llvm/lib/Object/MachOObjectFile.cpp
+++ b/llvm/lib/Object/MachOObjectFile.cpp
@@ -66,20 +66,6 @@ static Error malformedError(const Twine &Msg) {
                                         object_error::parse_failed);
 }
 
-// FIXME: Replace all uses of this function with getStructOrErr.
-template <typename T>
-static T getStruct(const MachOObjectFile &O, const char *P) {
-  // Don't read before the beginning or past the end of the file
-  if (P < O.getData().begin() || P + sizeof(T) > O.getData().end())
-    report_fatal_error("Malformed MachO file.");
-
-  T Cmd;
-  memcpy(&Cmd, P, sizeof(T));
-  if (O.isLittleEndian() != sys::IsLittleEndianHost)
-    MachO::swapStruct(Cmd);
-  return Cmd;
-}
-
 template <typename T>
 static Expected<T> getStructOrErr(const MachOObjectFile &O, const char *P) {
   // Don't read before the beginning or past the end of the file
@@ -115,10 +101,10 @@ static const char *getPtr(const MachOObjectFile &O, size_t Offset,
   return O.getData().data() + Offset + MachOFilesetEntryOffset;
 }
 
-static MachO::nlist_base
+static Expected<MachO::nlist_base>
 getSymbolTableEntryBase(const MachOObjectFile &O, DataRefImpl DRI) {
   const char *P = reinterpret_cast<const char *>(DRI.p);
-  return getStruct<MachO::nlist_base>(O, P);
+  return getStructOrErr<MachO::nlist_base>(O, P);
 }
 
 static StringRef parseSegmentOrSectionName(const char *P) {
@@ -178,14 +164,17 @@ static unsigned getPlainRelocationType(const MachOObjectFile &O,
   return RE.r_word1 & 0xf;
 }
 
-static uint32_t getSectionFlags(const MachOObjectFile &O,
-                                DataRefImpl Sec) {
+static uint32_t getSectionFlags(const MachOObjectFile &O, DataRefImpl Sec) {
   if (O.is64Bit()) {
-    MachO::section_64 Sect = O.getSection64(Sec);
-    return Sect.flags;
+    auto Sect = O.getSection64(Sec);
+    if (!Sect)
+      report_fatal_error(Sect.takeError());
+    return Sect.get().flags;
   }
-  MachO::section Sect = O.getSection(Sec);
-  return Sect.flags;
+  auto Sect = O.getSection(Sec);
+  if (!Sect)
+    report_fatal_error(Sect.takeError());
+  return Sect.get().flags;
 }
 
 static Expected<MachOObjectFile::LoadCommandInfo>
@@ -1505,8 +1494,13 @@ MachOObjectFile::MachOObjectFile(MemoryBufferRef Object, bool IsLittleEndian,
                              " has incorrect cmdsize");
         return;
       }
-      MachO::encryption_info_command E =
-        getStruct<MachO::encryption_info_command>(*this, Load.Ptr);
+      auto EOrError =
+          getStructOrErr<MachO::encryption_info_command>(*this, Load.Ptr);
+      if (!EOrError) {
+        Err = EOrError.takeError();
+        return;
+      }
+      MachO::encryption_info_command E = EOrError.get();
       if ((Err = checkEncryptCommand(*this, Load, I, E.cryptoff, E.cryptsize,
                                      &EncryptLoadCmd, "LC_ENCRYPTION_INFO")))
         return;
@@ -1516,8 +1510,13 @@ MachOObjectFile::MachOObjectFile(MemoryBufferRef Object, bool IsLittleEndian,
                              " has incorrect cmdsize");
         return;
       }
-      MachO::encryption_info_command_64 E =
-        getStruct<MachO::encryption_info_command_64>(*this, Load.Ptr);
+      auto EOrError =
+          getStructOrErr<MachO::encryption_info_command_64>(*this, Load.Ptr);
+      if (!EOrError) {
+        Err = EOrError.takeError();
+        return;
+      }
+      MachO::encryption_info_command_64 E = EOrError.get();
       if ((Err = checkEncryptCommand(*this, Load, I, E.cryptoff, E.cryptsize,
                                      &EncryptLoadCmd, "LC_ENCRYPTION_INFO_64")))
         return;
@@ -1530,8 +1529,13 @@ MachOObjectFile::MachOObjectFile(MemoryBufferRef Object, bool IsLittleEndian,
                               " LC_SUB_FRAMEWORK cmdsize too small");
         return;
       }
-      MachO::sub_framework_command S =
-        getStruct<MachO::sub_framework_command>(*this, Load.Ptr);
+      auto SOrError =
+          getStructOrErr<MachO::sub_framework_command>(*this, Load.Ptr);
+      if (!SOrError) {
+        Err = SOrError.takeError();
+        return;
+      }
+      MachO::sub_framework_command S = SOrError.get();
       if ((Err = checkSubCommand(*this, Load, I, "LC_SUB_FRAMEWORK",
                                  sizeof(MachO::sub_framework_command),
                                  "sub_framework_command", S.umbrella,
@@ -1543,8 +1547,13 @@ MachOObjectFile::MachOObjectFile(MemoryBufferRef Object, bool IsLittleEndian,
                               " LC_SUB_UMBRELLA cmdsize too small");
         return;
       }
-      MachO::sub_umbrella_command S =
-        getStruct<MachO::sub_umbrella_command>(*this, Load.Ptr);
+      auto SOrError =
+          getStructOrErr<MachO::sub_umbrella_command>(*this, Load.Ptr);
+      if (!SOrError) {
+        Err = SOrError.takeError();
+        return;
+      }
+      MachO::sub_umbrella_command S = SOrError.get();
       if ((Err = checkSubCommand(*this, Load, I, "LC_SUB_UMBRELLA",
                                  sizeof(MachO::sub_umbrella_command),
                                  "sub_umbrella_command", S.sub_umbrella,
@@ -1556,8 +1565,13 @@ MachOObjectFile::MachOObjectFile(MemoryBufferRef Object, bool IsLittleEndian,
                               " LC_SUB_LIBRARY cmdsize too small");
         return;
       }
-      MachO::sub_library_command S =
-        getStruct<MachO::sub_library_command>(*this, Load.Ptr);
+      auto SOrError =
+          getStructOrErr<MachO::sub_library_command>(*this, Load.Ptr);
+      if (!SOrError) {
+        Err = SOrError.takeError();
+        return;
+      }
+      MachO::sub_library_command S = SOrError.get();
       if ((Err = checkSubCommand(*this, Load, I, "LC_SUB_LIBRARY",
                                  sizeof(MachO::sub_library_command),
                                  "sub_library_command", S.sub_library,
@@ -1569,8 +1583,13 @@ MachOObjectFile::MachOObjectFile(MemoryBufferRef Object, bool IsLittleEndian,
                               " LC_SUB_CLIENT cmdsize too small");
         return;
       }
-      MachO::sub_client_command S =
-        getStruct<MachO::sub_client_command>(*this, Load.Ptr);
+      auto SOrError =
+          getStructOrErr<MachO::sub_client_command>(*this, Load.Ptr);
+      if (!SOrError) {
+        Err = SOrError.takeError();
+        return;
+      }
+      MachO::sub_client_command S = SOrError.get();
       if ((Err = checkSubCommand(*this, Load, I, "LC_SUB_CLIENT",
                                  sizeof(MachO::sub_client_command),
                                  "sub_client_command", S.client, "client")))
@@ -1643,10 +1662,19 @@ MachOObjectFile::MachOObjectFile(MemoryBufferRef Object, bool IsLittleEndian,
       return;
     }
   } else if (DysymtabLoadCmd) {
-    MachO::symtab_command Symtab =
-      getStruct<MachO::symtab_command>(*this, SymtabLoadCmd);
-    MachO::dysymtab_command Dysymtab =
-      getStruct<MachO::dysymtab_command>(*this, DysymtabLoadCmd);
+    auto SymtabOrErr = getStructOrErr<MachO::symtab_command>(*this, Load.Ptr);
+    if (!SymtabOrErr) {
+      Err = SymtabOrErr.takeError();
+      return;
+    }
+    MachO::symtab_command Symtab = SymtabOrErr.get();
+    auto DSymtabOrErr =
+        getStructOrErr<MachO::dysymtab_command>(*this, Load.Ptr);
+    if (!DSymtabOrErr) {
+      Err = DSymtabOrErr.takeError();
+      return;
+    }
+    MachO::dysymtab_command Dysymtab = DSymtabOrErr.get();
     if (Dysymtab.nlocalsym != 0 && Dysymtab.ilocalsym > Symtab.nsyms) {
       Err = malformedError("ilocalsym in LC_DYSYMTAB load command "
                            "extends past the end of the symbol table");
@@ -1773,7 +1801,10 @@ void MachOObjectFile::moveSymbolNext(DataRefImpl &Symb) const {
 
 Expected<StringRef> MachOObjectFile::getSymbolName(DataRefImpl Symb) const {
   StringRef StringTable = getStringTableData();
-  MachO::nlist_base Entry = getSymbolTableEntryBase(*this, Symb);
+  auto EntryOrErr = getSymbolTableEntryBase(*this, Symb);
+  if (!EntryOrErr)
+    return EntryOrErr.takeError();
+  MachO::nlist_base Entry = EntryOrErr.get();
   if (Entry.n_strx == 0)
     // A n_strx value of 0 indicates that no name is associated with a
     // particular symbol table entry.
@@ -1806,7 +1837,10 @@ uint64_t MachOObjectFile::getNValue(DataRefImpl Sym) const {
 std::error_code MachOObjectFile::getIndirectName(DataRefImpl Symb,
                                                  StringRef &Res) const {
   StringRef StringTable = getStringTableData();
-  MachO::nlist_base Entry = getSymbolTableEntryBase(*this, Symb);
+  auto EntryOrErr = getSymbolTableEntryBase(*this, Symb);
+  if (!EntryOrErr)
+    return errorToErrorCode(EntryOrErr.takeError());
+  MachO::nlist_base Entry = EntryOrErr.get();
   if ((Entry.n_type & MachO::N_TYPE) != MachO::N_INDR)
     return object_error::parse_failed;
   uint64_t NValue = getNValue(Symb);
@@ -1828,7 +1862,10 @@ Expected<uint64_t> MachOObjectFile::getSymbolAddress(DataRefImpl Sym) const {
 uint32_t MachOObjectFile::getSymbolAlignment(DataRefImpl DRI) const {
   uint32_t Flags = cantFail(getSymbolFlags(DRI));
   if (Flags & SymbolRef::SF_Common) {
-    MachO::nlist_base Entry = getSymbolTableEntryBase(*this, DRI);
+    auto EntryOrErr = getSymbolTableEntryBase(*this, DRI);
+    if (!EntryOrErr)
+      report_fatal_error(EntryOrErr.takeError());
+    MachO::nlist_base Entry = EntryOrErr.get();
     return 1 << MachO::GET_COMM_ALIGN(Entry.n_desc);
   }
   return 0;
@@ -1840,7 +1877,11 @@ uint64_t MachOObjectFile::getCommonSymbolSizeImpl(DataRefImpl DRI) const {
 
 Expected<SymbolRef::Type>
 MachOObjectFile::getSymbolType(DataRefImpl Symb) const {
-  MachO::nlist_base Entry = getSymbolTableEntryBase(*this, Symb);
+  auto EntryOrErr = getSymbolTableEntryBase(*this, Symb);
+  if (!EntryOrErr)
+    return EntryOrErr.takeError();
+
+  MachO::nlist_base Entry = EntryOrErr.get();
   uint8_t n_type = Entry.n_type;
 
   // If this is a STAB debugging symbol, we can do nothing more.
@@ -1865,8 +1906,10 @@ MachOObjectFile::getSymbolType(DataRefImpl Symb) const {
 }
 
 Expected<uint32_t> MachOObjectFile::getSymbolFlags(DataRefImpl DRI) const {
-  MachO::nlist_base Entry = getSymbolTableEntryBase(*this, DRI);
-
+  auto EntryOrErr = getSymbolTableEntryBase(*this, DRI);
+  if (!EntryOrErr)
+    return EntryOrErr.takeError();
+  MachO::nlist_base Entry = EntryOrErr.get();
   uint8_t MachOType = Entry.n_type;
   uint16_t MachOFlags = Entry.n_desc;
 
@@ -1909,7 +1952,11 @@ Expected<uint32_t> MachOObjectFile::getSymbolFlags(DataRefImpl DRI) const {
 
 Expected<section_iterator>
 MachOObjectFile::getSymbolSection(DataRefImpl Symb) const {
-  MachO::nlist_base Entry = getSymbolTableEntryBase(*this, Symb);
+  auto EntryOrErr = getSymbolTableEntryBase(*this, Symb);
+  if (!EntryOrErr)
+    return EntryOrErr.takeError();
+
+  MachO::nlist_base Entry = EntryOrErr.get();
   uint8_t index = Entry.n_sect;
 
   if (index == 0)
@@ -1924,8 +1971,11 @@ MachOObjectFile::getSymbolSection(DataRefImpl Symb) const {
 }
 
 unsigned MachOObjectFile::getSymbolSectionID(SymbolRef Sym) const {
-  MachO::nlist_base Entry =
-      getSymbolTableEntryBase(*this, Sym.getRawDataRefImpl());
+  auto EntryOrErr = getSymbolTableEntryBase(*this, Sym.getRawDataRefImpl());
+  if (!EntryOrErr)
+    report_fatal_error(EntryOrErr.takeError());
+
+  MachO::nlist_base Entry = EntryOrErr.get();
   return Entry.n_sect - 1;
 }
 
@@ -1939,9 +1989,17 @@ Expected<StringRef> MachOObjectFile::getSectionName(DataRefImpl Sec) const {
 }
 
 uint64_t MachOObjectFile::getSectionAddress(DataRefImpl Sec) const {
-  if (is64Bit())
-    return getSection64(Sec).addr;
-  return getSection(Sec).addr;
+  if (is64Bit()) {
+    auto Sect = getSection64(Sec);
+    if (!Sect)
+      report_fatal_error(Sect.takeError());
+    return Sect.get().addr;
+  }
+
+  auto Sect = getSection(Sec);
+  if (!Sect)
+    report_fatal_error(Sect.takeError());
+  return Sect.get().addr;
 }
 
 uint64_t MachOObjectFile::getSectionIndex(DataRefImpl Sec) const {
@@ -1957,12 +2015,18 @@ uint64_t MachOObjectFile::getSectionSize(DataRefImpl Sec) const {
   uint64_t SectSize;
 
   if (is64Bit()) {
-    MachO::section_64 Sect = getSection64(Sec);
+    auto SectOrError = getSection64(Sec);
+    if (!SectOrError)
+      return 0;
+    MachO::section_64 Sect = SectOrError.get();
     SectOffset = Sect.offset;
     SectSize = Sect.size;
     SectType = Sect.flags & MachO::SECTION_TYPE;
   } else {
-    MachO::section Sect = getSection(Sec);
+    auto SectOrError = getSection(Sec);
+    if (!SectOrError)
+      return 0;
+    MachO::section Sect = SectOrError.get();
     SectOffset = Sect.offset;
     SectSize = Sect.size;
     SectType = Sect.flags & MachO::SECTION_TYPE;
@@ -1988,11 +2052,17 @@ MachOObjectFile::getSectionContents(DataRefImpl Sec) const {
   uint64_t Size;
 
   if (is64Bit()) {
-    MachO::section_64 Sect = getSection64(Sec);
+    auto SectOrErr = getSection64(Sec);
+    if (!SectOrErr)
+      return SectOrErr.takeError();
+    MachO::section_64 Sect = SectOrErr.get();
     Offset = Sect.offset;
     Size = Sect.size;
   } else {
-    MachO::section Sect = getSection(Sec);
+    auto SectOrErr = getSection(Sec);
+    if (!SectOrErr)
+      return SectOrErr.takeError();
+    MachO::section Sect = SectOrErr.get();
     Offset = Sect.offset;
     Size = Sect.size;
   }
@@ -2003,13 +2073,17 @@ MachOObjectFile::getSectionContents(DataRefImpl Sec) const {
 uint64_t MachOObjectFile::getSectionAlignment(DataRefImpl Sec) const {
   uint32_t Align;
   if (is64Bit()) {
-    MachO::section_64 Sect = getSection64(Sec);
-    Align = Sect.align;
+    auto Sect = getSection64(Sec);
+    if (!Sect)
+      report_fatal_error(Sect.takeError());
+    Align = Sect.get().align;
   } else {
-    MachO::section Sect = getSection(Sec);
-    Align = Sect.align;
-  }
 
+    auto Sect = getSection(Sec);
+    if (!Sect)
+      report_fatal_error(Sect.takeError());
+    Align = Sect.get().align;
+  }
   return uint64_t(1) << Align;
 }
 
@@ -2166,9 +2240,17 @@ bool MachOObjectFile::isSectionBitcode(DataRefImpl Sec) const {
 }
 
 bool MachOObjectFile::isSectionStripped(DataRefImpl Sec) const {
-  if (is64Bit())
-    return getSection64(Sec).offset == 0;
-  return getSection(Sec).offset == 0;
+  if (is64Bit()) {
+    auto Sect = getSection64(Sec);
+    if (!Sect)
+      report_fatal_error(Sect.takeError());
+    return Sect.get().offset == 0;
+  }
+
+  auto Sect = getSection(Sec);
+  if (!Sect)
+    report_fatal_error(Sect.takeError());
+  return Sect.get().offset == 0;
 }
 
 relocation_iterator MachOObjectFile::section_rel_begin(DataRefImpl Sec) const {
@@ -2182,11 +2264,15 @@ relocation_iterator
 MachOObjectFile::section_rel_end(DataRefImpl Sec) const {
   uint32_t Num;
   if (is64Bit()) {
-    MachO::section_64 Sect = getSection64(Sec);
-    Num = Sect.nreloc;
+    auto Sect = getSection64(Sec);
+    if (!Sect)
+      report_fatal_error(Sect.takeError());
+    Num = Sect.get().nreloc;
   } else {
-    MachO::section Sect = getSection(Sec);
-    Num = Sect.nreloc;
+    auto Sect = getSection64(Sec);
+    if (!Sect)
+      report_fatal_error(Sect.takeError());
+    Num = Sect.get().nreloc;
   }
 
   DataRefImpl Ret;
@@ -4618,163 +4704,254 @@ MachOObjectFile::getAnyRelocationSection(
   return SectionRef(DRI, this);
 }
 
-MachO::section MachOObjectFile::getSection(DataRefImpl DRI) const {
+Expected<MachO::section> MachOObjectFile::getSection(DataRefImpl DRI) const {
   assert(DRI.d.a < Sections.size() && "Should have detected this earlier");
-  return getStruct<MachO::section>(*this, Sections[DRI.d.a]);
+  return getStructOrErr<MachO::section>(*this, Sections[DRI.d.a]);
 }
 
-MachO::section_64 MachOObjectFile::getSection64(DataRefImpl DRI) const {
+Expected<MachO::section_64>
+MachOObjectFile::getSection64(DataRefImpl DRI) const {
   assert(DRI.d.a < Sections.size() && "Should have detected this earlier");
-  return getStruct<MachO::section_64>(*this, Sections[DRI.d.a]);
+  return getStructOrErr<MachO::section_64>(*this, Sections[DRI.d.a]);
 }
 
-MachO::section MachOObjectFile::getSection(const LoadCommandInfo &L,
-                                           unsigned Index) const {
+Expected<MachO::section> MachOObjectFile::getSection(const LoadCommandInfo &L,
+                                                     unsigned Index) const {
   const char *Sec = getSectionPtr(*this, L, Index);
-  return getStruct<MachO::section>(*this, Sec);
+  return getStructOrErr<MachO::section>(*this, Sec);
 }
 
-MachO::section_64 MachOObjectFile::getSection64(const LoadCommandInfo &L,
-                                                unsigned Index) const {
+Expected<MachO::section_64>
+MachOObjectFile::getSection64(const LoadCommandInfo &L, unsigned Index) const {
   const char *Sec = getSectionPtr(*this, L, Index);
-  return getStruct<MachO::section_64>(*this, Sec);
+  return getStructOrErr<MachO::section_64>(*this, Sec);
 }
 
 MachO::nlist
 MachOObjectFile::getSymbolTableEntry(DataRefImpl DRI) const {
   const char *P = reinterpret_cast<const char *>(DRI.p);
-  return getStruct<MachO::nlist>(*this, P);
+  auto NListOrErr = getStructOrErr<MachO::nlist>(*this, P);
+  if (!NListOrErr)
+    report_fatal_error(NListOrErr.takeError());
+  return NListOrErr.get();
 }
 
 MachO::nlist_64
 MachOObjectFile::getSymbol64TableEntry(DataRefImpl DRI) const {
   const char *P = reinterpret_cast<const char *>(DRI.p);
-  return getStruct<MachO::nlist_64>(*this, P);
+  auto NListOrErr = getStructOrErr<MachO::nlist_64>(*this, P);
+  if (!NListOrErr)
+    report_fatal_error(NListOrErr.takeError());
+  return NListOrErr.get();
 }
 
 MachO::linkedit_data_command
 MachOObjectFile::getLinkeditDataLoadCommand(const LoadCommandInfo &L) const {
-  return getStruct<MachO::linkedit_data_command>(*this, L.Ptr);
+  auto CommandOrErr =
+      getStructOrErr<MachO::linkedit_data_command>(*this, L.Ptr);
+  if (!CommandOrErr)
+    report_fatal_error(CommandOrErr.takeError());
+  return CommandOrErr.get();
 }
 
 MachO::segment_command
 MachOObjectFile::getSegmentLoadCommand(const LoadCommandInfo &L) const {
-  return getStruct<MachO::segment_command>(*this, L.Ptr);
+  auto CommandOrErr = getStructOrErr<MachO::segment_command>(*this, L.Ptr);
+  if (!CommandOrErr)
+    report_fatal_error(CommandOrErr.takeError());
+  return CommandOrErr.get();
 }
 
 MachO::segment_command_64
 MachOObjectFile::getSegment64LoadCommand(const LoadCommandInfo &L) const {
-  return getStruct<MachO::segment_command_64>(*this, L.Ptr);
+  auto CommandOrErr = getStructOrErr<MachO::segment_command_64>(*this, L.Ptr);
+  if (!CommandOrErr)
+    report_fatal_error(CommandOrErr.takeError());
+  return CommandOrErr.get();
 }
 
 MachO::linker_option_command
 MachOObjectFile::getLinkerOptionLoadCommand(const LoadCommandInfo &L) const {
-  return getStruct<MachO::linker_option_command>(*this, L.Ptr);
+  auto CommandOrErr =
+      getStructOrErr<MachO::linker_option_command>(*this, L.Ptr);
+  if (!CommandOrErr)
+    report_fatal_error(CommandOrErr.takeError());
+  return CommandOrErr.get();
 }
 
 MachO::version_min_command
 MachOObjectFile::getVersionMinLoadCommand(const LoadCommandInfo &L) const {
-  return getStruct<MachO::version_min_command>(*this, L.Ptr);
+  auto CommandOrErr = getStructOrErr<MachO::version_min_command>(*this, L.Ptr);
+  if (!CommandOrErr)
+    report_fatal_error(CommandOrErr.takeError());
+  return CommandOrErr.get();
 }
 
 MachO::note_command
 MachOObjectFile::getNoteLoadCommand(const LoadCommandInfo &L) const {
-  return getStruct<MachO::note_command>(*this, L.Ptr);
+  auto CommandOrErr = getStructOrErr<MachO::note_command>(*this, L.Ptr);
+  if (!CommandOrErr)
+    report_fatal_error(CommandOrErr.takeError());
+  return CommandOrErr.get();
 }
 
 MachO::build_version_command
 MachOObjectFile::getBuildVersionLoadCommand(const LoadCommandInfo &L) const {
-  return getStruct<MachO::build_version_command>(*this, L.Ptr);
+  auto CommandOrErr =
+      getStructOrErr<MachO::build_version_command>(*this, L.Ptr);
+  if (!CommandOrErr)
+    report_fatal_error(CommandOrErr.takeError());
+  return CommandOrErr.get();
 }
 
 MachO::build_tool_version
 MachOObjectFile::getBuildToolVersion(unsigned index) const {
-  return getStruct<MachO::build_tool_version>(*this, BuildTools[index]);
+  auto CommandOrErr =
+      getStructOrErr<MachO::build_tool_version>(*this, BuildTools[index]);
+  if (!CommandOrErr)
+    report_fatal_error(CommandOrErr.takeError());
+  return CommandOrErr.get();
 }
 
 MachO::dylib_command
 MachOObjectFile::getDylibIDLoadCommand(const LoadCommandInfo &L) const {
-  return getStruct<MachO::dylib_command>(*this, L.Ptr);
+  auto CommandOrErr = getStructOrErr<MachO::dylib_command>(*this, L.Ptr);
+  if (!CommandOrErr)
+    report_fatal_error(CommandOrErr.takeError());
+  return CommandOrErr.get();
 }
 
 MachO::dyld_info_command
 MachOObjectFile::getDyldInfoLoadCommand(const LoadCommandInfo &L) const {
-  return getStruct<MachO::dyld_info_command>(*this, L.Ptr);
+  auto CommandOrErr = getStructOrErr<MachO::dyld_info_command>(*this, L.Ptr);
+  if (!CommandOrErr)
+    report_fatal_error(CommandOrErr.takeError());
+  return CommandOrErr.get();
 }
 
 MachO::dylinker_command
 MachOObjectFile::getDylinkerCommand(const LoadCommandInfo &L) const {
-  return getStruct<MachO::dylinker_command>(*this, L.Ptr);
+  auto CommandOrErr = getStructOrErr<MachO::dylinker_command>(*this, L.Ptr);
+  if (!CommandOrErr)
+    report_fatal_error(CommandOrErr.takeError());
+  return CommandOrErr.get();
 }
 
 MachO::uuid_command
 MachOObjectFile::getUuidCommand(const LoadCommandInfo &L) const {
-  return getStruct<MachO::uuid_command>(*this, L.Ptr);
+  auto CommandOrErr = getStructOrErr<MachO::uuid_command>(*this, L.Ptr);
+  if (!CommandOrErr)
+    report_fatal_error(CommandOrErr.takeError());
+  return CommandOrErr.get();
 }
 
 MachO::rpath_command
 MachOObjectFile::getRpathCommand(const LoadCommandInfo &L) const {
-  return getStruct<MachO::rpath_command>(*this, L.Ptr);
+  auto CommandOrErr = getStructOrErr<MachO::rpath_command>(*this, L.Ptr);
+  if (!CommandOrErr)
+    report_fatal_error(CommandOrErr.takeError());
+  return CommandOrErr.get();
 }
 
 MachO::source_version_command
 MachOObjectFile::getSourceVersionCommand(const LoadCommandInfo &L) const {
-  return getStruct<MachO::source_version_command>(*this, L.Ptr);
+  auto CommandOrErr =
+      getStructOrErr<MachO::source_version_command>(*this, L.Ptr);
+  if (!CommandOrErr)
+    report_fatal_error(CommandOrErr.takeError());
+  return CommandOrErr.get();
 }
 
 MachO::entry_point_command
 MachOObjectFile::getEntryPointCommand(const LoadCommandInfo &L) const {
-  return getStruct<MachO::entry_point_command>(*this, L.Ptr);
+  auto CommandOrErr = getStructOrErr<MachO::entry_point_command>(*this, L.Ptr);
+  if (!CommandOrErr)
+    report_fatal_error(CommandOrErr.takeError());
+  return CommandOrErr.get();
 }
 
 MachO::encryption_info_command
 MachOObjectFile::getEncryptionInfoCommand(const LoadCommandInfo &L) const {
-  return getStruct<MachO::encryption_info_command>(*this, L.Ptr);
+  auto CommandOrErr =
+      getStructOrErr<MachO::encryption_info_command>(*this, L.Ptr);
+  if (!CommandOrErr)
+    report_fatal_error(CommandOrErr.takeError());
+  return CommandOrErr.get();
 }
 
 MachO::encryption_info_command_64
 MachOObjectFile::getEncryptionInfoCommand64(const LoadCommandInfo &L) const {
-  return getStruct<MachO::encryption_info_command_64>(*this, L.Ptr);
+  auto CommandOrErr =
+      getStructOrErr<MachO::encryption_info_command_64>(*this, L.Ptr);
+  if (!CommandOrErr)
+    report_fatal_error(CommandOrErr.takeError());
+  return CommandOrErr.get();
 }
 
 MachO::sub_framework_command
 MachOObjectFile::getSubFrameworkCommand(const LoadCommandInfo &L) const {
-  return getStruct<MachO::sub_framework_command>(*this, L.Ptr);
+  auto CommandOrErr =
+      getStructOrErr<MachO::sub_framework_command>(*this, L.Ptr);
+  if (!CommandOrErr)
+    report_fatal_error(CommandOrErr.takeError());
+  return CommandOrErr.get();
 }
 
 MachO::sub_umbrella_command
 MachOObjectFile::getSubUmbrellaCommand(const LoadCommandInfo &L) const {
-  return getStruct<MachO::sub_umbrella_command>(*this, L.Ptr);
+  auto CommandOrErr = getStructOrErr<MachO::sub_umbrella_command>(*this, L.Ptr);
+  if (!CommandOrErr)
+    report_fatal_error(CommandOrErr.takeError());
+  return CommandOrErr.get();
 }
 
 MachO::sub_library_command
 MachOObjectFile::getSubLibraryCommand(const LoadCommandInfo &L) const {
-  return getStruct<MachO::sub_library_command>(*this, L.Ptr);
+  auto CommandOrErr = getStructOrErr<MachO::sub_library_command>(*this, L.Ptr);
+  if (!CommandOrErr)
+    report_fatal_error(CommandOrErr.takeError());
+  return CommandOrErr.get();
 }
 
 MachO::sub_client_command
 MachOObjectFile::getSubClientCommand(const LoadCommandInfo &L) const {
-  return getStruct<MachO::sub_client_command>(*this, L.Ptr);
+  auto CommandOrErr = getStructOrErr<MachO::sub_client_command>(*this, L.Ptr);
+  if (!CommandOrErr)
+    report_fatal_error(CommandOrErr.takeError());
+  return CommandOrErr.get();
 }
 
 MachO::routines_command
 MachOObjectFile::getRoutinesCommand(const LoadCommandInfo &L) const {
-  return getStruct<MachO::routines_command>(*this, L.Ptr);
+  auto CommandOrErr = getStructOrErr<MachO::routines_command>(*this, L.Ptr);
+  if (!CommandOrErr)
+    report_fatal_error(CommandOrErr.takeError());
+  return CommandOrErr.get();
 }
 
 MachO::routines_command_64
 MachOObjectFile::getRoutinesCommand64(const LoadCommandInfo &L) const {
-  return getStruct<MachO::routines_command_64>(*this, L.Ptr);
+  auto CommandOrErr = getStructOrErr<MachO::routines_command_64>(*this, L.Ptr);
+  if (!CommandOrErr)
+    report_fatal_error(CommandOrErr.takeError());
+  return CommandOrErr.get();
 }
 
 MachO::thread_command
 MachOObjectFile::getThreadCommand(const LoadCommandInfo &L) const {
-  return getStruct<MachO::thread_command>(*this, L.Ptr);
+  auto CommandOrErr = getStructOrErr<MachO::thread_command>(*this, L.Ptr);
+  if (!CommandOrErr)
+    report_fatal_error(CommandOrErr.takeError());
+  return CommandOrErr.get();
 }
 
 MachO::fileset_entry_command
 MachOObjectFile::getFilesetEntryLoadCommand(const LoadCommandInfo &L) const {
-  return getStruct<MachO::fileset_entry_command>(*this, L.Ptr);
+  auto CommandOrErr =
+      getStructOrErr<MachO::fileset_entry_command>(*this, L.Ptr);
+  if (!CommandOrErr)
+    report_fatal_error(CommandOrErr.takeError());
+  return CommandOrErr.get();
 }
 
 MachO::any_relocation_info
@@ -4784,11 +4961,15 @@ MachOObjectFile::getRelocation(DataRefImpl Rel) const {
     DataRefImpl Sec;
     Sec.d.a = Rel.d.a;
     if (is64Bit()) {
-      MachO::section_64 Sect = getSection64(Sec);
-      Offset = Sect.reloff;
+      auto Sect = getSection64(Sec);
+      if (!Sect)
+        report_fatal_error(Sect.takeError());
+      Offset = Sect.get().reloff;
     } else {
-      MachO::section Sect = getSection(Sec);
-      Offset = Sect.reloff;
+      auto Sect = getSection(Sec);
+      if (!Sect)
+        report_fatal_error(Sect.takeError());
+      Offset = Sect.get().reloff;
     }
   } else {
     MachO::dysymtab_command DysymtabLoadCmd = getDysymtabLoadCommand();
@@ -4800,14 +4981,20 @@ MachOObjectFile::getRelocation(DataRefImpl Rel) const {
 
   auto P = reinterpret_cast<const MachO::any_relocation_info *>(
       getPtr(*this, Offset)) + Rel.d.b;
-  return getStruct<MachO::any_relocation_info>(
+  auto InfoOrErr = getStructOrErr<MachO::any_relocation_info>(
       *this, reinterpret_cast<const char *>(P));
+  if (!InfoOrErr)
+    report_fatal_error(InfoOrErr.takeError());
+  return InfoOrErr.get();
 }
 
 MachO::data_in_code_entry
 MachOObjectFile::getDice(DataRefImpl Rel) const {
   const char *P = reinterpret_cast<const char *>(Rel.p);
-  return getStruct<MachO::data_in_code_entry>(*this, P);
+  auto CommandOrErr = getStructOrErr<MachO::data_in_code_entry>(*this, P);
+  if (!CommandOrErr)
+    report_fatal_error(CommandOrErr.takeError());
+  return CommandOrErr.get();
 }
 
 const MachO::mach_header &MachOObjectFile::getHeader() const {
@@ -4823,19 +5010,31 @@ uint32_t MachOObjectFile::getIndirectSymbolTableEntry(
                                              const MachO::dysymtab_command &DLC,
                                              unsigned Index) const {
   uint64_t Offset = DLC.indirectsymoff + Index * sizeof(uint32_t);
-  return getStruct<uint32_t>(*this, getPtr(*this, Offset));
+  auto EntryOrErr = getStructOrErr<uint32_t>(*this, getPtr(*this, Offset));
+  if (!EntryOrErr)
+    report_fatal_error(EntryOrErr.takeError());
+  return EntryOrErr.get();
 }
 
 MachO::data_in_code_entry
 MachOObjectFile::getDataInCodeTableEntry(uint32_t DataOffset,
                                          unsigned Index) const {
   uint64_t Offset = DataOffset + Index * sizeof(MachO::data_in_code_entry);
-  return getStruct<MachO::data_in_code_entry>(*this, getPtr(*this, Offset));
+  auto DataOrErr =
+      getStructOrErr<MachO::data_in_code_entry>(*this, getPtr(*this, Offset));
+  if (!DataOrErr)
+    report_fatal_error(DataOrErr.takeError());
+  return DataOrErr.get();
 }
 
 MachO::symtab_command MachOObjectFile::getSymtabLoadCommand() const {
-  if (SymtabLoadCmd)
-    return getStruct<MachO::symtab_command>(*this, SymtabLoadCmd);
+  if (SymtabLoadCmd) {
+    auto CommandOrErr =
+        getStructOrErr<MachO::symtab_command>(*this, SymtabLoadCmd);
+    if (!CommandOrErr)
+      report_fatal_error(CommandOrErr.takeError());
+    return CommandOrErr.get();
+  }
 
   // If there is no SymtabLoadCmd return a load command with zero'ed fields.
   MachO::symtab_command Cmd;
@@ -4849,8 +5048,13 @@ MachO::symtab_command MachOObjectFile::getSymtabLoadCommand() const {
 }
 
 MachO::dysymtab_command MachOObjectFile::getDysymtabLoadCommand() const {
-  if (DysymtabLoadCmd)
-    return getStruct<MachO::dysymtab_command>(*this, DysymtabLoadCmd);
+  if (DysymtabLoadCmd) {
+    auto CommandOrErr =
+        getStructOrErr<MachO::dysymtab_command>(*this, DysymtabLoadCmd);
+    if (!CommandOrErr)
+      report_fatal_error(CommandOrErr.takeError());
+    return CommandOrErr.get();
+  }
 
   // If there is no DysymtabLoadCmd return a load command with zero'ed fields.
   MachO::dysymtab_command Cmd;
@@ -4879,8 +5083,13 @@ MachO::dysymtab_command MachOObjectFile::getDysymtabLoadCommand() const {
 
 MachO::linkedit_data_command
 MachOObjectFile::getDataInCodeLoadCommand() const {
-  if (DataInCodeLoadCmd)
-    return getStruct<MachO::linkedit_data_command>(*this, DataInCodeLoadCmd);
+  if (DataInCodeLoadCmd) {
+    auto CommandOrErr =
+        getStructOrErr<MachO::linkedit_data_command>(*this, DataInCodeLoadCmd);
+    if (!CommandOrErr)
+      report_fatal_error(CommandOrErr.takeError());
+    return CommandOrErr.get();
+  }
 
   // If there is no DataInCodeLoadCmd return a load command with zero'ed fields.
   MachO::linkedit_data_command Cmd;
@@ -4893,8 +5102,13 @@ MachOObjectFile::getDataInCodeLoadCommand() const {
 
 MachO::linkedit_data_command
 MachOObjectFile::getLinkOptHintsLoadCommand() const {
-  if (LinkOptHintsLoadCmd)
-    return getStruct<MachO::linkedit_data_command>(*this, LinkOptHintsLoadCmd);
+  if (LinkOptHintsLoadCmd) {
+    auto CommandOrErr = getStructOrErr<MachO::linkedit_data_command>(
+        *this, LinkOptHintsLoadCmd);
+    if (!CommandOrErr)
+      report_fatal_error(CommandOrErr.takeError());
+    return CommandOrErr.get();
+  }
 
   // If there is no LinkOptHintsLoadCmd return a load command with zero'ed
   // fields.
diff --git a/llvm/lib/Object/MachOUniversalWriter.cpp b/llvm/lib/Object/MachOUniversalWriter.cpp
index 17940495cddd3..31a3c8bb4e67c 100644
--- a/llvm/lib/Object/MachOUniversalWriter.cpp
+++ b/llvm/lib/Object/MachOUniversalWriter.cpp
@@ -48,9 +48,19 @@ static uint32_t calculateFileAlignment(const MachOObjectFile &O) {
                    : O.getSegmentLoadCommand(LC).nsects);
       P2CurrentAlignment = NumberOfSections ? 2 : P2MinAlignment;
       for (unsigned SI = 0; SI < NumberOfSections; ++SI) {
-        P2CurrentAlignment = std::max(P2CurrentAlignment,
-                                      (Is64Bit ? O.getSection64(LC, SI).align
-                                               : O.getSection(LC, SI).align));
+        uint32_t Alignment;
+        if (Is64Bit) {
+          auto Sect = O.getSection64(LC, SI);
+          if (!Sect)
+            report_fatal_error(Sect.takeError());
+          Alignment = Sect.get().align;
+        } else {
+          auto Sect = O.getSection(LC, SI);
+          if (!Sect)
+            report_fatal_error(Sect.takeError());
+          Alignment = Sect.get().align;
+        }
+        P2CurrentAlignment = std::max(P2CurrentAlignment, Alignment);
       }
     } else {
       P2CurrentAlignment =
diff --git a/llvm/lib/ObjectYAML/MachOEmitter.cpp b/llvm/lib/ObjectYAML/MachOEmitter.cpp
index c08b389daea9c..b0ede0893a52f 100644
--- a/llvm/lib/ObjectYAML/MachOEmitter.cpp
+++ b/llvm/lib/ObjectYAML/MachOEmitter.cpp
@@ -371,8 +371,8 @@ Error MachOWriter::writeSectionData(raw_ostream &OS) {
 }
 
 // The implementation of makeRelocationInfo and makeScatteredRelocationInfo is
-// consistent with how libObject parses MachO binary files. For the reference
-// see getStruct, getRelocation, getPlainRelocationPCRel,
+// consistent with how libObject parses MachO binary files. For reference,
+// see getStructOrErr, getRelocation, getPlainRelocationPCRel,
 // getPlainRelocationLength and related methods in MachOObjectFile.cpp
 static MachO::any_relocation_info
 makeRelocationInfo(const MachOYAML::Relocation &R, bool IsLE) {
diff --git a/llvm/tools/dsymutil/MachOUtils.cpp b/llvm/tools/dsymutil/MachOUtils.cpp
index e2ec8cae22856..147db8f1d56be 100644
--- a/llvm/tools/dsymutil/MachOUtils.cpp
+++ b/llvm/tools/dsymutil/MachOUtils.cpp
@@ -243,14 +243,14 @@ static unsigned transferSymbols(const object::MachOObjectFile &Obj,
   return Syms;
 }
 
-static MachO::section
+static Expected<MachO::section>
 getSection(const object::MachOObjectFile &Obj,
            const MachO::segment_command &Seg,
            const object::MachOObjectFile::LoadCommandInfo &LCI, unsigned Idx) {
   return Obj.getSection(LCI, Idx);
 }
 
-static MachO::section_64
+static Expected<MachO::section_64>
 getSection(const object::MachOObjectFile &Obj,
            const MachO::segment_command_64 &Seg,
            const object::MachOObjectFile::LoadCommandInfo &LCI, unsigned Idx) {
@@ -309,7 +309,10 @@ static void transferSegmentAndSections(
     MachO::swapStruct(Segment);
   Writer.W.OS.write(reinterpret_cast<char *>(&Segment), sizeof(Segment));
   for (unsigned i = 0; i < nsects; ++i) {
-    auto Sect = getSection(Obj, Segment, LCI, i);
+    auto Sec = getSection(Obj, Segment, LCI, i);
+    if (!Sec)
+      report_fatal_error(Sec.takeError());
+    auto Sect = Sec.get();
     if (StringRef("__eh_frame") == Sect.sectname) {
       Sect.offset = EHFrameOffset;
       Sect.reloff = Sect.nreloc = 0;
diff --git a/llvm/tools/llvm-objdump/MachODump.cpp b/llvm/tools/llvm-objdump/MachODump.cpp
index 749f988201757..88e1d78169d8e 100644
--- a/llvm/tools/llvm-objdump/MachODump.cpp
+++ b/llvm/tools/llvm-objdump/MachODump.cpp
@@ -658,7 +658,10 @@ static void PrintIndirectSymbols(MachOObjectFile *O, bool verbose) {
     if (Load.C.cmd == MachO::LC_SEGMENT_64) {
       MachO::segment_command_64 Seg = O->getSegment64LoadCommand(Load);
       for (unsigned J = 0; J < Seg.nsects; ++J) {
-        MachO::section_64 Sec = O->getSection64(Load, J);
+        auto SOrErr = O->getSection64(Load, J);
+        if (!SOrErr)
+          report_fatal_error(SOrErr.takeError());
+        const MachO::section_64 Sec = SOrErr.get();
         uint32_t section_type = Sec.flags & MachO::SECTION_TYPE;
         if (section_type == MachO::S_NON_LAZY_SYMBOL_POINTERS ||
             section_type == MachO::S_LAZY_SYMBOL_POINTERS ||
@@ -686,7 +689,10 @@ static void PrintIndirectSymbols(MachOObjectFile *O, bool verbose) {
     } else if (Load.C.cmd == MachO::LC_SEGMENT) {
       MachO::segment_command Seg = O->getSegmentLoadCommand(Load);
       for (unsigned J = 0; J < Seg.nsects; ++J) {
-        MachO::section Sec = O->getSection(Load, J);
+        auto SOrErr = O->getSection(Load, J);
+        if (!SOrErr)
+          report_fatal_error(SOrErr.takeError());
+        MachO::section Sec = SOrErr.get();
         uint32_t section_type = Sec.flags & MachO::SECTION_TYPE;
         if (section_type == MachO::S_NON_LAZY_SYMBOL_POINTERS ||
             section_type == MachO::S_LAZY_SYMBOL_POINTERS ||
@@ -994,7 +1000,10 @@ static void PrintRelocations(const MachOObjectFile *O, const bool verbose) {
     if (Load.C.cmd == MachO::LC_SEGMENT_64) {
       const MachO::segment_command_64 Seg = O->getSegment64LoadCommand(Load);
       for (unsigned J = 0; J < Seg.nsects; ++J) {
-        const MachO::section_64 Sec = O->getSection64(Load, J);
+        auto SOrErr = O->getSection64(Load, J);
+        if (!SOrErr)
+          report_fatal_error(SOrErr.takeError());
+        MachO::section_64 Sec = SOrErr.get();
         if (Sec.nreloc != 0) {
           DataRefImpl DRI;
           DRI.d.a = J;
@@ -1014,7 +1023,10 @@ static void PrintRelocations(const MachOObjectFile *O, const bool verbose) {
     } else if (Load.C.cmd == MachO::LC_SEGMENT) {
       const MachO::segment_command Seg = O->getSegmentLoadCommand(Load);
       for (unsigned J = 0; J < Seg.nsects; ++J) {
-        const MachO::section Sec = O->getSection(Load, J);
+        auto SOrErr = O->getSection(Load, J);
+        if (!SOrErr)
+          report_fatal_error(SOrErr.takeError());
+        const MachO::section Sec = SOrErr.get();
         if (Sec.nreloc != 0) {
           DataRefImpl DRI;
           DRI.d.a = J;
@@ -1654,10 +1666,17 @@ static void DumpLiteralPointerSection(MachOObjectFile *O,
     DataRefImpl Ref = Section.getRawDataRefImpl();
     uint32_t section_type;
     if (O->is64Bit()) {
-      const MachO::section_64 Sec = O->getSection64(Ref);
+      auto SOrErr = O->getSection64(Ref);
+      if (!SOrErr)
+        report_fatal_error(SOrErr.takeError());
+      const MachO::section_64 Sec = SOrErr.get();
+
       section_type = Sec.flags & MachO::SECTION_TYPE;
     } else {
-      const MachO::section Sec = O->getSection(Ref);
+      auto SOrErr = O->getSection(Ref);
+      if (!SOrErr)
+        report_fatal_error(SOrErr.takeError());
+      const MachO::section Sec = SOrErr.get();
       section_type = Sec.flags & MachO::SECTION_TYPE;
     }
     if (section_type == MachO::S_CSTRING_LITERALS ||
@@ -1744,10 +1763,16 @@ static void DumpLiteralPointerSection(MachOObjectFile *O,
 
     uint32_t section_type;
     if (O->is64Bit()) {
-      const MachO::section_64 Sec = O->getSection64(Ref);
+      auto SOrErr = O->getSection64(Ref);
+      if (!SOrErr)
+        report_fatal_error(SOrErr.takeError());
+      const MachO::section_64 Sec = SOrErr.get();
       section_type = Sec.flags & MachO::SECTION_TYPE;
     } else {
-      const MachO::section Sec = O->getSection(Ref);
+      auto SOrErr = O->getSection(Ref);
+      if (!SOrErr)
+        report_fatal_error(SOrErr.takeError());
+      const MachO::section Sec = SOrErr.get();
       section_type = Sec.flags & MachO::SECTION_TYPE;
     }
 
@@ -1958,11 +1983,17 @@ static void DumpSectionContents(StringRef Filename, MachOObjectFile *O,
 
         uint32_t section_flags;
         if (O->is64Bit()) {
-          const MachO::section_64 Sec = O->getSection64(Ref);
+          auto SOrErr = O->getSection64(Ref);
+          if (!SOrErr)
+            report_fatal_error(SOrErr.takeError());
+          const MachO::section_64 Sec = SOrErr.get();
           section_flags = Sec.flags;
 
         } else {
-          const MachO::section Sec = O->getSection(Ref);
+          auto SOrErr = O->getSection(Ref);
+          if (!SOrErr)
+            report_fatal_error(SOrErr.takeError());
+          const MachO::section Sec = SOrErr.get();
           section_flags = Sec.flags;
         }
         uint32_t section_type = section_flags & MachO::SECTION_TYPE;
@@ -3224,7 +3255,10 @@ static const char *GuessCstringPointer(uint64_t ReferenceValue,
     if (Load.C.cmd == MachO::LC_SEGMENT_64) {
       MachO::segment_command_64 Seg = info->O->getSegment64LoadCommand(Load);
       for (unsigned J = 0; J < Seg.nsects; ++J) {
-        MachO::section_64 Sec = info->O->getSection64(Load, J);
+        auto SOrErr = info->O->getSection64(Load, J);
+        if (!SOrErr)
+          report_fatal_error(SOrErr.takeError());
+        MachO::section_64 Sec = SOrErr.get();
         uint32_t section_type = Sec.flags & MachO::SECTION_TYPE;
         if (section_type == MachO::S_CSTRING_LITERALS &&
             ReferenceValue >= Sec.addr &&
@@ -3245,7 +3279,10 @@ static const char *GuessCstringPointer(uint64_t ReferenceValue,
     } else if (Load.C.cmd == MachO::LC_SEGMENT) {
       MachO::segment_command Seg = info->O->getSegmentLoadCommand(Load);
       for (unsigned J = 0; J < Seg.nsects; ++J) {
-        MachO::section Sec = info->O->getSection(Load, J);
+        auto SOrErr = info->O->getSection(Load, J);
+        if (!SOrErr)
+          report_fatal_error(SOrErr.takeError());
+        MachO::section Sec = SOrErr.get();
         uint32_t section_type = Sec.flags & MachO::SECTION_TYPE;
         if (section_type == MachO::S_CSTRING_LITERALS &&
             ReferenceValue >= Sec.addr &&
@@ -3280,7 +3317,10 @@ static const char *GuessIndirectSymbol(uint64_t ReferenceValue,
     if (Load.C.cmd == MachO::LC_SEGMENT_64) {
       MachO::segment_command_64 Seg = info->O->getSegment64LoadCommand(Load);
       for (unsigned J = 0; J < Seg.nsects; ++J) {
-        MachO::section_64 Sec = info->O->getSection64(Load, J);
+        auto SOrErr = info->O->getSection64(Load, J);
+        if (!SOrErr)
+          report_fatal_error(SOrErr.takeError());
+        MachO::section_64 Sec = SOrErr.get();
         uint32_t section_type = Sec.flags & MachO::SECTION_TYPE;
         if ((section_type == MachO::S_NON_LAZY_SYMBOL_POINTERS ||
              section_type == MachO::S_LAZY_SYMBOL_POINTERS ||
@@ -3311,7 +3351,10 @@ static const char *GuessIndirectSymbol(uint64_t ReferenceValue,
     } else if (Load.C.cmd == MachO::LC_SEGMENT) {
       MachO::segment_command Seg = info->O->getSegmentLoadCommand(Load);
       for (unsigned J = 0; J < Seg.nsects; ++J) {
-        MachO::section Sec = info->O->getSection(Load, J);
+        auto SOrErr = info->O->getSection(Load, J);
+        if (!SOrErr)
+          report_fatal_error(SOrErr.takeError());
+        MachO::section Sec = SOrErr.get();
         uint32_t section_type = Sec.flags & MachO::SECTION_TYPE;
         if ((section_type == MachO::S_NON_LAZY_SYMBOL_POINTERS ||
              section_type == MachO::S_LAZY_SYMBOL_POINTERS ||
@@ -3431,7 +3474,10 @@ static uint64_t GuessPointerPointer(uint64_t ReferenceValue,
     if (Load.C.cmd == MachO::LC_SEGMENT_64) {
       MachO::segment_command_64 Seg = info->O->getSegment64LoadCommand(Load);
       for (unsigned J = 0; J < Seg.nsects; ++J) {
-        MachO::section_64 Sec = info->O->getSection64(Load, J);
+        auto SOrErr = info->O->getSection64(Load, J);
+        if (!SOrErr)
+          report_fatal_error(SOrErr.takeError());
+        MachO::section_64 Sec = SOrErr.get();
         if ((strncmp(Sec.sectname, "__objc_selrefs", 16) == 0 ||
              strncmp(Sec.sectname, "__objc_classrefs", 16) == 0 ||
              strncmp(Sec.sectname, "__objc_superrefs", 16) == 0 ||
@@ -10101,7 +10147,10 @@ static void PrintLoadCommands(const MachOObjectFile *Obj, uint32_t filetype,
                           SLC.initprot, SLC.nsects, SLC.flags, Buf.size(),
                           verbose);
       for (unsigned j = 0; j < SLC.nsects; j++) {
-        MachO::section S = Obj->getSection(Command, j);
+        auto SOrErr = Obj->getSection(Command, j);
+        if (!SOrErr)
+          report_fatal_error(SOrErr.takeError());
+        MachO::section S = SOrErr.get();
         PrintSection(S.sectname, S.segname, S.addr, S.size, S.offset, S.align,
                      S.reloff, S.nreloc, S.flags, S.reserved1, S.reserved2,
                      SLC.cmd, sg_segname, filetype, Buf.size(), verbose);
@@ -10114,7 +10163,10 @@ static void PrintLoadCommands(const MachOObjectFile *Obj, uint32_t filetype,
                           SLC_64.filesize, SLC_64.maxprot, SLC_64.initprot,
                           SLC_64.nsects, SLC_64.flags, Buf.size(), verbose);
       for (unsigned j = 0; j < SLC_64.nsects; j++) {
-        MachO::section_64 S_64 = Obj->getSection64(Command, j);
+        auto SOrErr = Obj->getSection64(Command, j);
+        if (!SOrErr)
+          report_fatal_error(SOrErr.takeError());
+        MachO::section_64 S_64 = SOrErr.get();
         PrintSection(S_64.sectname, S_64.segname, S_64.addr, S_64.size,
                      S_64.offset, S_64.align, S_64.reloff, S_64.nreloc,
                      S_64.flags, S_64.reserved1, S_64.reserved2, SLC_64.cmd,
diff --git a/llvm/tools/llvm-readobj/MachODumper.cpp b/llvm/tools/llvm-readobj/MachODumper.cpp
index 0a23ad772e4c5..fe9454802d91f 100644
--- a/llvm/tools/llvm-readobj/MachODumper.cpp
+++ b/llvm/tools/llvm-readobj/MachODumper.cpp
@@ -338,33 +338,39 @@ static std::string getMask(uint32_t prot)
   return Prot;
 }
 
-static void getSection(const MachOObjectFile *Obj,
-                       DataRefImpl Sec,
+static void getSection(const MachOObjectFile *Obj, DataRefImpl Sec,
                        MachOSection &Section) {
   if (!Obj->is64Bit()) {
-    MachO::section Sect = Obj->getSection(Sec);
-    Section.Address     = Sect.addr;
-    Section.Size        = Sect.size;
-    Section.Offset      = Sect.offset;
-    Section.Alignment   = Sect.align;
+    auto SOrErr = Obj->getSection(Sec);
+    if (!SOrErr)
+      report_fatal_error(SOrErr.takeError());
+    MachO::section Sect = SOrErr.get();
+    Section.Address = Sect.addr;
+    Section.Size = Sect.size;
+    Section.Offset = Sect.offset;
+    Section.Alignment = Sect.align;
     Section.RelocationTableOffset = Sect.reloff;
     Section.NumRelocationTableEntries = Sect.nreloc;
-    Section.Flags       = Sect.flags;
-    Section.Reserved1   = Sect.reserved1;
-    Section.Reserved2   = Sect.reserved2;
+    Section.Flags = Sect.flags;
+    Section.Reserved1 = Sect.reserved1;
+    Section.Reserved2 = Sect.reserved2;
     return;
   }
-  MachO::section_64 Sect = Obj->getSection64(Sec);
-  Section.Address     = Sect.addr;
-  Section.Size        = Sect.size;
-  Section.Offset      = Sect.offset;
-  Section.Alignment   = Sect.align;
+
+  auto SOrErr = Obj->getSection64(Sec);
+  if (!SOrErr)
+    report_fatal_error(SOrErr.takeError());
+  MachO::section_64 Sect = SOrErr.get();
+  Section.Address = Sect.addr;
+  Section.Size = Sect.size;
+  Section.Offset = Sect.offset;
+  Section.Alignment = Sect.align;
   Section.RelocationTableOffset = Sect.reloff;
   Section.NumRelocationTableEntries = Sect.nreloc;
-  Section.Flags       = Sect.flags;
-  Section.Reserved1   = Sect.reserved1;
-  Section.Reserved2   = Sect.reserved2;
-  Section.Reserved3   = Sect.reserved3;
+  Section.Flags = Sect.flags;
+  Section.Reserved1 = Sect.reserved1;
+  Section.Reserved2 = Sect.reserved2;
+  Section.Reserved3 = Sect.reserved3;
 }
 
 static void getSegment(const MachOObjectFile *Obj,
diff --git a/llvm/tools/llvm-size/llvm-size.cpp b/llvm/tools/llvm-size/llvm-size.cpp
index 78b207eeeb121..9c597506a770f 100644
--- a/llvm/tools/llvm-size/llvm-size.cpp
+++ b/llvm/tools/llvm-size/llvm-size.cpp
@@ -222,7 +222,10 @@ static void printDarwinSectionSizes(MachOObjectFile *MachO) {
       total += Seg.vmsize;
       uint64_t sec_total = 0;
       for (unsigned J = 0; J < Seg.nsects; ++J) {
-        MachO::section_64 Sec = MachO->getSection64(Load, J);
+        auto Sect = MachO->getSection64(Load, J);
+        if (!Sect)
+          report_fatal_error(Sect.takeError());
+        auto Sec = Sect.get();
         if (Filetype == MachO::MH_OBJECT)
           outs() << "\tSection (" << format("%.16s", &Sec.segname) << ", "
                  << format("%.16s", &Sec.sectname) << "): ";
@@ -249,7 +252,10 @@ static void printDarwinSectionSizes(MachOObjectFile *MachO) {
       total += Seg.vmsize;
       uint64_t sec_total = 0;
       for (unsigned J = 0; J < Seg.nsects; ++J) {
-        MachO::section Sec = MachO->getSection(Load, J);
+        auto Sect = MachO->getSection(Load, J);
+        if (!Sect)
+          report_fatal_error(Sect.takeError());
+        auto Sec = Sect.get();
         if (Filetype == MachO::MH_OBJECT)
           outs() << "\tSection (" << format("%.16s", &Sec.segname) << ", "
                  << format("%.16s", &Sec.sectname) << "): ";
@@ -284,7 +290,11 @@ static void printDarwinSegmentSizes(MachOObjectFile *MachO) {
       MachO::segment_command_64 Seg = MachO->getSegment64LoadCommand(Load);
       if (MachO->getHeader().filetype == MachO::MH_OBJECT) {
         for (unsigned J = 0; J < Seg.nsects; ++J) {
-          MachO::section_64 Sec = MachO->getSection64(Load, J);
+
+          auto Sect = MachO->getSection64(Load, J);
+          if (!Sect)
+            report_fatal_error(Sect.takeError());
+          auto Sec = Sect.get();
           StringRef SegmentName = StringRef(Sec.segname);
           if (SegmentName == "__TEXT")
             total_text += Sec.size;
@@ -310,7 +320,10 @@ static void printDarwinSegmentSizes(MachOObjectFile *MachO) {
       MachO::segment_command Seg = MachO->getSegmentLoadCommand(Load);
       if (MachO->getHeader().filetype == MachO::MH_OBJECT) {
         for (unsigned J = 0; J < Seg.nsects; ++J) {
-          MachO::section Sec = MachO->getSection(Load, J);
+          auto Sect = MachO->getSection(Load, J);
+          if (!Sect)
+            report_fatal_error(Sect.takeError());
+          auto Sec = Sect.get();
           StringRef SegmentName = StringRef(Sec.segname);
           if (SegmentName == "__TEXT")
             total_text += Sec.size;
diff --git a/llvm/tools/sancov/sancov.cpp b/llvm/tools/sancov/sancov.cpp
index e5b0875d46a11..5b8918d39ba51 100644
--- a/llvm/tools/sancov/sancov.cpp
+++ b/llvm/tools/sancov/sancov.cpp
@@ -609,7 +609,10 @@ static void findMachOIndirectCovFunctions(const object::MachOObjectFile &O,
     if (Load.C.cmd == MachO::LC_SEGMENT_64) {
       MachO::segment_command_64 Seg = O.getSegment64LoadCommand(Load);
       for (unsigned J = 0; J < Seg.nsects; ++J) {
-        MachO::section_64 Sec = O.getSection64(Load, J);
+        auto Sect = O.getSection64(Load, J);
+        if (!Sect)
+          report_fatal_error(Sect.takeError());
+        auto Sec = Sect.get();
 
         uint32_t SectionType = Sec.flags & MachO::SECTION_TYPE;
         if (SectionType == MachO::S_SYMBOL_STUBS) {



More information about the llvm-commits mailing list