[llvm] r261103 - Add a unwrapOrError utility and use it to simplify ELFDumper.cpp.

Rafael Espindola via llvm-commits llvm-commits at lists.llvm.org
Wed Feb 17 08:21:50 PST 2016


Author: rafael
Date: Wed Feb 17 10:21:49 2016
New Revision: 261103

URL: http://llvm.org/viewvc/llvm-project?rev=261103&view=rev
Log:
Add a unwrapOrError utility and use it to simplify ELFDumper.cpp.

Utility extracted from r260488.

Modified:
    llvm/trunk/tools/llvm-readobj/ELFDumper.cpp
    llvm/trunk/tools/llvm-readobj/llvm-readobj.h

Modified: llvm/trunk/tools/llvm-readobj/ELFDumper.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-readobj/ELFDumper.cpp?rev=261103&r1=261102&r2=261103&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-readobj/ELFDumper.cpp (original)
+++ llvm/trunk/tools/llvm-readobj/ELFDumper.cpp Wed Feb 17 10:21:49 2016
@@ -146,14 +146,10 @@ private:
   Elf_Rela_Range dyn_relas() const;
   StringRef getDynamicString(uint64_t Offset) const;
   const Elf_Dyn *dynamic_table_begin() const {
-    ErrorOr<const Elf_Dyn *> Ret = Obj->dynamic_table_begin(DynamicProgHeader);
-    error(Ret.getError());
-    return *Ret;
+    return unwrapOrError(Obj->dynamic_table_begin(DynamicProgHeader));
   }
   const Elf_Dyn *dynamic_table_end() const {
-    ErrorOr<const Elf_Dyn *> Ret = Obj->dynamic_table_end(DynamicProgHeader);
-    error(Ret.getError());
-    return *Ret;
+    return unwrapOrError(Obj->dynamic_table_end(DynamicProgHeader));
   }
   StringRef getSymbolVersion(StringRef StrTab, const Elf_Sym *symb,
                              bool &IsDefault);
@@ -203,9 +199,7 @@ private:
 
 public:
   Elf_Dyn_Range dynamic_table() const {
-    ErrorOr<Elf_Dyn_Range> Ret = Obj->dynamic_table(DynamicProgHeader);
-    error(Ret.getError());
-    return *Ret;
+    return unwrapOrError(Obj->dynamic_table(DynamicProgHeader));
   }
 
   Elf_Sym_Range dynamic_symbols() const {
@@ -254,14 +248,6 @@ private:
   StreamWriter &W;
 };
 
-template <class T> T errorOrDefault(ErrorOr<T> Val, T Default = T()) {
-  if (!Val) {
-    error(Val.getError());
-    return Default;
-  }
-
-  return *Val;
-}
 } // namespace
 
 namespace llvm {
@@ -387,7 +373,7 @@ static void printVersionSymbolSection(EL
   DictScope SS(W, "Version symbols");
   if (!Sec)
     return;
-  StringRef Name = errorOrDefault(Obj->getSectionName(Sec));
+  StringRef Name = unwrapOrError(Obj->getSectionName(Sec));
   W.printNumber("Section Name", Name, Sec->sh_name);
   W.printHex("Address", Sec->sh_addr);
   W.printHex("Offset", Sec->sh_offset);
@@ -416,7 +402,7 @@ static void printVersionDefinitionSectio
   DictScope SD(W, "Version definition");
   if (!Sec)
     return;
-  StringRef Name = errorOrDefault(Obj->getSectionName(Sec));
+  StringRef Name = unwrapOrError(Obj->getSectionName(Sec));
   W.printNumber("Section Name", Name, Sec->sh_name);
   W.printHex("Address", Sec->sh_addr);
   W.printHex("Offset", Sec->sh_offset);
@@ -433,9 +419,8 @@ static void printVersionDefinitionSectio
       (const uint8_t *)Obj->base() + Sec->sh_offset;
   const uint8_t *SecEndAddress = SecStartAddress + Sec->sh_size;
   const uint8_t *P = SecStartAddress;
-  ErrorOr<const typename ELFO::Elf_Shdr *> StrTabOrErr =
-      Obj->getSection(Sec->sh_link);
-  error(StrTabOrErr.getError());
+  const typename ELFO::Elf_Shdr *StrTab =
+      unwrapOrError(Obj->getSection(Sec->sh_link));
 
   ListScope Entries(W, "Entries");
   for (unsigned i = 0; i < verdef_entries; ++i) {
@@ -449,9 +434,9 @@ static void printVersionDefinitionSectio
     W.printNumber("Flags", VD->vd_flags);
     W.printNumber("Index", VD->vd_ndx);
     W.printNumber("Cnt", VD->vd_cnt);
-    W.printString("Name", StringRef((const char *)(Obj->base() +
-                                                   (*StrTabOrErr)->sh_offset +
-                                                   VD->getAux()->vda_name)));
+    W.printString("Name",
+                  StringRef((const char *)(Obj->base() + StrTab->sh_offset +
+                                           VD->getAux()->vda_name)));
     P += VD->vd_next;
   }
 }
@@ -517,7 +502,7 @@ template <typename ELFT>
 std::string ELFDumper<ELFT>::getFullSymbolName(const Elf_Sym *Symbol,
                                                StringRef StrTable,
                                                bool IsDynamic) {
-  StringRef SymbolName = errorOrDefault(Symbol->getName(StrTable));
+  StringRef SymbolName = unwrapOrError(Symbol->getName(StrTable));
   if (!IsDynamic)
     return SymbolName;
 
@@ -553,9 +538,9 @@ getSectionNameIndex(const ELFO &Obj, con
     if (SectionIndex == SHN_XINDEX)
       SectionIndex =
           Obj.getExtendedSymbolTableIndex(Symbol, FirstSym, ShndxTable);
-    ErrorOr<const typename ELFO::Elf_Shdr *> Sec = Obj.getSection(SectionIndex);
-    error(Sec.getError());
-    SectionName = errorOrDefault(Obj.getSectionName(*Sec));
+    const typename ELFO::Elf_Shdr *Sec =
+        unwrapOrError(Obj.getSection(SectionIndex));
+    SectionName = unwrapOrError(Obj.getSectionName(Sec));
   }
 }
 
@@ -572,7 +557,7 @@ template <class ELFO>
 static const typename ELFO::Elf_Shdr *findSectionByName(const ELFO &Obj,
                                                         StringRef Name) {
   for (const auto &Shdr : Obj.sections()) {
-    if (Name == errorOrDefault(Obj.getSectionName(&Shdr)))
+    if (Name == unwrapOrError(Obj.getSectionName(&Shdr)))
       return &Shdr;
   }
   return nullptr;
@@ -1027,9 +1012,7 @@ ELFDumper<ELFT>::ELFDumper(const ELFFile
       DynSymRegion = createDRIFrom(&Sec);
       break;
     case ELF::SHT_SYMTAB_SHNDX: {
-      ErrorOr<ArrayRef<Elf_Word>> TableOrErr = Obj->getSHNDXTable(Sec);
-      error(TableOrErr.getError());
-      ShndxTable = *TableOrErr;
+      ShndxTable = unwrapOrError(Obj->getSHNDXTable(Sec));
       break;
     }
     case ELF::SHT_GNU_versym:
@@ -1164,7 +1147,7 @@ void ELFDumper<ELFT>::printSections() {
   for (const Elf_Shdr &Sec : Obj->sections()) {
     ++SectionIndex;
 
-    StringRef Name = errorOrDefault(Obj->getSectionName(&Sec));
+    StringRef Name = unwrapOrError(Obj->getSectionName(&Sec));
 
     DictScope SectionD(W, "Section");
     W.printNumber("Index", SectionIndex);
@@ -1213,22 +1196,18 @@ void ELFDumper<ELFT>::printSections() {
     if (opts::SectionSymbols) {
       ListScope D(W, "Symbols");
       const Elf_Shdr *Symtab = DotSymtabSec;
-      ErrorOr<StringRef> StrTableOrErr = Obj->getStringTableForSymtab(*Symtab);
-      error(StrTableOrErr.getError());
-      StringRef StrTable = *StrTableOrErr;
+      StringRef StrTable = unwrapOrError(Obj->getStringTableForSymtab(*Symtab));
 
       for (const Elf_Sym &Sym : Obj->symbols(Symtab)) {
-        ErrorOr<const Elf_Shdr *> SymSec =
-            Obj->getSection(&Sym, Symtab, ShndxTable);
-        if (!SymSec)
-          continue;
-        if (*SymSec == &Sec)
+        const Elf_Shdr *SymSec =
+            unwrapOrError(Obj->getSection(&Sym, Symtab, ShndxTable));
+        if (SymSec == &Sec)
           printSymbol(&Sym, Obj->symbol_begin(Symtab), StrTable, false);
       }
     }
 
     if (opts::SectionData && Sec.sh_type != ELF::SHT_NOBITS) {
-      ArrayRef<uint8_t> Data = errorOrDefault(Obj->getSectionContents(&Sec));
+      ArrayRef<uint8_t> Data = unwrapOrError(Obj->getSectionContents(&Sec));
       W.printBinaryBlock("SectionData",
                          StringRef((const char *)Data.data(), Data.size()));
     }
@@ -1246,7 +1225,7 @@ void ELFDumper<ELFT>::printRelocations()
     if (Sec.sh_type != ELF::SHT_REL && Sec.sh_type != ELF::SHT_RELA)
       continue;
 
-    StringRef Name = errorOrDefault(Obj->getSectionName(&Sec));
+    StringRef Name = unwrapOrError(Obj->getSectionName(&Sec));
 
     W.startLine() << "Section (" << SectionNumber << ") " << Name << " {\n";
     W.indent();
@@ -1291,9 +1270,7 @@ template <class ELFT> void ELFDumper<ELF
 
 template <class ELFT>
 void ELFDumper<ELFT>::printRelocations(const Elf_Shdr *Sec) {
-  ErrorOr<const Elf_Shdr *> SymTabOrErr = Obj->getSection(Sec->sh_link);
-  error(SymTabOrErr.getError());
-  const Elf_Shdr *SymTab = *SymTabOrErr;
+  const Elf_Shdr *SymTab = unwrapOrError(Obj->getSection(Sec->sh_link));
 
   switch (Sec->sh_type) {
   case ELF::SHT_REL:
@@ -1319,15 +1296,12 @@ void ELFDumper<ELFT>::printRelocation(El
   StringRef TargetName;
   const Elf_Sym *Sym = Obj->getRelocationSymbol(&Rel, SymTab);
   if (Sym && Sym->getType() == ELF::STT_SECTION) {
-    ErrorOr<const Elf_Shdr *> Sec = Obj->getSection(Sym, SymTab, ShndxTable);
-    error(Sec.getError());
-    ErrorOr<StringRef> SecName = Obj->getSectionName(*Sec);
-    if (SecName)
-      TargetName = SecName.get();
+    const Elf_Shdr *Sec =
+        unwrapOrError(Obj->getSection(Sym, SymTab, ShndxTable));
+    TargetName = unwrapOrError(Obj->getSectionName(Sec));
   } else if (Sym) {
-    ErrorOr<StringRef> StrTableOrErr = Obj->getStringTableForSymtab(*SymTab);
-    error(StrTableOrErr.getError());
-    TargetName = errorOrDefault(Sym->getName(*StrTableOrErr));
+    StringRef StrTable = unwrapOrError(Obj->getStringTableForSymtab(*SymTab));
+    TargetName = unwrapOrError(Sym->getName(StrTable));
   }
 
   if (opts::ExpandRelocs) {
@@ -1352,7 +1326,7 @@ void ELFDumper<ELFT>::printDynamicReloca
   StringRef SymbolName;
   uint32_t SymIndex = Rel.getSymbol(Obj->isMips64EL());
   const Elf_Sym *Sym = dynamic_symbols().begin() + SymIndex;
-  SymbolName = errorOrDefault(Sym->getName(DynamicStringTable));
+  SymbolName = unwrapOrError(Sym->getName(DynamicStringTable));
   if (opts::ExpandRelocs) {
     DictScope Group(W, "Relocation");
     W.printHex("Offset", Rel.r_offset);
@@ -1378,10 +1352,7 @@ void ELFDumper<ELFT>::printSymbolsHelper
   } else {
     if (!DotSymtabSec)
       return;
-    ErrorOr<StringRef> StrTableOrErr =
-        Obj->getStringTableForSymtab(*DotSymtabSec);
-    error(StrTableOrErr.getError());
-    StrTable = *StrTableOrErr;
+    StrTable = unwrapOrError(Obj->getStringTableForSymtab(*DotSymtabSec));
     Syms = Obj->symbols(DotSymtabSec);
   }
   for (const Elf_Sym &Sym : Syms)
@@ -1808,21 +1779,18 @@ template <> void ELFDumper<ELFType<suppo
     if (Sec.sh_type != ELF::SHT_ARM_ATTRIBUTES)
       continue;
 
-    ErrorOr<ArrayRef<uint8_t>> Contents = Obj->getSectionContents(&Sec);
-    if (!Contents)
-      continue;
-
-    if ((*Contents)[0] != ARMBuildAttrs::Format_Version) {
-      errs() << "unrecognised FormatVersion: 0x" << utohexstr((*Contents)[0])
+    ArrayRef<uint8_t> Contents = unwrapOrError(Obj->getSectionContents(&Sec));
+    if (Contents[0] != ARMBuildAttrs::Format_Version) {
+      errs() << "unrecognised FormatVersion: 0x" << utohexstr(Contents[0])
              << '\n';
       continue;
     }
 
-    W.printHex("FormatVersion", (*Contents)[0]);
-    if (Contents->size() == 1)
+    W.printHex("FormatVersion", Contents[0]);
+    if (Contents.size() == 1)
       continue;
 
-    ARMAttributeParser(W).Parse(*Contents);
+    ARMAttributeParser(W).Parse(Contents);
   }
 }
 }
@@ -1932,13 +1900,13 @@ template <class ELFT> void MipsGOTParser
     report_fatal_error("There is no not empty GOT section at 0x" +
                        Twine::utohexstr(*DtPltGot));
 
-  ErrorOr<ArrayRef<uint8_t>> GOT = Obj->getSectionContents(GOTShdr);
+  ArrayRef<uint8_t> GOT = unwrapOrError(Obj->getSectionContents(GOTShdr));
 
-  if (*DtLocalGotNum + GlobalGotNum > getGOTTotal(*GOT))
+  if (*DtLocalGotNum + GlobalGotNum > getGOTTotal(GOT))
     report_fatal_error("Number of GOT entries exceeds the size of GOT section");
 
-  const GOTEntry *GotBegin = makeGOTIter(*GOT, 0);
-  const GOTEntry *GotLocalEnd = makeGOTIter(*GOT, *DtLocalGotNum);
+  const GOTEntry *GotBegin = makeGOTIter(GOT, 0);
+  const GOTEntry *GotLocalEnd = makeGOTIter(GOT, *DtLocalGotNum);
   const GOTEntry *It = GotBegin;
 
   DictScope GS(W, "Primary GOT");
@@ -1970,7 +1938,7 @@ template <class ELFT> void MipsGOTParser
     ListScope GS(W, "Global entries");
 
     const GOTEntry *GotGlobalEnd =
-        makeGOTIter(*GOT, *DtLocalGotNum + GlobalGotNum);
+        makeGOTIter(GOT, *DtLocalGotNum + GlobalGotNum);
     const Elf_Sym *GotDynSym = DynSymBegin + *DtGotSym;
     for (; It != GotGlobalEnd; ++It) {
       DictScope D(W, "Entry");
@@ -1979,7 +1947,7 @@ template <class ELFT> void MipsGOTParser
     }
   }
 
-  std::size_t SpecGotNum = getGOTTotal(*GOT) - *DtLocalGotNum - GlobalGotNum;
+  std::size_t SpecGotNum = getGOTTotal(GOT) - *DtLocalGotNum - GlobalGotNum;
   W.printNumber("Number of TLS and multi-GOT entries", uint64_t(SpecGotNum));
 }
 
@@ -1997,21 +1965,18 @@ template <class ELFT> void MipsGOTParser
   if (!PLTShdr)
     report_fatal_error("There is no not empty PLTGOT section at 0x " +
                        Twine::utohexstr(*DtMipsPltGot));
-  ErrorOr<ArrayRef<uint8_t>> PLT = Obj->getSectionContents(PLTShdr);
+  ArrayRef<uint8_t> PLT = unwrapOrError(Obj->getSectionContents(PLTShdr));
 
   const Elf_Shdr *PLTRelShdr = findNotEmptySectionByAddress(Obj, *DtJmpRel);
   if (!PLTRelShdr)
     report_fatal_error("There is no not empty RELPLT section at 0x" +
                        Twine::utohexstr(*DtJmpRel));
-  ErrorOr<const Elf_Shdr *> SymTableOrErr =
-      Obj->getSection(PLTRelShdr->sh_link);
-  error(SymTableOrErr.getError());
-  const Elf_Shdr *SymTable = *SymTableOrErr;
-  ErrorOr<StringRef> StrTable = Obj->getStringTableForSymtab(*SymTable);
-  error(StrTable.getError());
+  const Elf_Shdr *SymTable =
+      unwrapOrError(Obj->getSection(PLTRelShdr->sh_link));
+  StringRef StrTable = unwrapOrError(Obj->getStringTableForSymtab(*SymTable));
 
-  const GOTEntry *PLTBegin = makeGOTIter(*PLT, 0);
-  const GOTEntry *PLTEnd = makeGOTIter(*PLT, getGOTTotal(*PLT));
+  const GOTEntry *PLTBegin = makeGOTIter(PLT, 0);
+  const GOTEntry *PLTEnd = makeGOTIter(PLT, getGOTTotal(PLT));
   const GOTEntry *It = PLTBegin;
 
   DictScope GS(W, "PLT GOT");
@@ -2030,7 +1995,7 @@ template <class ELFT> void MipsGOTParser
                          *RE = Obj->rel_end(PLTRelShdr);
            RI != RE && It != PLTEnd; ++RI, ++It) {
         const Elf_Sym *Sym = Obj->getRelocationSymbol(&*RI, SymTable);
-        printPLTEntry(PLTShdr->sh_addr, PLTBegin, It, *StrTable, Sym);
+        printPLTEntry(PLTShdr->sh_addr, PLTBegin, It, StrTable, Sym);
       }
       break;
     case ELF::SHT_RELA:
@@ -2038,7 +2003,7 @@ template <class ELFT> void MipsGOTParser
                           *RE = Obj->rela_end(PLTRelShdr);
            RI != RE && It != PLTEnd; ++RI, ++It) {
         const Elf_Sym *Sym = Obj->getRelocationSymbol(&*RI, SymTable);
-        printPLTEntry(PLTShdr->sh_addr, PLTBegin, It, *StrTable, Sym);
+        printPLTEntry(PLTShdr->sh_addr, PLTBegin, It, StrTable, Sym);
       }
       break;
     }
@@ -2208,17 +2173,13 @@ template <class ELFT> void ELFDumper<ELF
     W.startLine() << "There is no .MIPS.abiflags section in the file.\n";
     return;
   }
-  ErrorOr<ArrayRef<uint8_t>> Sec = Obj->getSectionContents(Shdr);
-  if (!Sec) {
-    W.startLine() << "The .MIPS.abiflags section is empty.\n";
-    return;
-  }
-  if (Sec->size() != sizeof(Elf_Mips_ABIFlags<ELFT>)) {
+  ArrayRef<uint8_t> Sec = unwrapOrError(Obj->getSectionContents(Shdr));
+  if (Sec.size() != sizeof(Elf_Mips_ABIFlags<ELFT>)) {
     W.startLine() << "The .MIPS.abiflags section has a wrong size.\n";
     return;
   }
 
-  auto *Flags = reinterpret_cast<const Elf_Mips_ABIFlags<ELFT> *>(Sec->data());
+  auto *Flags = reinterpret_cast<const Elf_Mips_ABIFlags<ELFT> *>(Sec.data());
 
   raw_ostream &OS = W.getOStream();
   DictScope GS(W, "MIPS ABI Flags");
@@ -2246,17 +2207,13 @@ template <class ELFT> void ELFDumper<ELF
     W.startLine() << "There is no .reginfo section in the file.\n";
     return;
   }
-  ErrorOr<ArrayRef<uint8_t>> Sec = Obj->getSectionContents(Shdr);
-  if (!Sec) {
-    W.startLine() << "The .reginfo section is empty.\n";
-    return;
-  }
-  if (Sec->size() != sizeof(Elf_Mips_RegInfo<ELFT>)) {
+  ArrayRef<uint8_t> Sec = unwrapOrError(Obj->getSectionContents(Shdr));
+  if (Sec.size() != sizeof(Elf_Mips_RegInfo<ELFT>)) {
     W.startLine() << "The .reginfo section has a wrong size.\n";
     return;
   }
 
-  auto *Reginfo = reinterpret_cast<const Elf_Mips_RegInfo<ELFT> *>(Sec->data());
+  auto *Reginfo = reinterpret_cast<const Elf_Mips_RegInfo<ELFT> *>(Sec.data());
 
   DictScope GS(W, "MIPS RegInfo");
   W.printHex("GP", Reginfo->ri_gp_value);
@@ -2270,8 +2227,8 @@ template <class ELFT> void ELFDumper<ELF
 template <class ELFT> void ELFDumper<ELFT>::printStackMap() const {
   const Elf_Shdr *StackMapSection = nullptr;
   for (const auto &Sec : Obj->sections()) {
-    ErrorOr<StringRef> Name = Obj->getSectionName(&Sec);
-    if (*Name == ".llvm_stackmaps") {
+    StringRef Name = unwrapOrError(Obj->getSectionName(&Sec));
+    if (Name == ".llvm_stackmaps") {
       StackMapSection = &Sec;
       break;
     }
@@ -2281,12 +2238,11 @@ template <class ELFT> void ELFDumper<ELF
     return;
 
   StringRef StackMapContents;
-  ErrorOr<ArrayRef<uint8_t>> StackMapContentsArray =
-    Obj->getSectionContents(StackMapSection);
+  ArrayRef<uint8_t> StackMapContentsArray =
+      unwrapOrError(Obj->getSectionContents(StackMapSection));
 
-  prettyPrintStackMap(
-              llvm::outs(),
-              StackMapV1Parser<ELFT::TargetEndianness>(*StackMapContentsArray));
+  prettyPrintStackMap(llvm::outs(), StackMapV1Parser<ELFT::TargetEndianness>(
+                                        StackMapContentsArray));
 }
 
 template <class ELFT> void ELFDumper<ELFT>::printGroupSections() {
@@ -2296,17 +2252,13 @@ template <class ELFT> void ELFDumper<ELF
   for (const Elf_Shdr &Sec : Obj->sections()) {
     if (Sec.sh_type == ELF::SHT_GROUP) {
       HasGroups = true;
-      ErrorOr<const Elf_Shdr *> Symtab =
-          errorOrDefault(Obj->getSection(Sec.sh_link));
-      ErrorOr<StringRef> StrTableOrErr = Obj->getStringTableForSymtab(**Symtab);
-      error(StrTableOrErr.getError());
-      StringRef StrTable = *StrTableOrErr;
-      const Elf_Sym *Sym =
-          Obj->template getEntry<Elf_Sym>(*Symtab, Sec.sh_info);
-      auto Data = errorOrDefault(
+      const Elf_Shdr *Symtab = unwrapOrError(Obj->getSection(Sec.sh_link));
+      StringRef StrTable = unwrapOrError(Obj->getStringTableForSymtab(*Symtab));
+      const Elf_Sym *Sym = Obj->template getEntry<Elf_Sym>(Symtab, Sec.sh_info);
+      auto Data = unwrapOrError(
           Obj->template getSectionContentsAsArray<Elf_Word>(&Sec));
       DictScope D(W, "Group");
-      StringRef Name = errorOrDefault(Obj->getSectionName(&Sec));
+      StringRef Name = unwrapOrError(Obj->getSectionName(&Sec));
       W.printNumber("Name", Name, Sec.sh_name);
       W.printNumber("Index", SectionIndex);
       W.printHex("Type", getGroupType(Data[0]), Data[0]);
@@ -2315,8 +2267,8 @@ template <class ELFT> void ELFDumper<ELF
         ListScope L(W, "Section(s) in group");
         size_t Member = 1;
         while (Member < Data.size()) {
-          auto Sec = errorOrDefault(Obj->getSection(Data[Member]));
-          const StringRef Name = errorOrDefault(Obj->getSectionName(Sec));
+          auto Sec = unwrapOrError(Obj->getSection(Data[Member]));
+          const StringRef Name = unwrapOrError(Obj->getSectionName(Sec));
           W.startLine() << Name << " (" << Data[Member++] << ")\n";
         }
       }

Modified: llvm/trunk/tools/llvm-readobj/llvm-readobj.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-readobj/llvm-readobj.h?rev=261103&r1=261102&r2=261103&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-readobj/llvm-readobj.h (original)
+++ llvm/trunk/tools/llvm-readobj/llvm-readobj.h Wed Feb 17 10:21:49 2016
@@ -12,6 +12,7 @@
 
 #include "llvm/Support/CommandLine.h"
 #include "llvm/Support/Compiler.h"
+#include "llvm/Support/ErrorOr.h"
 #include <string>
 
 namespace llvm {
@@ -22,6 +23,11 @@ namespace llvm {
   // Various helper functions.
   LLVM_ATTRIBUTE_NORETURN void reportError(Twine Msg);
   void error(std::error_code ec);
+  template <class T> T unwrapOrError(ErrorOr<T> EO) {
+    if (EO)
+      return *EO;
+    reportError(EO.getError().message());
+  }
   bool relocAddressLess(object::RelocationRef A,
                         object::RelocationRef B);
 } // namespace llvm




More information about the llvm-commits mailing list